Here it is: --powertune-enable for nvidia -- Works on both linux and windows
[hashcat.git] / src / shared.c
1 /**
2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
4 * magnum <john.magnum@hushmail.com>
5 *
6 * License.....: MIT
7 */
8
9 #ifdef OSX
10 #include <stdio.h>
11 #endif
12
13 #include <shared.h>
14 #include <limits.h>
15
16 /**
17 * basic bit handling
18 */
19
20 u32 is_power_of_2(u32 v)
21 {
22 return (v && !(v & (v - 1)));
23 }
24
25 u32 rotl32 (const u32 a, const u32 n)
26 {
27 return ((a << n) | (a >> (32 - n)));
28 }
29
30 u32 rotr32 (const u32 a, const u32 n)
31 {
32 return ((a >> n) | (a << (32 - n)));
33 }
34
35 u64 rotl64 (const u64 a, const u64 n)
36 {
37 return ((a << n) | (a >> (64 - n)));
38 }
39
40 u64 rotr64 (const u64 a, const u64 n)
41 {
42 return ((a >> n) | (a << (64 - n)));
43 }
44
45 u32 byte_swap_32 (const u32 n)
46 {
47 return (n & 0xff000000) >> 24
48 | (n & 0x00ff0000) >> 8
49 | (n & 0x0000ff00) << 8
50 | (n & 0x000000ff) << 24;
51 }
52
53 u64 byte_swap_64 (const u64 n)
54 {
55 return (n & 0xff00000000000000ULL) >> 56
56 | (n & 0x00ff000000000000ULL) >> 40
57 | (n & 0x0000ff0000000000ULL) >> 24
58 | (n & 0x000000ff00000000ULL) >> 8
59 | (n & 0x00000000ff000000ULL) << 8
60 | (n & 0x0000000000ff0000ULL) << 24
61 | (n & 0x000000000000ff00ULL) << 40
62 | (n & 0x00000000000000ffULL) << 56;
63 }
64
65 /**
66 * ciphers for use on cpu
67 */
68
69 #include "cpu-des.c"
70 #include "cpu-aes.c"
71
72 /**
73 * hashes for use on cpu
74 */
75
76 #include "cpu-md5.c"
77 #include "cpu-sha1.c"
78 #include "cpu-sha256.c"
79
80 /**
81 * logging
82 */
83
84 int last_len = 0;
85
86 void log_final (FILE *fp, const char *fmt, va_list ap)
87 {
88 if (last_len)
89 {
90 fputc ('\r', fp);
91
92 for (int i = 0; i < last_len; i++)
93 {
94 fputc (' ', fp);
95 }
96
97 fputc ('\r', fp);
98 }
99
100 char s[4096] = { 0 };
101
102 int max_len = (int) sizeof (s);
103
104 int len = vsnprintf (s, max_len, fmt, ap);
105
106 if (len > max_len) len = max_len;
107
108 fwrite (s, len, 1, fp);
109
110 fflush (fp);
111
112 last_len = len;
113 }
114
115 void log_out_nn (FILE *fp, const char *fmt, ...)
116 {
117 if (SUPPRESS_OUTPUT) return;
118
119 va_list ap;
120
121 va_start (ap, fmt);
122
123 log_final (fp, fmt, ap);
124
125 va_end (ap);
126 }
127
128 void log_info_nn (const char *fmt, ...)
129 {
130 if (SUPPRESS_OUTPUT) return;
131
132 va_list ap;
133
134 va_start (ap, fmt);
135
136 log_final (stdout, fmt, ap);
137
138 va_end (ap);
139 }
140
141 void log_error_nn (const char *fmt, ...)
142 {
143 if (SUPPRESS_OUTPUT) return;
144
145 va_list ap;
146
147 va_start (ap, fmt);
148
149 log_final (stderr, fmt, ap);
150
151 va_end (ap);
152 }
153
154 void log_out (FILE *fp, const char *fmt, ...)
155 {
156 if (SUPPRESS_OUTPUT) return;
157
158 va_list ap;
159
160 va_start (ap, fmt);
161
162 log_final (fp, fmt, ap);
163
164 va_end (ap);
165
166 fputc ('\n', fp);
167
168 last_len = 0;
169 }
170
171 void log_info (const char *fmt, ...)
172 {
173 if (SUPPRESS_OUTPUT) return;
174
175 va_list ap;
176
177 va_start (ap, fmt);
178
179 log_final (stdout, fmt, ap);
180
181 va_end (ap);
182
183 fputc ('\n', stdout);
184
185 last_len = 0;
186 }
187
188 void log_error (const char *fmt, ...)
189 {
190 if (SUPPRESS_OUTPUT) return;
191
192 fputc ('\n', stderr);
193 fputc ('\n', stderr);
194
195 va_list ap;
196
197 va_start (ap, fmt);
198
199 log_final (stderr, fmt, ap);
200
201 va_end (ap);
202
203 fputc ('\n', stderr);
204 fputc ('\n', stderr);
205
206 last_len = 0;
207 }
208
209 /**
210 * converter
211 */
212
213 u8 int_to_base32 (const u8 c)
214 {
215 static const u8 tbl[0x20] =
216 {
217 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
218 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
219 };
220
221 return tbl[c];
222 }
223
224 u8 base32_to_int (const u8 c)
225 {
226 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
227 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
228
229 return 0;
230 }
231
232 u8 int_to_itoa32 (const u8 c)
233 {
234 static const u8 tbl[0x20] =
235 {
236 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
237 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
238 };
239
240 return tbl[c];
241 }
242
243 u8 itoa32_to_int (const u8 c)
244 {
245 if ((c >= '0') && (c <= '9')) return c - '0';
246 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
247
248 return 0;
249 }
250
251 u8 int_to_itoa64 (const u8 c)
252 {
253 static const u8 tbl[0x40] =
254 {
255 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
256 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
257 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
258 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
259 };
260
261 return tbl[c];
262 }
263
264 u8 itoa64_to_int (const u8 c)
265 {
266 static const u8 tbl[0x100] =
267 {
268 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
269 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
270 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
271 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
272 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
273 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
274 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
275 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
276 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
277 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
278 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
279 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
280 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
281 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
282 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
283 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
284 };
285
286 return tbl[c];
287 }
288
289 u8 int_to_base64 (const u8 c)
290 {
291 static const u8 tbl[0x40] =
292 {
293 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
294 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
295 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
296 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
297 };
298
299 return tbl[c];
300 }
301
302 u8 base64_to_int (const u8 c)
303 {
304 static const u8 tbl[0x100] =
305 {
306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
309 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
311 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
313 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 };
323
324 return tbl[c];
325 }
326
327 u8 int_to_bf64 (const u8 c)
328 {
329 static const u8 tbl[0x40] =
330 {
331 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
332 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
333 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
334 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
335 };
336
337 return tbl[c];
338 }
339
340 u8 bf64_to_int (const u8 c)
341 {
342 static const u8 tbl[0x100] =
343 {
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
347 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
349 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
351 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 };
361
362 return tbl[c];
363 }
364
365 u8 int_to_lotus64 (const u8 c)
366 {
367 if (c < 10) return '0' + c;
368 else if (c < 36) return 'A' + c - 10;
369 else if (c < 62) return 'a' + c - 36;
370 else if (c == 62) return '+';
371 else if (c == 63) return '/';
372
373 return 0;
374 }
375
376 u8 lotus64_to_int (const u8 c)
377 {
378 if ((c >= '0') && (c <= '9')) return c - '0';
379 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
380 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
381 else if (c == '+') return 62;
382 else if (c == '/') return 63;
383 else
384
385 return 0;
386 }
387
388 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
389 {
390 const u8 *in_ptr = in_buf;
391
392 u8 *out_ptr = out_buf;
393
394 for (int i = 0; i < in_len; i += 8)
395 {
396 const u8 out_val0 = f (in_ptr[0] & 0x7f);
397 const u8 out_val1 = f (in_ptr[1] & 0x7f);
398 const u8 out_val2 = f (in_ptr[2] & 0x7f);
399 const u8 out_val3 = f (in_ptr[3] & 0x7f);
400 const u8 out_val4 = f (in_ptr[4] & 0x7f);
401 const u8 out_val5 = f (in_ptr[5] & 0x7f);
402 const u8 out_val6 = f (in_ptr[6] & 0x7f);
403 const u8 out_val7 = f (in_ptr[7] & 0x7f);
404
405 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
406 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
407 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
408 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
409 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
410
411 in_ptr += 8;
412 out_ptr += 5;
413 }
414
415 for (int i = 0; i < in_len; i++)
416 {
417 if (in_buf[i] != '=') continue;
418
419 in_len = i;
420 }
421
422 int out_len = (in_len * 5) / 8;
423
424 return out_len;
425 }
426
427 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
428 {
429 const u8 *in_ptr = in_buf;
430
431 u8 *out_ptr = out_buf;
432
433 for (int i = 0; i < in_len; i += 5)
434 {
435 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
436 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
437 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
438 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
439 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
440 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
441 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
442 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
443
444 out_ptr[0] = out_val0 & 0x7f;
445 out_ptr[1] = out_val1 & 0x7f;
446 out_ptr[2] = out_val2 & 0x7f;
447 out_ptr[3] = out_val3 & 0x7f;
448 out_ptr[4] = out_val4 & 0x7f;
449 out_ptr[5] = out_val5 & 0x7f;
450 out_ptr[6] = out_val6 & 0x7f;
451 out_ptr[7] = out_val7 & 0x7f;
452
453 in_ptr += 5;
454 out_ptr += 8;
455 }
456
457 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
458
459 while (out_len % 8)
460 {
461 out_buf[out_len] = '=';
462
463 out_len++;
464 }
465
466 return out_len;
467 }
468
469 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
470 {
471 const u8 *in_ptr = in_buf;
472
473 u8 *out_ptr = out_buf;
474
475 for (int i = 0; i < in_len; i += 4)
476 {
477 const u8 out_val0 = f (in_ptr[0] & 0x7f);
478 const u8 out_val1 = f (in_ptr[1] & 0x7f);
479 const u8 out_val2 = f (in_ptr[2] & 0x7f);
480 const u8 out_val3 = f (in_ptr[3] & 0x7f);
481
482 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
483 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
484 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
485
486 in_ptr += 4;
487 out_ptr += 3;
488 }
489
490 for (int i = 0; i < in_len; i++)
491 {
492 if (in_buf[i] != '=') continue;
493
494 in_len = i;
495 }
496
497 int out_len = (in_len * 6) / 8;
498
499 return out_len;
500 }
501
502 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
503 {
504 const u8 *in_ptr = in_buf;
505
506 u8 *out_ptr = out_buf;
507
508 for (int i = 0; i < in_len; i += 3)
509 {
510 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
511 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
512 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
513 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
514
515 out_ptr[0] = out_val0 & 0x7f;
516 out_ptr[1] = out_val1 & 0x7f;
517 out_ptr[2] = out_val2 & 0x7f;
518 out_ptr[3] = out_val3 & 0x7f;
519
520 in_ptr += 3;
521 out_ptr += 4;
522 }
523
524 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
525
526 while (out_len % 4)
527 {
528 out_buf[out_len] = '=';
529
530 out_len++;
531 }
532
533 return out_len;
534 }
535
536 int is_valid_hex_char (const u8 c)
537 {
538 if ((c >= '0') && (c <= '9')) return 1;
539 if ((c >= 'A') && (c <= 'F')) return 1;
540 if ((c >= 'a') && (c <= 'f')) return 1;
541
542 return 0;
543 }
544
545 u8 hex_convert (const u8 c)
546 {
547 return (c & 15) + (c >> 6) * 9;
548 }
549
550 u8 hex_to_u8 (const u8 hex[2])
551 {
552 u8 v = 0;
553
554 v |= (hex_convert (hex[1]) << 0);
555 v |= (hex_convert (hex[0]) << 4);
556
557 return (v);
558 }
559
560 u32 hex_to_u32 (const u8 hex[8])
561 {
562 u32 v = 0;
563
564 v |= ((u32) hex_convert (hex[7])) << 0;
565 v |= ((u32) hex_convert (hex[6])) << 4;
566 v |= ((u32) hex_convert (hex[5])) << 8;
567 v |= ((u32) hex_convert (hex[4])) << 12;
568 v |= ((u32) hex_convert (hex[3])) << 16;
569 v |= ((u32) hex_convert (hex[2])) << 20;
570 v |= ((u32) hex_convert (hex[1])) << 24;
571 v |= ((u32) hex_convert (hex[0])) << 28;
572
573 return (v);
574 }
575
576 u64 hex_to_u64 (const u8 hex[16])
577 {
578 u64 v = 0;
579
580 v |= ((u64) hex_convert (hex[15]) << 0);
581 v |= ((u64) hex_convert (hex[14]) << 4);
582 v |= ((u64) hex_convert (hex[13]) << 8);
583 v |= ((u64) hex_convert (hex[12]) << 12);
584 v |= ((u64) hex_convert (hex[11]) << 16);
585 v |= ((u64) hex_convert (hex[10]) << 20);
586 v |= ((u64) hex_convert (hex[ 9]) << 24);
587 v |= ((u64) hex_convert (hex[ 8]) << 28);
588 v |= ((u64) hex_convert (hex[ 7]) << 32);
589 v |= ((u64) hex_convert (hex[ 6]) << 36);
590 v |= ((u64) hex_convert (hex[ 5]) << 40);
591 v |= ((u64) hex_convert (hex[ 4]) << 44);
592 v |= ((u64) hex_convert (hex[ 3]) << 48);
593 v |= ((u64) hex_convert (hex[ 2]) << 52);
594 v |= ((u64) hex_convert (hex[ 1]) << 56);
595 v |= ((u64) hex_convert (hex[ 0]) << 60);
596
597 return (v);
598 }
599
600 void bin_to_hex_lower (const u32 v, u8 hex[8])
601 {
602 hex[0] = v >> 28 & 15;
603 hex[1] = v >> 24 & 15;
604 hex[2] = v >> 20 & 15;
605 hex[3] = v >> 16 & 15;
606 hex[4] = v >> 12 & 15;
607 hex[5] = v >> 8 & 15;
608 hex[6] = v >> 4 & 15;
609 hex[7] = v >> 0 & 15;
610
611 u32 add;
612
613 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
614 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
615 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
616 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
617 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
618 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
619 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
620 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
621 }
622
623 /**
624 * decoder
625 */
626
627 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
628 {
629 AES_KEY skey;
630
631 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
632
633 u32 _iv[4] = { 0 };
634
635 _iv[0] = iv[0];
636 _iv[1] = iv[1];
637 _iv[2] = iv[2];
638 _iv[3] = iv[3];
639
640 for (int i = 0; i < 16; i += 4)
641 {
642 u32 _in[4] = { 0 };
643 u32 _out[4] = { 0 };
644
645 _in[0] = in[i + 0];
646 _in[1] = in[i + 1];
647 _in[2] = in[i + 2];
648 _in[3] = in[i + 3];
649
650 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
651
652 _out[0] ^= _iv[0];
653 _out[1] ^= _iv[1];
654 _out[2] ^= _iv[2];
655 _out[3] ^= _iv[3];
656
657 out[i + 0] = _out[0];
658 out[i + 1] = _out[1];
659 out[i + 2] = _out[2];
660 out[i + 3] = _out[3];
661
662 _iv[0] = _in[0];
663 _iv[1] = _in[1];
664 _iv[2] = _in[2];
665 _iv[3] = _in[3];
666 }
667 }
668
669 static void juniper_decrypt_hash (char *in, char *out)
670 {
671 // base64 decode
672
673 u8 base64_buf[100] = { 0 };
674
675 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
676
677 // iv stuff
678
679 u32 juniper_iv[4] = { 0 };
680
681 memcpy (juniper_iv, base64_buf, 12);
682
683 memcpy (out, juniper_iv, 12);
684
685 // reversed key
686
687 u32 juniper_key[4] = { 0 };
688
689 juniper_key[0] = byte_swap_32 (0xa6707a7e);
690 juniper_key[1] = byte_swap_32 (0x8df91059);
691 juniper_key[2] = byte_swap_32 (0xdea70ae5);
692 juniper_key[3] = byte_swap_32 (0x2f9c2442);
693
694 // AES decrypt
695
696 u32 *in_ptr = (u32 *) (base64_buf + 12);
697 u32 *out_ptr = (u32 *) (out + 12);
698
699 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
700 }
701
702 void phpass_decode (u8 digest[16], u8 buf[22])
703 {
704 int l;
705
706 l = itoa64_to_int (buf[ 0]) << 0;
707 l |= itoa64_to_int (buf[ 1]) << 6;
708 l |= itoa64_to_int (buf[ 2]) << 12;
709 l |= itoa64_to_int (buf[ 3]) << 18;
710
711 digest[ 0] = (l >> 0) & 0xff;
712 digest[ 1] = (l >> 8) & 0xff;
713 digest[ 2] = (l >> 16) & 0xff;
714
715 l = itoa64_to_int (buf[ 4]) << 0;
716 l |= itoa64_to_int (buf[ 5]) << 6;
717 l |= itoa64_to_int (buf[ 6]) << 12;
718 l |= itoa64_to_int (buf[ 7]) << 18;
719
720 digest[ 3] = (l >> 0) & 0xff;
721 digest[ 4] = (l >> 8) & 0xff;
722 digest[ 5] = (l >> 16) & 0xff;
723
724 l = itoa64_to_int (buf[ 8]) << 0;
725 l |= itoa64_to_int (buf[ 9]) << 6;
726 l |= itoa64_to_int (buf[10]) << 12;
727 l |= itoa64_to_int (buf[11]) << 18;
728
729 digest[ 6] = (l >> 0) & 0xff;
730 digest[ 7] = (l >> 8) & 0xff;
731 digest[ 8] = (l >> 16) & 0xff;
732
733 l = itoa64_to_int (buf[12]) << 0;
734 l |= itoa64_to_int (buf[13]) << 6;
735 l |= itoa64_to_int (buf[14]) << 12;
736 l |= itoa64_to_int (buf[15]) << 18;
737
738 digest[ 9] = (l >> 0) & 0xff;
739 digest[10] = (l >> 8) & 0xff;
740 digest[11] = (l >> 16) & 0xff;
741
742 l = itoa64_to_int (buf[16]) << 0;
743 l |= itoa64_to_int (buf[17]) << 6;
744 l |= itoa64_to_int (buf[18]) << 12;
745 l |= itoa64_to_int (buf[19]) << 18;
746
747 digest[12] = (l >> 0) & 0xff;
748 digest[13] = (l >> 8) & 0xff;
749 digest[14] = (l >> 16) & 0xff;
750
751 l = itoa64_to_int (buf[20]) << 0;
752 l |= itoa64_to_int (buf[21]) << 6;
753
754 digest[15] = (l >> 0) & 0xff;
755 }
756
757 void phpass_encode (u8 digest[16], u8 buf[22])
758 {
759 int l;
760
761 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
762
763 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
764 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
765 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
766 buf[ 3] = int_to_itoa64 (l & 0x3f);
767
768 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
769
770 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
771 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
772 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
773 buf[ 7] = int_to_itoa64 (l & 0x3f);
774
775 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
776
777 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
778 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
779 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[11] = int_to_itoa64 (l & 0x3f);
781
782 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
783
784 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
785 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
786 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[15] = int_to_itoa64 (l & 0x3f);
788
789 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
790
791 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
792 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
793 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
794 buf[19] = int_to_itoa64 (l & 0x3f);
795
796 l = (digest[15] << 0);
797
798 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
799 buf[21] = int_to_itoa64 (l & 0x3f);
800 }
801
802 void md5crypt_decode (u8 digest[16], u8 buf[22])
803 {
804 int l;
805
806 l = itoa64_to_int (buf[ 0]) << 0;
807 l |= itoa64_to_int (buf[ 1]) << 6;
808 l |= itoa64_to_int (buf[ 2]) << 12;
809 l |= itoa64_to_int (buf[ 3]) << 18;
810
811 digest[ 0] = (l >> 16) & 0xff;
812 digest[ 6] = (l >> 8) & 0xff;
813 digest[12] = (l >> 0) & 0xff;
814
815 l = itoa64_to_int (buf[ 4]) << 0;
816 l |= itoa64_to_int (buf[ 5]) << 6;
817 l |= itoa64_to_int (buf[ 6]) << 12;
818 l |= itoa64_to_int (buf[ 7]) << 18;
819
820 digest[ 1] = (l >> 16) & 0xff;
821 digest[ 7] = (l >> 8) & 0xff;
822 digest[13] = (l >> 0) & 0xff;
823
824 l = itoa64_to_int (buf[ 8]) << 0;
825 l |= itoa64_to_int (buf[ 9]) << 6;
826 l |= itoa64_to_int (buf[10]) << 12;
827 l |= itoa64_to_int (buf[11]) << 18;
828
829 digest[ 2] = (l >> 16) & 0xff;
830 digest[ 8] = (l >> 8) & 0xff;
831 digest[14] = (l >> 0) & 0xff;
832
833 l = itoa64_to_int (buf[12]) << 0;
834 l |= itoa64_to_int (buf[13]) << 6;
835 l |= itoa64_to_int (buf[14]) << 12;
836 l |= itoa64_to_int (buf[15]) << 18;
837
838 digest[ 3] = (l >> 16) & 0xff;
839 digest[ 9] = (l >> 8) & 0xff;
840 digest[15] = (l >> 0) & 0xff;
841
842 l = itoa64_to_int (buf[16]) << 0;
843 l |= itoa64_to_int (buf[17]) << 6;
844 l |= itoa64_to_int (buf[18]) << 12;
845 l |= itoa64_to_int (buf[19]) << 18;
846
847 digest[ 4] = (l >> 16) & 0xff;
848 digest[10] = (l >> 8) & 0xff;
849 digest[ 5] = (l >> 0) & 0xff;
850
851 l = itoa64_to_int (buf[20]) << 0;
852 l |= itoa64_to_int (buf[21]) << 6;
853
854 digest[11] = (l >> 0) & 0xff;
855 }
856
857 void md5crypt_encode (u8 digest[16], u8 buf[22])
858 {
859 int l;
860
861 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
862
863 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
864 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
865 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
866 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
867
868 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
869
870 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
871 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
872 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
873 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
874
875 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
876
877 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
878 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
879 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
881
882 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
883
884 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
885 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
886 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
888
889 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
890
891 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
892 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
893 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
894 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
895
896 l = (digest[11] << 0);
897
898 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
899 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
900 }
901
902 void sha512crypt_decode (u8 digest[64], u8 buf[86])
903 {
904 int l;
905
906 l = itoa64_to_int (buf[ 0]) << 0;
907 l |= itoa64_to_int (buf[ 1]) << 6;
908 l |= itoa64_to_int (buf[ 2]) << 12;
909 l |= itoa64_to_int (buf[ 3]) << 18;
910
911 digest[ 0] = (l >> 16) & 0xff;
912 digest[21] = (l >> 8) & 0xff;
913 digest[42] = (l >> 0) & 0xff;
914
915 l = itoa64_to_int (buf[ 4]) << 0;
916 l |= itoa64_to_int (buf[ 5]) << 6;
917 l |= itoa64_to_int (buf[ 6]) << 12;
918 l |= itoa64_to_int (buf[ 7]) << 18;
919
920 digest[22] = (l >> 16) & 0xff;
921 digest[43] = (l >> 8) & 0xff;
922 digest[ 1] = (l >> 0) & 0xff;
923
924 l = itoa64_to_int (buf[ 8]) << 0;
925 l |= itoa64_to_int (buf[ 9]) << 6;
926 l |= itoa64_to_int (buf[10]) << 12;
927 l |= itoa64_to_int (buf[11]) << 18;
928
929 digest[44] = (l >> 16) & 0xff;
930 digest[ 2] = (l >> 8) & 0xff;
931 digest[23] = (l >> 0) & 0xff;
932
933 l = itoa64_to_int (buf[12]) << 0;
934 l |= itoa64_to_int (buf[13]) << 6;
935 l |= itoa64_to_int (buf[14]) << 12;
936 l |= itoa64_to_int (buf[15]) << 18;
937
938 digest[ 3] = (l >> 16) & 0xff;
939 digest[24] = (l >> 8) & 0xff;
940 digest[45] = (l >> 0) & 0xff;
941
942 l = itoa64_to_int (buf[16]) << 0;
943 l |= itoa64_to_int (buf[17]) << 6;
944 l |= itoa64_to_int (buf[18]) << 12;
945 l |= itoa64_to_int (buf[19]) << 18;
946
947 digest[25] = (l >> 16) & 0xff;
948 digest[46] = (l >> 8) & 0xff;
949 digest[ 4] = (l >> 0) & 0xff;
950
951 l = itoa64_to_int (buf[20]) << 0;
952 l |= itoa64_to_int (buf[21]) << 6;
953 l |= itoa64_to_int (buf[22]) << 12;
954 l |= itoa64_to_int (buf[23]) << 18;
955
956 digest[47] = (l >> 16) & 0xff;
957 digest[ 5] = (l >> 8) & 0xff;
958 digest[26] = (l >> 0) & 0xff;
959
960 l = itoa64_to_int (buf[24]) << 0;
961 l |= itoa64_to_int (buf[25]) << 6;
962 l |= itoa64_to_int (buf[26]) << 12;
963 l |= itoa64_to_int (buf[27]) << 18;
964
965 digest[ 6] = (l >> 16) & 0xff;
966 digest[27] = (l >> 8) & 0xff;
967 digest[48] = (l >> 0) & 0xff;
968
969 l = itoa64_to_int (buf[28]) << 0;
970 l |= itoa64_to_int (buf[29]) << 6;
971 l |= itoa64_to_int (buf[30]) << 12;
972 l |= itoa64_to_int (buf[31]) << 18;
973
974 digest[28] = (l >> 16) & 0xff;
975 digest[49] = (l >> 8) & 0xff;
976 digest[ 7] = (l >> 0) & 0xff;
977
978 l = itoa64_to_int (buf[32]) << 0;
979 l |= itoa64_to_int (buf[33]) << 6;
980 l |= itoa64_to_int (buf[34]) << 12;
981 l |= itoa64_to_int (buf[35]) << 18;
982
983 digest[50] = (l >> 16) & 0xff;
984 digest[ 8] = (l >> 8) & 0xff;
985 digest[29] = (l >> 0) & 0xff;
986
987 l = itoa64_to_int (buf[36]) << 0;
988 l |= itoa64_to_int (buf[37]) << 6;
989 l |= itoa64_to_int (buf[38]) << 12;
990 l |= itoa64_to_int (buf[39]) << 18;
991
992 digest[ 9] = (l >> 16) & 0xff;
993 digest[30] = (l >> 8) & 0xff;
994 digest[51] = (l >> 0) & 0xff;
995
996 l = itoa64_to_int (buf[40]) << 0;
997 l |= itoa64_to_int (buf[41]) << 6;
998 l |= itoa64_to_int (buf[42]) << 12;
999 l |= itoa64_to_int (buf[43]) << 18;
1000
1001 digest[31] = (l >> 16) & 0xff;
1002 digest[52] = (l >> 8) & 0xff;
1003 digest[10] = (l >> 0) & 0xff;
1004
1005 l = itoa64_to_int (buf[44]) << 0;
1006 l |= itoa64_to_int (buf[45]) << 6;
1007 l |= itoa64_to_int (buf[46]) << 12;
1008 l |= itoa64_to_int (buf[47]) << 18;
1009
1010 digest[53] = (l >> 16) & 0xff;
1011 digest[11] = (l >> 8) & 0xff;
1012 digest[32] = (l >> 0) & 0xff;
1013
1014 l = itoa64_to_int (buf[48]) << 0;
1015 l |= itoa64_to_int (buf[49]) << 6;
1016 l |= itoa64_to_int (buf[50]) << 12;
1017 l |= itoa64_to_int (buf[51]) << 18;
1018
1019 digest[12] = (l >> 16) & 0xff;
1020 digest[33] = (l >> 8) & 0xff;
1021 digest[54] = (l >> 0) & 0xff;
1022
1023 l = itoa64_to_int (buf[52]) << 0;
1024 l |= itoa64_to_int (buf[53]) << 6;
1025 l |= itoa64_to_int (buf[54]) << 12;
1026 l |= itoa64_to_int (buf[55]) << 18;
1027
1028 digest[34] = (l >> 16) & 0xff;
1029 digest[55] = (l >> 8) & 0xff;
1030 digest[13] = (l >> 0) & 0xff;
1031
1032 l = itoa64_to_int (buf[56]) << 0;
1033 l |= itoa64_to_int (buf[57]) << 6;
1034 l |= itoa64_to_int (buf[58]) << 12;
1035 l |= itoa64_to_int (buf[59]) << 18;
1036
1037 digest[56] = (l >> 16) & 0xff;
1038 digest[14] = (l >> 8) & 0xff;
1039 digest[35] = (l >> 0) & 0xff;
1040
1041 l = itoa64_to_int (buf[60]) << 0;
1042 l |= itoa64_to_int (buf[61]) << 6;
1043 l |= itoa64_to_int (buf[62]) << 12;
1044 l |= itoa64_to_int (buf[63]) << 18;
1045
1046 digest[15] = (l >> 16) & 0xff;
1047 digest[36] = (l >> 8) & 0xff;
1048 digest[57] = (l >> 0) & 0xff;
1049
1050 l = itoa64_to_int (buf[64]) << 0;
1051 l |= itoa64_to_int (buf[65]) << 6;
1052 l |= itoa64_to_int (buf[66]) << 12;
1053 l |= itoa64_to_int (buf[67]) << 18;
1054
1055 digest[37] = (l >> 16) & 0xff;
1056 digest[58] = (l >> 8) & 0xff;
1057 digest[16] = (l >> 0) & 0xff;
1058
1059 l = itoa64_to_int (buf[68]) << 0;
1060 l |= itoa64_to_int (buf[69]) << 6;
1061 l |= itoa64_to_int (buf[70]) << 12;
1062 l |= itoa64_to_int (buf[71]) << 18;
1063
1064 digest[59] = (l >> 16) & 0xff;
1065 digest[17] = (l >> 8) & 0xff;
1066 digest[38] = (l >> 0) & 0xff;
1067
1068 l = itoa64_to_int (buf[72]) << 0;
1069 l |= itoa64_to_int (buf[73]) << 6;
1070 l |= itoa64_to_int (buf[74]) << 12;
1071 l |= itoa64_to_int (buf[75]) << 18;
1072
1073 digest[18] = (l >> 16) & 0xff;
1074 digest[39] = (l >> 8) & 0xff;
1075 digest[60] = (l >> 0) & 0xff;
1076
1077 l = itoa64_to_int (buf[76]) << 0;
1078 l |= itoa64_to_int (buf[77]) << 6;
1079 l |= itoa64_to_int (buf[78]) << 12;
1080 l |= itoa64_to_int (buf[79]) << 18;
1081
1082 digest[40] = (l >> 16) & 0xff;
1083 digest[61] = (l >> 8) & 0xff;
1084 digest[19] = (l >> 0) & 0xff;
1085
1086 l = itoa64_to_int (buf[80]) << 0;
1087 l |= itoa64_to_int (buf[81]) << 6;
1088 l |= itoa64_to_int (buf[82]) << 12;
1089 l |= itoa64_to_int (buf[83]) << 18;
1090
1091 digest[62] = (l >> 16) & 0xff;
1092 digest[20] = (l >> 8) & 0xff;
1093 digest[41] = (l >> 0) & 0xff;
1094
1095 l = itoa64_to_int (buf[84]) << 0;
1096 l |= itoa64_to_int (buf[85]) << 6;
1097
1098 digest[63] = (l >> 0) & 0xff;
1099 }
1100
1101 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1102 {
1103 int l;
1104
1105 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1106
1107 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1108 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1109 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111
1112 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1113
1114 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1115 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1116 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118
1119 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1120
1121 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1122 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1123 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125
1126 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1127
1128 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1129 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1130 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132
1133 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1134
1135 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1136 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1137 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139
1140 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1141
1142 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1143 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1144 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146
1147 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1148
1149 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1150 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1151 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153
1154 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1155
1156 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1157 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1158 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160
1161 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1162
1163 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1164 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1165 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167
1168 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1169
1170 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1171 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1172 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174
1175 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1176
1177 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1178 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1179 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181
1182 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1183
1184 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1185 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1186 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188
1189 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1190
1191 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1192 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1193 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195
1196 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1197
1198 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1199 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1200 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202
1203 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1204
1205 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1206 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1207 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209
1210 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1211
1212 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1213 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1214 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216
1217 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1218
1219 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1220 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1221 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223
1224 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1225
1226 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1227 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1228 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230
1231 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1232
1233 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1234 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1235 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237
1238 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1239
1240 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1241 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1242 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244
1245 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1246
1247 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1248 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1249 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1250 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251
1252 l = 0 | 0 | (digest[63] << 0);
1253
1254 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1255 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1256 }
1257
1258 void sha1aix_decode (u8 digest[20], u8 buf[27])
1259 {
1260 int l;
1261
1262 l = itoa64_to_int (buf[ 0]) << 0;
1263 l |= itoa64_to_int (buf[ 1]) << 6;
1264 l |= itoa64_to_int (buf[ 2]) << 12;
1265 l |= itoa64_to_int (buf[ 3]) << 18;
1266
1267 digest[ 2] = (l >> 0) & 0xff;
1268 digest[ 1] = (l >> 8) & 0xff;
1269 digest[ 0] = (l >> 16) & 0xff;
1270
1271 l = itoa64_to_int (buf[ 4]) << 0;
1272 l |= itoa64_to_int (buf[ 5]) << 6;
1273 l |= itoa64_to_int (buf[ 6]) << 12;
1274 l |= itoa64_to_int (buf[ 7]) << 18;
1275
1276 digest[ 5] = (l >> 0) & 0xff;
1277 digest[ 4] = (l >> 8) & 0xff;
1278 digest[ 3] = (l >> 16) & 0xff;
1279
1280 l = itoa64_to_int (buf[ 8]) << 0;
1281 l |= itoa64_to_int (buf[ 9]) << 6;
1282 l |= itoa64_to_int (buf[10]) << 12;
1283 l |= itoa64_to_int (buf[11]) << 18;
1284
1285 digest[ 8] = (l >> 0) & 0xff;
1286 digest[ 7] = (l >> 8) & 0xff;
1287 digest[ 6] = (l >> 16) & 0xff;
1288
1289 l = itoa64_to_int (buf[12]) << 0;
1290 l |= itoa64_to_int (buf[13]) << 6;
1291 l |= itoa64_to_int (buf[14]) << 12;
1292 l |= itoa64_to_int (buf[15]) << 18;
1293
1294 digest[11] = (l >> 0) & 0xff;
1295 digest[10] = (l >> 8) & 0xff;
1296 digest[ 9] = (l >> 16) & 0xff;
1297
1298 l = itoa64_to_int (buf[16]) << 0;
1299 l |= itoa64_to_int (buf[17]) << 6;
1300 l |= itoa64_to_int (buf[18]) << 12;
1301 l |= itoa64_to_int (buf[19]) << 18;
1302
1303 digest[14] = (l >> 0) & 0xff;
1304 digest[13] = (l >> 8) & 0xff;
1305 digest[12] = (l >> 16) & 0xff;
1306
1307 l = itoa64_to_int (buf[20]) << 0;
1308 l |= itoa64_to_int (buf[21]) << 6;
1309 l |= itoa64_to_int (buf[22]) << 12;
1310 l |= itoa64_to_int (buf[23]) << 18;
1311
1312 digest[17] = (l >> 0) & 0xff;
1313 digest[16] = (l >> 8) & 0xff;
1314 digest[15] = (l >> 16) & 0xff;
1315
1316 l = itoa64_to_int (buf[24]) << 0;
1317 l |= itoa64_to_int (buf[25]) << 6;
1318 l |= itoa64_to_int (buf[26]) << 12;
1319
1320 digest[19] = (l >> 8) & 0xff;
1321 digest[18] = (l >> 16) & 0xff;
1322 }
1323
1324 void sha1aix_encode (u8 digest[20], u8 buf[27])
1325 {
1326 int l;
1327
1328 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1329
1330 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1331 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1332 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1333 buf[ 3] = int_to_itoa64 (l & 0x3f);
1334
1335 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1336
1337 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1338 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1339 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1340 buf[ 7] = int_to_itoa64 (l & 0x3f);
1341
1342 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1343
1344 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1345 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1346 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[11] = int_to_itoa64 (l & 0x3f);
1348
1349 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1350
1351 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1352 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1353 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[15] = int_to_itoa64 (l & 0x3f);
1355
1356 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1357
1358 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1359 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1360 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[19] = int_to_itoa64 (l & 0x3f);
1362
1363 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1364
1365 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1366 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1367 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1368 buf[23] = int_to_itoa64 (l & 0x3f);
1369
1370 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1371
1372 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1373 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1374 buf[26] = int_to_itoa64 (l & 0x3f);
1375 }
1376
1377 void sha256aix_decode (u8 digest[32], u8 buf[43])
1378 {
1379 int l;
1380
1381 l = itoa64_to_int (buf[ 0]) << 0;
1382 l |= itoa64_to_int (buf[ 1]) << 6;
1383 l |= itoa64_to_int (buf[ 2]) << 12;
1384 l |= itoa64_to_int (buf[ 3]) << 18;
1385
1386 digest[ 2] = (l >> 0) & 0xff;
1387 digest[ 1] = (l >> 8) & 0xff;
1388 digest[ 0] = (l >> 16) & 0xff;
1389
1390 l = itoa64_to_int (buf[ 4]) << 0;
1391 l |= itoa64_to_int (buf[ 5]) << 6;
1392 l |= itoa64_to_int (buf[ 6]) << 12;
1393 l |= itoa64_to_int (buf[ 7]) << 18;
1394
1395 digest[ 5] = (l >> 0) & 0xff;
1396 digest[ 4] = (l >> 8) & 0xff;
1397 digest[ 3] = (l >> 16) & 0xff;
1398
1399 l = itoa64_to_int (buf[ 8]) << 0;
1400 l |= itoa64_to_int (buf[ 9]) << 6;
1401 l |= itoa64_to_int (buf[10]) << 12;
1402 l |= itoa64_to_int (buf[11]) << 18;
1403
1404 digest[ 8] = (l >> 0) & 0xff;
1405 digest[ 7] = (l >> 8) & 0xff;
1406 digest[ 6] = (l >> 16) & 0xff;
1407
1408 l = itoa64_to_int (buf[12]) << 0;
1409 l |= itoa64_to_int (buf[13]) << 6;
1410 l |= itoa64_to_int (buf[14]) << 12;
1411 l |= itoa64_to_int (buf[15]) << 18;
1412
1413 digest[11] = (l >> 0) & 0xff;
1414 digest[10] = (l >> 8) & 0xff;
1415 digest[ 9] = (l >> 16) & 0xff;
1416
1417 l = itoa64_to_int (buf[16]) << 0;
1418 l |= itoa64_to_int (buf[17]) << 6;
1419 l |= itoa64_to_int (buf[18]) << 12;
1420 l |= itoa64_to_int (buf[19]) << 18;
1421
1422 digest[14] = (l >> 0) & 0xff;
1423 digest[13] = (l >> 8) & 0xff;
1424 digest[12] = (l >> 16) & 0xff;
1425
1426 l = itoa64_to_int (buf[20]) << 0;
1427 l |= itoa64_to_int (buf[21]) << 6;
1428 l |= itoa64_to_int (buf[22]) << 12;
1429 l |= itoa64_to_int (buf[23]) << 18;
1430
1431 digest[17] = (l >> 0) & 0xff;
1432 digest[16] = (l >> 8) & 0xff;
1433 digest[15] = (l >> 16) & 0xff;
1434
1435 l = itoa64_to_int (buf[24]) << 0;
1436 l |= itoa64_to_int (buf[25]) << 6;
1437 l |= itoa64_to_int (buf[26]) << 12;
1438 l |= itoa64_to_int (buf[27]) << 18;
1439
1440 digest[20] = (l >> 0) & 0xff;
1441 digest[19] = (l >> 8) & 0xff;
1442 digest[18] = (l >> 16) & 0xff;
1443
1444 l = itoa64_to_int (buf[28]) << 0;
1445 l |= itoa64_to_int (buf[29]) << 6;
1446 l |= itoa64_to_int (buf[30]) << 12;
1447 l |= itoa64_to_int (buf[31]) << 18;
1448
1449 digest[23] = (l >> 0) & 0xff;
1450 digest[22] = (l >> 8) & 0xff;
1451 digest[21] = (l >> 16) & 0xff;
1452
1453 l = itoa64_to_int (buf[32]) << 0;
1454 l |= itoa64_to_int (buf[33]) << 6;
1455 l |= itoa64_to_int (buf[34]) << 12;
1456 l |= itoa64_to_int (buf[35]) << 18;
1457
1458 digest[26] = (l >> 0) & 0xff;
1459 digest[25] = (l >> 8) & 0xff;
1460 digest[24] = (l >> 16) & 0xff;
1461
1462 l = itoa64_to_int (buf[36]) << 0;
1463 l |= itoa64_to_int (buf[37]) << 6;
1464 l |= itoa64_to_int (buf[38]) << 12;
1465 l |= itoa64_to_int (buf[39]) << 18;
1466
1467 digest[29] = (l >> 0) & 0xff;
1468 digest[28] = (l >> 8) & 0xff;
1469 digest[27] = (l >> 16) & 0xff;
1470
1471 l = itoa64_to_int (buf[40]) << 0;
1472 l |= itoa64_to_int (buf[41]) << 6;
1473 l |= itoa64_to_int (buf[42]) << 12;
1474
1475 //digest[32] = (l >> 0) & 0xff;
1476 digest[31] = (l >> 8) & 0xff;
1477 digest[30] = (l >> 16) & 0xff;
1478 }
1479
1480 void sha256aix_encode (u8 digest[32], u8 buf[43])
1481 {
1482 int l;
1483
1484 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1485
1486 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1487 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1488 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1489 buf[ 3] = int_to_itoa64 (l & 0x3f);
1490
1491 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1492
1493 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1494 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1495 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1496 buf[ 7] = int_to_itoa64 (l & 0x3f);
1497
1498 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1499
1500 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1501 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1502 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[11] = int_to_itoa64 (l & 0x3f);
1504
1505 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1506
1507 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1508 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1509 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[15] = int_to_itoa64 (l & 0x3f);
1511
1512 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1513
1514 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1515 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1516 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[19] = int_to_itoa64 (l & 0x3f);
1518
1519 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1520
1521 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1522 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1523 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[23] = int_to_itoa64 (l & 0x3f);
1525
1526 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1527
1528 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1529 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1530 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[27] = int_to_itoa64 (l & 0x3f);
1532
1533 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1534
1535 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1536 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1537 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[31] = int_to_itoa64 (l & 0x3f);
1539
1540 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1541
1542 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1543 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1544 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[35] = int_to_itoa64 (l & 0x3f);
1546
1547 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1548
1549 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1550 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1551 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1552 buf[39] = int_to_itoa64 (l & 0x3f);
1553
1554 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1555
1556 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1557 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1558 buf[42] = int_to_itoa64 (l & 0x3f);
1559 }
1560
1561 void sha512aix_decode (u8 digest[64], u8 buf[86])
1562 {
1563 int l;
1564
1565 l = itoa64_to_int (buf[ 0]) << 0;
1566 l |= itoa64_to_int (buf[ 1]) << 6;
1567 l |= itoa64_to_int (buf[ 2]) << 12;
1568 l |= itoa64_to_int (buf[ 3]) << 18;
1569
1570 digest[ 2] = (l >> 0) & 0xff;
1571 digest[ 1] = (l >> 8) & 0xff;
1572 digest[ 0] = (l >> 16) & 0xff;
1573
1574 l = itoa64_to_int (buf[ 4]) << 0;
1575 l |= itoa64_to_int (buf[ 5]) << 6;
1576 l |= itoa64_to_int (buf[ 6]) << 12;
1577 l |= itoa64_to_int (buf[ 7]) << 18;
1578
1579 digest[ 5] = (l >> 0) & 0xff;
1580 digest[ 4] = (l >> 8) & 0xff;
1581 digest[ 3] = (l >> 16) & 0xff;
1582
1583 l = itoa64_to_int (buf[ 8]) << 0;
1584 l |= itoa64_to_int (buf[ 9]) << 6;
1585 l |= itoa64_to_int (buf[10]) << 12;
1586 l |= itoa64_to_int (buf[11]) << 18;
1587
1588 digest[ 8] = (l >> 0) & 0xff;
1589 digest[ 7] = (l >> 8) & 0xff;
1590 digest[ 6] = (l >> 16) & 0xff;
1591
1592 l = itoa64_to_int (buf[12]) << 0;
1593 l |= itoa64_to_int (buf[13]) << 6;
1594 l |= itoa64_to_int (buf[14]) << 12;
1595 l |= itoa64_to_int (buf[15]) << 18;
1596
1597 digest[11] = (l >> 0) & 0xff;
1598 digest[10] = (l >> 8) & 0xff;
1599 digest[ 9] = (l >> 16) & 0xff;
1600
1601 l = itoa64_to_int (buf[16]) << 0;
1602 l |= itoa64_to_int (buf[17]) << 6;
1603 l |= itoa64_to_int (buf[18]) << 12;
1604 l |= itoa64_to_int (buf[19]) << 18;
1605
1606 digest[14] = (l >> 0) & 0xff;
1607 digest[13] = (l >> 8) & 0xff;
1608 digest[12] = (l >> 16) & 0xff;
1609
1610 l = itoa64_to_int (buf[20]) << 0;
1611 l |= itoa64_to_int (buf[21]) << 6;
1612 l |= itoa64_to_int (buf[22]) << 12;
1613 l |= itoa64_to_int (buf[23]) << 18;
1614
1615 digest[17] = (l >> 0) & 0xff;
1616 digest[16] = (l >> 8) & 0xff;
1617 digest[15] = (l >> 16) & 0xff;
1618
1619 l = itoa64_to_int (buf[24]) << 0;
1620 l |= itoa64_to_int (buf[25]) << 6;
1621 l |= itoa64_to_int (buf[26]) << 12;
1622 l |= itoa64_to_int (buf[27]) << 18;
1623
1624 digest[20] = (l >> 0) & 0xff;
1625 digest[19] = (l >> 8) & 0xff;
1626 digest[18] = (l >> 16) & 0xff;
1627
1628 l = itoa64_to_int (buf[28]) << 0;
1629 l |= itoa64_to_int (buf[29]) << 6;
1630 l |= itoa64_to_int (buf[30]) << 12;
1631 l |= itoa64_to_int (buf[31]) << 18;
1632
1633 digest[23] = (l >> 0) & 0xff;
1634 digest[22] = (l >> 8) & 0xff;
1635 digest[21] = (l >> 16) & 0xff;
1636
1637 l = itoa64_to_int (buf[32]) << 0;
1638 l |= itoa64_to_int (buf[33]) << 6;
1639 l |= itoa64_to_int (buf[34]) << 12;
1640 l |= itoa64_to_int (buf[35]) << 18;
1641
1642 digest[26] = (l >> 0) & 0xff;
1643 digest[25] = (l >> 8) & 0xff;
1644 digest[24] = (l >> 16) & 0xff;
1645
1646 l = itoa64_to_int (buf[36]) << 0;
1647 l |= itoa64_to_int (buf[37]) << 6;
1648 l |= itoa64_to_int (buf[38]) << 12;
1649 l |= itoa64_to_int (buf[39]) << 18;
1650
1651 digest[29] = (l >> 0) & 0xff;
1652 digest[28] = (l >> 8) & 0xff;
1653 digest[27] = (l >> 16) & 0xff;
1654
1655 l = itoa64_to_int (buf[40]) << 0;
1656 l |= itoa64_to_int (buf[41]) << 6;
1657 l |= itoa64_to_int (buf[42]) << 12;
1658 l |= itoa64_to_int (buf[43]) << 18;
1659
1660 digest[32] = (l >> 0) & 0xff;
1661 digest[31] = (l >> 8) & 0xff;
1662 digest[30] = (l >> 16) & 0xff;
1663
1664 l = itoa64_to_int (buf[44]) << 0;
1665 l |= itoa64_to_int (buf[45]) << 6;
1666 l |= itoa64_to_int (buf[46]) << 12;
1667 l |= itoa64_to_int (buf[47]) << 18;
1668
1669 digest[35] = (l >> 0) & 0xff;
1670 digest[34] = (l >> 8) & 0xff;
1671 digest[33] = (l >> 16) & 0xff;
1672
1673 l = itoa64_to_int (buf[48]) << 0;
1674 l |= itoa64_to_int (buf[49]) << 6;
1675 l |= itoa64_to_int (buf[50]) << 12;
1676 l |= itoa64_to_int (buf[51]) << 18;
1677
1678 digest[38] = (l >> 0) & 0xff;
1679 digest[37] = (l >> 8) & 0xff;
1680 digest[36] = (l >> 16) & 0xff;
1681
1682 l = itoa64_to_int (buf[52]) << 0;
1683 l |= itoa64_to_int (buf[53]) << 6;
1684 l |= itoa64_to_int (buf[54]) << 12;
1685 l |= itoa64_to_int (buf[55]) << 18;
1686
1687 digest[41] = (l >> 0) & 0xff;
1688 digest[40] = (l >> 8) & 0xff;
1689 digest[39] = (l >> 16) & 0xff;
1690
1691 l = itoa64_to_int (buf[56]) << 0;
1692 l |= itoa64_to_int (buf[57]) << 6;
1693 l |= itoa64_to_int (buf[58]) << 12;
1694 l |= itoa64_to_int (buf[59]) << 18;
1695
1696 digest[44] = (l >> 0) & 0xff;
1697 digest[43] = (l >> 8) & 0xff;
1698 digest[42] = (l >> 16) & 0xff;
1699
1700 l = itoa64_to_int (buf[60]) << 0;
1701 l |= itoa64_to_int (buf[61]) << 6;
1702 l |= itoa64_to_int (buf[62]) << 12;
1703 l |= itoa64_to_int (buf[63]) << 18;
1704
1705 digest[47] = (l >> 0) & 0xff;
1706 digest[46] = (l >> 8) & 0xff;
1707 digest[45] = (l >> 16) & 0xff;
1708
1709 l = itoa64_to_int (buf[64]) << 0;
1710 l |= itoa64_to_int (buf[65]) << 6;
1711 l |= itoa64_to_int (buf[66]) << 12;
1712 l |= itoa64_to_int (buf[67]) << 18;
1713
1714 digest[50] = (l >> 0) & 0xff;
1715 digest[49] = (l >> 8) & 0xff;
1716 digest[48] = (l >> 16) & 0xff;
1717
1718 l = itoa64_to_int (buf[68]) << 0;
1719 l |= itoa64_to_int (buf[69]) << 6;
1720 l |= itoa64_to_int (buf[70]) << 12;
1721 l |= itoa64_to_int (buf[71]) << 18;
1722
1723 digest[53] = (l >> 0) & 0xff;
1724 digest[52] = (l >> 8) & 0xff;
1725 digest[51] = (l >> 16) & 0xff;
1726
1727 l = itoa64_to_int (buf[72]) << 0;
1728 l |= itoa64_to_int (buf[73]) << 6;
1729 l |= itoa64_to_int (buf[74]) << 12;
1730 l |= itoa64_to_int (buf[75]) << 18;
1731
1732 digest[56] = (l >> 0) & 0xff;
1733 digest[55] = (l >> 8) & 0xff;
1734 digest[54] = (l >> 16) & 0xff;
1735
1736 l = itoa64_to_int (buf[76]) << 0;
1737 l |= itoa64_to_int (buf[77]) << 6;
1738 l |= itoa64_to_int (buf[78]) << 12;
1739 l |= itoa64_to_int (buf[79]) << 18;
1740
1741 digest[59] = (l >> 0) & 0xff;
1742 digest[58] = (l >> 8) & 0xff;
1743 digest[57] = (l >> 16) & 0xff;
1744
1745 l = itoa64_to_int (buf[80]) << 0;
1746 l |= itoa64_to_int (buf[81]) << 6;
1747 l |= itoa64_to_int (buf[82]) << 12;
1748 l |= itoa64_to_int (buf[83]) << 18;
1749
1750 digest[62] = (l >> 0) & 0xff;
1751 digest[61] = (l >> 8) & 0xff;
1752 digest[60] = (l >> 16) & 0xff;
1753
1754 l = itoa64_to_int (buf[84]) << 0;
1755 l |= itoa64_to_int (buf[85]) << 6;
1756
1757 digest[63] = (l >> 16) & 0xff;
1758 }
1759
1760 void sha512aix_encode (u8 digest[64], u8 buf[86])
1761 {
1762 int l;
1763
1764 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1765
1766 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1767 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1768 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1769 buf[ 3] = int_to_itoa64 (l & 0x3f);
1770
1771 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1772
1773 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1774 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1775 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1776 buf[ 7] = int_to_itoa64 (l & 0x3f);
1777
1778 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1779
1780 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1781 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1782 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[11] = int_to_itoa64 (l & 0x3f);
1784
1785 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1786
1787 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1788 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1789 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[15] = int_to_itoa64 (l & 0x3f);
1791
1792 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1793
1794 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1795 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1796 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[19] = int_to_itoa64 (l & 0x3f);
1798
1799 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1800
1801 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1802 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1803 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[23] = int_to_itoa64 (l & 0x3f);
1805
1806 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1807
1808 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1809 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1810 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[27] = int_to_itoa64 (l & 0x3f);
1812
1813 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1814
1815 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1816 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1817 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[31] = int_to_itoa64 (l & 0x3f);
1819
1820 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1821
1822 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1823 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1824 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[35] = int_to_itoa64 (l & 0x3f);
1826
1827 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1828
1829 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1830 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1831 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[39] = int_to_itoa64 (l & 0x3f);
1833
1834 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1835
1836 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1837 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1838 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[43] = int_to_itoa64 (l & 0x3f);
1840
1841 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1842
1843 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1844 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1845 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[47] = int_to_itoa64 (l & 0x3f);
1847
1848 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1849
1850 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1851 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1852 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[51] = int_to_itoa64 (l & 0x3f);
1854
1855 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1856
1857 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1858 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1859 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[55] = int_to_itoa64 (l & 0x3f);
1861
1862 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1863
1864 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1865 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1866 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[59] = int_to_itoa64 (l & 0x3f);
1868
1869 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1870
1871 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1872 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1873 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[63] = int_to_itoa64 (l & 0x3f);
1875
1876 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1877
1878 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1879 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1880 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[67] = int_to_itoa64 (l & 0x3f);
1882
1883 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1884
1885 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1886 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1887 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[71] = int_to_itoa64 (l & 0x3f);
1889
1890 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1891
1892 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1893 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1894 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[75] = int_to_itoa64 (l & 0x3f);
1896
1897 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1898
1899 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1900 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1901 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[79] = int_to_itoa64 (l & 0x3f);
1903
1904 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1905
1906 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1907 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1908 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1909 buf[83] = int_to_itoa64 (l & 0x3f);
1910
1911 l = 0 | 0 | (digest[63] << 16);
1912
1913 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1914 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1915 }
1916
1917 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1918 {
1919 int l;
1920
1921 l = itoa64_to_int (buf[ 0]) << 0;
1922 l |= itoa64_to_int (buf[ 1]) << 6;
1923 l |= itoa64_to_int (buf[ 2]) << 12;
1924 l |= itoa64_to_int (buf[ 3]) << 18;
1925
1926 digest[ 0] = (l >> 16) & 0xff;
1927 digest[10] = (l >> 8) & 0xff;
1928 digest[20] = (l >> 0) & 0xff;
1929
1930 l = itoa64_to_int (buf[ 4]) << 0;
1931 l |= itoa64_to_int (buf[ 5]) << 6;
1932 l |= itoa64_to_int (buf[ 6]) << 12;
1933 l |= itoa64_to_int (buf[ 7]) << 18;
1934
1935 digest[21] = (l >> 16) & 0xff;
1936 digest[ 1] = (l >> 8) & 0xff;
1937 digest[11] = (l >> 0) & 0xff;
1938
1939 l = itoa64_to_int (buf[ 8]) << 0;
1940 l |= itoa64_to_int (buf[ 9]) << 6;
1941 l |= itoa64_to_int (buf[10]) << 12;
1942 l |= itoa64_to_int (buf[11]) << 18;
1943
1944 digest[12] = (l >> 16) & 0xff;
1945 digest[22] = (l >> 8) & 0xff;
1946 digest[ 2] = (l >> 0) & 0xff;
1947
1948 l = itoa64_to_int (buf[12]) << 0;
1949 l |= itoa64_to_int (buf[13]) << 6;
1950 l |= itoa64_to_int (buf[14]) << 12;
1951 l |= itoa64_to_int (buf[15]) << 18;
1952
1953 digest[ 3] = (l >> 16) & 0xff;
1954 digest[13] = (l >> 8) & 0xff;
1955 digest[23] = (l >> 0) & 0xff;
1956
1957 l = itoa64_to_int (buf[16]) << 0;
1958 l |= itoa64_to_int (buf[17]) << 6;
1959 l |= itoa64_to_int (buf[18]) << 12;
1960 l |= itoa64_to_int (buf[19]) << 18;
1961
1962 digest[24] = (l >> 16) & 0xff;
1963 digest[ 4] = (l >> 8) & 0xff;
1964 digest[14] = (l >> 0) & 0xff;
1965
1966 l = itoa64_to_int (buf[20]) << 0;
1967 l |= itoa64_to_int (buf[21]) << 6;
1968 l |= itoa64_to_int (buf[22]) << 12;
1969 l |= itoa64_to_int (buf[23]) << 18;
1970
1971 digest[15] = (l >> 16) & 0xff;
1972 digest[25] = (l >> 8) & 0xff;
1973 digest[ 5] = (l >> 0) & 0xff;
1974
1975 l = itoa64_to_int (buf[24]) << 0;
1976 l |= itoa64_to_int (buf[25]) << 6;
1977 l |= itoa64_to_int (buf[26]) << 12;
1978 l |= itoa64_to_int (buf[27]) << 18;
1979
1980 digest[ 6] = (l >> 16) & 0xff;
1981 digest[16] = (l >> 8) & 0xff;
1982 digest[26] = (l >> 0) & 0xff;
1983
1984 l = itoa64_to_int (buf[28]) << 0;
1985 l |= itoa64_to_int (buf[29]) << 6;
1986 l |= itoa64_to_int (buf[30]) << 12;
1987 l |= itoa64_to_int (buf[31]) << 18;
1988
1989 digest[27] = (l >> 16) & 0xff;
1990 digest[ 7] = (l >> 8) & 0xff;
1991 digest[17] = (l >> 0) & 0xff;
1992
1993 l = itoa64_to_int (buf[32]) << 0;
1994 l |= itoa64_to_int (buf[33]) << 6;
1995 l |= itoa64_to_int (buf[34]) << 12;
1996 l |= itoa64_to_int (buf[35]) << 18;
1997
1998 digest[18] = (l >> 16) & 0xff;
1999 digest[28] = (l >> 8) & 0xff;
2000 digest[ 8] = (l >> 0) & 0xff;
2001
2002 l = itoa64_to_int (buf[36]) << 0;
2003 l |= itoa64_to_int (buf[37]) << 6;
2004 l |= itoa64_to_int (buf[38]) << 12;
2005 l |= itoa64_to_int (buf[39]) << 18;
2006
2007 digest[ 9] = (l >> 16) & 0xff;
2008 digest[19] = (l >> 8) & 0xff;
2009 digest[29] = (l >> 0) & 0xff;
2010
2011 l = itoa64_to_int (buf[40]) << 0;
2012 l |= itoa64_to_int (buf[41]) << 6;
2013 l |= itoa64_to_int (buf[42]) << 12;
2014
2015 digest[31] = (l >> 8) & 0xff;
2016 digest[30] = (l >> 0) & 0xff;
2017 }
2018
2019 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2020 {
2021 int l;
2022
2023 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2024
2025 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2026 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2027 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029
2030 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2031
2032 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2033 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2034 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036
2037 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2038
2039 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2040 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2041 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043
2044 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2045
2046 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2047 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2048 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050
2051 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2052
2053 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2054 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2055 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057
2058 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2059
2060 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2061 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2062 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064
2065 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2066
2067 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2068 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2069 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071
2072 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2073
2074 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2075 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2076 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078
2079 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2080
2081 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2082 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2083 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085
2086 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2087
2088 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2089 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2090 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2091 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092
2093 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2094
2095 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2096 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2097 buf[42] = int_to_itoa64 (l & 0x3f);
2098 }
2099
2100 void drupal7_decode (u8 digest[64], u8 buf[44])
2101 {
2102 int l;
2103
2104 l = itoa64_to_int (buf[ 0]) << 0;
2105 l |= itoa64_to_int (buf[ 1]) << 6;
2106 l |= itoa64_to_int (buf[ 2]) << 12;
2107 l |= itoa64_to_int (buf[ 3]) << 18;
2108
2109 digest[ 0] = (l >> 0) & 0xff;
2110 digest[ 1] = (l >> 8) & 0xff;
2111 digest[ 2] = (l >> 16) & 0xff;
2112
2113 l = itoa64_to_int (buf[ 4]) << 0;
2114 l |= itoa64_to_int (buf[ 5]) << 6;
2115 l |= itoa64_to_int (buf[ 6]) << 12;
2116 l |= itoa64_to_int (buf[ 7]) << 18;
2117
2118 digest[ 3] = (l >> 0) & 0xff;
2119 digest[ 4] = (l >> 8) & 0xff;
2120 digest[ 5] = (l >> 16) & 0xff;
2121
2122 l = itoa64_to_int (buf[ 8]) << 0;
2123 l |= itoa64_to_int (buf[ 9]) << 6;
2124 l |= itoa64_to_int (buf[10]) << 12;
2125 l |= itoa64_to_int (buf[11]) << 18;
2126
2127 digest[ 6] = (l >> 0) & 0xff;
2128 digest[ 7] = (l >> 8) & 0xff;
2129 digest[ 8] = (l >> 16) & 0xff;
2130
2131 l = itoa64_to_int (buf[12]) << 0;
2132 l |= itoa64_to_int (buf[13]) << 6;
2133 l |= itoa64_to_int (buf[14]) << 12;
2134 l |= itoa64_to_int (buf[15]) << 18;
2135
2136 digest[ 9] = (l >> 0) & 0xff;
2137 digest[10] = (l >> 8) & 0xff;
2138 digest[11] = (l >> 16) & 0xff;
2139
2140 l = itoa64_to_int (buf[16]) << 0;
2141 l |= itoa64_to_int (buf[17]) << 6;
2142 l |= itoa64_to_int (buf[18]) << 12;
2143 l |= itoa64_to_int (buf[19]) << 18;
2144
2145 digest[12] = (l >> 0) & 0xff;
2146 digest[13] = (l >> 8) & 0xff;
2147 digest[14] = (l >> 16) & 0xff;
2148
2149 l = itoa64_to_int (buf[20]) << 0;
2150 l |= itoa64_to_int (buf[21]) << 6;
2151 l |= itoa64_to_int (buf[22]) << 12;
2152 l |= itoa64_to_int (buf[23]) << 18;
2153
2154 digest[15] = (l >> 0) & 0xff;
2155 digest[16] = (l >> 8) & 0xff;
2156 digest[17] = (l >> 16) & 0xff;
2157
2158 l = itoa64_to_int (buf[24]) << 0;
2159 l |= itoa64_to_int (buf[25]) << 6;
2160 l |= itoa64_to_int (buf[26]) << 12;
2161 l |= itoa64_to_int (buf[27]) << 18;
2162
2163 digest[18] = (l >> 0) & 0xff;
2164 digest[19] = (l >> 8) & 0xff;
2165 digest[20] = (l >> 16) & 0xff;
2166
2167 l = itoa64_to_int (buf[28]) << 0;
2168 l |= itoa64_to_int (buf[29]) << 6;
2169 l |= itoa64_to_int (buf[30]) << 12;
2170 l |= itoa64_to_int (buf[31]) << 18;
2171
2172 digest[21] = (l >> 0) & 0xff;
2173 digest[22] = (l >> 8) & 0xff;
2174 digest[23] = (l >> 16) & 0xff;
2175
2176 l = itoa64_to_int (buf[32]) << 0;
2177 l |= itoa64_to_int (buf[33]) << 6;
2178 l |= itoa64_to_int (buf[34]) << 12;
2179 l |= itoa64_to_int (buf[35]) << 18;
2180
2181 digest[24] = (l >> 0) & 0xff;
2182 digest[25] = (l >> 8) & 0xff;
2183 digest[26] = (l >> 16) & 0xff;
2184
2185 l = itoa64_to_int (buf[36]) << 0;
2186 l |= itoa64_to_int (buf[37]) << 6;
2187 l |= itoa64_to_int (buf[38]) << 12;
2188 l |= itoa64_to_int (buf[39]) << 18;
2189
2190 digest[27] = (l >> 0) & 0xff;
2191 digest[28] = (l >> 8) & 0xff;
2192 digest[29] = (l >> 16) & 0xff;
2193
2194 l = itoa64_to_int (buf[40]) << 0;
2195 l |= itoa64_to_int (buf[41]) << 6;
2196 l |= itoa64_to_int (buf[42]) << 12;
2197 l |= itoa64_to_int (buf[43]) << 18;
2198
2199 digest[30] = (l >> 0) & 0xff;
2200 digest[31] = (l >> 8) & 0xff;
2201 digest[32] = (l >> 16) & 0xff;
2202
2203 digest[33] = 0;
2204 digest[34] = 0;
2205 digest[35] = 0;
2206 digest[36] = 0;
2207 digest[37] = 0;
2208 digest[38] = 0;
2209 digest[39] = 0;
2210 digest[40] = 0;
2211 digest[41] = 0;
2212 digest[42] = 0;
2213 digest[43] = 0;
2214 digest[44] = 0;
2215 digest[45] = 0;
2216 digest[46] = 0;
2217 digest[47] = 0;
2218 digest[48] = 0;
2219 digest[49] = 0;
2220 digest[50] = 0;
2221 digest[51] = 0;
2222 digest[52] = 0;
2223 digest[53] = 0;
2224 digest[54] = 0;
2225 digest[55] = 0;
2226 digest[56] = 0;
2227 digest[57] = 0;
2228 digest[58] = 0;
2229 digest[59] = 0;
2230 digest[60] = 0;
2231 digest[61] = 0;
2232 digest[62] = 0;
2233 digest[63] = 0;
2234 }
2235
2236 void drupal7_encode (u8 digest[64], u8 buf[43])
2237 {
2238 int l;
2239
2240 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2241
2242 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2243 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2244 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2245 buf[ 3] = int_to_itoa64 (l & 0x3f);
2246
2247 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2248
2249 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2250 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2251 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2252 buf[ 7] = int_to_itoa64 (l & 0x3f);
2253
2254 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2255
2256 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2257 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2258 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[11] = int_to_itoa64 (l & 0x3f);
2260
2261 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2262
2263 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2264 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2265 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[15] = int_to_itoa64 (l & 0x3f);
2267
2268 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2269
2270 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2271 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2272 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[19] = int_to_itoa64 (l & 0x3f);
2274
2275 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2276
2277 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2278 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2279 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[23] = int_to_itoa64 (l & 0x3f);
2281
2282 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2283
2284 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2285 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2286 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[27] = int_to_itoa64 (l & 0x3f);
2288
2289 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2290
2291 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2292 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2293 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[31] = int_to_itoa64 (l & 0x3f);
2295
2296 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2297
2298 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2299 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2300 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[35] = int_to_itoa64 (l & 0x3f);
2302
2303 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2304
2305 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2306 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2307 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 buf[39] = int_to_itoa64 (l & 0x3f);
2309
2310 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2311
2312 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2313 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2314 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2315 //buf[43] = int_to_itoa64 (l & 0x3f);
2316 }
2317
2318 /**
2319 * tty
2320 */
2321
2322 #ifdef LINUX
2323 static struct termio savemodes;
2324 static int havemodes = 0;
2325
2326 int tty_break()
2327 {
2328 struct termio modmodes;
2329
2330 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2331
2332 havemodes = 1;
2333
2334 modmodes = savemodes;
2335 modmodes.c_lflag &= ~ICANON;
2336 modmodes.c_cc[VMIN] = 1;
2337 modmodes.c_cc[VTIME] = 0;
2338
2339 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2340 }
2341
2342 int tty_getchar()
2343 {
2344 fd_set rfds;
2345
2346 FD_ZERO (&rfds);
2347
2348 FD_SET (fileno (stdin), &rfds);
2349
2350 struct timeval tv;
2351
2352 tv.tv_sec = 1;
2353 tv.tv_usec = 0;
2354
2355 int retval = select (1, &rfds, NULL, NULL, &tv);
2356
2357 if (retval == 0) return 0;
2358 if (retval == -1) return -1;
2359
2360 return getchar();
2361 }
2362
2363 int tty_fix()
2364 {
2365 if (!havemodes) return 0;
2366
2367 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2368 }
2369 #endif
2370
2371 #ifdef OSX
2372 static struct termios savemodes;
2373 static int havemodes = 0;
2374
2375 int tty_break()
2376 {
2377 struct termios modmodes;
2378
2379 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2380
2381 havemodes = 1;
2382
2383 modmodes = savemodes;
2384 modmodes.c_lflag &= ~ICANON;
2385 modmodes.c_cc[VMIN] = 1;
2386 modmodes.c_cc[VTIME] = 0;
2387
2388 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2389 }
2390
2391 int tty_getchar()
2392 {
2393 fd_set rfds;
2394
2395 FD_ZERO (&rfds);
2396
2397 FD_SET (fileno (stdin), &rfds);
2398
2399 struct timeval tv;
2400
2401 tv.tv_sec = 1;
2402 tv.tv_usec = 0;
2403
2404 int retval = select (1, &rfds, NULL, NULL, &tv);
2405
2406 if (retval == 0) return 0;
2407 if (retval == -1) return -1;
2408
2409 return getchar();
2410 }
2411
2412 int tty_fix()
2413 {
2414 if (!havemodes) return 0;
2415
2416 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2417 }
2418 #endif
2419
2420 #ifdef WIN
2421 static DWORD saveMode = 0;
2422
2423 int tty_break()
2424 {
2425 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2426
2427 GetConsoleMode (stdinHandle, &saveMode);
2428 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2429
2430 return 0;
2431 }
2432
2433 int tty_getchar()
2434 {
2435 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2436
2437 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2438
2439 if (rc == WAIT_TIMEOUT) return 0;
2440 if (rc == WAIT_ABANDONED) return -1;
2441 if (rc == WAIT_FAILED) return -1;
2442
2443 // The whole ReadConsoleInput () part is a workaround.
2444 // For some unknown reason, maybe a mingw bug, a random signal
2445 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2446 // Then it wants to read with getche () a keyboard input
2447 // which has never been made.
2448
2449 INPUT_RECORD buf[100];
2450
2451 DWORD num = 0;
2452
2453 memset (buf, 0, sizeof (buf));
2454
2455 ReadConsoleInput (stdinHandle, buf, 100, &num);
2456
2457 FlushConsoleInputBuffer (stdinHandle);
2458
2459 for (uint i = 0; i < num; i++)
2460 {
2461 if (buf[i].EventType != KEY_EVENT) continue;
2462
2463 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2464
2465 if (KeyEvent.bKeyDown != TRUE) continue;
2466
2467 return KeyEvent.uChar.AsciiChar;
2468 }
2469
2470 return 0;
2471 }
2472
2473 int tty_fix()
2474 {
2475 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2476
2477 SetConsoleMode (stdinHandle, saveMode);
2478
2479 return 0;
2480 }
2481 #endif
2482
2483 /**
2484 * mem alloc
2485 */
2486
2487 #define MSG_ENOMEM "Insufficient memory available"
2488
2489 void *mycalloc (size_t nmemb, size_t size)
2490 {
2491 void *p = calloc (nmemb, size);
2492
2493 if (p == NULL)
2494 {
2495 log_error ("ERROR: %s", MSG_ENOMEM);
2496
2497 exit (-1);
2498 }
2499
2500 return (p);
2501 }
2502
2503 void *mymalloc (size_t size)
2504 {
2505 void *p = malloc (size);
2506
2507 if (p == NULL)
2508 {
2509 log_error ("ERROR: %s", MSG_ENOMEM);
2510
2511 exit (-1);
2512 }
2513
2514 memset (p, 0, size);
2515
2516 return (p);
2517 }
2518
2519 void myfree (void *ptr)
2520 {
2521 if (ptr == NULL) return;
2522
2523 free (ptr);
2524 }
2525
2526 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2527 {
2528 void *p = realloc (ptr, oldsz + add);
2529
2530 if (p == NULL)
2531 {
2532 log_error ("ERROR: %s", MSG_ENOMEM);
2533
2534 exit (-1);
2535 }
2536
2537 memset ((char *) p + oldsz, 0, add);
2538
2539 return (p);
2540 }
2541
2542 char *mystrdup (const char *s)
2543 {
2544 const size_t len = strlen (s);
2545
2546 char *b = (char *) mymalloc (len + 1);
2547
2548 memcpy (b, s, len);
2549
2550 return (b);
2551 }
2552
2553 FILE *logfile_open (char *logfile)
2554 {
2555 FILE *fp = fopen (logfile, "ab");
2556
2557 if (fp == NULL)
2558 {
2559 fp = stdout;
2560 }
2561
2562 return fp;
2563 }
2564
2565 void logfile_close (FILE *fp)
2566 {
2567 if (fp == stdout) return;
2568
2569 fclose (fp);
2570 }
2571
2572 void logfile_append (const char *fmt, ...)
2573 {
2574 if (data.logfile_disable == 1) return;
2575
2576 FILE *fp = logfile_open (data.logfile);
2577
2578 va_list ap;
2579
2580 va_start (ap, fmt);
2581
2582 vfprintf (fp, fmt, ap);
2583
2584 va_end (ap);
2585
2586 fputc ('\n', fp);
2587
2588 fflush (fp);
2589
2590 logfile_close (fp);
2591 }
2592
2593 int logfile_generate_id ()
2594 {
2595 const int n = rand ();
2596
2597 time_t t;
2598
2599 time (&t);
2600
2601 return t + n;
2602 }
2603
2604 char *logfile_generate_topid ()
2605 {
2606 const int id = logfile_generate_id ();
2607
2608 char *topid = (char *) mymalloc (1 + 16 + 1);
2609
2610 snprintf (topid, 1 + 16, "TOP%08x", id);
2611
2612 return topid;
2613 }
2614
2615 char *logfile_generate_subid ()
2616 {
2617 const int id = logfile_generate_id ();
2618
2619 char *subid = (char *) mymalloc (1 + 16 + 1);
2620
2621 snprintf (subid, 1 + 16, "SUB%08x", id);
2622
2623 return subid;
2624 }
2625
2626 /**
2627 * system
2628 */
2629
2630 #if F_SETLKW
2631 void lock_file (FILE *fp)
2632 {
2633 struct flock lock;
2634
2635 memset (&lock, 0, sizeof (struct flock));
2636
2637 lock.l_type = F_WRLCK;
2638 while (fcntl(fileno(fp), F_SETLKW, &lock))
2639 {
2640 if (errno != EINTR)
2641 {
2642 log_error ("ERROR: failed acquiring write lock: %s", strerror (errno));
2643
2644 exit (-1);
2645 }
2646 }
2647 }
2648
2649 void unlock_file (FILE *fp)
2650 {
2651 struct flock lock;
2652
2653 memset (&lock, 0, sizeof (struct flock));
2654
2655 lock.l_type = F_UNLCK;
2656 fcntl(fileno(fp), F_SETLK, &lock);
2657 }
2658 #endif // F_SETLKW
2659
2660 #ifdef _WIN
2661 void fsync (int fd)
2662 {
2663 HANDLE h = (HANDLE) _get_osfhandle (fd);
2664
2665 FlushFileBuffers (h);
2666 }
2667 #endif
2668
2669 /**
2670 * thermal
2671 */
2672
2673 #ifdef HAVE_HWMON
2674
2675 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2676 {
2677 int pGpuCount = 0;
2678
2679 for (uint i = 0; i < DEVICES_MAX; i++)
2680 {
2681 if (hm_NVML_nvmlDeviceGetHandleByIndex (data.hm_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2682
2683 // can be used to determine if the device by index matches the cuda device by index
2684 // char name[100]; memset (name, 0, sizeof (name));
2685 // hm_NVML_nvmlDeviceGetName (data.hm_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2686
2687 pGpuCount++;
2688 }
2689
2690 if (pGpuCount == 0)
2691 {
2692 log_info ("WARN: No NVML adapters found");
2693
2694 return (0);
2695 }
2696
2697 return (pGpuCount);
2698 }
2699
2700 int get_adapters_num_amd (void *adl, int *iNumberAdapters)
2701 {
2702 if (hm_ADL_Adapter_NumberOfAdapters_Get ((ADL_PTR *) adl, iNumberAdapters) != ADL_OK) return -1;
2703
2704 if (iNumberAdapters == 0)
2705 {
2706 log_info ("WARN: No ADL adapters found.");
2707
2708 return -1;
2709 }
2710
2711 return 0;
2712 }
2713
2714 /*
2715 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2716 {
2717 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2718 ADLODParameters lpOdParameters;
2719
2720 lpOdParameters.iSize = sizeof (ADLODParameters);
2721 size_t plevels_size = 0;
2722
2723 if (hm_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2724
2725 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2726 __func__, iAdapterIndex,
2727 lpOdParameters.iNumberOfPerformanceLevels,
2728 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2729 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2730
2731 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2732
2733 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2734
2735 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2736
2737 if (hm_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2738
2739 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2740 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2741 __func__, iAdapterIndex, j,
2742 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2743
2744 myfree (lpOdPerformanceLevels);
2745
2746 return 0;
2747 }
2748 */
2749
2750 LPAdapterInfo hm_get_adapter_info_amd (void *adl, int iNumberAdapters)
2751 {
2752 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2753
2754 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2755
2756 if (hm_ADL_Adapter_AdapterInfo_Get ((ADL_PTR *) adl, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2757
2758 return lpAdapterInfo;
2759 }
2760
2761 /*
2762 //
2763 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2764 //
2765
2766 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2767 {
2768 u32 idx = -1;
2769
2770 for (uint i = 0; i < num_adl_adapters; i++)
2771 {
2772 int opencl_bus_num = hm_device[i].busid;
2773 int opencl_dev_num = hm_device[i].devid;
2774
2775 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2776 {
2777 idx = i;
2778
2779 break;
2780 }
2781 }
2782
2783 if (idx >= DEVICES_MAX) return -1;
2784
2785 return idx;
2786 }
2787
2788 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2789 {
2790 for (uint i = 0; i < opencl_num_devices; i++)
2791 {
2792 cl_device_topology_amd device_topology;
2793
2794 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2795
2796 hm_device[i].busid = device_topology.pcie.bus;
2797 hm_device[i].devid = device_topology.pcie.device;
2798 }
2799 }
2800 */
2801
2802 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2803 {
2804 // basically bubble sort
2805
2806 for (int i = 0; i < num_adl_adapters; i++)
2807 {
2808 for (int j = 0; j < num_adl_adapters - 1; j++)
2809 {
2810 // get info of adapter [x]
2811
2812 u32 adapter_index_x = valid_adl_device_list[j];
2813 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2814
2815 u32 bus_num_x = info_x.iBusNumber;
2816 u32 dev_num_x = info_x.iDeviceNumber;
2817
2818 // get info of adapter [y]
2819
2820 u32 adapter_index_y = valid_adl_device_list[j + 1];
2821 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2822
2823 u32 bus_num_y = info_y.iBusNumber;
2824 u32 dev_num_y = info_y.iDeviceNumber;
2825
2826 uint need_swap = 0;
2827
2828 if (bus_num_y < bus_num_x)
2829 {
2830 need_swap = 1;
2831 }
2832 else if (bus_num_y == bus_num_x)
2833 {
2834 if (dev_num_y < dev_num_x)
2835 {
2836 need_swap = 1;
2837 }
2838 }
2839
2840 if (need_swap == 1)
2841 {
2842 u32 temp = valid_adl_device_list[j + 1];
2843
2844 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2845 valid_adl_device_list[j + 0] = temp;
2846 }
2847 }
2848 }
2849 }
2850
2851 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2852 {
2853 *num_adl_adapters = 0;
2854
2855 u32 *adl_adapters = NULL;
2856
2857 int *bus_numbers = NULL;
2858 int *device_numbers = NULL;
2859
2860 for (int i = 0; i < iNumberAdapters; i++)
2861 {
2862 AdapterInfo info = lpAdapterInfo[i];
2863
2864 if (strlen (info.strUDID) < 1) continue;
2865
2866 #ifdef WIN
2867 if (info.iVendorID != 1002) continue;
2868 #else
2869 if (info.iVendorID != 0x1002) continue;
2870 #endif
2871
2872 if (info.iBusNumber < 0) continue;
2873 if (info.iDeviceNumber < 0) continue;
2874
2875 int found = 0;
2876
2877 for (int pos = 0; pos < *num_adl_adapters; pos++)
2878 {
2879 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2880 {
2881 found = 1;
2882 break;
2883 }
2884 }
2885
2886 if (found) continue;
2887
2888 // add it to the list
2889
2890 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2891
2892 adl_adapters[*num_adl_adapters] = i;
2893
2894 // rest is just bookkeeping
2895
2896 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2897 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2898
2899 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2900 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2901
2902 (*num_adl_adapters)++;
2903 }
2904
2905 myfree (bus_numbers);
2906 myfree (device_numbers);
2907
2908 // sort the list by increasing bus id, device id number
2909
2910 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2911
2912 return adl_adapters;
2913 }
2914
2915 int hm_check_fanspeed_control (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2916 {
2917 // loop through all valid devices
2918
2919 for (int i = 0; i < num_adl_adapters; i++)
2920 {
2921 u32 adapter_index = valid_adl_device_list[i];
2922
2923 // get AdapterInfo
2924
2925 AdapterInfo info = lpAdapterInfo[adapter_index];
2926
2927 // unfortunately this doesn't work since bus id and dev id are not unique
2928 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2929 // if (opencl_device_index == -1) continue;
2930
2931 int opencl_device_index = i;
2932
2933 // if (hm_show_performance_level (adl, info.iAdapterIndex) != 0) return -1;
2934
2935 // get fanspeed info
2936
2937 if (hm_device[opencl_device_index].od_version == 5)
2938 {
2939 ADLFanSpeedInfo FanSpeedInfo;
2940
2941 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2942
2943 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2944
2945 if (hm_ADL_Overdrive5_FanSpeedInfo_Get (adl, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2946
2947 // check read and write capability in fanspeedinfo
2948
2949 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2950 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2951 {
2952 hm_device[opencl_device_index].fan_get_supported = 1;
2953 }
2954 else
2955 {
2956 hm_device[opencl_device_index].fan_get_supported = 0;
2957 }
2958 }
2959 else // od_version == 6
2960 {
2961 ADLOD6FanSpeedInfo faninfo;
2962
2963 memset (&faninfo, 0, sizeof (faninfo));
2964
2965 if (hm_ADL_Overdrive6_FanSpeed_Get (adl, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2966
2967 // check read capability in fanspeedinfo
2968
2969 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2970 {
2971 hm_device[opencl_device_index].fan_get_supported = 1;
2972 }
2973 else
2974 {
2975 hm_device[opencl_device_index].fan_get_supported = 0;
2976 }
2977 }
2978 }
2979
2980 return 0;
2981 }
2982
2983 int hm_get_overdrive_version (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2984 {
2985 for (int i = 0; i < num_adl_adapters; i++)
2986 {
2987 u32 adapter_index = valid_adl_device_list[i];
2988
2989 // get AdapterInfo
2990
2991 AdapterInfo info = lpAdapterInfo[adapter_index];
2992
2993 // get overdrive version
2994
2995 int od_supported = 0;
2996 int od_enabled = 0;
2997 int od_version = 0;
2998
2999 if (hm_ADL_Overdrive_Caps (adl, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3000
3001 // store the overdrive version in hm_device
3002
3003 // unfortunately this doesn't work since bus id and dev id are not unique
3004 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3005 // if (opencl_device_index == -1) continue;
3006
3007 int opencl_device_index = i;
3008
3009 hm_device[opencl_device_index].od_version = od_version;
3010 }
3011
3012 return 0;
3013 }
3014
3015 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3016 {
3017 for (int i = 0; i < num_adl_adapters; i++)
3018 {
3019 u32 adapter_index = valid_adl_device_list[i];
3020
3021 // get AdapterInfo
3022
3023 AdapterInfo info = lpAdapterInfo[adapter_index];
3024
3025 // store the iAdapterIndex in hm_device
3026
3027 // unfortunately this doesn't work since bus id and dev id are not unique
3028 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3029 // if (opencl_device_index == -1) continue;
3030
3031 int opencl_device_index = i;
3032
3033 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3034 }
3035
3036 return num_adl_adapters;
3037 }
3038
3039 int hm_get_threshold_slowdown_with_device_id (const uint device_id)
3040 {
3041 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3042
3043 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3044 {
3045 if (data.hm_amd)
3046 {
3047 if (data.hm_device[device_id].od_version == 5)
3048 {
3049
3050 }
3051 else if (data.hm_device[device_id].od_version == 6)
3052 {
3053 int CurrentValue = 0;
3054 int DefaultValue = 0;
3055
3056 if (hm_ADL_Overdrive6_TargetTemperatureData_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &CurrentValue, &DefaultValue) != ADL_OK) return -1;
3057
3058 // the return value has never been tested since hm_ADL_Overdrive6_TargetTemperatureData_Get() never worked on any system. expect problems.
3059
3060 return DefaultValue;
3061 }
3062 }
3063 }
3064
3065 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3066 {
3067 int target = 0;
3068
3069 if (hm_NVML_nvmlDeviceGetTemperatureThreshold (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_THRESHOLD_SLOWDOWN, (unsigned int *) &target) != NVML_SUCCESS) return -1;
3070
3071 return target;
3072 }
3073
3074 return -1;
3075 }
3076
3077 int hm_get_threshold_shutdown_with_device_id (const uint device_id)
3078 {
3079 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3080
3081 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3082 {
3083 if (data.hm_amd)
3084 {
3085 if (data.hm_device[device_id].od_version == 5)
3086 {
3087
3088 }
3089 else if (data.hm_device[device_id].od_version == 6)
3090 {
3091
3092 }
3093 }
3094 }
3095
3096 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3097 {
3098 int target = 0;
3099
3100 if (hm_NVML_nvmlDeviceGetTemperatureThreshold (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_THRESHOLD_SHUTDOWN, (unsigned int *) &target) != NVML_SUCCESS) return -1;
3101
3102 return target;
3103 }
3104
3105 return -1;
3106 }
3107
3108 int hm_get_temperature_with_device_id (const uint device_id)
3109 {
3110 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3111
3112 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3113 {
3114 if (data.hm_amd)
3115 {
3116 if (data.hm_device[device_id].od_version == 5)
3117 {
3118 ADLTemperature Temperature;
3119
3120 Temperature.iSize = sizeof (ADLTemperature);
3121
3122 if (hm_ADL_Overdrive5_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3123
3124 return Temperature.iTemperature / 1000;
3125 }
3126 else if (data.hm_device[device_id].od_version == 6)
3127 {
3128 int Temperature = 0;
3129
3130 if (hm_ADL_Overdrive6_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3131
3132 return Temperature / 1000;
3133 }
3134 }
3135 }
3136
3137 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3138 {
3139 int temperature = 0;
3140
3141 if (hm_NVML_nvmlDeviceGetTemperature (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (uint *) &temperature) != NVML_SUCCESS) return -1;
3142
3143 return temperature;
3144 }
3145
3146 return -1;
3147 }
3148
3149 int hm_get_fanpolicy_with_device_id (const uint device_id)
3150 {
3151 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3152
3153 if (data.hm_device[device_id].fan_get_supported == 1)
3154 {
3155 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3156 {
3157 if (data.hm_amd)
3158 {
3159 if (data.hm_device[device_id].od_version == 5)
3160 {
3161 ADLFanSpeedValue lpFanSpeedValue;
3162
3163 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3164
3165 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3166 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3167
3168 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3169
3170 return (lpFanSpeedValue.iFanSpeed & ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED) ? 0 : 1;
3171 }
3172 else // od_version == 6
3173 {
3174 return 1;
3175 }
3176 }
3177 }
3178
3179 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3180 {
3181 #if defined(LINUX)
3182 return 0;
3183 #endif
3184
3185 #if defined(WIN)
3186 return 1;
3187 #endif
3188 }
3189 }
3190
3191 return -1;
3192 }
3193
3194 int hm_get_fanspeed_with_device_id (const uint device_id)
3195 {
3196 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3197
3198 if (data.hm_device[device_id].fan_get_supported == 1)
3199 {
3200 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3201 {
3202 if (data.hm_amd)
3203 {
3204 if (data.hm_device[device_id].od_version == 5)
3205 {
3206 ADLFanSpeedValue lpFanSpeedValue;
3207
3208 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3209
3210 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3211 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3212 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3213
3214 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3215
3216 return lpFanSpeedValue.iFanSpeed;
3217 }
3218 else // od_version == 6
3219 {
3220 ADLOD6FanSpeedInfo faninfo;
3221
3222 memset (&faninfo, 0, sizeof (faninfo));
3223
3224 if (hm_ADL_Overdrive6_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3225
3226 return faninfo.iFanSpeedPercent;
3227 }
3228 }
3229 }
3230
3231 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3232 {
3233 int speed = 0;
3234
3235 if (hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nv, 0, data.hm_device[device_id].adapter_index.nv, (uint *) &speed) != NVML_SUCCESS) return -1;
3236
3237 return speed;
3238 }
3239 }
3240
3241 return -1;
3242 }
3243
3244 int hm_get_buslanes_with_device_id (const uint device_id)
3245 {
3246 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3247
3248 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3249 {
3250 if (data.hm_amd)
3251 {
3252 ADLPMActivity PMActivity;
3253
3254 PMActivity.iSize = sizeof (ADLPMActivity);
3255
3256 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3257
3258 return PMActivity.iCurrentBusLanes;
3259 }
3260 }
3261
3262 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3263 {
3264 unsigned int currLinkWidth;
3265
3266 if (hm_NVML_nvmlDeviceGetCurrPcieLinkWidth (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, &currLinkWidth) != NVML_SUCCESS) return -1;
3267
3268 return currLinkWidth;
3269 }
3270
3271 return -1;
3272 }
3273
3274 int hm_get_utilization_with_device_id (const uint device_id)
3275 {
3276 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3277
3278 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3279 {
3280 if (data.hm_amd)
3281 {
3282 ADLPMActivity PMActivity;
3283
3284 PMActivity.iSize = sizeof (ADLPMActivity);
3285
3286 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3287
3288 return PMActivity.iActivityPercent;
3289 }
3290 }
3291
3292 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3293 {
3294 nvmlUtilization_t utilization;
3295
3296 if (hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, &utilization) != NVML_SUCCESS) return -1;
3297
3298 return utilization.gpu;
3299 }
3300
3301 return -1;
3302 }
3303
3304 int hm_get_memoryspeed_with_device_id (const uint device_id)
3305 {
3306 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3307
3308 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3309 {
3310 if (data.hm_amd)
3311 {
3312 ADLPMActivity PMActivity;
3313
3314 PMActivity.iSize = sizeof (ADLPMActivity);
3315
3316 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3317
3318 return PMActivity.iMemoryClock / 100;
3319 }
3320 }
3321
3322 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3323 {
3324 unsigned int clock;
3325
3326 if (hm_NVML_nvmlDeviceGetClockInfo (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, NVML_CLOCK_MEM, &clock) != NVML_SUCCESS) return -1;
3327
3328 return clock;
3329 }
3330
3331 return -1;
3332 }
3333
3334 int hm_get_corespeed_with_device_id (const uint device_id)
3335 {
3336 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3337
3338 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3339 {
3340 if (data.hm_amd)
3341 {
3342 ADLPMActivity PMActivity;
3343
3344 PMActivity.iSize = sizeof (ADLPMActivity);
3345
3346 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3347
3348 return PMActivity.iEngineClock / 100;
3349 }
3350 }
3351
3352 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3353 {
3354 unsigned int clock;
3355
3356 if (hm_NVML_nvmlDeviceGetClockInfo (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, NVML_CLOCK_SM, &clock) != NVML_SUCCESS) return -1;
3357
3358 return clock;
3359 }
3360
3361 return -1;
3362 }
3363
3364 int hm_get_throttle_with_device_id (const uint device_id)
3365 {
3366 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3367
3368 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3369 {
3370
3371 }
3372
3373 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3374 {
3375 unsigned long long clocksThrottleReasons = 0;
3376 unsigned long long supportedThrottleReasons = 0;
3377
3378 if (hm_NVML_nvmlDeviceGetCurrentClocksThrottleReasons (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, &clocksThrottleReasons) != NVML_SUCCESS) return -1;
3379 if (hm_NVML_nvmlDeviceGetSupportedClocksThrottleReasons (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, &supportedThrottleReasons) != NVML_SUCCESS) return -1;
3380
3381 clocksThrottleReasons &= supportedThrottleReasons;
3382
3383 return (clocksThrottleReasons > 0);
3384 }
3385
3386 return -1;
3387 }
3388
3389 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed, const int fanpolicy)
3390 {
3391 if (data.hm_device[device_id].fan_set_supported == 1)
3392 {
3393 if (data.hm_amd)
3394 {
3395 if (data.hm_device[device_id].od_version == 5)
3396 {
3397 ADLFanSpeedValue lpFanSpeedValue;
3398
3399 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3400
3401 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3402 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3403 lpFanSpeedValue.iFlags = (fanpolicy == 1) ? ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED : 0;
3404 lpFanSpeedValue.iFanSpeed = fanspeed;
3405
3406 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3407
3408 return 0;
3409 }
3410 else // od_version == 6
3411 {
3412 ADLOD6FanSpeedValue fan_speed_value;
3413
3414 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3415
3416 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3417 fan_speed_value.iFanSpeed = fanspeed;
3418
3419 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3420
3421 return 0;
3422 }
3423 }
3424 }
3425
3426 return -1;
3427 }
3428
3429 #endif // HAVE_HWMON
3430
3431 /**
3432 * maskprocessor
3433 */
3434
3435 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3436 {
3437 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3438
3439 if (css_cnt > SP_PW_MAX)
3440 {
3441 log_error ("ERROR: mask length is too long");
3442
3443 exit (-1);
3444 }
3445
3446 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3447 {
3448 uint *uniq_tbl = uniq_tbls[css_pos];
3449
3450 uint *cs_buf = css[css_pos].cs_buf;
3451 uint cs_len = css[css_pos].cs_len;
3452
3453 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3454 {
3455 uint c = cs_buf[cs_pos] & 0xff;
3456
3457 uniq_tbl[c] = 1;
3458 }
3459 }
3460 }
3461
3462 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3463 {
3464 cs_t *cs = &css[css_cnt];
3465
3466 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3467
3468 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3469
3470 size_t i;
3471
3472 for (i = 0; i < cs->cs_len; i++)
3473 {
3474 const uint u = cs->cs_buf[i];
3475
3476 css_uniq[u] = 1;
3477 }
3478
3479 for (i = 0; i < in_len; i++)
3480 {
3481 uint u = in_buf[i] & 0xff;
3482
3483 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3484
3485 if (css_uniq[u] == 1) continue;
3486
3487 css_uniq[u] = 1;
3488
3489 cs->cs_buf[cs->cs_len] = u;
3490
3491 cs->cs_len++;
3492 }
3493
3494 myfree (css_uniq);
3495 }
3496
3497 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3498 {
3499 size_t in_pos;
3500
3501 for (in_pos = 0; in_pos < in_len; in_pos++)
3502 {
3503 uint p0 = in_buf[in_pos] & 0xff;
3504
3505 if (interpret == 1 && p0 == '?')
3506 {
3507 in_pos++;
3508
3509 if (in_pos == in_len) break;
3510
3511 uint p1 = in_buf[in_pos] & 0xff;
3512
3513 switch (p1)
3514 {
3515 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3516 break;
3517 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3518 break;
3519 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3520 break;
3521 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3522 break;
3523 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3524 break;
3525 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3526 break;
3527 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3528 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3529 break;
3530 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3531 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3532 break;
3533 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3534 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3535 break;
3536 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3537 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3538 break;
3539 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3540 break;
3541 default: log_error ("Syntax error: %s", in_buf);
3542 exit (-1);
3543 }
3544 }
3545 else
3546 {
3547 if (data.hex_charset)
3548 {
3549 in_pos++;
3550
3551 if (in_pos == in_len)
3552 {
3553 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3554
3555 exit (-1);
3556 }
3557
3558 uint p1 = in_buf[in_pos] & 0xff;
3559
3560 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3561 {
3562 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3563
3564 exit (-1);
3565 }
3566
3567 uint chr = 0;
3568
3569 chr = hex_convert (p1) << 0;
3570 chr |= hex_convert (p0) << 4;
3571
3572 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3573 }
3574 else
3575 {
3576 uint chr = p0;
3577
3578 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3579 }
3580 }
3581 }
3582 }
3583
3584 u64 mp_get_sum (uint css_cnt, cs_t *css)
3585 {
3586 u64 sum = 1;
3587
3588 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3589 {
3590 sum *= css[css_pos].cs_len;
3591 }
3592
3593 return (sum);
3594 }
3595
3596 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3597 {
3598 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3599
3600 uint mask_pos;
3601 uint css_pos;
3602
3603 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3604 {
3605 char p0 = mask_buf[mask_pos];
3606
3607 if (p0 == '?')
3608 {
3609 mask_pos++;
3610
3611 if (mask_pos == mask_len) break;
3612
3613 char p1 = mask_buf[mask_pos];
3614
3615 uint chr = p1;
3616
3617 switch (p1)
3618 {
3619 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3620 break;
3621 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3622 break;
3623 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3624 break;
3625 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3626 break;
3627 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3628 break;
3629 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3630 break;
3631 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3632 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3633 break;
3634 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3635 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3636 break;
3637 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3638 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3639 break;
3640 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3641 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3642 break;
3643 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3644 break;
3645 default: log_error ("ERROR: syntax error: %s", mask_buf);
3646 exit (-1);
3647 }
3648 }
3649 else
3650 {
3651 if (data.hex_charset)
3652 {
3653 mask_pos++;
3654
3655 // if there is no 2nd hex character, show an error:
3656
3657 if (mask_pos == mask_len)
3658 {
3659 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3660
3661 exit (-1);
3662 }
3663
3664 char p1 = mask_buf[mask_pos];
3665
3666 // if they are not valid hex character, show an error:
3667
3668 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3669 {
3670 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3671
3672 exit (-1);
3673 }
3674
3675 uint chr = 0;
3676
3677 chr |= hex_convert (p1) << 0;
3678 chr |= hex_convert (p0) << 4;
3679
3680 mp_add_cs_buf (&chr, 1, css, css_pos);
3681 }
3682 else
3683 {
3684 uint chr = p0;
3685
3686 mp_add_cs_buf (&chr, 1, css, css_pos);
3687 }
3688 }
3689 }
3690
3691 if (css_pos == 0)
3692 {
3693 log_error ("ERROR: invalid mask length (0)");
3694
3695 exit (-1);
3696 }
3697
3698 *css_cnt = css_pos;
3699
3700 return (css);
3701 }
3702
3703 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3704 {
3705 for (int i = 0; i < css_cnt; i++)
3706 {
3707 uint len = css[i].cs_len;
3708 u64 next = val / len;
3709 uint pos = val % len;
3710 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3711 val = next;
3712 }
3713 }
3714
3715 void mp_cut_at (char *mask, uint max)
3716 {
3717 uint i;
3718 uint j;
3719 uint mask_len = strlen (mask);
3720
3721 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3722 {
3723 if (mask[i] == '?') i++;
3724 }
3725
3726 mask[i] = 0;
3727 }
3728
3729 void mp_setup_sys (cs_t *mp_sys)
3730 {
3731 uint pos;
3732 uint chr;
3733 uint donec[CHARSIZ] = { 0 };
3734
3735 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3736 mp_sys[0].cs_buf[pos++] = chr;
3737 mp_sys[0].cs_len = pos; }
3738
3739 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3740 mp_sys[1].cs_buf[pos++] = chr;
3741 mp_sys[1].cs_len = pos; }
3742
3743 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3744 mp_sys[2].cs_buf[pos++] = chr;
3745 mp_sys[2].cs_len = pos; }
3746
3747 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3748 mp_sys[3].cs_buf[pos++] = chr;
3749 mp_sys[3].cs_len = pos; }
3750
3751 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3752 mp_sys[4].cs_len = pos; }
3753
3754 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3755 mp_sys[5].cs_len = pos; }
3756 }
3757
3758 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3759 {
3760 FILE *fp = fopen (buf, "rb");
3761
3762 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3763 {
3764 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3765 }
3766 else
3767 {
3768 char mp_file[1024] = { 0 };
3769
3770 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3771
3772 fclose (fp);
3773
3774 len = in_superchop (mp_file);
3775
3776 if (len == 0)
3777 {
3778 log_info ("WARNING: charset file corrupted");
3779
3780 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3781 }
3782 else
3783 {
3784 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3785 }
3786 }
3787 }
3788
3789 void mp_reset_usr (cs_t *mp_usr, uint index)
3790 {
3791 mp_usr[index].cs_len = 0;
3792
3793 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3794 }
3795
3796 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3797 {
3798 char *new_mask_buf = (char *) mymalloc (256);
3799
3800 uint mask_pos;
3801
3802 uint css_pos;
3803
3804 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3805 {
3806 if (css_pos == len) break;
3807
3808 char p0 = mask_buf[mask_pos];
3809
3810 new_mask_buf[mask_pos] = p0;
3811
3812 if (p0 == '?')
3813 {
3814 mask_pos++;
3815
3816 if (mask_pos == mask_len) break;
3817
3818 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3819 }
3820 else
3821 {
3822 if (data.hex_charset)
3823 {
3824 mask_pos++;
3825
3826 if (mask_pos == mask_len)
3827 {
3828 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3829
3830 exit (-1);
3831 }
3832
3833 char p1 = mask_buf[mask_pos];
3834
3835 // if they are not valid hex character, show an error:
3836
3837 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3838 {
3839 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3840
3841 exit (-1);
3842 }
3843
3844 new_mask_buf[mask_pos] = p1;
3845 }
3846 }
3847 }
3848
3849 if (css_pos == len) return (new_mask_buf);
3850
3851 myfree (new_mask_buf);
3852
3853 return (NULL);
3854 }
3855
3856 /**
3857 * statprocessor
3858 */
3859
3860 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3861 {
3862 u64 sum = 1;
3863
3864 uint i;
3865
3866 for (i = start; i < stop; i++)
3867 {
3868 sum *= root_css_buf[i].cs_len;
3869 }
3870
3871 return (sum);
3872 }
3873
3874 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3875 {
3876 u64 v = ctx;
3877
3878 cs_t *cs = &root_css_buf[start];
3879
3880 uint i;
3881
3882 for (i = start; i < stop; i++)
3883 {
3884 const u64 m = v % cs->cs_len;
3885 const u64 d = v / cs->cs_len;
3886
3887 v = d;
3888
3889 const uint k = cs->cs_buf[m];
3890
3891 pw_buf[i - start] = (char) k;
3892
3893 cs = &markov_css_buf[(i * CHARSIZ) + k];
3894 }
3895 }
3896
3897 int sp_comp_val (const void *p1, const void *p2)
3898 {
3899 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3900 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3901
3902 return b2->val - b1->val;
3903 }
3904
3905 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)
3906 {
3907 uint i;
3908 uint j;
3909 uint k;
3910
3911 /**
3912 * Initialize hcstats
3913 */
3914
3915 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3916
3917 u64 *root_stats_ptr = root_stats_buf;
3918
3919 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3920
3921 for (i = 0; i < SP_PW_MAX; i++)
3922 {
3923 root_stats_buf_by_pos[i] = root_stats_ptr;
3924
3925 root_stats_ptr += CHARSIZ;
3926 }
3927
3928 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3929
3930 u64 *markov_stats_ptr = markov_stats_buf;
3931
3932 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3933
3934 for (i = 0; i < SP_PW_MAX; i++)
3935 {
3936 for (j = 0; j < CHARSIZ; j++)
3937 {
3938 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3939
3940 markov_stats_ptr += CHARSIZ;
3941 }
3942 }
3943
3944 /**
3945 * Load hcstats File
3946 */
3947
3948 if (hcstat == NULL)
3949 {
3950 char hcstat_tmp[256] = { 0 };
3951
3952 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3953
3954 hcstat = hcstat_tmp;
3955 }
3956
3957 FILE *fd = fopen (hcstat, "rb");
3958
3959 if (fd == NULL)
3960 {
3961 log_error ("%s: %s", hcstat, strerror (errno));
3962
3963 exit (-1);
3964 }
3965
3966 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3967 {
3968 log_error ("%s: Could not load data", hcstat);
3969
3970 fclose (fd);
3971
3972 exit (-1);
3973 }
3974
3975 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3976 {
3977 log_error ("%s: Could not load data", hcstat);
3978
3979 fclose (fd);
3980
3981 exit (-1);
3982 }
3983
3984 fclose (fd);
3985
3986 /**
3987 * Markov modifier of hcstat_table on user request
3988 */
3989
3990 if (disable)
3991 {
3992 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3993 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3994 }
3995
3996 if (classic)
3997 {
3998 /* Add all stats to first position */
3999
4000 for (i = 1; i < SP_PW_MAX; i++)
4001 {
4002 u64 *out = root_stats_buf_by_pos[0];
4003 u64 *in = root_stats_buf_by_pos[i];
4004
4005 for (j = 0; j < CHARSIZ; j++)
4006 {
4007 *out++ += *in++;
4008 }
4009 }
4010
4011 for (i = 1; i < SP_PW_MAX; i++)
4012 {
4013 u64 *out = markov_stats_buf_by_key[0][0];
4014 u64 *in = markov_stats_buf_by_key[i][0];
4015
4016 for (j = 0; j < CHARSIZ; j++)
4017 {
4018 for (k = 0; k < CHARSIZ; k++)
4019 {
4020 *out++ += *in++;
4021 }
4022 }
4023 }
4024
4025 /* copy them to all pw_positions */
4026
4027 for (i = 1; i < SP_PW_MAX; i++)
4028 {
4029 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
4030 }
4031
4032 for (i = 1; i < SP_PW_MAX; i++)
4033 {
4034 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
4035 }
4036 }
4037
4038 /**
4039 * Initialize tables
4040 */
4041
4042 hcstat_table_t *root_table_ptr = root_table_buf;
4043
4044 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
4045
4046 for (i = 0; i < SP_PW_MAX; i++)
4047 {
4048 root_table_buf_by_pos[i] = root_table_ptr;
4049
4050 root_table_ptr += CHARSIZ;
4051 }
4052
4053 hcstat_table_t *markov_table_ptr = markov_table_buf;
4054
4055 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
4056
4057 for (i = 0; i < SP_PW_MAX; i++)
4058 {
4059 for (j = 0; j < CHARSIZ; j++)
4060 {
4061 markov_table_buf_by_key[i][j] = markov_table_ptr;
4062
4063 markov_table_ptr += CHARSIZ;
4064 }
4065 }
4066
4067 /**
4068 * Convert hcstat to tables
4069 */
4070
4071 for (i = 0; i < SP_ROOT_CNT; i++)
4072 {
4073 uint key = i % CHARSIZ;
4074
4075 root_table_buf[i].key = key;
4076 root_table_buf[i].val = root_stats_buf[i];
4077 }
4078
4079 for (i = 0; i < SP_MARKOV_CNT; i++)
4080 {
4081 uint key = i % CHARSIZ;
4082
4083 markov_table_buf[i].key = key;
4084 markov_table_buf[i].val = markov_stats_buf[i];
4085 }
4086
4087 myfree (root_stats_buf);
4088 myfree (markov_stats_buf);
4089
4090 /**
4091 * Finally sort them
4092 */
4093
4094 for (i = 0; i < SP_PW_MAX; i++)
4095 {
4096 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4097 }
4098
4099 for (i = 0; i < SP_PW_MAX; i++)
4100 {
4101 for (j = 0; j < CHARSIZ; j++)
4102 {
4103 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4104 }
4105 }
4106 }
4107
4108 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])
4109 {
4110 /**
4111 * Convert tables to css
4112 */
4113
4114 for (uint i = 0; i < SP_ROOT_CNT; i++)
4115 {
4116 uint pw_pos = i / CHARSIZ;
4117
4118 cs_t *cs = &root_css_buf[pw_pos];
4119
4120 if (cs->cs_len == threshold) continue;
4121
4122 uint key = root_table_buf[i].key;
4123
4124 if (uniq_tbls[pw_pos][key] == 0) continue;
4125
4126 cs->cs_buf[cs->cs_len] = key;
4127
4128 cs->cs_len++;
4129 }
4130
4131 /**
4132 * Convert table to css
4133 */
4134
4135 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4136 {
4137 uint c = i / CHARSIZ;
4138
4139 cs_t *cs = &markov_css_buf[c];
4140
4141 if (cs->cs_len == threshold) continue;
4142
4143 uint pw_pos = c / CHARSIZ;
4144
4145 uint key = markov_table_buf[i].key;
4146
4147 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4148
4149 cs->cs_buf[cs->cs_len] = key;
4150
4151 cs->cs_len++;
4152 }
4153
4154 /*
4155 for (uint i = 0; i < 8; i++)
4156 {
4157 for (uint j = 0x20; j < 0x80; j++)
4158 {
4159 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4160
4161 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4162
4163 for (uint k = 0; k < 10; k++)
4164 {
4165 printf (" %u\n", ptr->cs_buf[k]);
4166 }
4167 }
4168 }
4169 */
4170 }
4171
4172 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4173 {
4174 for (uint i = 0; i < SP_PW_MAX; i += 2)
4175 {
4176 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4177
4178 out += CHARSIZ;
4179 in += CHARSIZ;
4180
4181 out->key = 0;
4182 out->val = 1;
4183
4184 out++;
4185
4186 for (uint j = 1; j < CHARSIZ; j++)
4187 {
4188 out->key = j;
4189 out->val = 0;
4190
4191 out++;
4192 }
4193 }
4194 }
4195
4196 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4197 {
4198 for (uint i = 0; i < SP_PW_MAX; i += 2)
4199 {
4200 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4201
4202 out += CHARSIZ * CHARSIZ;
4203 in += CHARSIZ * CHARSIZ;
4204
4205 for (uint j = 0; j < CHARSIZ; j++)
4206 {
4207 out->key = 0;
4208 out->val = 1;
4209
4210 out++;
4211
4212 for (uint k = 1; k < CHARSIZ; k++)
4213 {
4214 out->key = k;
4215 out->val = 0;
4216
4217 out++;
4218 }
4219 }
4220 }
4221 }
4222
4223 /**
4224 * mixed shared functions
4225 */
4226
4227 void dump_hex (const u8 *s, const int sz)
4228 {
4229 for (int i = 0; i < sz; i++)
4230 {
4231 log_info_nn ("%02x ", s[i]);
4232 }
4233
4234 log_info ("");
4235 }
4236
4237 void usage_mini_print (const char *progname)
4238 {
4239 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4240 }
4241
4242 void usage_big_print (const char *progname)
4243 {
4244 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4245 }
4246
4247 char *get_exec_path ()
4248 {
4249 int exec_path_len = 1024;
4250
4251 char *exec_path = (char *) mymalloc (exec_path_len);
4252
4253 #ifdef LINUX
4254
4255 char tmp[32] = { 0 };
4256
4257 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4258
4259 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4260
4261 #elif WIN
4262
4263 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4264
4265 #elif OSX
4266
4267 uint size = exec_path_len;
4268
4269 if (_NSGetExecutablePath (exec_path, &size) != 0)
4270 {
4271 log_error("! executable path buffer too small\n");
4272
4273 exit (-1);
4274 }
4275
4276 const int len = strlen (exec_path);
4277
4278 #else
4279 #error Your Operating System is not supported or detected
4280 #endif
4281
4282 exec_path[len] = 0;
4283
4284 return exec_path;
4285 }
4286
4287 char *get_install_dir (const char *progname)
4288 {
4289 char *install_dir = mystrdup (progname);
4290 char *last_slash = NULL;
4291
4292 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4293 {
4294 *last_slash = 0;
4295 }
4296 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4297 {
4298 *last_slash = 0;
4299 }
4300 else
4301 {
4302 install_dir[0] = '.';
4303 install_dir[1] = 0;
4304 }
4305
4306 return (install_dir);
4307 }
4308
4309 char *get_profile_dir (const char *homedir)
4310 {
4311 #define DOT_HASHCAT ".hashcat"
4312
4313 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4314
4315 char *profile_dir = (char *) mymalloc (len + 1);
4316
4317 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4318
4319 return profile_dir;
4320 }
4321
4322 char *get_session_dir (const char *profile_dir)
4323 {
4324 #define SESSIONS_FOLDER "sessions"
4325
4326 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4327
4328 char *session_dir = (char *) mymalloc (len + 1);
4329
4330 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4331
4332 return session_dir;
4333 }
4334
4335 uint count_lines (FILE *fd)
4336 {
4337 uint cnt = 0;
4338
4339 char *buf = (char *) mymalloc (HCBUFSIZ + 1);
4340
4341 char prev = '\n';
4342
4343 while (!feof (fd))
4344 {
4345 size_t nread = fread (buf, sizeof (char), HCBUFSIZ, fd);
4346
4347 if (nread < 1) continue;
4348
4349 size_t i;
4350
4351 for (i = 0; i < nread; i++)
4352 {
4353 if (prev == '\n') cnt++;
4354
4355 prev = buf[i];
4356 }
4357 }
4358
4359 myfree (buf);
4360
4361 return cnt;
4362 }
4363
4364 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4365 {
4366 uint crc = ~0;
4367
4368 FILE *fd = fopen (filename, "rb");
4369
4370 if (fd == NULL)
4371 {
4372 log_error ("%s: %s", filename, strerror (errno));
4373
4374 exit (-1);
4375 }
4376
4377 #define MAX_KEY_SIZE (1024 * 1024)
4378
4379 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4380
4381 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4382
4383 fclose (fd);
4384
4385 int kpos = 0;
4386
4387 for (int fpos = 0; fpos < nread; fpos++)
4388 {
4389 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4390
4391 keytab[kpos++] += (crc >> 24) & 0xff;
4392 keytab[kpos++] += (crc >> 16) & 0xff;
4393 keytab[kpos++] += (crc >> 8) & 0xff;
4394 keytab[kpos++] += (crc >> 0) & 0xff;
4395
4396 if (kpos >= 64) kpos = 0;
4397 }
4398
4399 myfree (buf);
4400 }
4401
4402 #ifdef OSX
4403 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4404 {
4405 int core;
4406
4407 for (core = 0; core < (8 * (int)cpu_size); core++)
4408 if (CPU_ISSET(core, cpu_set)) break;
4409
4410 thread_affinity_policy_data_t policy = { core };
4411
4412 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4413
4414 if (data.quiet == 0)
4415 {
4416 if (rc != KERN_SUCCESS)
4417 {
4418 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4419 }
4420 }
4421
4422 return rc;
4423 }
4424 #endif
4425
4426 void set_cpu_affinity (char *cpu_affinity)
4427 {
4428 #ifdef WIN
4429 DWORD_PTR aff_mask = 0;
4430 #elif _POSIX
4431 cpu_set_t cpuset;
4432 CPU_ZERO (&cpuset);
4433 #endif
4434
4435 if (cpu_affinity)
4436 {
4437 char *devices = strdup (cpu_affinity);
4438
4439 char *next = strtok (devices, ",");
4440
4441 do
4442 {
4443 uint cpu_id = atoi (next);
4444
4445 if (cpu_id == 0)
4446 {
4447 #ifdef WIN
4448 aff_mask = 0;
4449 #elif _POSIX
4450 CPU_ZERO (&cpuset);
4451 #endif
4452
4453 break;
4454 }
4455
4456 if (cpu_id > 32)
4457 {
4458 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4459
4460 exit (-1);
4461 }
4462
4463 #ifdef WIN
4464 aff_mask |= 1 << (cpu_id - 1);
4465 #elif _POSIX
4466 CPU_SET ((cpu_id - 1), &cpuset);
4467 #endif
4468
4469 } while ((next = strtok (NULL, ",")) != NULL);
4470
4471 free (devices);
4472 }
4473
4474 #ifdef WIN
4475 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4476 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4477 #elif _POSIX
4478 pthread_t thread = pthread_self ();
4479 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4480 #endif
4481 }
4482
4483 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4484 {
4485 char *element, *end;
4486
4487 end = (char *) base + nmemb * size;
4488
4489 for (element = (char *) base; element < end; element += size)
4490 if (!compar (element, key))
4491 return element;
4492
4493 return NULL;
4494 }
4495
4496 int sort_by_u32 (const void *v1, const void *v2)
4497 {
4498 const u32 *s1 = (const u32 *) v1;
4499 const u32 *s2 = (const u32 *) v2;
4500
4501 return *s1 - *s2;
4502 }
4503
4504 int sort_by_salt (const void *v1, const void *v2)
4505 {
4506 const salt_t *s1 = (const salt_t *) v1;
4507 const salt_t *s2 = (const salt_t *) v2;
4508
4509 const int res1 = s1->salt_len - s2->salt_len;
4510
4511 if (res1 != 0) return (res1);
4512
4513 const int res2 = s1->salt_iter - s2->salt_iter;
4514
4515 if (res2 != 0) return (res2);
4516
4517 uint n;
4518
4519 n = 16;
4520
4521 while (n--)
4522 {
4523 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4524 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4525 }
4526
4527 n = 8;
4528
4529 while (n--)
4530 {
4531 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4532 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4533 }
4534
4535 return (0);
4536 }
4537
4538 int sort_by_salt_buf (const void *v1, const void *v2)
4539 {
4540 const pot_t *p1 = (const pot_t *) v1;
4541 const pot_t *p2 = (const pot_t *) v2;
4542
4543 const hash_t *h1 = &p1->hash;
4544 const hash_t *h2 = &p2->hash;
4545
4546 const salt_t *s1 = h1->salt;
4547 const salt_t *s2 = h2->salt;
4548
4549 uint n = 16;
4550
4551 while (n--)
4552 {
4553 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4554 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4555 }
4556
4557 return 0;
4558 }
4559
4560 int sort_by_hash_t_salt (const void *v1, const void *v2)
4561 {
4562 const hash_t *h1 = (const hash_t *) v1;
4563 const hash_t *h2 = (const hash_t *) v2;
4564
4565 const salt_t *s1 = h1->salt;
4566 const salt_t *s2 = h2->salt;
4567
4568 // testphase: this should work
4569 uint n = 16;
4570
4571 while (n--)
4572 {
4573 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4574 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4575 }
4576
4577 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4578 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4579 if (s1->salt_len > s2->salt_len) return ( 1);
4580 if (s1->salt_len < s2->salt_len) return (-1);
4581
4582 uint n = s1->salt_len;
4583
4584 while (n--)
4585 {
4586 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4587 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4588 }
4589 */
4590
4591 return 0;
4592 }
4593
4594 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4595 {
4596 const hash_t *h1 = (const hash_t *) v1;
4597 const hash_t *h2 = (const hash_t *) v2;
4598
4599 const salt_t *s1 = h1->salt;
4600 const salt_t *s2 = h2->salt;
4601
4602 // 16 - 2 (since last 2 uints contain the digest)
4603 uint n = 14;
4604
4605 while (n--)
4606 {
4607 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4608 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4609 }
4610
4611 return 0;
4612 }
4613
4614 int sort_by_hash_no_salt (const void *v1, const void *v2)
4615 {
4616 const hash_t *h1 = (const hash_t *) v1;
4617 const hash_t *h2 = (const hash_t *) v2;
4618
4619 const void *d1 = h1->digest;
4620 const void *d2 = h2->digest;
4621
4622 return data.sort_by_digest (d1, d2);
4623 }
4624
4625 int sort_by_hash (const void *v1, const void *v2)
4626 {
4627 const hash_t *h1 = (const hash_t *) v1;
4628 const hash_t *h2 = (const hash_t *) v2;
4629
4630 if (data.isSalted)
4631 {
4632 const salt_t *s1 = h1->salt;
4633 const salt_t *s2 = h2->salt;
4634
4635 int res = sort_by_salt (s1, s2);
4636
4637 if (res != 0) return (res);
4638 }
4639
4640 const void *d1 = h1->digest;
4641 const void *d2 = h2->digest;
4642
4643 return data.sort_by_digest (d1, d2);
4644 }
4645
4646 int sort_by_pot (const void *v1, const void *v2)
4647 {
4648 const pot_t *p1 = (const pot_t *) v1;
4649 const pot_t *p2 = (const pot_t *) v2;
4650
4651 const hash_t *h1 = &p1->hash;
4652 const hash_t *h2 = &p2->hash;
4653
4654 return sort_by_hash (h1, h2);
4655 }
4656
4657 int sort_by_mtime (const void *p1, const void *p2)
4658 {
4659 const char **f1 = (const char **) p1;
4660 const char **f2 = (const char **) p2;
4661
4662 struct stat s1; stat (*f1, &s1);
4663 struct stat s2; stat (*f2, &s2);
4664
4665 return s2.st_mtime - s1.st_mtime;
4666 }
4667
4668 int sort_by_cpu_rule (const void *p1, const void *p2)
4669 {
4670 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4671 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4672
4673 return memcmp (r1, r2, sizeof (cpu_rule_t));
4674 }
4675
4676 int sort_by_kernel_rule (const void *p1, const void *p2)
4677 {
4678 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4679 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4680
4681 return memcmp (r1, r2, sizeof (kernel_rule_t));
4682 }
4683
4684 int sort_by_stringptr (const void *p1, const void *p2)
4685 {
4686 const char **s1 = (const char **) p1;
4687 const char **s2 = (const char **) p2;
4688
4689 return strcmp (*s1, *s2);
4690 }
4691
4692 int sort_by_dictstat (const void *s1, const void *s2)
4693 {
4694 dictstat_t *d1 = (dictstat_t *) s1;
4695 dictstat_t *d2 = (dictstat_t *) s2;
4696
4697 #ifdef LINUX
4698 d2->stat.st_atim = d1->stat.st_atim;
4699 #else
4700 d2->stat.st_atime = d1->stat.st_atime;
4701 #endif
4702
4703 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4704 }
4705
4706 int sort_by_bitmap (const void *p1, const void *p2)
4707 {
4708 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4709 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4710
4711 return b1->collisions - b2->collisions;
4712 }
4713
4714 int sort_by_digest_4_2 (const void *v1, const void *v2)
4715 {
4716 const u32 *d1 = (const u32 *) v1;
4717 const u32 *d2 = (const u32 *) v2;
4718
4719 uint n = 2;
4720
4721 while (n--)
4722 {
4723 if (d1[n] > d2[n]) return ( 1);
4724 if (d1[n] < d2[n]) return (-1);
4725 }
4726
4727 return (0);
4728 }
4729
4730 int sort_by_digest_4_4 (const void *v1, const void *v2)
4731 {
4732 const u32 *d1 = (const u32 *) v1;
4733 const u32 *d2 = (const u32 *) v2;
4734
4735 uint n = 4;
4736
4737 while (n--)
4738 {
4739 if (d1[n] > d2[n]) return ( 1);
4740 if (d1[n] < d2[n]) return (-1);
4741 }
4742
4743 return (0);
4744 }
4745
4746 int sort_by_digest_4_5 (const void *v1, const void *v2)
4747 {
4748 const u32 *d1 = (const u32 *) v1;
4749 const u32 *d2 = (const u32 *) v2;
4750
4751 uint n = 5;
4752
4753 while (n--)
4754 {
4755 if (d1[n] > d2[n]) return ( 1);
4756 if (d1[n] < d2[n]) return (-1);
4757 }
4758
4759 return (0);
4760 }
4761
4762 int sort_by_digest_4_6 (const void *v1, const void *v2)
4763 {
4764 const u32 *d1 = (const u32 *) v1;
4765 const u32 *d2 = (const u32 *) v2;
4766
4767 uint n = 6;
4768
4769 while (n--)
4770 {
4771 if (d1[n] > d2[n]) return ( 1);
4772 if (d1[n] < d2[n]) return (-1);
4773 }
4774
4775 return (0);
4776 }
4777
4778 int sort_by_digest_4_8 (const void *v1, const void *v2)
4779 {
4780 const u32 *d1 = (const u32 *) v1;
4781 const u32 *d2 = (const u32 *) v2;
4782
4783 uint n = 8;
4784
4785 while (n--)
4786 {
4787 if (d1[n] > d2[n]) return ( 1);
4788 if (d1[n] < d2[n]) return (-1);
4789 }
4790
4791 return (0);
4792 }
4793
4794 int sort_by_digest_4_16 (const void *v1, const void *v2)
4795 {
4796 const u32 *d1 = (const u32 *) v1;
4797 const u32 *d2 = (const u32 *) v2;
4798
4799 uint n = 16;
4800
4801 while (n--)
4802 {
4803 if (d1[n] > d2[n]) return ( 1);
4804 if (d1[n] < d2[n]) return (-1);
4805 }
4806
4807 return (0);
4808 }
4809
4810 int sort_by_digest_4_32 (const void *v1, const void *v2)
4811 {
4812 const u32 *d1 = (const u32 *) v1;
4813 const u32 *d2 = (const u32 *) v2;
4814
4815 uint n = 32;
4816
4817 while (n--)
4818 {
4819 if (d1[n] > d2[n]) return ( 1);
4820 if (d1[n] < d2[n]) return (-1);
4821 }
4822
4823 return (0);
4824 }
4825
4826 int sort_by_digest_4_64 (const void *v1, const void *v2)
4827 {
4828 const u32 *d1 = (const u32 *) v1;
4829 const u32 *d2 = (const u32 *) v2;
4830
4831 uint n = 64;
4832
4833 while (n--)
4834 {
4835 if (d1[n] > d2[n]) return ( 1);
4836 if (d1[n] < d2[n]) return (-1);
4837 }
4838
4839 return (0);
4840 }
4841
4842 int sort_by_digest_8_8 (const void *v1, const void *v2)
4843 {
4844 const u64 *d1 = (const u64 *) v1;
4845 const u64 *d2 = (const u64 *) v2;
4846
4847 uint n = 8;
4848
4849 while (n--)
4850 {
4851 if (d1[n] > d2[n]) return ( 1);
4852 if (d1[n] < d2[n]) return (-1);
4853 }
4854
4855 return (0);
4856 }
4857
4858 int sort_by_digest_8_16 (const void *v1, const void *v2)
4859 {
4860 const u64 *d1 = (const u64 *) v1;
4861 const u64 *d2 = (const u64 *) v2;
4862
4863 uint n = 16;
4864
4865 while (n--)
4866 {
4867 if (d1[n] > d2[n]) return ( 1);
4868 if (d1[n] < d2[n]) return (-1);
4869 }
4870
4871 return (0);
4872 }
4873
4874 int sort_by_digest_8_25 (const void *v1, const void *v2)
4875 {
4876 const u64 *d1 = (const u64 *) v1;
4877 const u64 *d2 = (const u64 *) v2;
4878
4879 uint n = 25;
4880
4881 while (n--)
4882 {
4883 if (d1[n] > d2[n]) return ( 1);
4884 if (d1[n] < d2[n]) return (-1);
4885 }
4886
4887 return (0);
4888 }
4889
4890 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4891 {
4892 const u32 *d1 = (const u32 *) v1;
4893 const u32 *d2 = (const u32 *) v2;
4894
4895 const uint dgst_pos0 = data.dgst_pos0;
4896 const uint dgst_pos1 = data.dgst_pos1;
4897 const uint dgst_pos2 = data.dgst_pos2;
4898 const uint dgst_pos3 = data.dgst_pos3;
4899
4900 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4901 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4902 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4903 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4904 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4905 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4906 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4907 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4908
4909 return (0);
4910 }
4911
4912 int sort_by_tuning_db_alias (const void *v1, const void *v2)
4913 {
4914 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
4915 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
4916
4917 const int res1 = strcmp (t1->device_name, t2->device_name);
4918
4919 if (res1 != 0) return (res1);
4920
4921 return 0;
4922 }
4923
4924 int sort_by_tuning_db_entry (const void *v1, const void *v2)
4925 {
4926 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
4927 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
4928
4929 const int res1 = strcmp (t1->device_name, t2->device_name);
4930
4931 if (res1 != 0) return (res1);
4932
4933 const int res2 = t1->attack_mode
4934 - t2->attack_mode;
4935
4936 if (res2 != 0) return (res2);
4937
4938 const int res3 = t1->hash_type
4939 - t2->hash_type;
4940
4941 if (res3 != 0) return (res3);
4942
4943 return 0;
4944 }
4945
4946 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)
4947 {
4948 uint outfile_autohex = data.outfile_autohex;
4949
4950 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4951
4952 FILE *debug_fp = NULL;
4953
4954 if (debug_file != NULL)
4955 {
4956 debug_fp = fopen (debug_file, "ab");
4957
4958 lock_file (debug_fp);
4959 }
4960 else
4961 {
4962 debug_fp = stderr;
4963 }
4964
4965 if (debug_fp == NULL)
4966 {
4967 log_info ("WARNING: Could not open debug-file for writing");
4968 }
4969 else
4970 {
4971 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4972 {
4973 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4974
4975 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4976 }
4977
4978 fwrite (rule_ptr, rule_len, 1, debug_fp);
4979
4980 if (debug_mode == 4)
4981 {
4982 fputc (':', debug_fp);
4983
4984 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4985 }
4986
4987 fputc ('\n', debug_fp);
4988
4989 if (debug_file != NULL) fclose (debug_fp);
4990 }
4991 }
4992
4993 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4994 {
4995 int needs_hexify = 0;
4996
4997 if (outfile_autohex == 1)
4998 {
4999 for (uint i = 0; i < plain_len; i++)
5000 {
5001 if (plain_ptr[i] < 0x20)
5002 {
5003 needs_hexify = 1;
5004
5005 break;
5006 }
5007
5008 if (plain_ptr[i] > 0x7f)
5009 {
5010 needs_hexify = 1;
5011
5012 break;
5013 }
5014 }
5015 }
5016
5017 if (needs_hexify == 1)
5018 {
5019 fprintf (fp, "$HEX[");
5020
5021 for (uint i = 0; i < plain_len; i++)
5022 {
5023 fprintf (fp, "%02x", plain_ptr[i]);
5024 }
5025
5026 fprintf (fp, "]");
5027 }
5028 else
5029 {
5030 fwrite (plain_ptr, plain_len, 1, fp);
5031 }
5032 }
5033
5034 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)
5035 {
5036 uint outfile_format = data.outfile_format;
5037
5038 char separator = data.separator;
5039
5040 if (outfile_format & OUTFILE_FMT_HASH)
5041 {
5042 fprintf (out_fp, "%s", out_buf);
5043
5044 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5045 {
5046 fputc (separator, out_fp);
5047 }
5048 }
5049 else if (data.username)
5050 {
5051 if (username != NULL)
5052 {
5053 for (uint i = 0; i < user_len; i++)
5054 {
5055 fprintf (out_fp, "%c", username[i]);
5056 }
5057
5058 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5059 {
5060 fputc (separator, out_fp);
5061 }
5062 }
5063 }
5064
5065 if (outfile_format & OUTFILE_FMT_PLAIN)
5066 {
5067 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
5068
5069 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5070 {
5071 fputc (separator, out_fp);
5072 }
5073 }
5074
5075 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
5076 {
5077 for (uint i = 0; i < plain_len; i++)
5078 {
5079 fprintf (out_fp, "%02x", plain_ptr[i]);
5080 }
5081
5082 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
5083 {
5084 fputc (separator, out_fp);
5085 }
5086 }
5087
5088 if (outfile_format & OUTFILE_FMT_CRACKPOS)
5089 {
5090 #ifdef _WIN
5091 __mingw_fprintf (out_fp, "%llu", crackpos);
5092 #endif
5093
5094 #ifdef _POSIX
5095 #ifdef __x86_64__
5096 fprintf (out_fp, "%lu", (unsigned long) crackpos);
5097 #else
5098 fprintf (out_fp, "%llu", crackpos);
5099 #endif
5100 #endif
5101 }
5102
5103 fputc ('\n', out_fp);
5104 }
5105
5106 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)
5107 {
5108 pot_t pot_key;
5109
5110 pot_key.hash.salt = hashes_buf->salt;
5111 pot_key.hash.digest = hashes_buf->digest;
5112
5113 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5114
5115 if (pot_ptr)
5116 {
5117 log_info_nn ("");
5118
5119 input_buf[input_len] = 0;
5120
5121 // user
5122 unsigned char *username = NULL;
5123 uint user_len = 0;
5124
5125 if (data.username)
5126 {
5127 user_t *user = hashes_buf->hash_info->user;
5128
5129 if (user)
5130 {
5131 username = (unsigned char *) (user->user_name);
5132
5133 user_len = user->user_len;
5134 }
5135 }
5136
5137 // do output the line
5138 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
5139 }
5140 }
5141
5142 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
5143 #define LM_MASKED_PLAIN "[notfound]"
5144
5145 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)
5146 {
5147 // left
5148
5149 pot_t pot_left_key;
5150
5151 pot_left_key.hash.salt = hash_left->salt;
5152 pot_left_key.hash.digest = hash_left->digest;
5153
5154 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5155
5156 // right
5157
5158 uint weak_hash_found = 0;
5159
5160 pot_t pot_right_key;
5161
5162 pot_right_key.hash.salt = hash_right->salt;
5163 pot_right_key.hash.digest = hash_right->digest;
5164
5165 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5166
5167 if (pot_right_ptr == NULL)
5168 {
5169 // special case, if "weak hash"
5170
5171 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5172 {
5173 weak_hash_found = 1;
5174
5175 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5176
5177 // in theory this is not needed, but we are paranoia:
5178
5179 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5180 pot_right_ptr->plain_len = 0;
5181 }
5182 }
5183
5184 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5185 {
5186 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
5187
5188 return;
5189 }
5190
5191 // at least one half was found:
5192
5193 log_info_nn ("");
5194
5195 input_buf[input_len] = 0;
5196
5197 // user
5198
5199 unsigned char *username = NULL;
5200 uint user_len = 0;
5201
5202 if (data.username)
5203 {
5204 user_t *user = hash_left->hash_info->user;
5205
5206 if (user)
5207 {
5208 username = (unsigned char *) (user->user_name);
5209
5210 user_len = user->user_len;
5211 }
5212 }
5213
5214 // mask the part which was not found
5215
5216 uint left_part_masked = 0;
5217 uint right_part_masked = 0;
5218
5219 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5220
5221 if (pot_left_ptr == NULL)
5222 {
5223 left_part_masked = 1;
5224
5225 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5226
5227 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5228
5229 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5230 pot_left_ptr->plain_len = mask_plain_len;
5231 }
5232
5233 if (pot_right_ptr == NULL)
5234 {
5235 right_part_masked = 1;
5236
5237 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5238
5239 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5240
5241 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5242 pot_right_ptr->plain_len = mask_plain_len;
5243 }
5244
5245 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5246
5247 pot_t pot_ptr;
5248
5249 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5250
5251 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5252
5253 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5254
5255 // do output the line
5256
5257 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5258
5259 if (weak_hash_found == 1) myfree (pot_right_ptr);
5260
5261 if (left_part_masked == 1) myfree (pot_left_ptr);
5262 if (right_part_masked == 1) myfree (pot_right_ptr);
5263 }
5264
5265 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)
5266 {
5267 pot_t pot_key;
5268
5269 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5270
5271 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5272
5273 if (pot_ptr == NULL)
5274 {
5275 log_info_nn ("");
5276
5277 input_buf[input_len] = 0;
5278
5279 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5280 }
5281 }
5282
5283 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)
5284 {
5285 // left
5286
5287 pot_t pot_left_key;
5288
5289 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5290
5291 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5292
5293 // right
5294
5295 pot_t pot_right_key;
5296
5297 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5298
5299 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5300
5301 uint weak_hash_found = 0;
5302
5303 if (pot_right_ptr == NULL)
5304 {
5305 // special case, if "weak hash"
5306
5307 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5308 {
5309 weak_hash_found = 1;
5310
5311 // we just need that pot_right_ptr is not a NULL pointer
5312
5313 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5314 }
5315 }
5316
5317 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5318 {
5319 if (weak_hash_found == 1) myfree (pot_right_ptr);
5320
5321 return;
5322 }
5323
5324 // ... at least one part was not cracked
5325
5326 log_info_nn ("");
5327
5328 input_buf[input_len] = 0;
5329
5330 // only show the hash part which is still not cracked
5331
5332 uint user_len = input_len - 32;
5333
5334 char *hash_output = (char *) mymalloc (33);
5335
5336 memcpy (hash_output, input_buf, input_len);
5337
5338 if (pot_left_ptr != NULL)
5339 {
5340 // only show right part (because left part was already found)
5341
5342 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5343
5344 hash_output[user_len + 16] = 0;
5345 }
5346
5347 if (pot_right_ptr != NULL)
5348 {
5349 // only show left part (because right part was already found)
5350
5351 memcpy (hash_output + user_len, input_buf + user_len, 16);
5352
5353 hash_output[user_len + 16] = 0;
5354 }
5355
5356 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5357
5358 myfree (hash_output);
5359
5360 if (weak_hash_found == 1) myfree (pot_right_ptr);
5361 }
5362
5363 uint setup_opencl_platforms_filter (char *opencl_platforms)
5364 {
5365 uint opencl_platforms_filter = 0;
5366
5367 if (opencl_platforms)
5368 {
5369 char *platforms = strdup (opencl_platforms);
5370
5371 char *next = strtok (platforms, ",");
5372
5373 do
5374 {
5375 int platform = atoi (next);
5376
5377 if (platform < 1 || platform > 32)
5378 {
5379 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5380
5381 exit (-1);
5382 }
5383
5384 opencl_platforms_filter |= 1 << (platform - 1);
5385
5386 } while ((next = strtok (NULL, ",")) != NULL);
5387
5388 free (platforms);
5389 }
5390 else
5391 {
5392 opencl_platforms_filter = -1;
5393 }
5394
5395 return opencl_platforms_filter;
5396 }
5397
5398 u32 setup_devices_filter (char *opencl_devices)
5399 {
5400 u32 devices_filter = 0;
5401
5402 if (opencl_devices)
5403 {
5404 char *devices = strdup (opencl_devices);
5405
5406 char *next = strtok (devices, ",");
5407
5408 do
5409 {
5410 int device_id = atoi (next);
5411
5412 if (device_id < 1 || device_id > 32)
5413 {
5414 log_error ("ERROR: invalid device_id %u specified", device_id);
5415
5416 exit (-1);
5417 }
5418
5419 devices_filter |= 1 << (device_id - 1);
5420
5421 } while ((next = strtok (NULL, ",")) != NULL);
5422
5423 free (devices);
5424 }
5425 else
5426 {
5427 devices_filter = -1;
5428 }
5429
5430 return devices_filter;
5431 }
5432
5433 cl_device_type setup_device_types_filter (char *opencl_device_types)
5434 {
5435 cl_device_type device_types_filter = 0;
5436
5437 if (opencl_device_types)
5438 {
5439 char *device_types = strdup (opencl_device_types);
5440
5441 char *next = strtok (device_types, ",");
5442
5443 do
5444 {
5445 int device_type = atoi (next);
5446
5447 if (device_type < 1 || device_type > 3)
5448 {
5449 log_error ("ERROR: invalid device_type %u specified", device_type);
5450
5451 exit (-1);
5452 }
5453
5454 device_types_filter |= 1 << device_type;
5455
5456 } while ((next = strtok (NULL, ",")) != NULL);
5457
5458 free (device_types);
5459 }
5460 else
5461 {
5462 // Do not use CPU by default, this often reduces GPU performance because
5463 // the CPU is too busy to handle GPU synchronization
5464
5465 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5466 }
5467
5468 return device_types_filter;
5469 }
5470
5471 u32 get_random_num (const u32 min, const u32 max)
5472 {
5473 if (min == max) return (min);
5474
5475 return ((rand () % (max - min)) + min);
5476 }
5477
5478 u32 mydivc32 (const u32 dividend, const u32 divisor)
5479 {
5480 u32 quotient = dividend / divisor;
5481
5482 if (dividend % divisor) quotient++;
5483
5484 return quotient;
5485 }
5486
5487 u64 mydivc64 (const u64 dividend, const u64 divisor)
5488 {
5489 u64 quotient = dividend / divisor;
5490
5491 if (dividend % divisor) quotient++;
5492
5493 return quotient;
5494 }
5495
5496 void format_timer_display (struct tm *tm, char *buf, size_t len)
5497 {
5498 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5499 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5500
5501 if (tm->tm_year - 70)
5502 {
5503 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5504 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5505
5506 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5507 }
5508 else if (tm->tm_yday)
5509 {
5510 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5511 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5512
5513 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5514 }
5515 else if (tm->tm_hour)
5516 {
5517 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5518 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5519
5520 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5521 }
5522 else if (tm->tm_min)
5523 {
5524 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5525 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5526
5527 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5528 }
5529 else
5530 {
5531 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5532
5533 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5534 }
5535 }
5536
5537 void format_speed_display (float val, char *buf, size_t len)
5538 {
5539 if (val <= 0)
5540 {
5541 buf[0] = '0';
5542 buf[1] = ' ';
5543 buf[2] = 0;
5544
5545 return;
5546 }
5547
5548 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5549
5550 uint level = 0;
5551
5552 while (val > 99999)
5553 {
5554 val /= 1000;
5555
5556 level++;
5557 }
5558
5559 /* generate output */
5560
5561 if (level == 0)
5562 {
5563 snprintf (buf, len - 1, "%.0f ", val);
5564 }
5565 else
5566 {
5567 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5568 }
5569 }
5570
5571 void lowercase (u8 *buf, int len)
5572 {
5573 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5574 }
5575
5576 void uppercase (u8 *buf, int len)
5577 {
5578 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5579 }
5580
5581 int fgetl (FILE *fp, char *line_buf)
5582 {
5583 int line_len = 0;
5584
5585 while (!feof (fp))
5586 {
5587 const int c = fgetc (fp);
5588
5589 if (c == EOF) break;
5590
5591 line_buf[line_len] = (char) c;
5592
5593 line_len++;
5594
5595 if (line_len == HCBUFSIZ) line_len--;
5596
5597 if (c == '\n') break;
5598 }
5599
5600 if (line_len == 0) return 0;
5601
5602 if (line_buf[line_len - 1] == '\n')
5603 {
5604 line_len--;
5605
5606 line_buf[line_len] = 0;
5607 }
5608
5609 if (line_len == 0) return 0;
5610
5611 if (line_buf[line_len - 1] == '\r')
5612 {
5613 line_len--;
5614
5615 line_buf[line_len] = 0;
5616 }
5617
5618 return (line_len);
5619 }
5620
5621 int in_superchop (char *buf)
5622 {
5623 int len = strlen (buf);
5624
5625 while (len)
5626 {
5627 if (buf[len - 1] == '\n')
5628 {
5629 len--;
5630
5631 continue;
5632 }
5633
5634 if (buf[len - 1] == '\r')
5635 {
5636 len--;
5637
5638 continue;
5639 }
5640
5641 break;
5642 }
5643
5644 buf[len] = 0;
5645
5646 return len;
5647 }
5648
5649 char **scan_directory (const char *path)
5650 {
5651 char *tmp_path = mystrdup (path);
5652
5653 size_t tmp_path_len = strlen (tmp_path);
5654
5655 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5656 {
5657 tmp_path[tmp_path_len - 1] = 0;
5658
5659 tmp_path_len = strlen (tmp_path);
5660 }
5661
5662 char **files = NULL;
5663
5664 int num_files = 0;
5665
5666 DIR *d = NULL;
5667
5668 if ((d = opendir (tmp_path)) != NULL)
5669 {
5670 #ifdef OSX
5671 struct dirent e;
5672
5673 for (;;) {
5674 memset (&e, 0, sizeof (e));
5675 struct dirent *de = NULL;
5676
5677 if (readdir_r (d, &e, &de) != 0)
5678 {
5679 log_error ("ERROR: readdir_r() failed");
5680
5681 break;
5682 }
5683
5684 if (de == NULL) break;
5685 #else
5686 struct dirent *de;
5687
5688 while ((de = readdir (d)) != NULL)
5689 {
5690 #endif
5691 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5692
5693 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5694
5695 char *path_file = (char *) mymalloc (path_size + 1);
5696
5697 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5698
5699 path_file[path_size] = 0;
5700
5701 DIR *d_test;
5702
5703 if ((d_test = opendir (path_file)) != NULL)
5704 {
5705 closedir (d_test);
5706
5707 myfree (path_file);
5708 }
5709 else
5710 {
5711 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5712
5713 num_files++;
5714
5715 files[num_files - 1] = path_file;
5716 }
5717 }
5718
5719 closedir (d);
5720 }
5721 else if (errno == ENOTDIR)
5722 {
5723 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5724
5725 num_files++;
5726
5727 files[num_files - 1] = mystrdup (path);
5728 }
5729
5730 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5731
5732 num_files++;
5733
5734 files[num_files - 1] = NULL;
5735
5736 myfree (tmp_path);
5737
5738 return (files);
5739 }
5740
5741 int count_dictionaries (char **dictionary_files)
5742 {
5743 if (dictionary_files == NULL) return 0;
5744
5745 int cnt = 0;
5746
5747 for (int d = 0; dictionary_files[d] != NULL; d++)
5748 {
5749 cnt++;
5750 }
5751
5752 return (cnt);
5753 }
5754
5755 char *stroptitype (const uint opti_type)
5756 {
5757 switch (opti_type)
5758 {
5759 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5760 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5761 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5762 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5763 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5764 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5765 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5766 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5767 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5768 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5769 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5770 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5771 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5772 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5773 case OPTI_TYPE_SLOW_HASH_SIMD: return ((char *) OPTI_STR_SLOW_HASH_SIMD); break;
5774 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5775 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5776 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5777 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5778 }
5779
5780 return (NULL);
5781 }
5782
5783 char *strparser (const uint parser_status)
5784 {
5785 switch (parser_status)
5786 {
5787 case PARSER_OK: return ((char *) PA_000); break;
5788 case PARSER_COMMENT: return ((char *) PA_001); break;
5789 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5790 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5791 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5792 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5793 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5794 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5795 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5796 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5797 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5798 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5799 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5800 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5801 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5802 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5803 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5804 }
5805
5806 return ((char *) PA_255);
5807 }
5808
5809 char *strhashtype (const uint hash_mode)
5810 {
5811 switch (hash_mode)
5812 {
5813 case 0: return ((char *) HT_00000); break;
5814 case 10: return ((char *) HT_00010); break;
5815 case 11: return ((char *) HT_00011); break;
5816 case 12: return ((char *) HT_00012); break;
5817 case 20: return ((char *) HT_00020); break;
5818 case 21: return ((char *) HT_00021); break;
5819 case 22: return ((char *) HT_00022); break;
5820 case 23: return ((char *) HT_00023); break;
5821 case 30: return ((char *) HT_00030); break;
5822 case 40: return ((char *) HT_00040); break;
5823 case 50: return ((char *) HT_00050); break;
5824 case 60: return ((char *) HT_00060); break;
5825 case 100: return ((char *) HT_00100); break;
5826 case 101: return ((char *) HT_00101); break;
5827 case 110: return ((char *) HT_00110); break;
5828 case 111: return ((char *) HT_00111); break;
5829 case 112: return ((char *) HT_00112); break;
5830 case 120: return ((char *) HT_00120); break;
5831 case 121: return ((char *) HT_00121); break;
5832 case 122: return ((char *) HT_00122); break;
5833 case 124: return ((char *) HT_00124); break;
5834 case 125: return ((char *) HT_00125); break;
5835 case 130: return ((char *) HT_00130); break;
5836 case 131: return ((char *) HT_00131); break;
5837 case 132: return ((char *) HT_00132); break;
5838 case 133: return ((char *) HT_00133); break;
5839 case 140: return ((char *) HT_00140); break;
5840 case 141: return ((char *) HT_00141); break;
5841 case 150: return ((char *) HT_00150); break;
5842 case 160: return ((char *) HT_00160); break;
5843 case 190: return ((char *) HT_00190); break;
5844 case 200: return ((char *) HT_00200); break;
5845 case 300: return ((char *) HT_00300); break;
5846 case 400: return ((char *) HT_00400); break;
5847 case 500: return ((char *) HT_00500); break;
5848 case 501: return ((char *) HT_00501); break;
5849 case 900: return ((char *) HT_00900); break;
5850 case 910: return ((char *) HT_00910); break;
5851 case 1000: return ((char *) HT_01000); break;
5852 case 1100: return ((char *) HT_01100); break;
5853 case 1400: return ((char *) HT_01400); break;
5854 case 1410: return ((char *) HT_01410); break;
5855 case 1420: return ((char *) HT_01420); break;
5856 case 1421: return ((char *) HT_01421); break;
5857 case 1430: return ((char *) HT_01430); break;
5858 case 1440: return ((char *) HT_01440); break;
5859 case 1441: return ((char *) HT_01441); break;
5860 case 1450: return ((char *) HT_01450); break;
5861 case 1460: return ((char *) HT_01460); break;
5862 case 1500: return ((char *) HT_01500); break;
5863 case 1600: return ((char *) HT_01600); break;
5864 case 1700: return ((char *) HT_01700); break;
5865 case 1710: return ((char *) HT_01710); break;
5866 case 1711: return ((char *) HT_01711); break;
5867 case 1720: return ((char *) HT_01720); break;
5868 case 1722: return ((char *) HT_01722); break;
5869 case 1730: return ((char *) HT_01730); break;
5870 case 1731: return ((char *) HT_01731); break;
5871 case 1740: return ((char *) HT_01740); break;
5872 case 1750: return ((char *) HT_01750); break;
5873 case 1760: return ((char *) HT_01760); break;
5874 case 1800: return ((char *) HT_01800); break;
5875 case 2100: return ((char *) HT_02100); break;
5876 case 2400: return ((char *) HT_02400); break;
5877 case 2410: return ((char *) HT_02410); break;
5878 case 2500: return ((char *) HT_02500); break;
5879 case 2600: return ((char *) HT_02600); break;
5880 case 2611: return ((char *) HT_02611); break;
5881 case 2612: return ((char *) HT_02612); break;
5882 case 2711: return ((char *) HT_02711); break;
5883 case 2811: return ((char *) HT_02811); break;
5884 case 3000: return ((char *) HT_03000); break;
5885 case 3100: return ((char *) HT_03100); break;
5886 case 3200: return ((char *) HT_03200); break;
5887 case 3710: return ((char *) HT_03710); break;
5888 case 3711: return ((char *) HT_03711); break;
5889 case 3800: return ((char *) HT_03800); break;
5890 case 4300: return ((char *) HT_04300); break;
5891 case 4400: return ((char *) HT_04400); break;
5892 case 4500: return ((char *) HT_04500); break;
5893 case 4700: return ((char *) HT_04700); break;
5894 case 4800: return ((char *) HT_04800); break;
5895 case 4900: return ((char *) HT_04900); break;
5896 case 5000: return ((char *) HT_05000); break;
5897 case 5100: return ((char *) HT_05100); break;
5898 case 5200: return ((char *) HT_05200); break;
5899 case 5300: return ((char *) HT_05300); break;
5900 case 5400: return ((char *) HT_05400); break;
5901 case 5500: return ((char *) HT_05500); break;
5902 case 5600: return ((char *) HT_05600); break;
5903 case 5700: return ((char *) HT_05700); break;
5904 case 5800: return ((char *) HT_05800); break;
5905 case 6000: return ((char *) HT_06000); break;
5906 case 6100: return ((char *) HT_06100); break;
5907 case 6211: return ((char *) HT_06211); break;
5908 case 6212: return ((char *) HT_06212); break;
5909 case 6213: return ((char *) HT_06213); break;
5910 case 6221: return ((char *) HT_06221); break;
5911 case 6222: return ((char *) HT_06222); break;
5912 case 6223: return ((char *) HT_06223); break;
5913 case 6231: return ((char *) HT_06231); break;
5914 case 6232: return ((char *) HT_06232); break;
5915 case 6233: return ((char *) HT_06233); break;
5916 case 6241: return ((char *) HT_06241); break;
5917 case 6242: return ((char *) HT_06242); break;
5918 case 6243: return ((char *) HT_06243); break;
5919 case 6300: return ((char *) HT_06300); break;
5920 case 6400: return ((char *) HT_06400); break;
5921 case 6500: return ((char *) HT_06500); break;
5922 case 6600: return ((char *) HT_06600); break;
5923 case 6700: return ((char *) HT_06700); break;
5924 case 6800: return ((char *) HT_06800); break;
5925 case 6900: return ((char *) HT_06900); break;
5926 case 7100: return ((char *) HT_07100); break;
5927 case 7200: return ((char *) HT_07200); break;
5928 case 7300: return ((char *) HT_07300); break;
5929 case 7400: return ((char *) HT_07400); break;
5930 case 7500: return ((char *) HT_07500); break;
5931 case 7600: return ((char *) HT_07600); break;
5932 case 7700: return ((char *) HT_07700); break;
5933 case 7800: return ((char *) HT_07800); break;
5934 case 7900: return ((char *) HT_07900); break;
5935 case 8000: return ((char *) HT_08000); break;
5936 case 8100: return ((char *) HT_08100); break;
5937 case 8200: return ((char *) HT_08200); break;
5938 case 8300: return ((char *) HT_08300); break;
5939 case 8400: return ((char *) HT_08400); break;
5940 case 8500: return ((char *) HT_08500); break;
5941 case 8600: return ((char *) HT_08600); break;
5942 case 8700: return ((char *) HT_08700); break;
5943 case 8800: return ((char *) HT_08800); break;
5944 case 8900: return ((char *) HT_08900); break;
5945 case 9000: return ((char *) HT_09000); break;
5946 case 9100: return ((char *) HT_09100); break;
5947 case 9200: return ((char *) HT_09200); break;
5948 case 9300: return ((char *) HT_09300); break;
5949 case 9400: return ((char *) HT_09400); break;
5950 case 9500: return ((char *) HT_09500); break;
5951 case 9600: return ((char *) HT_09600); break;
5952 case 9700: return ((char *) HT_09700); break;
5953 case 9710: return ((char *) HT_09710); break;
5954 case 9720: return ((char *) HT_09720); break;
5955 case 9800: return ((char *) HT_09800); break;
5956 case 9810: return ((char *) HT_09810); break;
5957 case 9820: return ((char *) HT_09820); break;
5958 case 9900: return ((char *) HT_09900); break;
5959 case 10000: return ((char *) HT_10000); break;
5960 case 10100: return ((char *) HT_10100); break;
5961 case 10200: return ((char *) HT_10200); break;
5962 case 10300: return ((char *) HT_10300); break;
5963 case 10400: return ((char *) HT_10400); break;
5964 case 10410: return ((char *) HT_10410); break;
5965 case 10420: return ((char *) HT_10420); break;
5966 case 10500: return ((char *) HT_10500); break;
5967 case 10600: return ((char *) HT_10600); break;
5968 case 10700: return ((char *) HT_10700); break;
5969 case 10800: return ((char *) HT_10800); break;
5970 case 10900: return ((char *) HT_10900); break;
5971 case 11000: return ((char *) HT_11000); break;
5972 case 11100: return ((char *) HT_11100); break;
5973 case 11200: return ((char *) HT_11200); break;
5974 case 11300: return ((char *) HT_11300); break;
5975 case 11400: return ((char *) HT_11400); break;
5976 case 11500: return ((char *) HT_11500); break;
5977 case 11600: return ((char *) HT_11600); break;
5978 case 11700: return ((char *) HT_11700); break;
5979 case 11800: return ((char *) HT_11800); break;
5980 case 11900: return ((char *) HT_11900); break;
5981 case 12000: return ((char *) HT_12000); break;
5982 case 12100: return ((char *) HT_12100); break;
5983 case 12200: return ((char *) HT_12200); break;
5984 case 12300: return ((char *) HT_12300); break;
5985 case 12400: return ((char *) HT_12400); break;
5986 case 12500: return ((char *) HT_12500); break;
5987 case 12600: return ((char *) HT_12600); break;
5988 case 12700: return ((char *) HT_12700); break;
5989 case 12800: return ((char *) HT_12800); break;
5990 case 12900: return ((char *) HT_12900); break;
5991 case 13000: return ((char *) HT_13000); break;
5992 case 13100: return ((char *) HT_13100); break;
5993 case 13200: return ((char *) HT_13200); break;
5994 case 13300: return ((char *) HT_13300); break;
5995 case 13400: return ((char *) HT_13400); break;
5996 case 13500: return ((char *) HT_13500); break;
5997 case 13600: return ((char *) HT_13600); break;
5998 case 13711: return ((char *) HT_13711); break;
5999 case 13712: return ((char *) HT_13712); break;
6000 case 13713: return ((char *) HT_13713); break;
6001 case 13721: return ((char *) HT_13721); break;
6002 case 13722: return ((char *) HT_13722); break;
6003 case 13723: return ((char *) HT_13723); break;
6004 case 13731: return ((char *) HT_13731); break;
6005 case 13732: return ((char *) HT_13732); break;
6006 case 13733: return ((char *) HT_13733); break;
6007 case 13741: return ((char *) HT_13741); break;
6008 case 13742: return ((char *) HT_13742); break;
6009 case 13743: return ((char *) HT_13743); break;
6010 case 13751: return ((char *) HT_13751); break;
6011 case 13752: return ((char *) HT_13752); break;
6012 case 13753: return ((char *) HT_13753); break;
6013 case 13761: return ((char *) HT_13761); break;
6014 case 13762: return ((char *) HT_13762); break;
6015 case 13763: return ((char *) HT_13763); break;
6016 }
6017
6018 return ((char *) "Unknown");
6019 }
6020
6021 char *strstatus (const uint devices_status)
6022 {
6023 switch (devices_status)
6024 {
6025 case STATUS_INIT: return ((char *) ST_0000); break;
6026 case STATUS_STARTING: return ((char *) ST_0001); break;
6027 case STATUS_RUNNING: return ((char *) ST_0002); break;
6028 case STATUS_PAUSED: return ((char *) ST_0003); break;
6029 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
6030 case STATUS_CRACKED: return ((char *) ST_0005); break;
6031 case STATUS_ABORTED: return ((char *) ST_0006); break;
6032 case STATUS_QUIT: return ((char *) ST_0007); break;
6033 case STATUS_BYPASS: return ((char *) ST_0008); break;
6034 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
6035 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
6036 }
6037
6038 return ((char *) "Unknown");
6039 }
6040
6041 void ascii_digest (char *out_buf, uint salt_pos, uint digest_pos)
6042 {
6043 uint hash_type = data.hash_type;
6044 uint hash_mode = data.hash_mode;
6045 uint salt_type = data.salt_type;
6046 uint opts_type = data.opts_type;
6047 uint opti_type = data.opti_type;
6048 uint dgst_size = data.dgst_size;
6049
6050 char *hashfile = data.hashfile;
6051
6052 uint len = 4096;
6053
6054 uint digest_buf[64] = { 0 };
6055
6056 u64 *digest_buf64 = (u64 *) digest_buf;
6057
6058 char *digests_buf_ptr = (char *) data.digests_buf;
6059
6060 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
6061
6062 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6063 {
6064 uint tt;
6065
6066 switch (hash_type)
6067 {
6068 case HASH_TYPE_DESCRYPT:
6069 FP (digest_buf[1], digest_buf[0], tt);
6070 break;
6071
6072 case HASH_TYPE_DESRACF:
6073 digest_buf[0] = rotl32 (digest_buf[0], 29);
6074 digest_buf[1] = rotl32 (digest_buf[1], 29);
6075
6076 FP (digest_buf[1], digest_buf[0], tt);
6077 break;
6078
6079 case HASH_TYPE_LM:
6080 FP (digest_buf[1], digest_buf[0], tt);
6081 break;
6082
6083 case HASH_TYPE_NETNTLM:
6084 digest_buf[0] = rotl32 (digest_buf[0], 29);
6085 digest_buf[1] = rotl32 (digest_buf[1], 29);
6086 digest_buf[2] = rotl32 (digest_buf[2], 29);
6087 digest_buf[3] = rotl32 (digest_buf[3], 29);
6088
6089 FP (digest_buf[1], digest_buf[0], tt);
6090 FP (digest_buf[3], digest_buf[2], tt);
6091 break;
6092
6093 case HASH_TYPE_BSDICRYPT:
6094 digest_buf[0] = rotl32 (digest_buf[0], 31);
6095 digest_buf[1] = rotl32 (digest_buf[1], 31);
6096
6097 FP (digest_buf[1], digest_buf[0], tt);
6098 break;
6099 }
6100 }
6101
6102 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
6103 {
6104 switch (hash_type)
6105 {
6106 case HASH_TYPE_MD4:
6107 digest_buf[0] += MD4M_A;
6108 digest_buf[1] += MD4M_B;
6109 digest_buf[2] += MD4M_C;
6110 digest_buf[3] += MD4M_D;
6111 break;
6112
6113 case HASH_TYPE_MD5:
6114 digest_buf[0] += MD5M_A;
6115 digest_buf[1] += MD5M_B;
6116 digest_buf[2] += MD5M_C;
6117 digest_buf[3] += MD5M_D;
6118 break;
6119
6120 case HASH_TYPE_SHA1:
6121 digest_buf[0] += SHA1M_A;
6122 digest_buf[1] += SHA1M_B;
6123 digest_buf[2] += SHA1M_C;
6124 digest_buf[3] += SHA1M_D;
6125 digest_buf[4] += SHA1M_E;
6126 break;
6127
6128 case HASH_TYPE_SHA256:
6129 digest_buf[0] += SHA256M_A;
6130 digest_buf[1] += SHA256M_B;
6131 digest_buf[2] += SHA256M_C;
6132 digest_buf[3] += SHA256M_D;
6133 digest_buf[4] += SHA256M_E;
6134 digest_buf[5] += SHA256M_F;
6135 digest_buf[6] += SHA256M_G;
6136 digest_buf[7] += SHA256M_H;
6137 break;
6138
6139 case HASH_TYPE_SHA384:
6140 digest_buf64[0] += SHA384M_A;
6141 digest_buf64[1] += SHA384M_B;
6142 digest_buf64[2] += SHA384M_C;
6143 digest_buf64[3] += SHA384M_D;
6144 digest_buf64[4] += SHA384M_E;
6145 digest_buf64[5] += SHA384M_F;
6146 digest_buf64[6] += 0;
6147 digest_buf64[7] += 0;
6148 break;
6149
6150 case HASH_TYPE_SHA512:
6151 digest_buf64[0] += SHA512M_A;
6152 digest_buf64[1] += SHA512M_B;
6153 digest_buf64[2] += SHA512M_C;
6154 digest_buf64[3] += SHA512M_D;
6155 digest_buf64[4] += SHA512M_E;
6156 digest_buf64[5] += SHA512M_F;
6157 digest_buf64[6] += SHA512M_G;
6158 digest_buf64[7] += SHA512M_H;
6159 break;
6160 }
6161 }
6162
6163 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
6164 {
6165 if (dgst_size == DGST_SIZE_4_2)
6166 {
6167 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6168 }
6169 else if (dgst_size == DGST_SIZE_4_4)
6170 {
6171 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6172 }
6173 else if (dgst_size == DGST_SIZE_4_5)
6174 {
6175 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6176 }
6177 else if (dgst_size == DGST_SIZE_4_6)
6178 {
6179 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6180 }
6181 else if (dgst_size == DGST_SIZE_4_8)
6182 {
6183 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6184 }
6185 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6186 {
6187 if (hash_type == HASH_TYPE_WHIRLPOOL)
6188 {
6189 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6190 }
6191 else if (hash_type == HASH_TYPE_SHA384)
6192 {
6193 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6194 }
6195 else if (hash_type == HASH_TYPE_SHA512)
6196 {
6197 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6198 }
6199 else if (hash_type == HASH_TYPE_GOST)
6200 {
6201 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6202 }
6203 }
6204 else if (dgst_size == DGST_SIZE_4_64)
6205 {
6206 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6207 }
6208 else if (dgst_size == DGST_SIZE_8_25)
6209 {
6210 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6211 }
6212 }
6213
6214 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6215 | (data.salt_type == SALT_TYPE_EXTERN)
6216 | (data.salt_type == SALT_TYPE_EMBEDDED));
6217
6218 salt_t salt;
6219
6220 if (isSalted)
6221 {
6222 memset (&salt, 0, sizeof (salt_t));
6223
6224 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6225
6226 char *ptr = (char *) salt.salt_buf;
6227
6228 uint len = salt.salt_len;
6229
6230 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6231 {
6232 uint tt;
6233
6234 switch (hash_type)
6235 {
6236 case HASH_TYPE_NETNTLM:
6237
6238 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6239 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6240
6241 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6242
6243 break;
6244 }
6245 }
6246
6247 if (opts_type & OPTS_TYPE_ST_UNICODE)
6248 {
6249 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6250 {
6251 ptr[i] = ptr[j];
6252 }
6253
6254 len = len / 2;
6255 }
6256
6257 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6258 {
6259 uint max = salt.salt_len / 4;
6260
6261 if (len % 4) max++;
6262
6263 for (uint i = 0; i < max; i++)
6264 {
6265 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6266 }
6267 }
6268
6269 if (opts_type & OPTS_TYPE_ST_HEX)
6270 {
6271 char tmp[64] = { 0 };
6272
6273 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6274 {
6275 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6276 }
6277
6278 len = len * 2;
6279
6280 memcpy (ptr, tmp, len);
6281 }
6282
6283 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6284
6285 memset (ptr + len, 0, memset_size);
6286
6287 salt.salt_len = len;
6288 }
6289
6290 //
6291 // some modes require special encoding
6292 //
6293
6294 uint out_buf_plain[256] = { 0 };
6295 uint out_buf_salt[256] = { 0 };
6296
6297 char tmp_buf[1024] = { 0 };
6298
6299 char *ptr_plain = (char *) out_buf_plain;
6300 char *ptr_salt = (char *) out_buf_salt;
6301
6302 if (hash_mode == 22)
6303 {
6304 char username[30] = { 0 };
6305
6306 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6307
6308 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6309
6310 u16 *ptr = (u16 *) digest_buf;
6311
6312 tmp_buf[ 0] = sig[0];
6313 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6314 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6315 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6316 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6317 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6318 tmp_buf[ 6] = sig[1];
6319 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6320 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6321 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6322 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6323 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6324 tmp_buf[12] = sig[2];
6325 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6326 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6327 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6328 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6329 tmp_buf[17] = sig[3];
6330 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6331 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6332 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6333 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6334 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6335 tmp_buf[23] = sig[4];
6336 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6337 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6338 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6339 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6340 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6341 tmp_buf[29] = sig[5];
6342
6343 snprintf (out_buf, len-1, "%s:%s",
6344 tmp_buf,
6345 username);
6346 }
6347 else if (hash_mode == 23)
6348 {
6349 // do not show the skyper part in output
6350
6351 char *salt_buf_ptr = (char *) salt.salt_buf;
6352
6353 salt_buf_ptr[salt.salt_len - 8] = 0;
6354
6355 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6356 digest_buf[0],
6357 digest_buf[1],
6358 digest_buf[2],
6359 digest_buf[3],
6360 salt_buf_ptr);
6361 }
6362 else if (hash_mode == 101)
6363 {
6364 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6365
6366 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6367 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6368 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6369 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6370 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6371
6372 memcpy (tmp_buf, digest_buf, 20);
6373
6374 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6375
6376 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6377 }
6378 else if (hash_mode == 111)
6379 {
6380 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6381
6382 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6383 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6384 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6385 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6386 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6387
6388 memcpy (tmp_buf, digest_buf, 20);
6389 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6390
6391 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6392
6393 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6394 }
6395 else if ((hash_mode == 122) || (hash_mode == 125))
6396 {
6397 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6398 (char *) salt.salt_buf,
6399 digest_buf[0],
6400 digest_buf[1],
6401 digest_buf[2],
6402 digest_buf[3],
6403 digest_buf[4]);
6404 }
6405 else if (hash_mode == 124)
6406 {
6407 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6408 (char *) salt.salt_buf,
6409 digest_buf[0],
6410 digest_buf[1],
6411 digest_buf[2],
6412 digest_buf[3],
6413 digest_buf[4]);
6414 }
6415 else if (hash_mode == 131)
6416 {
6417 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6418 (char *) salt.salt_buf,
6419 0, 0, 0, 0, 0,
6420 digest_buf[0],
6421 digest_buf[1],
6422 digest_buf[2],
6423 digest_buf[3],
6424 digest_buf[4]);
6425 }
6426 else if (hash_mode == 132)
6427 {
6428 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6429 (char *) salt.salt_buf,
6430 digest_buf[0],
6431 digest_buf[1],
6432 digest_buf[2],
6433 digest_buf[3],
6434 digest_buf[4]);
6435 }
6436 else if (hash_mode == 133)
6437 {
6438 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6439
6440 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6441 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6442 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6443 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6444 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6445
6446 memcpy (tmp_buf, digest_buf, 20);
6447
6448 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6449
6450 snprintf (out_buf, len-1, "%s", ptr_plain);
6451 }
6452 else if (hash_mode == 141)
6453 {
6454 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6455
6456 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6457
6458 memset (tmp_buf, 0, sizeof (tmp_buf));
6459
6460 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6461
6462 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6463 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6464 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6465 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6466 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6467
6468 memcpy (tmp_buf, digest_buf, 20);
6469
6470 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6471
6472 ptr_plain[27] = 0;
6473
6474 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6475 }
6476 else if (hash_mode == 400)
6477 {
6478 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6479
6480 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6481 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6482 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6483 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6484
6485 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6486
6487 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6488 }
6489 else if (hash_mode == 500)
6490 {
6491 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6492
6493 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6494 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6495 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6496 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6497
6498 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6499
6500 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6501 {
6502 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6503 }
6504 else
6505 {
6506 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6507 }
6508 }
6509 else if (hash_mode == 501)
6510 {
6511 uint digest_idx = salt.digests_offset + digest_pos;
6512
6513 hashinfo_t **hashinfo_ptr = data.hash_info;
6514 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6515
6516 snprintf (out_buf, len-1, "%s", hash_buf);
6517 }
6518 else if (hash_mode == 1421)
6519 {
6520 u8 *salt_ptr = (u8 *) salt.salt_buf;
6521
6522 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6523 salt_ptr[0],
6524 salt_ptr[1],
6525 salt_ptr[2],
6526 salt_ptr[3],
6527 salt_ptr[4],
6528 salt_ptr[5],
6529 digest_buf[0],
6530 digest_buf[1],
6531 digest_buf[2],
6532 digest_buf[3],
6533 digest_buf[4],
6534 digest_buf[5],
6535 digest_buf[6],
6536 digest_buf[7]);
6537 }
6538 else if (hash_mode == 1441)
6539 {
6540 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6541
6542 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6543
6544 memset (tmp_buf, 0, sizeof (tmp_buf));
6545
6546 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6547
6548 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6549 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6550 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6551 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6552 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6553 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6554 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6555 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6556
6557 memcpy (tmp_buf, digest_buf, 32);
6558
6559 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6560
6561 ptr_plain[43] = 0;
6562
6563 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6564 }
6565 else if (hash_mode == 1500)
6566 {
6567 out_buf[0] = salt.salt_sign[0] & 0xff;
6568 out_buf[1] = salt.salt_sign[1] & 0xff;
6569 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6570 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6571 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6572
6573 memset (tmp_buf, 0, sizeof (tmp_buf));
6574
6575 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6576
6577 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6578 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6579
6580 memcpy (tmp_buf, digest_buf, 8);
6581
6582 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6583
6584 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6585
6586 out_buf[13] = 0;
6587 }
6588 else if (hash_mode == 1600)
6589 {
6590 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6591
6592 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6593 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6594 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6595 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6596
6597 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6598
6599 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6600 {
6601 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6602 }
6603 else
6604 {
6605 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6606 }
6607 }
6608 else if (hash_mode == 1711)
6609 {
6610 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6611
6612 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6613 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6614 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6615 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6616 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6617 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6618 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6619 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6620
6621 memcpy (tmp_buf, digest_buf, 64);
6622 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6623
6624 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6625
6626 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6627 }
6628 else if (hash_mode == 1722)
6629 {
6630 uint *ptr = digest_buf;
6631
6632 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6633 (unsigned char *) salt.salt_buf,
6634 ptr[ 1], ptr[ 0],
6635 ptr[ 3], ptr[ 2],
6636 ptr[ 5], ptr[ 4],
6637 ptr[ 7], ptr[ 6],
6638 ptr[ 9], ptr[ 8],
6639 ptr[11], ptr[10],
6640 ptr[13], ptr[12],
6641 ptr[15], ptr[14]);
6642 }
6643 else if (hash_mode == 1731)
6644 {
6645 uint *ptr = digest_buf;
6646
6647 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6648 (unsigned char *) salt.salt_buf,
6649 ptr[ 1], ptr[ 0],
6650 ptr[ 3], ptr[ 2],
6651 ptr[ 5], ptr[ 4],
6652 ptr[ 7], ptr[ 6],
6653 ptr[ 9], ptr[ 8],
6654 ptr[11], ptr[10],
6655 ptr[13], ptr[12],
6656 ptr[15], ptr[14]);
6657 }
6658 else if (hash_mode == 1800)
6659 {
6660 // temp workaround
6661
6662 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6663 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6664 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6665 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6666 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6667 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6668 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6669 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6670
6671 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6672
6673 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6674 {
6675 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6676 }
6677 else
6678 {
6679 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6680 }
6681 }
6682 else if (hash_mode == 2100)
6683 {
6684 uint pos = 0;
6685
6686 snprintf (out_buf + pos, len-1, "%s%i#",
6687 SIGNATURE_DCC2,
6688 salt.salt_iter + 1);
6689
6690 uint signature_len = strlen (out_buf);
6691
6692 pos += signature_len;
6693 len -= signature_len;
6694
6695 char *salt_ptr = (char *) salt.salt_buf;
6696
6697 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6698
6699 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6700 byte_swap_32 (digest_buf[0]),
6701 byte_swap_32 (digest_buf[1]),
6702 byte_swap_32 (digest_buf[2]),
6703 byte_swap_32 (digest_buf[3]));
6704 }
6705 else if ((hash_mode == 2400) || (hash_mode == 2410))
6706 {
6707 memcpy (tmp_buf, digest_buf, 16);
6708
6709 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6710
6711 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6712 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6713 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6714 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6715
6716 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6717 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6718 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6719 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6720
6721 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6722 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6723 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6724 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6725
6726 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6727 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6728 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6729 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6730
6731 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6732 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6733 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6734 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6735
6736 out_buf[16] = 0;
6737 }
6738 else if (hash_mode == 2500)
6739 {
6740 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6741
6742 wpa_t *wpa = &wpas[salt_pos];
6743
6744 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6745 (char *) salt.salt_buf,
6746 wpa->orig_mac1[0],
6747 wpa->orig_mac1[1],
6748 wpa->orig_mac1[2],
6749 wpa->orig_mac1[3],
6750 wpa->orig_mac1[4],
6751 wpa->orig_mac1[5],
6752 wpa->orig_mac2[0],
6753 wpa->orig_mac2[1],
6754 wpa->orig_mac2[2],
6755 wpa->orig_mac2[3],
6756 wpa->orig_mac2[4],
6757 wpa->orig_mac2[5]);
6758 }
6759 else if (hash_mode == 4400)
6760 {
6761 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6762 byte_swap_32 (digest_buf[0]),
6763 byte_swap_32 (digest_buf[1]),
6764 byte_swap_32 (digest_buf[2]),
6765 byte_swap_32 (digest_buf[3]));
6766 }
6767 else if (hash_mode == 4700)
6768 {
6769 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6770 byte_swap_32 (digest_buf[0]),
6771 byte_swap_32 (digest_buf[1]),
6772 byte_swap_32 (digest_buf[2]),
6773 byte_swap_32 (digest_buf[3]),
6774 byte_swap_32 (digest_buf[4]));
6775 }
6776 else if (hash_mode == 4800)
6777 {
6778 u8 chap_id_byte = (u8) salt.salt_buf[4];
6779
6780 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6781 digest_buf[0],
6782 digest_buf[1],
6783 digest_buf[2],
6784 digest_buf[3],
6785 byte_swap_32 (salt.salt_buf[0]),
6786 byte_swap_32 (salt.salt_buf[1]),
6787 byte_swap_32 (salt.salt_buf[2]),
6788 byte_swap_32 (salt.salt_buf[3]),
6789 chap_id_byte);
6790 }
6791 else if (hash_mode == 4900)
6792 {
6793 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6794 byte_swap_32 (digest_buf[0]),
6795 byte_swap_32 (digest_buf[1]),
6796 byte_swap_32 (digest_buf[2]),
6797 byte_swap_32 (digest_buf[3]),
6798 byte_swap_32 (digest_buf[4]));
6799 }
6800 else if (hash_mode == 5100)
6801 {
6802 snprintf (out_buf, len-1, "%08x%08x",
6803 digest_buf[0],
6804 digest_buf[1]);
6805 }
6806 else if (hash_mode == 5200)
6807 {
6808 snprintf (out_buf, len-1, "%s", hashfile);
6809 }
6810 else if (hash_mode == 5300)
6811 {
6812 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6813
6814 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6815
6816 int buf_len = len -1;
6817
6818 // msg_buf
6819
6820 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6821
6822 for (uint i = 0; i < ikepsk_msg_len; i++)
6823 {
6824 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6825 {
6826 snprintf (out_buf, buf_len, ":");
6827
6828 buf_len--;
6829 out_buf++;
6830 }
6831
6832 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6833
6834 buf_len -= 8;
6835 out_buf += 8;
6836 }
6837
6838 // nr_buf
6839
6840 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6841
6842 for (uint i = 0; i < ikepsk_nr_len; i++)
6843 {
6844 if ((i == 0) || (i == 5))
6845 {
6846 snprintf (out_buf, buf_len, ":");
6847
6848 buf_len--;
6849 out_buf++;
6850 }
6851
6852 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6853
6854 buf_len -= 8;
6855 out_buf += 8;
6856 }
6857
6858 // digest_buf
6859
6860 for (uint i = 0; i < 4; i++)
6861 {
6862 if (i == 0)
6863 {
6864 snprintf (out_buf, buf_len, ":");
6865
6866 buf_len--;
6867 out_buf++;
6868 }
6869
6870 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6871
6872 buf_len -= 8;
6873 out_buf += 8;
6874 }
6875 }
6876 else if (hash_mode == 5400)
6877 {
6878 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6879
6880 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6881
6882 int buf_len = len -1;
6883
6884 // msg_buf
6885
6886 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6887
6888 for (uint i = 0; i < ikepsk_msg_len; i++)
6889 {
6890 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6891 {
6892 snprintf (out_buf, buf_len, ":");
6893
6894 buf_len--;
6895 out_buf++;
6896 }
6897
6898 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6899
6900 buf_len -= 8;
6901 out_buf += 8;
6902 }
6903
6904 // nr_buf
6905
6906 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6907
6908 for (uint i = 0; i < ikepsk_nr_len; i++)
6909 {
6910 if ((i == 0) || (i == 5))
6911 {
6912 snprintf (out_buf, buf_len, ":");
6913
6914 buf_len--;
6915 out_buf++;
6916 }
6917
6918 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6919
6920 buf_len -= 8;
6921 out_buf += 8;
6922 }
6923
6924 // digest_buf
6925
6926 for (uint i = 0; i < 5; i++)
6927 {
6928 if (i == 0)
6929 {
6930 snprintf (out_buf, buf_len, ":");
6931
6932 buf_len--;
6933 out_buf++;
6934 }
6935
6936 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6937
6938 buf_len -= 8;
6939 out_buf += 8;
6940 }
6941 }
6942 else if (hash_mode == 5500)
6943 {
6944 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6945
6946 netntlm_t *netntlm = &netntlms[salt_pos];
6947
6948 char user_buf[64] = { 0 };
6949 char domain_buf[64] = { 0 };
6950 char srvchall_buf[1024] = { 0 };
6951 char clichall_buf[1024] = { 0 };
6952
6953 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6954 {
6955 char *ptr = (char *) netntlm->userdomain_buf;
6956
6957 user_buf[i] = ptr[j];
6958 }
6959
6960 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6961 {
6962 char *ptr = (char *) netntlm->userdomain_buf;
6963
6964 domain_buf[i] = ptr[netntlm->user_len + j];
6965 }
6966
6967 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6968 {
6969 u8 *ptr = (u8 *) netntlm->chall_buf;
6970
6971 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6972 }
6973
6974 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6975 {
6976 u8 *ptr = (u8 *) netntlm->chall_buf;
6977
6978 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6979 }
6980
6981 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6982 user_buf,
6983 domain_buf,
6984 srvchall_buf,
6985 digest_buf[0],
6986 digest_buf[1],
6987 digest_buf[2],
6988 digest_buf[3],
6989 byte_swap_32 (salt.salt_buf_pc[0]),
6990 byte_swap_32 (salt.salt_buf_pc[1]),
6991 clichall_buf);
6992 }
6993 else if (hash_mode == 5600)
6994 {
6995 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6996
6997 netntlm_t *netntlm = &netntlms[salt_pos];
6998
6999 char user_buf[64] = { 0 };
7000 char domain_buf[64] = { 0 };
7001 char srvchall_buf[1024] = { 0 };
7002 char clichall_buf[1024] = { 0 };
7003
7004 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7005 {
7006 char *ptr = (char *) netntlm->userdomain_buf;
7007
7008 user_buf[i] = ptr[j];
7009 }
7010
7011 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7012 {
7013 char *ptr = (char *) netntlm->userdomain_buf;
7014
7015 domain_buf[i] = ptr[netntlm->user_len + j];
7016 }
7017
7018 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7019 {
7020 u8 *ptr = (u8 *) netntlm->chall_buf;
7021
7022 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7023 }
7024
7025 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7026 {
7027 u8 *ptr = (u8 *) netntlm->chall_buf;
7028
7029 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7030 }
7031
7032 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
7033 user_buf,
7034 domain_buf,
7035 srvchall_buf,
7036 digest_buf[0],
7037 digest_buf[1],
7038 digest_buf[2],
7039 digest_buf[3],
7040 clichall_buf);
7041 }
7042 else if (hash_mode == 5700)
7043 {
7044 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7045
7046 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7047 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7048 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7049 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7050 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7051 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7052 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7053 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7054
7055 memcpy (tmp_buf, digest_buf, 32);
7056
7057 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
7058
7059 ptr_plain[43] = 0;
7060
7061 snprintf (out_buf, len-1, "%s", ptr_plain);
7062 }
7063 else if (hash_mode == 5800)
7064 {
7065 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7066 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7067 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7068 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7069 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7070
7071 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
7072 digest_buf[0],
7073 digest_buf[1],
7074 digest_buf[2],
7075 digest_buf[3],
7076 digest_buf[4]);
7077 }
7078 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
7079 {
7080 snprintf (out_buf, len-1, "%s", hashfile);
7081 }
7082 else if (hash_mode == 6300)
7083 {
7084 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7085
7086 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7087 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7088 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7089 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7090
7091 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7092
7093 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7094 }
7095 else if (hash_mode == 6400)
7096 {
7097 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7098
7099 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7100 }
7101 else if (hash_mode == 6500)
7102 {
7103 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7104
7105 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7106 }
7107 else if (hash_mode == 6600)
7108 {
7109 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
7110
7111 agilekey_t *agilekey = &agilekeys[salt_pos];
7112
7113 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7114 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7115
7116 uint buf_len = len - 1;
7117
7118 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
7119 buf_len -= 22;
7120
7121 for (uint i = 0, j = off; i < 1040; i++, j += 2)
7122 {
7123 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
7124
7125 buf_len -= 2;
7126 }
7127 }
7128 else if (hash_mode == 6700)
7129 {
7130 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7131
7132 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7133 }
7134 else if (hash_mode == 6800)
7135 {
7136 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
7137 }
7138 else if (hash_mode == 7100)
7139 {
7140 uint *ptr = digest_buf;
7141
7142 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7143
7144 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7145
7146 uint esalt[8] = { 0 };
7147
7148 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
7149 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
7150 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
7151 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
7152 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
7153 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
7154 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
7155 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
7156
7157 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",
7158 SIGNATURE_SHA512OSX,
7159 salt.salt_iter + 1,
7160 esalt[ 0], esalt[ 1],
7161 esalt[ 2], esalt[ 3],
7162 esalt[ 4], esalt[ 5],
7163 esalt[ 6], esalt[ 7],
7164 ptr [ 1], ptr [ 0],
7165 ptr [ 3], ptr [ 2],
7166 ptr [ 5], ptr [ 4],
7167 ptr [ 7], ptr [ 6],
7168 ptr [ 9], ptr [ 8],
7169 ptr [11], ptr [10],
7170 ptr [13], ptr [12],
7171 ptr [15], ptr [14]);
7172 }
7173 else if (hash_mode == 7200)
7174 {
7175 uint *ptr = digest_buf;
7176
7177 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7178
7179 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7180
7181 uint len_used = 0;
7182
7183 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7184
7185 len_used = strlen (out_buf);
7186
7187 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7188
7189 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7190 {
7191 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7192 }
7193
7194 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",
7195 ptr [ 1], ptr [ 0],
7196 ptr [ 3], ptr [ 2],
7197 ptr [ 5], ptr [ 4],
7198 ptr [ 7], ptr [ 6],
7199 ptr [ 9], ptr [ 8],
7200 ptr [11], ptr [10],
7201 ptr [13], ptr [12],
7202 ptr [15], ptr [14]);
7203 }
7204 else if (hash_mode == 7300)
7205 {
7206 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7207
7208 rakp_t *rakp = &rakps[salt_pos];
7209
7210 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7211 {
7212 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7213 }
7214
7215 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7216 digest_buf[0],
7217 digest_buf[1],
7218 digest_buf[2],
7219 digest_buf[3],
7220 digest_buf[4]);
7221 }
7222 else if (hash_mode == 7400)
7223 {
7224 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7225
7226 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7227 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7228 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7229 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7230 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7231 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7232 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7233 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7234
7235 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7236
7237 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7238 {
7239 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7240 }
7241 else
7242 {
7243 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7244 }
7245 }
7246 else if (hash_mode == 7500)
7247 {
7248 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7249
7250 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7251
7252 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7253 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7254
7255 char data[128] = { 0 };
7256
7257 char *ptr_data = data;
7258
7259 for (uint i = 0; i < 36; i++, ptr_data += 2)
7260 {
7261 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7262 }
7263
7264 for (uint i = 0; i < 16; i++, ptr_data += 2)
7265 {
7266 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7267 }
7268
7269 *ptr_data = 0;
7270
7271 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7272 SIGNATURE_KRB5PA,
7273 (char *) krb5pa->user,
7274 (char *) krb5pa->realm,
7275 (char *) krb5pa->salt,
7276 data);
7277 }
7278 else if (hash_mode == 7700)
7279 {
7280 snprintf (out_buf, len-1, "%s$%08X%08X",
7281 (char *) salt.salt_buf,
7282 digest_buf[0],
7283 digest_buf[1]);
7284 }
7285 else if (hash_mode == 7800)
7286 {
7287 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7288 (char *) salt.salt_buf,
7289 digest_buf[0],
7290 digest_buf[1],
7291 digest_buf[2],
7292 digest_buf[3],
7293 digest_buf[4]);
7294 }
7295 else if (hash_mode == 7900)
7296 {
7297 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7298
7299 // ugly hack start
7300
7301 char *tmp = (char *) salt.salt_buf_pc;
7302
7303 ptr_plain[42] = tmp[0];
7304
7305 // ugly hack end
7306
7307 ptr_plain[43] = 0;
7308
7309 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7310 }
7311 else if (hash_mode == 8000)
7312 {
7313 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7314 (unsigned char *) salt.salt_buf,
7315 digest_buf[0],
7316 digest_buf[1],
7317 digest_buf[2],
7318 digest_buf[3],
7319 digest_buf[4],
7320 digest_buf[5],
7321 digest_buf[6],
7322 digest_buf[7]);
7323 }
7324 else if (hash_mode == 8100)
7325 {
7326 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7327 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7328
7329 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7330 (unsigned char *) salt.salt_buf,
7331 digest_buf[0],
7332 digest_buf[1],
7333 digest_buf[2],
7334 digest_buf[3],
7335 digest_buf[4]);
7336 }
7337 else if (hash_mode == 8200)
7338 {
7339 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7340
7341 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7342
7343 char data_buf[4096] = { 0 };
7344
7345 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7346 {
7347 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7348 }
7349
7350 data_buf[cloudkey->data_len * 2] = 0;
7351
7352 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7353 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7354 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7355 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7356 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7357 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7358 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7359 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7360
7361 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7362 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7363 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7364 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7365
7366 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7367 digest_buf[0],
7368 digest_buf[1],
7369 digest_buf[2],
7370 digest_buf[3],
7371 digest_buf[4],
7372 digest_buf[5],
7373 digest_buf[6],
7374 digest_buf[7],
7375 salt.salt_buf[0],
7376 salt.salt_buf[1],
7377 salt.salt_buf[2],
7378 salt.salt_buf[3],
7379 salt.salt_iter + 1,
7380 data_buf);
7381 }
7382 else if (hash_mode == 8300)
7383 {
7384 char digest_buf_c[34] = { 0 };
7385
7386 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7387 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7388 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7389 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7390 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7391
7392 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7393
7394 digest_buf_c[32] = 0;
7395
7396 // domain
7397
7398 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7399
7400 char domain_buf_c[33] = { 0 };
7401
7402 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7403
7404 for (uint i = 0; i < salt_pc_len; i++)
7405 {
7406 const char next = domain_buf_c[i];
7407
7408 domain_buf_c[i] = '.';
7409
7410 i += next;
7411 }
7412
7413 domain_buf_c[salt_pc_len] = 0;
7414
7415 // final
7416
7417 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7418 }
7419 else if (hash_mode == 8500)
7420 {
7421 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7422 }
7423 else if (hash_mode == 2612)
7424 {
7425 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7426 SIGNATURE_PHPS,
7427 (char *) salt.salt_buf,
7428 digest_buf[0],
7429 digest_buf[1],
7430 digest_buf[2],
7431 digest_buf[3]);
7432 }
7433 else if (hash_mode == 3711)
7434 {
7435 char *salt_ptr = (char *) salt.salt_buf;
7436
7437 salt_ptr[salt.salt_len - 1] = 0;
7438
7439 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7440 SIGNATURE_MEDIAWIKI_B,
7441 salt_ptr,
7442 digest_buf[0],
7443 digest_buf[1],
7444 digest_buf[2],
7445 digest_buf[3]);
7446 }
7447 else if (hash_mode == 8800)
7448 {
7449 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7450
7451 androidfde_t *androidfde = &androidfdes[salt_pos];
7452
7453 char tmp[3073] = { 0 };
7454
7455 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7456 {
7457 sprintf (tmp + j, "%08x", androidfde->data[i]);
7458 }
7459
7460 tmp[3072] = 0;
7461
7462 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7463 SIGNATURE_ANDROIDFDE,
7464 byte_swap_32 (salt.salt_buf[0]),
7465 byte_swap_32 (salt.salt_buf[1]),
7466 byte_swap_32 (salt.salt_buf[2]),
7467 byte_swap_32 (salt.salt_buf[3]),
7468 byte_swap_32 (digest_buf[0]),
7469 byte_swap_32 (digest_buf[1]),
7470 byte_swap_32 (digest_buf[2]),
7471 byte_swap_32 (digest_buf[3]),
7472 tmp);
7473 }
7474 else if (hash_mode == 8900)
7475 {
7476 uint N = salt.scrypt_N;
7477 uint r = salt.scrypt_r;
7478 uint p = salt.scrypt_p;
7479
7480 char base64_salt[32] = { 0 };
7481
7482 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7483
7484 memset (tmp_buf, 0, 46);
7485
7486 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7487 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7488 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7489 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7490 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7491 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7492 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7493 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7494 digest_buf[8] = 0; // needed for base64_encode ()
7495
7496 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7497
7498 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7499 SIGNATURE_SCRYPT,
7500 N,
7501 r,
7502 p,
7503 base64_salt,
7504 tmp_buf);
7505 }
7506 else if (hash_mode == 9000)
7507 {
7508 snprintf (out_buf, len-1, "%s", hashfile);
7509 }
7510 else if (hash_mode == 9200)
7511 {
7512 // salt
7513
7514 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7515
7516 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7517
7518 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7519
7520 // hash
7521
7522 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7523 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7524 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7525 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7526 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7527 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7528 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7529 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7530 digest_buf[8] = 0; // needed for base64_encode ()
7531
7532 char tmp_buf[64] = { 0 };
7533
7534 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7535 tmp_buf[43] = 0; // cut it here
7536
7537 // output
7538
7539 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7540 }
7541 else if (hash_mode == 9300)
7542 {
7543 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7544 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7545 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7546 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7547 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7548 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7549 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7550 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7551 digest_buf[8] = 0; // needed for base64_encode ()
7552
7553 char tmp_buf[64] = { 0 };
7554
7555 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7556 tmp_buf[43] = 0; // cut it here
7557
7558 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7559
7560 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7561 }
7562 else if (hash_mode == 9400)
7563 {
7564 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7565
7566 office2007_t *office2007 = &office2007s[salt_pos];
7567
7568 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7569 SIGNATURE_OFFICE2007,
7570 2007,
7571 20,
7572 office2007->keySize,
7573 16,
7574 salt.salt_buf[0],
7575 salt.salt_buf[1],
7576 salt.salt_buf[2],
7577 salt.salt_buf[3],
7578 office2007->encryptedVerifier[0],
7579 office2007->encryptedVerifier[1],
7580 office2007->encryptedVerifier[2],
7581 office2007->encryptedVerifier[3],
7582 office2007->encryptedVerifierHash[0],
7583 office2007->encryptedVerifierHash[1],
7584 office2007->encryptedVerifierHash[2],
7585 office2007->encryptedVerifierHash[3],
7586 office2007->encryptedVerifierHash[4]);
7587 }
7588 else if (hash_mode == 9500)
7589 {
7590 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7591
7592 office2010_t *office2010 = &office2010s[salt_pos];
7593
7594 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,
7595
7596 salt.salt_buf[0],
7597 salt.salt_buf[1],
7598 salt.salt_buf[2],
7599 salt.salt_buf[3],
7600 office2010->encryptedVerifier[0],
7601 office2010->encryptedVerifier[1],
7602 office2010->encryptedVerifier[2],
7603 office2010->encryptedVerifier[3],
7604 office2010->encryptedVerifierHash[0],
7605 office2010->encryptedVerifierHash[1],
7606 office2010->encryptedVerifierHash[2],
7607 office2010->encryptedVerifierHash[3],
7608 office2010->encryptedVerifierHash[4],
7609 office2010->encryptedVerifierHash[5],
7610 office2010->encryptedVerifierHash[6],
7611 office2010->encryptedVerifierHash[7]);
7612 }
7613 else if (hash_mode == 9600)
7614 {
7615 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7616
7617 office2013_t *office2013 = &office2013s[salt_pos];
7618
7619 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,
7620
7621 salt.salt_buf[0],
7622 salt.salt_buf[1],
7623 salt.salt_buf[2],
7624 salt.salt_buf[3],
7625 office2013->encryptedVerifier[0],
7626 office2013->encryptedVerifier[1],
7627 office2013->encryptedVerifier[2],
7628 office2013->encryptedVerifier[3],
7629 office2013->encryptedVerifierHash[0],
7630 office2013->encryptedVerifierHash[1],
7631 office2013->encryptedVerifierHash[2],
7632 office2013->encryptedVerifierHash[3],
7633 office2013->encryptedVerifierHash[4],
7634 office2013->encryptedVerifierHash[5],
7635 office2013->encryptedVerifierHash[6],
7636 office2013->encryptedVerifierHash[7]);
7637 }
7638 else if (hash_mode == 9700)
7639 {
7640 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7641
7642 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7643
7644 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7645 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7646 byte_swap_32 (salt.salt_buf[0]),
7647 byte_swap_32 (salt.salt_buf[1]),
7648 byte_swap_32 (salt.salt_buf[2]),
7649 byte_swap_32 (salt.salt_buf[3]),
7650 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7651 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7652 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7653 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7654 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7655 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7656 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7657 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7658 }
7659 else if (hash_mode == 9710)
7660 {
7661 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7662
7663 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7664
7665 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7666 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7667 byte_swap_32 (salt.salt_buf[0]),
7668 byte_swap_32 (salt.salt_buf[1]),
7669 byte_swap_32 (salt.salt_buf[2]),
7670 byte_swap_32 (salt.salt_buf[3]),
7671 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7672 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7673 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7674 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7675 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7676 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7677 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7678 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7679 }
7680 else if (hash_mode == 9720)
7681 {
7682 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7683
7684 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7685
7686 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7687
7688 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7689 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7690 byte_swap_32 (salt.salt_buf[0]),
7691 byte_swap_32 (salt.salt_buf[1]),
7692 byte_swap_32 (salt.salt_buf[2]),
7693 byte_swap_32 (salt.salt_buf[3]),
7694 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7695 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7696 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7697 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7698 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7699 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7700 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7701 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7702 rc4key[0],
7703 rc4key[1],
7704 rc4key[2],
7705 rc4key[3],
7706 rc4key[4]);
7707 }
7708 else if (hash_mode == 9800)
7709 {
7710 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7711
7712 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7713
7714 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7715 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7716 salt.salt_buf[0],
7717 salt.salt_buf[1],
7718 salt.salt_buf[2],
7719 salt.salt_buf[3],
7720 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7721 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7722 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7723 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7724 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7725 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7726 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7727 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7728 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7729 }
7730 else if (hash_mode == 9810)
7731 {
7732 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7733
7734 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7735
7736 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7737 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7738 salt.salt_buf[0],
7739 salt.salt_buf[1],
7740 salt.salt_buf[2],
7741 salt.salt_buf[3],
7742 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7743 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7744 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7745 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7746 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7747 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7748 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7749 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7750 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7751 }
7752 else if (hash_mode == 9820)
7753 {
7754 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7755
7756 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7757
7758 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7759
7760 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7761 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7762 salt.salt_buf[0],
7763 salt.salt_buf[1],
7764 salt.salt_buf[2],
7765 salt.salt_buf[3],
7766 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7767 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7768 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7769 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7770 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7771 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7772 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7773 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7774 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7775 rc4key[0],
7776 rc4key[1],
7777 rc4key[2],
7778 rc4key[3],
7779 rc4key[4]);
7780 }
7781 else if (hash_mode == 10000)
7782 {
7783 // salt
7784
7785 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7786
7787 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7788
7789 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7790
7791 // hash
7792
7793 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7794 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7795 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7796 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7797 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7798 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7799 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7800 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7801 digest_buf[8] = 0; // needed for base64_encode ()
7802
7803 char tmp_buf[64] = { 0 };
7804
7805 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7806
7807 // output
7808
7809 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7810 }
7811 else if (hash_mode == 10100)
7812 {
7813 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7814 digest_buf[0],
7815 digest_buf[1],
7816 2,
7817 4,
7818 byte_swap_32 (salt.salt_buf[0]),
7819 byte_swap_32 (salt.salt_buf[1]),
7820 byte_swap_32 (salt.salt_buf[2]),
7821 byte_swap_32 (salt.salt_buf[3]));
7822 }
7823 else if (hash_mode == 10200)
7824 {
7825 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7826
7827 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7828
7829 // challenge
7830
7831 char challenge[100] = { 0 };
7832
7833 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7834
7835 // response
7836
7837 char tmp_buf[100] = { 0 };
7838
7839 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7840 (char *) cram_md5->user,
7841 digest_buf[0],
7842 digest_buf[1],
7843 digest_buf[2],
7844 digest_buf[3]);
7845
7846 char response[100] = { 0 };
7847
7848 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7849
7850 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7851 }
7852 else if (hash_mode == 10300)
7853 {
7854 char tmp_buf[100] = { 0 };
7855
7856 memcpy (tmp_buf + 0, digest_buf, 20);
7857 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7858
7859 uint tmp_len = 20 + salt.salt_len;
7860
7861 // base64 encode it
7862
7863 char base64_encoded[100] = { 0 };
7864
7865 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7866
7867 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7868 }
7869 else if (hash_mode == 10400)
7870 {
7871 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7872
7873 pdf_t *pdf = &pdfs[salt_pos];
7874
7875 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",
7876
7877 pdf->V,
7878 pdf->R,
7879 40,
7880 pdf->P,
7881 pdf->enc_md,
7882 pdf->id_len,
7883 byte_swap_32 (pdf->id_buf[0]),
7884 byte_swap_32 (pdf->id_buf[1]),
7885 byte_swap_32 (pdf->id_buf[2]),
7886 byte_swap_32 (pdf->id_buf[3]),
7887 pdf->u_len,
7888 byte_swap_32 (pdf->u_buf[0]),
7889 byte_swap_32 (pdf->u_buf[1]),
7890 byte_swap_32 (pdf->u_buf[2]),
7891 byte_swap_32 (pdf->u_buf[3]),
7892 byte_swap_32 (pdf->u_buf[4]),
7893 byte_swap_32 (pdf->u_buf[5]),
7894 byte_swap_32 (pdf->u_buf[6]),
7895 byte_swap_32 (pdf->u_buf[7]),
7896 pdf->o_len,
7897 byte_swap_32 (pdf->o_buf[0]),
7898 byte_swap_32 (pdf->o_buf[1]),
7899 byte_swap_32 (pdf->o_buf[2]),
7900 byte_swap_32 (pdf->o_buf[3]),
7901 byte_swap_32 (pdf->o_buf[4]),
7902 byte_swap_32 (pdf->o_buf[5]),
7903 byte_swap_32 (pdf->o_buf[6]),
7904 byte_swap_32 (pdf->o_buf[7])
7905 );
7906 }
7907 else if (hash_mode == 10410)
7908 {
7909 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7910
7911 pdf_t *pdf = &pdfs[salt_pos];
7912
7913 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",
7914
7915 pdf->V,
7916 pdf->R,
7917 40,
7918 pdf->P,
7919 pdf->enc_md,
7920 pdf->id_len,
7921 byte_swap_32 (pdf->id_buf[0]),
7922 byte_swap_32 (pdf->id_buf[1]),
7923 byte_swap_32 (pdf->id_buf[2]),
7924 byte_swap_32 (pdf->id_buf[3]),
7925 pdf->u_len,
7926 byte_swap_32 (pdf->u_buf[0]),
7927 byte_swap_32 (pdf->u_buf[1]),
7928 byte_swap_32 (pdf->u_buf[2]),
7929 byte_swap_32 (pdf->u_buf[3]),
7930 byte_swap_32 (pdf->u_buf[4]),
7931 byte_swap_32 (pdf->u_buf[5]),
7932 byte_swap_32 (pdf->u_buf[6]),
7933 byte_swap_32 (pdf->u_buf[7]),
7934 pdf->o_len,
7935 byte_swap_32 (pdf->o_buf[0]),
7936 byte_swap_32 (pdf->o_buf[1]),
7937 byte_swap_32 (pdf->o_buf[2]),
7938 byte_swap_32 (pdf->o_buf[3]),
7939 byte_swap_32 (pdf->o_buf[4]),
7940 byte_swap_32 (pdf->o_buf[5]),
7941 byte_swap_32 (pdf->o_buf[6]),
7942 byte_swap_32 (pdf->o_buf[7])
7943 );
7944 }
7945 else if (hash_mode == 10420)
7946 {
7947 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7948
7949 pdf_t *pdf = &pdfs[salt_pos];
7950
7951 u8 *rc4key = (u8 *) pdf->rc4key;
7952
7953 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",
7954
7955 pdf->V,
7956 pdf->R,
7957 40,
7958 pdf->P,
7959 pdf->enc_md,
7960 pdf->id_len,
7961 byte_swap_32 (pdf->id_buf[0]),
7962 byte_swap_32 (pdf->id_buf[1]),
7963 byte_swap_32 (pdf->id_buf[2]),
7964 byte_swap_32 (pdf->id_buf[3]),
7965 pdf->u_len,
7966 byte_swap_32 (pdf->u_buf[0]),
7967 byte_swap_32 (pdf->u_buf[1]),
7968 byte_swap_32 (pdf->u_buf[2]),
7969 byte_swap_32 (pdf->u_buf[3]),
7970 byte_swap_32 (pdf->u_buf[4]),
7971 byte_swap_32 (pdf->u_buf[5]),
7972 byte_swap_32 (pdf->u_buf[6]),
7973 byte_swap_32 (pdf->u_buf[7]),
7974 pdf->o_len,
7975 byte_swap_32 (pdf->o_buf[0]),
7976 byte_swap_32 (pdf->o_buf[1]),
7977 byte_swap_32 (pdf->o_buf[2]),
7978 byte_swap_32 (pdf->o_buf[3]),
7979 byte_swap_32 (pdf->o_buf[4]),
7980 byte_swap_32 (pdf->o_buf[5]),
7981 byte_swap_32 (pdf->o_buf[6]),
7982 byte_swap_32 (pdf->o_buf[7]),
7983 rc4key[0],
7984 rc4key[1],
7985 rc4key[2],
7986 rc4key[3],
7987 rc4key[4]
7988 );
7989 }
7990 else if (hash_mode == 10500)
7991 {
7992 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7993
7994 pdf_t *pdf = &pdfs[salt_pos];
7995
7996 if (pdf->id_len == 32)
7997 {
7998 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",
7999
8000 pdf->V,
8001 pdf->R,
8002 128,
8003 pdf->P,
8004 pdf->enc_md,
8005 pdf->id_len,
8006 byte_swap_32 (pdf->id_buf[0]),
8007 byte_swap_32 (pdf->id_buf[1]),
8008 byte_swap_32 (pdf->id_buf[2]),
8009 byte_swap_32 (pdf->id_buf[3]),
8010 byte_swap_32 (pdf->id_buf[4]),
8011 byte_swap_32 (pdf->id_buf[5]),
8012 byte_swap_32 (pdf->id_buf[6]),
8013 byte_swap_32 (pdf->id_buf[7]),
8014 pdf->u_len,
8015 byte_swap_32 (pdf->u_buf[0]),
8016 byte_swap_32 (pdf->u_buf[1]),
8017 byte_swap_32 (pdf->u_buf[2]),
8018 byte_swap_32 (pdf->u_buf[3]),
8019 byte_swap_32 (pdf->u_buf[4]),
8020 byte_swap_32 (pdf->u_buf[5]),
8021 byte_swap_32 (pdf->u_buf[6]),
8022 byte_swap_32 (pdf->u_buf[7]),
8023 pdf->o_len,
8024 byte_swap_32 (pdf->o_buf[0]),
8025 byte_swap_32 (pdf->o_buf[1]),
8026 byte_swap_32 (pdf->o_buf[2]),
8027 byte_swap_32 (pdf->o_buf[3]),
8028 byte_swap_32 (pdf->o_buf[4]),
8029 byte_swap_32 (pdf->o_buf[5]),
8030 byte_swap_32 (pdf->o_buf[6]),
8031 byte_swap_32 (pdf->o_buf[7])
8032 );
8033 }
8034 else
8035 {
8036 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",
8037
8038 pdf->V,
8039 pdf->R,
8040 128,
8041 pdf->P,
8042 pdf->enc_md,
8043 pdf->id_len,
8044 byte_swap_32 (pdf->id_buf[0]),
8045 byte_swap_32 (pdf->id_buf[1]),
8046 byte_swap_32 (pdf->id_buf[2]),
8047 byte_swap_32 (pdf->id_buf[3]),
8048 pdf->u_len,
8049 byte_swap_32 (pdf->u_buf[0]),
8050 byte_swap_32 (pdf->u_buf[1]),
8051 byte_swap_32 (pdf->u_buf[2]),
8052 byte_swap_32 (pdf->u_buf[3]),
8053 byte_swap_32 (pdf->u_buf[4]),
8054 byte_swap_32 (pdf->u_buf[5]),
8055 byte_swap_32 (pdf->u_buf[6]),
8056 byte_swap_32 (pdf->u_buf[7]),
8057 pdf->o_len,
8058 byte_swap_32 (pdf->o_buf[0]),
8059 byte_swap_32 (pdf->o_buf[1]),
8060 byte_swap_32 (pdf->o_buf[2]),
8061 byte_swap_32 (pdf->o_buf[3]),
8062 byte_swap_32 (pdf->o_buf[4]),
8063 byte_swap_32 (pdf->o_buf[5]),
8064 byte_swap_32 (pdf->o_buf[6]),
8065 byte_swap_32 (pdf->o_buf[7])
8066 );
8067 }
8068 }
8069 else if (hash_mode == 10600)
8070 {
8071 uint digest_idx = salt.digests_offset + digest_pos;
8072
8073 hashinfo_t **hashinfo_ptr = data.hash_info;
8074 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8075
8076 snprintf (out_buf, len-1, "%s", hash_buf);
8077 }
8078 else if (hash_mode == 10700)
8079 {
8080 uint digest_idx = salt.digests_offset + digest_pos;
8081
8082 hashinfo_t **hashinfo_ptr = data.hash_info;
8083 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8084
8085 snprintf (out_buf, len-1, "%s", hash_buf);
8086 }
8087 else if (hash_mode == 10900)
8088 {
8089 uint digest_idx = salt.digests_offset + digest_pos;
8090
8091 hashinfo_t **hashinfo_ptr = data.hash_info;
8092 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8093
8094 snprintf (out_buf, len-1, "%s", hash_buf);
8095 }
8096 else if (hash_mode == 11100)
8097 {
8098 u32 salt_challenge = salt.salt_buf[0];
8099
8100 salt_challenge = byte_swap_32 (salt_challenge);
8101
8102 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
8103
8104 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
8105 SIGNATURE_POSTGRESQL_AUTH,
8106 user_name,
8107 salt_challenge,
8108 digest_buf[0],
8109 digest_buf[1],
8110 digest_buf[2],
8111 digest_buf[3]);
8112 }
8113 else if (hash_mode == 11200)
8114 {
8115 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
8116 SIGNATURE_MYSQL_AUTH,
8117 (unsigned char *) salt.salt_buf,
8118 digest_buf[0],
8119 digest_buf[1],
8120 digest_buf[2],
8121 digest_buf[3],
8122 digest_buf[4]);
8123 }
8124 else if (hash_mode == 11300)
8125 {
8126 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
8127
8128 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
8129
8130 const uint cry_master_len = bitcoin_wallet->cry_master_len;
8131 const uint ckey_len = bitcoin_wallet->ckey_len;
8132 const uint public_key_len = bitcoin_wallet->public_key_len;
8133
8134 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
8135 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
8136 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
8137
8138 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
8139 {
8140 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
8141
8142 sprintf (cry_master_buf + j, "%02x", ptr[i]);
8143 }
8144
8145 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
8146 {
8147 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
8148
8149 sprintf (ckey_buf + j, "%02x", ptr[i]);
8150 }
8151
8152 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
8153 {
8154 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
8155
8156 sprintf (public_key_buf + j, "%02x", ptr[i]);
8157 }
8158
8159 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
8160 SIGNATURE_BITCOIN_WALLET,
8161 cry_master_len * 2,
8162 cry_master_buf,
8163 salt.salt_len,
8164 (unsigned char *) salt.salt_buf,
8165 salt.salt_iter + 1,
8166 ckey_len * 2,
8167 ckey_buf,
8168 public_key_len * 2,
8169 public_key_buf
8170 );
8171
8172 free (cry_master_buf);
8173 free (ckey_buf);
8174 free (public_key_buf);
8175 }
8176 else if (hash_mode == 11400)
8177 {
8178 uint digest_idx = salt.digests_offset + digest_pos;
8179
8180 hashinfo_t **hashinfo_ptr = data.hash_info;
8181 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8182
8183 snprintf (out_buf, len-1, "%s", hash_buf);
8184 }
8185 else if (hash_mode == 11600)
8186 {
8187 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8188
8189 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8190
8191 const uint data_len = seven_zip->data_len;
8192
8193 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8194
8195 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8196 {
8197 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8198
8199 sprintf (data_buf + j, "%02x", ptr[i]);
8200 }
8201
8202 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8203 SIGNATURE_SEVEN_ZIP,
8204 0,
8205 salt.salt_sign[0],
8206 0,
8207 (char *) seven_zip->salt_buf,
8208 seven_zip->iv_len,
8209 seven_zip->iv_buf[0],
8210 seven_zip->iv_buf[1],
8211 seven_zip->iv_buf[2],
8212 seven_zip->iv_buf[3],
8213 seven_zip->crc,
8214 seven_zip->data_len,
8215 seven_zip->unpack_size,
8216 data_buf);
8217
8218 free (data_buf);
8219 }
8220 else if (hash_mode == 11700)
8221 {
8222 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8223 digest_buf[0],
8224 digest_buf[1],
8225 digest_buf[2],
8226 digest_buf[3],
8227 digest_buf[4],
8228 digest_buf[5],
8229 digest_buf[6],
8230 digest_buf[7]);
8231 }
8232 else if (hash_mode == 11800)
8233 {
8234 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8235 digest_buf[ 0],
8236 digest_buf[ 1],
8237 digest_buf[ 2],
8238 digest_buf[ 3],
8239 digest_buf[ 4],
8240 digest_buf[ 5],
8241 digest_buf[ 6],
8242 digest_buf[ 7],
8243 digest_buf[ 8],
8244 digest_buf[ 9],
8245 digest_buf[10],
8246 digest_buf[11],
8247 digest_buf[12],
8248 digest_buf[13],
8249 digest_buf[14],
8250 digest_buf[15]);
8251 }
8252 else if (hash_mode == 11900)
8253 {
8254 uint digest_idx = salt.digests_offset + digest_pos;
8255
8256 hashinfo_t **hashinfo_ptr = data.hash_info;
8257 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8258
8259 snprintf (out_buf, len-1, "%s", hash_buf);
8260 }
8261 else if (hash_mode == 12000)
8262 {
8263 uint digest_idx = salt.digests_offset + digest_pos;
8264
8265 hashinfo_t **hashinfo_ptr = data.hash_info;
8266 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8267
8268 snprintf (out_buf, len-1, "%s", hash_buf);
8269 }
8270 else if (hash_mode == 12100)
8271 {
8272 uint digest_idx = salt.digests_offset + digest_pos;
8273
8274 hashinfo_t **hashinfo_ptr = data.hash_info;
8275 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8276
8277 snprintf (out_buf, len-1, "%s", hash_buf);
8278 }
8279 else if (hash_mode == 12200)
8280 {
8281 uint *ptr_digest = digest_buf;
8282 uint *ptr_salt = salt.salt_buf;
8283
8284 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8285 SIGNATURE_ECRYPTFS,
8286 ptr_salt[0],
8287 ptr_salt[1],
8288 ptr_digest[0],
8289 ptr_digest[1]);
8290 }
8291 else if (hash_mode == 12300)
8292 {
8293 uint *ptr_digest = digest_buf;
8294 uint *ptr_salt = salt.salt_buf;
8295
8296 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",
8297 ptr_digest[ 0], ptr_digest[ 1],
8298 ptr_digest[ 2], ptr_digest[ 3],
8299 ptr_digest[ 4], ptr_digest[ 5],
8300 ptr_digest[ 6], ptr_digest[ 7],
8301 ptr_digest[ 8], ptr_digest[ 9],
8302 ptr_digest[10], ptr_digest[11],
8303 ptr_digest[12], ptr_digest[13],
8304 ptr_digest[14], ptr_digest[15],
8305 ptr_salt[0],
8306 ptr_salt[1],
8307 ptr_salt[2],
8308 ptr_salt[3]);
8309 }
8310 else if (hash_mode == 12400)
8311 {
8312 // encode iteration count
8313
8314 char salt_iter[5] = { 0 };
8315
8316 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8317 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8318 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8319 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8320 salt_iter[4] = 0;
8321
8322 // encode salt
8323
8324 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8325 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8326 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8327 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8328 ptr_salt[4] = 0;
8329
8330 // encode digest
8331
8332 memset (tmp_buf, 0, sizeof (tmp_buf));
8333
8334 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8335 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8336
8337 memcpy (tmp_buf, digest_buf, 8);
8338
8339 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8340
8341 ptr_plain[11] = 0;
8342
8343 // fill the resulting buffer
8344
8345 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8346 }
8347 else if (hash_mode == 12500)
8348 {
8349 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8350 SIGNATURE_RAR3,
8351 byte_swap_32 (salt.salt_buf[0]),
8352 byte_swap_32 (salt.salt_buf[1]),
8353 salt.salt_buf[2],
8354 salt.salt_buf[3],
8355 salt.salt_buf[4],
8356 salt.salt_buf[5]);
8357 }
8358 else if (hash_mode == 12600)
8359 {
8360 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8361 digest_buf[0] + salt.salt_buf_pc[0],
8362 digest_buf[1] + salt.salt_buf_pc[1],
8363 digest_buf[2] + salt.salt_buf_pc[2],
8364 digest_buf[3] + salt.salt_buf_pc[3],
8365 digest_buf[4] + salt.salt_buf_pc[4],
8366 digest_buf[5] + salt.salt_buf_pc[5],
8367 digest_buf[6] + salt.salt_buf_pc[6],
8368 digest_buf[7] + salt.salt_buf_pc[7]);
8369 }
8370 else if (hash_mode == 12700)
8371 {
8372 uint digest_idx = salt.digests_offset + digest_pos;
8373
8374 hashinfo_t **hashinfo_ptr = data.hash_info;
8375 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8376
8377 snprintf (out_buf, len-1, "%s", hash_buf);
8378 }
8379 else if (hash_mode == 12800)
8380 {
8381 const u8 *ptr = (const u8 *) salt.salt_buf;
8382
8383 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",
8384 SIGNATURE_MS_DRSR,
8385 ptr[0],
8386 ptr[1],
8387 ptr[2],
8388 ptr[3],
8389 ptr[4],
8390 ptr[5],
8391 ptr[6],
8392 ptr[7],
8393 ptr[8],
8394 ptr[9],
8395 salt.salt_iter + 1,
8396 byte_swap_32 (digest_buf[0]),
8397 byte_swap_32 (digest_buf[1]),
8398 byte_swap_32 (digest_buf[2]),
8399 byte_swap_32 (digest_buf[3]),
8400 byte_swap_32 (digest_buf[4]),
8401 byte_swap_32 (digest_buf[5]),
8402 byte_swap_32 (digest_buf[6]),
8403 byte_swap_32 (digest_buf[7])
8404 );
8405 }
8406 else if (hash_mode == 12900)
8407 {
8408 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",
8409 salt.salt_buf[ 4],
8410 salt.salt_buf[ 5],
8411 salt.salt_buf[ 6],
8412 salt.salt_buf[ 7],
8413 salt.salt_buf[ 8],
8414 salt.salt_buf[ 9],
8415 salt.salt_buf[10],
8416 salt.salt_buf[11],
8417 byte_swap_32 (digest_buf[0]),
8418 byte_swap_32 (digest_buf[1]),
8419 byte_swap_32 (digest_buf[2]),
8420 byte_swap_32 (digest_buf[3]),
8421 byte_swap_32 (digest_buf[4]),
8422 byte_swap_32 (digest_buf[5]),
8423 byte_swap_32 (digest_buf[6]),
8424 byte_swap_32 (digest_buf[7]),
8425 salt.salt_buf[ 0],
8426 salt.salt_buf[ 1],
8427 salt.salt_buf[ 2],
8428 salt.salt_buf[ 3]
8429 );
8430 }
8431 else if (hash_mode == 13000)
8432 {
8433 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8434
8435 rar5_t *rar5 = &rar5s[salt_pos];
8436
8437 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8438 salt.salt_buf[0],
8439 salt.salt_buf[1],
8440 salt.salt_buf[2],
8441 salt.salt_buf[3],
8442 salt.salt_sign[0],
8443 rar5->iv[0],
8444 rar5->iv[1],
8445 rar5->iv[2],
8446 rar5->iv[3],
8447 byte_swap_32 (digest_buf[0]),
8448 byte_swap_32 (digest_buf[1])
8449 );
8450 }
8451 else if (hash_mode == 13100)
8452 {
8453 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8454
8455 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8456
8457 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8458 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8459
8460 char data[2560 * 4 * 2] = { 0 };
8461
8462 char *ptr_data = data;
8463
8464 for (uint i = 0; i < 16; i++, ptr_data += 2)
8465 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8466
8467 /* skip '$' */
8468 ptr_data++;
8469
8470 for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
8471 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8472
8473 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8474 SIGNATURE_KRB5TGS,
8475 (char *) krb5tgs->account_info,
8476 data,
8477 data + 33);
8478 }
8479 else if (hash_mode == 13200)
8480 {
8481 snprintf (out_buf, len-1, "%s*%d*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x",
8482 SIGNATURE_AXCRYPT,
8483 salt.salt_iter,
8484 salt.salt_buf[0],
8485 salt.salt_buf[1],
8486 salt.salt_buf[2],
8487 salt.salt_buf[3],
8488 salt.salt_buf[4],
8489 salt.salt_buf[5],
8490 salt.salt_buf[6],
8491 salt.salt_buf[7],
8492 salt.salt_buf[8],
8493 salt.salt_buf[9]);
8494 }
8495 else if (hash_mode == 13300)
8496 {
8497 snprintf (out_buf, len-1, "%s$%08x%08x%08x%08x",
8498 SIGNATURE_AXCRYPT_SHA1,
8499 digest_buf[0],
8500 digest_buf[1],
8501 digest_buf[2],
8502 digest_buf[3]);
8503 }
8504 else if (hash_mode == 13400)
8505 {
8506 keepass_t *keepasss = (keepass_t *) data.esalts_buf;
8507
8508 keepass_t *keepass = &keepasss[salt_pos];
8509
8510 u32 version = (u32) keepass->version;
8511 u32 rounds = salt.salt_iter;
8512 u32 algorithm = (u32) keepass->algorithm;
8513 u32 keyfile_len = (u32) keepass->keyfile_len;
8514
8515 u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed ;
8516 u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed ;
8517 u32 *ptr_enc_iv = (u32 *) keepass->enc_iv ;
8518 u32 *ptr_contents_hash = (u32 *) keepass->contents_hash ;
8519 u32 *ptr_keyfile = (u32 *) keepass->keyfile ;
8520
8521 /* specific to version 1 */
8522 u32 contents_len;
8523 u32 *ptr_contents;
8524
8525 /* specific to version 2 */
8526 u32 expected_bytes_len;
8527 u32 *ptr_expected_bytes;
8528
8529 u32 final_random_seed_len;
8530 u32 transf_random_seed_len;
8531 u32 enc_iv_len;
8532 u32 contents_hash_len;
8533
8534 transf_random_seed_len = 8;
8535 enc_iv_len = 4;
8536 contents_hash_len = 8;
8537 final_random_seed_len = 8;
8538
8539 if (version == 1)
8540 final_random_seed_len = 4;
8541
8542 snprintf (out_buf, len-1, "%s*%d*%d*%d",
8543 SIGNATURE_KEEPASS,
8544 version,
8545 rounds,
8546 algorithm);
8547
8548 char *ptr_data = out_buf;
8549
8550 ptr_data += strlen(out_buf);
8551
8552 *ptr_data = '*';
8553 ptr_data++;
8554
8555 for (uint i = 0; i < final_random_seed_len; i++, ptr_data += 8)
8556 sprintf (ptr_data, "%08x", ptr_final_random_seed[i]);
8557
8558 *ptr_data = '*';
8559 ptr_data++;
8560
8561 for (uint i = 0; i < transf_random_seed_len; i++, ptr_data += 8)
8562 sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]);
8563
8564 *ptr_data = '*';
8565 ptr_data++;
8566
8567 for (uint i = 0; i < enc_iv_len; i++, ptr_data += 8)
8568 sprintf (ptr_data, "%08x", ptr_enc_iv[i]);
8569
8570 *ptr_data = '*';
8571 ptr_data++;
8572
8573 if (version == 1)
8574 {
8575 contents_len = (u32) keepass->contents_len;
8576 ptr_contents = (u32 *) keepass->contents;
8577
8578 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8579 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8580
8581 *ptr_data = '*';
8582 ptr_data++;
8583
8584 /* inline flag */
8585 *ptr_data = '1';
8586 ptr_data++;
8587
8588 *ptr_data = '*';
8589 ptr_data++;
8590
8591 char ptr_contents_len[10] = { 0 };
8592
8593 sprintf ((char*) ptr_contents_len, "%d", contents_len);
8594
8595 sprintf (ptr_data, "%d", contents_len);
8596
8597 ptr_data += strlen(ptr_contents_len);
8598
8599 *ptr_data = '*';
8600 ptr_data++;
8601
8602 for (uint i = 0; i < contents_len / 4; i++, ptr_data += 8)
8603 sprintf (ptr_data, "%08x", ptr_contents[i]);
8604 }
8605 else if (version == 2)
8606 {
8607 expected_bytes_len = 8;
8608 ptr_expected_bytes = (u32 *) keepass->expected_bytes ;
8609
8610 for (uint i = 0; i < expected_bytes_len; i++, ptr_data += 8)
8611 sprintf (ptr_data, "%08x", ptr_expected_bytes[i]);
8612
8613 *ptr_data = '*';
8614 ptr_data++;
8615
8616 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8617 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8618 }
8619 if (keyfile_len)
8620 {
8621 *ptr_data = '*';
8622 ptr_data++;
8623
8624 /* inline flag */
8625 *ptr_data = '1';
8626 ptr_data++;
8627
8628 *ptr_data = '*';
8629 ptr_data++;
8630
8631 sprintf (ptr_data, "%d", keyfile_len);
8632
8633 ptr_data += 2;
8634
8635 *ptr_data = '*';
8636 ptr_data++;
8637
8638 for (uint i = 0; i < 8; i++, ptr_data += 8)
8639 sprintf (ptr_data, "%08x", ptr_keyfile[i]);
8640 }
8641 }
8642 else if (hash_mode == 13500)
8643 {
8644 pstoken_t *pstokens = (pstoken_t *) data.esalts_buf;
8645
8646 pstoken_t *pstoken = &pstokens[salt_pos];
8647
8648 const u32 salt_len = (pstoken->salt_len > 512) ? 512 : pstoken->salt_len;
8649
8650 char pstoken_tmp[1024 + 1] = { 0 };
8651
8652 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8653 {
8654 const u8 *ptr = (const u8 *) pstoken->salt_buf;
8655
8656 sprintf (pstoken_tmp + j, "%02x", ptr[i]);
8657 }
8658
8659 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x:%s",
8660 digest_buf[0],
8661 digest_buf[1],
8662 digest_buf[2],
8663 digest_buf[3],
8664 digest_buf[4],
8665 pstoken_tmp);
8666 }
8667 else if (hash_mode == 13600)
8668 {
8669 zip2_t *zip2s = (zip2_t *) data.esalts_buf;
8670
8671 zip2_t *zip2 = &zip2s[salt_pos];
8672
8673 const u32 salt_len = zip2->salt_len;
8674
8675 char salt_tmp[32 + 1] = { 0 };
8676
8677 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8678 {
8679 const u8 *ptr = (const u8 *) zip2->salt_buf;
8680
8681 sprintf (salt_tmp + j, "%02x", ptr[i]);
8682 }
8683
8684 const u32 data_len = zip2->data_len;
8685
8686 char data_tmp[8192 + 1] = { 0 };
8687
8688 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8689 {
8690 const u8 *ptr = (const u8 *) zip2->data_buf;
8691
8692 sprintf (data_tmp + j, "%02x", ptr[i]);
8693 }
8694
8695 const u32 auth_len = zip2->auth_len;
8696
8697 char auth_tmp[20 + 1] = { 0 };
8698
8699 for (uint i = 0, j = 0; i < auth_len; i += 1, j += 2)
8700 {
8701 const u8 *ptr = (const u8 *) zip2->auth_buf;
8702
8703 sprintf (auth_tmp + j, "%02x", ptr[i]);
8704 }
8705
8706 snprintf (out_buf, 255, "%s*%u*%u*%u*%s*%x*%u*%s*%s*%s",
8707 SIGNATURE_ZIP2_START,
8708 zip2->type,
8709 zip2->mode,
8710 zip2->magic,
8711 salt_tmp,
8712 zip2->verify_bytes,
8713 zip2->compress_length,
8714 data_tmp,
8715 auth_tmp,
8716 SIGNATURE_ZIP2_STOP);
8717 }
8718 else if ((hash_mode >= 13700) && (hash_mode <= 13799))
8719 {
8720 snprintf (out_buf, len-1, "%s", hashfile);
8721 }
8722 else
8723 {
8724 if (hash_type == HASH_TYPE_MD4)
8725 {
8726 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8727 digest_buf[0],
8728 digest_buf[1],
8729 digest_buf[2],
8730 digest_buf[3]);
8731 }
8732 else if (hash_type == HASH_TYPE_MD5)
8733 {
8734 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8735 digest_buf[0],
8736 digest_buf[1],
8737 digest_buf[2],
8738 digest_buf[3]);
8739 }
8740 else if (hash_type == HASH_TYPE_SHA1)
8741 {
8742 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8743 digest_buf[0],
8744 digest_buf[1],
8745 digest_buf[2],
8746 digest_buf[3],
8747 digest_buf[4]);
8748 }
8749 else if (hash_type == HASH_TYPE_SHA256)
8750 {
8751 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8752 digest_buf[0],
8753 digest_buf[1],
8754 digest_buf[2],
8755 digest_buf[3],
8756 digest_buf[4],
8757 digest_buf[5],
8758 digest_buf[6],
8759 digest_buf[7]);
8760 }
8761 else if (hash_type == HASH_TYPE_SHA384)
8762 {
8763 uint *ptr = digest_buf;
8764
8765 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8766 ptr[ 1], ptr[ 0],
8767 ptr[ 3], ptr[ 2],
8768 ptr[ 5], ptr[ 4],
8769 ptr[ 7], ptr[ 6],
8770 ptr[ 9], ptr[ 8],
8771 ptr[11], ptr[10]);
8772 }
8773 else if (hash_type == HASH_TYPE_SHA512)
8774 {
8775 uint *ptr = digest_buf;
8776
8777 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8778 ptr[ 1], ptr[ 0],
8779 ptr[ 3], ptr[ 2],
8780 ptr[ 5], ptr[ 4],
8781 ptr[ 7], ptr[ 6],
8782 ptr[ 9], ptr[ 8],
8783 ptr[11], ptr[10],
8784 ptr[13], ptr[12],
8785 ptr[15], ptr[14]);
8786 }
8787 else if (hash_type == HASH_TYPE_LM)
8788 {
8789 snprintf (out_buf, len-1, "%08x%08x",
8790 digest_buf[0],
8791 digest_buf[1]);
8792 }
8793 else if (hash_type == HASH_TYPE_ORACLEH)
8794 {
8795 snprintf (out_buf, len-1, "%08X%08X",
8796 digest_buf[0],
8797 digest_buf[1]);
8798 }
8799 else if (hash_type == HASH_TYPE_BCRYPT)
8800 {
8801 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8802 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8803
8804 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8805
8806 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8807 }
8808 else if (hash_type == HASH_TYPE_KECCAK)
8809 {
8810 uint *ptr = digest_buf;
8811
8812 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",
8813 ptr[ 1], ptr[ 0],
8814 ptr[ 3], ptr[ 2],
8815 ptr[ 5], ptr[ 4],
8816 ptr[ 7], ptr[ 6],
8817 ptr[ 9], ptr[ 8],
8818 ptr[11], ptr[10],
8819 ptr[13], ptr[12],
8820 ptr[15], ptr[14],
8821 ptr[17], ptr[16],
8822 ptr[19], ptr[18],
8823 ptr[21], ptr[20],
8824 ptr[23], ptr[22],
8825 ptr[25], ptr[24],
8826 ptr[27], ptr[26],
8827 ptr[29], ptr[28],
8828 ptr[31], ptr[30],
8829 ptr[33], ptr[32],
8830 ptr[35], ptr[34],
8831 ptr[37], ptr[36],
8832 ptr[39], ptr[38],
8833 ptr[41], ptr[30],
8834 ptr[43], ptr[42],
8835 ptr[45], ptr[44],
8836 ptr[47], ptr[46],
8837 ptr[49], ptr[48]
8838 );
8839
8840 out_buf[salt.keccak_mdlen * 2] = 0;
8841 }
8842 else if (hash_type == HASH_TYPE_RIPEMD160)
8843 {
8844 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8845 digest_buf[0],
8846 digest_buf[1],
8847 digest_buf[2],
8848 digest_buf[3],
8849 digest_buf[4]);
8850 }
8851 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8852 {
8853 digest_buf[ 0] = digest_buf[ 0];
8854 digest_buf[ 1] = digest_buf[ 1];
8855 digest_buf[ 2] = digest_buf[ 2];
8856 digest_buf[ 3] = digest_buf[ 3];
8857 digest_buf[ 4] = digest_buf[ 4];
8858 digest_buf[ 5] = digest_buf[ 5];
8859 digest_buf[ 6] = digest_buf[ 6];
8860 digest_buf[ 7] = digest_buf[ 7];
8861 digest_buf[ 8] = digest_buf[ 8];
8862 digest_buf[ 9] = digest_buf[ 9];
8863 digest_buf[10] = digest_buf[10];
8864 digest_buf[11] = digest_buf[11];
8865 digest_buf[12] = digest_buf[12];
8866 digest_buf[13] = digest_buf[13];
8867 digest_buf[14] = digest_buf[14];
8868 digest_buf[15] = digest_buf[15];
8869
8870 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8871 digest_buf[ 0],
8872 digest_buf[ 1],
8873 digest_buf[ 2],
8874 digest_buf[ 3],
8875 digest_buf[ 4],
8876 digest_buf[ 5],
8877 digest_buf[ 6],
8878 digest_buf[ 7],
8879 digest_buf[ 8],
8880 digest_buf[ 9],
8881 digest_buf[10],
8882 digest_buf[11],
8883 digest_buf[12],
8884 digest_buf[13],
8885 digest_buf[14],
8886 digest_buf[15]);
8887 }
8888 else if (hash_type == HASH_TYPE_GOST)
8889 {
8890 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8891 digest_buf[0],
8892 digest_buf[1],
8893 digest_buf[2],
8894 digest_buf[3],
8895 digest_buf[4],
8896 digest_buf[5],
8897 digest_buf[6],
8898 digest_buf[7]);
8899 }
8900 else if (hash_type == HASH_TYPE_MYSQL)
8901 {
8902 snprintf (out_buf, len-1, "%08x%08x",
8903 digest_buf[0],
8904 digest_buf[1]);
8905 }
8906 else if (hash_type == HASH_TYPE_LOTUS5)
8907 {
8908 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8909 digest_buf[0],
8910 digest_buf[1],
8911 digest_buf[2],
8912 digest_buf[3]);
8913 }
8914 else if (hash_type == HASH_TYPE_LOTUS6)
8915 {
8916 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8917 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8918 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8919 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8920
8921 char buf[16] = { 0 };
8922
8923 memcpy (buf + 0, salt.salt_buf, 5);
8924 memcpy (buf + 5, digest_buf, 9);
8925
8926 buf[3] -= -4;
8927
8928 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8929
8930 tmp_buf[18] = salt.salt_buf_pc[7];
8931 tmp_buf[19] = 0;
8932
8933 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8934 }
8935 else if (hash_type == HASH_TYPE_LOTUS8)
8936 {
8937 char buf[52] = { 0 };
8938
8939 // salt
8940
8941 memcpy (buf + 0, salt.salt_buf, 16);
8942
8943 buf[3] -= -4;
8944
8945 // iteration
8946
8947 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8948
8949 // chars
8950
8951 buf[26] = salt.salt_buf_pc[0];
8952 buf[27] = salt.salt_buf_pc[1];
8953
8954 // digest
8955
8956 memcpy (buf + 28, digest_buf, 8);
8957
8958 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8959
8960 tmp_buf[49] = 0;
8961
8962 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8963 }
8964 else if (hash_type == HASH_TYPE_CRC32)
8965 {
8966 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8967 }
8968 }
8969
8970 if (salt_type == SALT_TYPE_INTERN)
8971 {
8972 size_t pos = strlen (out_buf);
8973
8974 out_buf[pos] = data.separator;
8975
8976 char *ptr = (char *) salt.salt_buf;
8977
8978 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8979
8980 out_buf[pos + 1 + salt.salt_len] = 0;
8981 }
8982 }
8983
8984 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8985 {
8986 memset (hccap, 0, sizeof (hccap_t));
8987
8988 salt_t *salt = &data.salts_buf[salt_pos];
8989
8990 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8991
8992 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8993 wpa_t *wpa = &wpas[salt_pos];
8994
8995 hccap->keyver = wpa->keyver;
8996
8997 hccap->eapol_size = wpa->eapol_size;
8998
8999 if (wpa->keyver != 1)
9000 {
9001 uint eapol_tmp[64] = { 0 };
9002
9003 for (uint i = 0; i < 64; i++)
9004 {
9005 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
9006 }
9007
9008 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
9009 }
9010 else
9011 {
9012 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
9013 }
9014
9015 memcpy (hccap->mac1, wpa->orig_mac1, 6);
9016 memcpy (hccap->mac2, wpa->orig_mac2, 6);
9017 memcpy (hccap->nonce1, wpa->orig_nonce1, 32);
9018 memcpy (hccap->nonce2, wpa->orig_nonce2, 32);
9019
9020 char *digests_buf_ptr = (char *) data.digests_buf;
9021
9022 uint dgst_size = data.dgst_size;
9023
9024 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
9025
9026 if (wpa->keyver != 1)
9027 {
9028 uint digest_tmp[4] = { 0 };
9029
9030 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
9031 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
9032 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
9033 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
9034
9035 memcpy (hccap->keymic, digest_tmp, 16);
9036 }
9037 else
9038 {
9039 memcpy (hccap->keymic, digest_ptr, 16);
9040 }
9041 }
9042
9043 void SuspendThreads ()
9044 {
9045 if (data.devices_status == STATUS_RUNNING)
9046 {
9047 hc_timer_set (&data.timer_paused);
9048
9049 data.devices_status = STATUS_PAUSED;
9050
9051 log_info ("Paused");
9052 }
9053 }
9054
9055 void ResumeThreads ()
9056 {
9057 if (data.devices_status == STATUS_PAUSED)
9058 {
9059 double ms_paused;
9060
9061 hc_timer_get (data.timer_paused, ms_paused);
9062
9063 data.ms_paused += ms_paused;
9064
9065 data.devices_status = STATUS_RUNNING;
9066
9067 log_info ("Resumed");
9068 }
9069 }
9070
9071 void bypass ()
9072 {
9073 if (data.devices_status != STATUS_RUNNING) return;
9074
9075 data.devices_status = STATUS_BYPASS;
9076
9077 log_info ("Next dictionary / mask in queue selected, bypassing current one");
9078 }
9079
9080 void stop_at_checkpoint ()
9081 {
9082 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9083 {
9084 if (data.devices_status != STATUS_RUNNING) return;
9085 }
9086
9087 // this feature only makes sense if --restore-disable was not specified
9088
9089 if (data.restore_disable == 1)
9090 {
9091 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
9092
9093 return;
9094 }
9095
9096 // check if monitoring of Restore Point updates should be enabled or disabled
9097
9098 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9099 {
9100 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
9101
9102 // save the current restore point value
9103
9104 data.checkpoint_cur_words = get_lowest_words_done ();
9105
9106 log_info ("Checkpoint enabled: will quit at next Restore Point update");
9107 }
9108 else
9109 {
9110 data.devices_status = STATUS_RUNNING;
9111
9112 // reset the global value for checkpoint checks
9113
9114 data.checkpoint_cur_words = 0;
9115
9116 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
9117 }
9118 }
9119
9120 void myabort ()
9121 {
9122 if (data.devices_status == STATUS_INIT) return;
9123 if (data.devices_status == STATUS_STARTING) return;
9124
9125 data.devices_status = STATUS_ABORTED;
9126 }
9127
9128 void myquit ()
9129 {
9130 if (data.devices_status == STATUS_INIT) return;
9131 if (data.devices_status == STATUS_STARTING) return;
9132
9133 data.devices_status = STATUS_QUIT;
9134 }
9135
9136 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
9137 {
9138 FILE *fp = fopen (kernel_file, "rb");
9139
9140 if (fp != NULL)
9141 {
9142 struct stat st;
9143
9144 memset (&st, 0, sizeof (st));
9145
9146 stat (kernel_file, &st);
9147
9148 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
9149
9150 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
9151
9152 if (num_read != (size_t) st.st_size)
9153 {
9154 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9155
9156 exit (-1);
9157 }
9158
9159 fclose (fp);
9160
9161 buf[st.st_size] = 0;
9162
9163 for (int i = 0; i < num_devices; i++)
9164 {
9165 kernel_lengths[i] = (size_t) st.st_size;
9166
9167 kernel_sources[i] = buf;
9168 }
9169 }
9170 else
9171 {
9172 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9173
9174 exit (-1);
9175 }
9176
9177 return;
9178 }
9179
9180 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
9181 {
9182 if (binary_size > 0)
9183 {
9184 FILE *fp = fopen (dst, "wb");
9185
9186 lock_file (fp);
9187 fwrite (binary, sizeof (u8), binary_size, fp);
9188
9189 fflush (fp);
9190 fclose (fp);
9191 }
9192 }
9193
9194 /**
9195 * restore
9196 */
9197
9198 restore_data_t *init_restore (int argc, char **argv)
9199 {
9200 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
9201
9202 if (data.restore_disable == 0)
9203 {
9204 FILE *fp = fopen (data.eff_restore_file, "rb");
9205
9206 if (fp)
9207 {
9208 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
9209
9210 if (nread != 1)
9211 {
9212 log_error ("ERROR: cannot read %s", data.eff_restore_file);
9213
9214 exit (-1);
9215 }
9216
9217 fclose (fp);
9218
9219 if (rd->pid)
9220 {
9221 char *pidbin = (char *) mymalloc (HCBUFSIZ);
9222
9223 int pidbin_len = -1;
9224
9225 #ifdef _POSIX
9226 snprintf (pidbin, HCBUFSIZ - 1, "/proc/%d/cmdline", rd->pid);
9227
9228 FILE *fd = fopen (pidbin, "rb");
9229
9230 if (fd)
9231 {
9232 pidbin_len = fread (pidbin, 1, HCBUFSIZ, fd);
9233
9234 pidbin[pidbin_len] = 0;
9235
9236 fclose (fd);
9237
9238 char *argv0_r = strrchr (argv[0], '/');
9239
9240 char *pidbin_r = strrchr (pidbin, '/');
9241
9242 if (argv0_r == NULL) argv0_r = argv[0];
9243
9244 if (pidbin_r == NULL) pidbin_r = pidbin;
9245
9246 if (strcmp (argv0_r, pidbin_r) == 0)
9247 {
9248 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
9249
9250 exit (-1);
9251 }
9252 }
9253
9254 #elif _WIN
9255 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
9256
9257 char *pidbin2 = (char *) mymalloc (HCBUFSIZ);
9258
9259 int pidbin2_len = -1;
9260
9261 pidbin_len = GetModuleFileName (NULL, pidbin, HCBUFSIZ);
9262 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, HCBUFSIZ);
9263
9264 pidbin[pidbin_len] = 0;
9265 pidbin2[pidbin2_len] = 0;
9266
9267 if (pidbin2_len)
9268 {
9269 if (strcmp (pidbin, pidbin2) == 0)
9270 {
9271 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
9272
9273 exit (-1);
9274 }
9275 }
9276
9277 myfree (pidbin2);
9278
9279 #endif
9280
9281 myfree (pidbin);
9282 }
9283
9284 if (rd->version_bin < RESTORE_MIN)
9285 {
9286 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
9287
9288 exit (-1);
9289 }
9290 }
9291 }
9292
9293 memset (rd, 0, sizeof (restore_data_t));
9294
9295 rd->version_bin = VERSION_BIN;
9296
9297 #ifdef _POSIX
9298 rd->pid = getpid ();
9299 #elif _WIN
9300 rd->pid = GetCurrentProcessId ();
9301 #endif
9302
9303 if (getcwd (rd->cwd, 255) == NULL)
9304 {
9305 myfree (rd);
9306
9307 return (NULL);
9308 }
9309
9310 rd->argc = argc;
9311 rd->argv = argv;
9312
9313 return (rd);
9314 }
9315
9316 void read_restore (const char *eff_restore_file, restore_data_t *rd)
9317 {
9318 FILE *fp = fopen (eff_restore_file, "rb");
9319
9320 if (fp == NULL)
9321 {
9322 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
9323
9324 exit (-1);
9325 }
9326
9327 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
9328 {
9329 log_error ("ERROR: cannot read %s", eff_restore_file);
9330
9331 exit (-1);
9332 }
9333
9334 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
9335
9336 char *buf = (char *) mymalloc (HCBUFSIZ);
9337
9338 for (uint i = 0; i < rd->argc; i++)
9339 {
9340 if (fgets (buf, HCBUFSIZ - 1, fp) == NULL)
9341 {
9342 log_error ("ERROR: cannot read %s", eff_restore_file);
9343
9344 exit (-1);
9345 }
9346
9347 size_t len = strlen (buf);
9348
9349 if (len) buf[len - 1] = 0;
9350
9351 rd->argv[i] = mystrdup (buf);
9352 }
9353
9354 myfree (buf);
9355
9356 fclose (fp);
9357
9358 log_info ("INFO: Changing current working directory to the path found within the .restore file: '%s'", rd->cwd);
9359
9360 if (chdir (rd->cwd))
9361 {
9362 log_error ("ERROR: The directory '%s' does not exist. It is needed to restore (--restore) the session.\n"
9363 " You could either create this directory (or link it) or update the .restore file using e.g. the analyze_hc_restore.pl tool:\n"
9364 " https://github.com/philsmd/analyze_hc_restore\n"
9365 " The directory must be relative to (or contain) all files/folders mentioned within the command line.", rd->cwd);
9366
9367 exit (-1);
9368 }
9369 }
9370
9371 u64 get_lowest_words_done ()
9372 {
9373 u64 words_cur = -1;
9374
9375 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
9376 {
9377 hc_device_param_t *device_param = &data.devices_param[device_id];
9378
9379 if (device_param->skipped) continue;
9380
9381 const u64 words_done = device_param->words_done;
9382
9383 if (words_done < words_cur) words_cur = words_done;
9384 }
9385
9386 // It's possible that a device's workload isn't finished right after a restore-case.
9387 // In that case, this function would return 0 and overwrite the real restore point
9388 // There's also data.words_cur which is set to rd->words_cur but it changes while
9389 // the attack is running therefore we should stick to rd->words_cur.
9390 // Note that -s influences rd->words_cur we should keep a close look on that.
9391
9392 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9393
9394 return words_cur;
9395 }
9396
9397 void write_restore (const char *new_restore_file, restore_data_t *rd)
9398 {
9399 u64 words_cur = get_lowest_words_done ();
9400
9401 rd->words_cur = words_cur;
9402
9403 FILE *fp = fopen (new_restore_file, "wb");
9404
9405 if (fp == NULL)
9406 {
9407 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9408
9409 exit (-1);
9410 }
9411
9412 if (setvbuf (fp, NULL, _IONBF, 0))
9413 {
9414 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9415
9416 exit (-1);
9417 }
9418
9419 fwrite (rd, sizeof (restore_data_t), 1, fp);
9420
9421 for (uint i = 0; i < rd->argc; i++)
9422 {
9423 fprintf (fp, "%s", rd->argv[i]);
9424 fputc ('\n', fp);
9425 }
9426
9427 fflush (fp);
9428
9429 fsync (fileno (fp));
9430
9431 fclose (fp);
9432 }
9433
9434 void cycle_restore ()
9435 {
9436 const char *eff_restore_file = data.eff_restore_file;
9437 const char *new_restore_file = data.new_restore_file;
9438
9439 restore_data_t *rd = data.rd;
9440
9441 write_restore (new_restore_file, rd);
9442
9443 struct stat st;
9444
9445 memset (&st, 0, sizeof(st));
9446
9447 if (stat (eff_restore_file, &st) == 0)
9448 {
9449 if (unlink (eff_restore_file))
9450 {
9451 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
9452 }
9453 }
9454
9455 if (rename (new_restore_file, eff_restore_file))
9456 {
9457 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9458 }
9459 }
9460
9461 void check_checkpoint ()
9462 {
9463 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9464
9465 u64 words_cur = get_lowest_words_done ();
9466
9467 if (words_cur != data.checkpoint_cur_words)
9468 {
9469 myabort ();
9470 }
9471 }
9472
9473 /**
9474 * tuning db
9475 */
9476
9477 void tuning_db_destroy (tuning_db_t *tuning_db)
9478 {
9479 int i;
9480
9481 for (i = 0; i < tuning_db->alias_cnt; i++)
9482 {
9483 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9484
9485 myfree (alias->device_name);
9486 myfree (alias->alias_name);
9487 }
9488
9489 for (i = 0; i < tuning_db->entry_cnt; i++)
9490 {
9491 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9492
9493 myfree (entry->device_name);
9494 }
9495
9496 myfree (tuning_db->alias_buf);
9497 myfree (tuning_db->entry_buf);
9498
9499 myfree (tuning_db);
9500 }
9501
9502 tuning_db_t *tuning_db_alloc (FILE *fp)
9503 {
9504 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9505
9506 int num_lines = count_lines (fp);
9507
9508 // a bit over-allocated
9509
9510 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9511 tuning_db->alias_cnt = 0;
9512
9513 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9514 tuning_db->entry_cnt = 0;
9515
9516 return tuning_db;
9517 }
9518
9519 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9520 {
9521 FILE *fp = fopen (tuning_db_file, "rb");
9522
9523 if (fp == NULL)
9524 {
9525 log_error ("%s: %s", tuning_db_file, strerror (errno));
9526
9527 exit (-1);
9528 }
9529
9530 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9531
9532 rewind (fp);
9533
9534 int line_num = 0;
9535
9536 char *buf = (char *) mymalloc (HCBUFSIZ);
9537
9538 while (!feof (fp))
9539 {
9540 char *line_buf = fgets (buf, HCBUFSIZ - 1, fp);
9541
9542 if (line_buf == NULL) break;
9543
9544 line_num++;
9545
9546 const int line_len = in_superchop (line_buf);
9547
9548 if (line_len == 0) continue;
9549
9550 if (line_buf[0] == '#') continue;
9551
9552 // start processing
9553
9554 char *token_ptr[7] = { NULL };
9555
9556 int token_cnt = 0;
9557
9558 char *next = strtok (line_buf, "\t ");
9559
9560 token_ptr[token_cnt] = next;
9561
9562 token_cnt++;
9563
9564 while ((next = strtok (NULL, "\t ")) != NULL)
9565 {
9566 token_ptr[token_cnt] = next;
9567
9568 token_cnt++;
9569 }
9570
9571 if (token_cnt == 2)
9572 {
9573 char *device_name = token_ptr[0];
9574 char *alias_name = token_ptr[1];
9575
9576 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9577
9578 alias->device_name = mystrdup (device_name);
9579 alias->alias_name = mystrdup (alias_name);
9580
9581 tuning_db->alias_cnt++;
9582 }
9583 else if (token_cnt == 6)
9584 {
9585 if ((token_ptr[1][0] != '0') &&
9586 (token_ptr[1][0] != '1') &&
9587 (token_ptr[1][0] != '3') &&
9588 (token_ptr[1][0] != '*'))
9589 {
9590 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9591
9592 continue;
9593 }
9594
9595 if ((token_ptr[3][0] != '1') &&
9596 (token_ptr[3][0] != '2') &&
9597 (token_ptr[3][0] != '4') &&
9598 (token_ptr[3][0] != '8') &&
9599 (token_ptr[3][0] != 'N'))
9600 {
9601 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9602
9603 continue;
9604 }
9605
9606 char *device_name = token_ptr[0];
9607
9608 int attack_mode = -1;
9609 int hash_type = -1;
9610 int vector_width = -1;
9611 int kernel_accel = -1;
9612 int kernel_loops = -1;
9613
9614 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9615 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9616 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9617
9618 if (token_ptr[4][0] != 'A')
9619 {
9620 kernel_accel = atoi (token_ptr[4]);
9621
9622 if ((kernel_accel < 1) || (kernel_accel > 1024))
9623 {
9624 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9625
9626 continue;
9627 }
9628 }
9629 else
9630 {
9631 kernel_accel = 0;
9632 }
9633
9634 if (token_ptr[5][0] != 'A')
9635 {
9636 kernel_loops = atoi (token_ptr[5]);
9637
9638 if ((kernel_loops < 1) || (kernel_loops > 1024))
9639 {
9640 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9641
9642 continue;
9643 }
9644 }
9645 else
9646 {
9647 kernel_loops = 0;
9648 }
9649
9650 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9651
9652 entry->device_name = mystrdup (device_name);
9653 entry->attack_mode = attack_mode;
9654 entry->hash_type = hash_type;
9655 entry->vector_width = vector_width;
9656 entry->kernel_accel = kernel_accel;
9657 entry->kernel_loops = kernel_loops;
9658
9659 tuning_db->entry_cnt++;
9660 }
9661 else
9662 {
9663 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9664
9665 continue;
9666 }
9667 }
9668
9669 myfree (buf);
9670
9671 fclose (fp);
9672
9673 // todo: print loaded 'cnt' message
9674
9675 // sort the database
9676
9677 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9678 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9679
9680 return tuning_db;
9681 }
9682
9683 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, hc_device_param_t *device_param, int attack_mode, int hash_type)
9684 {
9685 static tuning_db_entry_t s;
9686
9687 // first we need to convert all spaces in the device_name to underscore
9688
9689 char *device_name_nospace = strdup (device_param->device_name);
9690
9691 int device_name_length = strlen (device_name_nospace);
9692
9693 int i;
9694
9695 for (i = 0; i < device_name_length; i++)
9696 {
9697 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9698 }
9699
9700 // find out if there's an alias configured
9701
9702 tuning_db_alias_t a;
9703
9704 a.device_name = device_name_nospace;
9705
9706 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);
9707
9708 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9709
9710 // attack-mode 6 and 7 are attack-mode 1 basically
9711
9712 if (attack_mode == 6) attack_mode = 1;
9713 if (attack_mode == 7) attack_mode = 1;
9714
9715 // bsearch is not ideal but fast enough
9716
9717 s.device_name = device_name_nospace;
9718 s.attack_mode = attack_mode;
9719 s.hash_type = hash_type;
9720
9721 tuning_db_entry_t *entry = NULL;
9722
9723 // this will produce all 2^3 combinations required
9724
9725 for (i = 0; i < 8; i++)
9726 {
9727 s.device_name = (i & 1) ? "*" : device_name_nospace;
9728 s.attack_mode = (i & 2) ? -1 : attack_mode;
9729 s.hash_type = (i & 4) ? -1 : hash_type;
9730
9731 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9732
9733 if (entry != NULL) break;
9734
9735 // in non-wildcard mode do some additional checks:
9736
9737 if ((i & 1) == 0)
9738 {
9739 // in case we have an alias-name
9740
9741 if (alias_name != NULL)
9742 {
9743 s.device_name = alias_name;
9744
9745 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9746
9747 if (entry != NULL) break;
9748 }
9749
9750 // or by device type
9751
9752 if (device_param->device_type & CL_DEVICE_TYPE_CPU)
9753 {
9754 s.device_name = "DEVICE_TYPE_CPU";
9755 }
9756 else if (device_param->device_type & CL_DEVICE_TYPE_GPU)
9757 {
9758 s.device_name = "DEVICE_TYPE_GPU";
9759 }
9760 else if (device_param->device_type & CL_DEVICE_TYPE_ACCELERATOR)
9761 {
9762 s.device_name = "DEVICE_TYPE_ACCELERATOR";
9763 }
9764
9765 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9766
9767 if (entry != NULL) break;
9768 }
9769 }
9770
9771 // free converted device_name
9772
9773 myfree (device_name_nospace);
9774
9775 return entry;
9776 }
9777
9778 /**
9779 * parser
9780 */
9781
9782 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9783 {
9784 u8 tmp[256] = { 0 };
9785
9786 if (salt_len > sizeof (tmp))
9787 {
9788 return UINT_MAX;
9789 }
9790
9791 memcpy (tmp, in, salt_len);
9792
9793 if (data.opts_type & OPTS_TYPE_ST_HEX)
9794 {
9795 if ((salt_len % 2) == 0)
9796 {
9797 u32 new_salt_len = salt_len / 2;
9798
9799 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9800 {
9801 u8 p0 = tmp[j + 0];
9802 u8 p1 = tmp[j + 1];
9803
9804 tmp[i] = hex_convert (p1) << 0;
9805 tmp[i] |= hex_convert (p0) << 4;
9806 }
9807
9808 salt_len = new_salt_len;
9809 }
9810 else
9811 {
9812 return UINT_MAX;
9813 }
9814 }
9815 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9816 {
9817 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9818 }
9819
9820 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9821
9822 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9823 {
9824 if (salt_len < 20)
9825 {
9826 u32 *tmp_uint = (u32 *) tmp;
9827
9828 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9829 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9830 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9831 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9832 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9833 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9834 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9835 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9836 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9837 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9838
9839 salt_len = salt_len * 2;
9840 }
9841 else
9842 {
9843 return UINT_MAX;
9844 }
9845 }
9846
9847 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9848 {
9849 lowercase (tmp, salt_len);
9850 }
9851
9852 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9853 {
9854 uppercase (tmp, salt_len);
9855 }
9856
9857 u32 len = salt_len;
9858
9859 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9860 {
9861 tmp[len++] = 0x80;
9862 }
9863
9864 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9865 {
9866 tmp[len++] = 0x01;
9867 }
9868
9869 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9870 {
9871 u32 *tmp_uint = (uint *) tmp;
9872
9873 u32 max = len / 4;
9874
9875 if (len % 4) max++;
9876
9877 for (u32 i = 0; i < max; i++)
9878 {
9879 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9880 }
9881
9882 // Important: we may need to increase the length of memcpy since
9883 // we don't want to "loose" some swapped bytes (could happen if
9884 // they do not perfectly fit in the 4-byte blocks)
9885 // Memcpy does always copy the bytes in the BE order, but since
9886 // we swapped them, some important bytes could be in positions
9887 // we normally skip with the original len
9888
9889 if (len % 4) len += 4 - (len % 4);
9890 }
9891
9892 memcpy (out, tmp, len);
9893
9894 return (salt_len);
9895 }
9896
9897 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9898 {
9899 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9900
9901 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9902
9903 u32 *digest = (u32 *) hash_buf->digest;
9904
9905 salt_t *salt = hash_buf->salt;
9906
9907 memcpy ((char *) salt->salt_sign, input_buf, 6);
9908
9909 char *iter_pos = input_buf + 4;
9910
9911 salt->salt_iter = 1 << atoi (iter_pos);
9912
9913 char *salt_pos = strchr (iter_pos, '$');
9914
9915 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9916
9917 salt_pos++;
9918
9919 uint salt_len = 16;
9920
9921 salt->salt_len = salt_len;
9922
9923 u8 tmp_buf[100] = { 0 };
9924
9925 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9926
9927 char *salt_buf_ptr = (char *) salt->salt_buf;
9928
9929 memcpy (salt_buf_ptr, tmp_buf, 16);
9930
9931 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9932 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9933 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9934 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9935
9936 char *hash_pos = salt_pos + 22;
9937
9938 memset (tmp_buf, 0, sizeof (tmp_buf));
9939
9940 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9941
9942 memcpy (digest, tmp_buf, 24);
9943
9944 digest[0] = byte_swap_32 (digest[0]);
9945 digest[1] = byte_swap_32 (digest[1]);
9946 digest[2] = byte_swap_32 (digest[2]);
9947 digest[3] = byte_swap_32 (digest[3]);
9948 digest[4] = byte_swap_32 (digest[4]);
9949 digest[5] = byte_swap_32 (digest[5]);
9950
9951 digest[5] &= ~0xff; // its just 23 not 24 !
9952
9953 return (PARSER_OK);
9954 }
9955
9956 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9957 {
9958 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9959
9960 u32 *digest = (u32 *) hash_buf->digest;
9961
9962 u8 tmp_buf[100] = { 0 };
9963
9964 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9965
9966 memcpy (digest, tmp_buf, 32);
9967
9968 digest[0] = byte_swap_32 (digest[0]);
9969 digest[1] = byte_swap_32 (digest[1]);
9970 digest[2] = byte_swap_32 (digest[2]);
9971 digest[3] = byte_swap_32 (digest[3]);
9972 digest[4] = byte_swap_32 (digest[4]);
9973 digest[5] = byte_swap_32 (digest[5]);
9974 digest[6] = byte_swap_32 (digest[6]);
9975 digest[7] = byte_swap_32 (digest[7]);
9976
9977 digest[0] -= SHA256M_A;
9978 digest[1] -= SHA256M_B;
9979 digest[2] -= SHA256M_C;
9980 digest[3] -= SHA256M_D;
9981 digest[4] -= SHA256M_E;
9982 digest[5] -= SHA256M_F;
9983 digest[6] -= SHA256M_G;
9984 digest[7] -= SHA256M_H;
9985
9986 return (PARSER_OK);
9987 }
9988
9989 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9990 {
9991 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9992
9993 u32 *digest = (u32 *) hash_buf->digest;
9994
9995 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9996 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9997
9998 digest[0] = byte_swap_32 (digest[0]);
9999 digest[1] = byte_swap_32 (digest[1]);
10000
10001 uint tt;
10002
10003 IP (digest[0], digest[1], tt);
10004
10005 digest[0] = digest[0];
10006 digest[1] = digest[1];
10007 digest[2] = 0;
10008 digest[3] = 0;
10009
10010 return (PARSER_OK);
10011 }
10012
10013 int arubaos_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10014 {
10015 if ((input_len < DISPLAY_LEN_MIN_125) || (input_len > DISPLAY_LEN_MAX_125)) return (PARSER_GLOBAL_LENGTH);
10016
10017 if ((input_buf[8] != '0') || (input_buf[9] != '1')) return (PARSER_SIGNATURE_UNMATCHED);
10018
10019 u32 *digest = (u32 *) hash_buf->digest;
10020
10021 salt_t *salt = hash_buf->salt;
10022
10023 char *hash_pos = input_buf + 10;
10024
10025 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10026 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10027 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10028 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10029 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10030
10031 digest[0] -= SHA1M_A;
10032 digest[1] -= SHA1M_B;
10033 digest[2] -= SHA1M_C;
10034 digest[3] -= SHA1M_D;
10035 digest[4] -= SHA1M_E;
10036
10037 uint salt_len = 10;
10038
10039 char *salt_buf_ptr = (char *) salt->salt_buf;
10040
10041 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10042
10043 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10044
10045 salt->salt_len = salt_len;
10046
10047 return (PARSER_OK);
10048 }
10049
10050 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10051 {
10052 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
10053
10054 u32 *digest = (u32 *) hash_buf->digest;
10055
10056 salt_t *salt = hash_buf->salt;
10057
10058 char *hash_pos = input_buf + 8;
10059
10060 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10061 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10062 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10063 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10064 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10065
10066 digest[0] -= SHA1M_A;
10067 digest[1] -= SHA1M_B;
10068 digest[2] -= SHA1M_C;
10069 digest[3] -= SHA1M_D;
10070 digest[4] -= SHA1M_E;
10071
10072 uint salt_len = 8;
10073
10074 char *salt_buf_ptr = (char *) salt->salt_buf;
10075
10076 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10077
10078 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10079
10080 salt->salt_len = salt_len;
10081
10082 return (PARSER_OK);
10083 }
10084
10085 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10086 {
10087 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
10088
10089 u64 *digest = (u64 *) hash_buf->digest;
10090
10091 salt_t *salt = hash_buf->salt;
10092
10093 char *hash_pos = input_buf + 8;
10094
10095 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
10096 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
10097 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
10098 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
10099 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
10100 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
10101 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
10102 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
10103
10104 digest[0] -= SHA512M_A;
10105 digest[1] -= SHA512M_B;
10106 digest[2] -= SHA512M_C;
10107 digest[3] -= SHA512M_D;
10108 digest[4] -= SHA512M_E;
10109 digest[5] -= SHA512M_F;
10110 digest[6] -= SHA512M_G;
10111 digest[7] -= SHA512M_H;
10112
10113 uint salt_len = 8;
10114
10115 char *salt_buf_ptr = (char *) salt->salt_buf;
10116
10117 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10118
10119 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10120
10121 salt->salt_len = salt_len;
10122
10123 return (PARSER_OK);
10124 }
10125
10126 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10127 {
10128 if (data.opts_type & OPTS_TYPE_ST_HEX)
10129 {
10130 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
10131 }
10132 else
10133 {
10134 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
10135 }
10136
10137 u32 *digest = (u32 *) hash_buf->digest;
10138
10139 salt_t *salt = hash_buf->salt;
10140
10141 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10142 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10143 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10144 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10145
10146 digest[0] = byte_swap_32 (digest[0]);
10147 digest[1] = byte_swap_32 (digest[1]);
10148 digest[2] = byte_swap_32 (digest[2]);
10149 digest[3] = byte_swap_32 (digest[3]);
10150
10151 digest[0] -= MD5M_A;
10152 digest[1] -= MD5M_B;
10153 digest[2] -= MD5M_C;
10154 digest[3] -= MD5M_D;
10155
10156 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10157
10158 uint salt_len = input_len - 32 - 1;
10159
10160 char *salt_buf = input_buf + 32 + 1;
10161
10162 char *salt_buf_ptr = (char *) salt->salt_buf;
10163
10164 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10165
10166 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10167
10168 salt->salt_len = salt_len;
10169
10170 return (PARSER_OK);
10171 }
10172
10173 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10174 {
10175 if (data.opts_type & OPTS_TYPE_ST_HEX)
10176 {
10177 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
10178 }
10179 else
10180 {
10181 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
10182 }
10183
10184 // unscramble
10185
10186 char clean_input_buf[32] = { 0 };
10187
10188 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
10189 int pos[6] = { 0, 6, 12, 17, 23, 29 };
10190
10191 for (int i = 0, j = 0, k = 0; i < 30; i++)
10192 {
10193 if (i == pos[j])
10194 {
10195 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
10196
10197 j++;
10198 }
10199 else
10200 {
10201 clean_input_buf[k] = input_buf[i];
10202
10203 k++;
10204 }
10205 }
10206
10207 // base64 decode
10208
10209 u32 *digest = (u32 *) hash_buf->digest;
10210
10211 salt_t *salt = hash_buf->salt;
10212
10213 u32 a, b, c, d, e, f;
10214
10215 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
10216 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
10217 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
10218 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
10219 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
10220 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
10221
10222 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
10223 | (((d << 12) | (e << 6) | (f)) << 0);
10224
10225 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
10226 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
10227 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
10228 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
10229 e = base64_to_int (clean_input_buf[10] & 0x7f);
10230 f = base64_to_int (clean_input_buf[11] & 0x7f);
10231
10232 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
10233 | (((d << 12) | (e << 6) | (f)) << 0);
10234
10235 a = base64_to_int (clean_input_buf[12] & 0x7f);
10236 b = base64_to_int (clean_input_buf[13] & 0x7f);
10237 c = base64_to_int (clean_input_buf[14] & 0x7f);
10238 d = base64_to_int (clean_input_buf[15] & 0x7f);
10239 e = base64_to_int (clean_input_buf[16] & 0x7f);
10240 f = base64_to_int (clean_input_buf[17] & 0x7f);
10241
10242 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
10243 | (((d << 12) | (e << 6) | (f)) << 0);
10244
10245 a = base64_to_int (clean_input_buf[18] & 0x7f);
10246 b = base64_to_int (clean_input_buf[19] & 0x7f);
10247 c = base64_to_int (clean_input_buf[20] & 0x7f);
10248 d = base64_to_int (clean_input_buf[21] & 0x7f);
10249 e = base64_to_int (clean_input_buf[22] & 0x7f);
10250 f = base64_to_int (clean_input_buf[23] & 0x7f);
10251
10252 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10253 | (((d << 12) | (e << 6) | (f)) << 0);
10254
10255 digest[0] = byte_swap_32 (digest[0]);
10256 digest[1] = byte_swap_32 (digest[1]);
10257 digest[2] = byte_swap_32 (digest[2]);
10258 digest[3] = byte_swap_32 (digest[3]);
10259
10260 digest[0] -= MD5M_A;
10261 digest[1] -= MD5M_B;
10262 digest[2] -= MD5M_C;
10263 digest[3] -= MD5M_D;
10264
10265 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10266
10267 uint salt_len = input_len - 30 - 1;
10268
10269 char *salt_buf = input_buf + 30 + 1;
10270
10271 char *salt_buf_ptr = (char *) salt->salt_buf;
10272
10273 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10274
10275 // max. salt length: 55 (max for MD5) - 22 (":Administration Tools:") - 1 (0x80) = 32
10276 // 32 - 4 bytes (to fit w0lr for all attack modes) = 28
10277
10278 if (salt_len > 28) return (PARSER_SALT_LENGTH);
10279
10280 salt->salt_len = salt_len;
10281
10282 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10283
10284 salt->salt_len += 22;
10285
10286 return (PARSER_OK);
10287 }
10288
10289 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10290 {
10291 if (data.opts_type & OPTS_TYPE_ST_HEX)
10292 {
10293 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10294 }
10295 else
10296 {
10297 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10298 }
10299
10300 u32 *digest = (u32 *) hash_buf->digest;
10301
10302 salt_t *salt = hash_buf->salt;
10303
10304 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10305 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10306 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10307 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10308 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10309
10310 digest[0] -= SHA1M_A;
10311 digest[1] -= SHA1M_B;
10312 digest[2] -= SHA1M_C;
10313 digest[3] -= SHA1M_D;
10314 digest[4] -= SHA1M_E;
10315
10316 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10317
10318 uint salt_len = input_len - 40 - 1;
10319
10320 char *salt_buf = input_buf + 40 + 1;
10321
10322 char *salt_buf_ptr = (char *) salt->salt_buf;
10323
10324 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10325
10326 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10327
10328 salt->salt_len = salt_len;
10329
10330 return (PARSER_OK);
10331 }
10332
10333 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10334 {
10335 if (data.opts_type & OPTS_TYPE_ST_HEX)
10336 {
10337 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10338 }
10339 else
10340 {
10341 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10342 }
10343
10344 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10345
10346 char *iter_pos = input_buf + 6;
10347
10348 salt_t *salt = hash_buf->salt;
10349
10350 uint iter = atoi (iter_pos);
10351
10352 if (iter < 1)
10353 {
10354 iter = ROUNDS_DCC2;
10355 }
10356
10357 salt->salt_iter = iter - 1;
10358
10359 char *salt_pos = strchr (iter_pos, '#');
10360
10361 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10362
10363 salt_pos++;
10364
10365 char *digest_pos = strchr (salt_pos, '#');
10366
10367 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10368
10369 digest_pos++;
10370
10371 uint salt_len = digest_pos - salt_pos - 1;
10372
10373 u32 *digest = (u32 *) hash_buf->digest;
10374
10375 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10376 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10377 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10378 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10379
10380 char *salt_buf_ptr = (char *) salt->salt_buf;
10381
10382 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10383
10384 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10385
10386 salt->salt_len = salt_len;
10387
10388 return (PARSER_OK);
10389 }
10390
10391 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10392 {
10393 u32 *digest = (u32 *) hash_buf->digest;
10394
10395 salt_t *salt = hash_buf->salt;
10396
10397 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10398
10399 hccap_t in;
10400
10401 memcpy (&in, input_buf, input_len);
10402
10403 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10404
10405 memcpy (digest, in.keymic, 16);
10406
10407 /*
10408 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10409 The phrase "Pairwise key expansion"
10410 Access Point Address (referred to as Authenticator Address AA)
10411 Supplicant Address (referred to as Supplicant Address SA)
10412 Access Point Nonce (referred to as Authenticator Anonce)
10413 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10414 */
10415
10416 uint salt_len = strlen (in.essid);
10417
10418 if (salt_len > 36)
10419 {
10420 log_info ("WARNING: the length of the ESSID is too long. The hccap file may be invalid or corrupted");
10421
10422 return (PARSER_SALT_LENGTH);
10423 }
10424
10425 memcpy (salt->salt_buf, in.essid, salt_len);
10426
10427 salt->salt_len = salt_len;
10428
10429 salt->salt_iter = ROUNDS_WPA2 - 1;
10430
10431 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10432
10433 memcpy (pke_ptr, "Pairwise key expansion", 23);
10434
10435 if (memcmp (in.mac1, in.mac2, 6) < 0)
10436 {
10437 memcpy (pke_ptr + 23, in.mac1, 6);
10438 memcpy (pke_ptr + 29, in.mac2, 6);
10439 }
10440 else
10441 {
10442 memcpy (pke_ptr + 23, in.mac2, 6);
10443 memcpy (pke_ptr + 29, in.mac1, 6);
10444 }
10445
10446 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10447 {
10448 memcpy (pke_ptr + 35, in.nonce1, 32);
10449 memcpy (pke_ptr + 67, in.nonce2, 32);
10450 }
10451 else
10452 {
10453 memcpy (pke_ptr + 35, in.nonce2, 32);
10454 memcpy (pke_ptr + 67, in.nonce1, 32);
10455 }
10456
10457 for (int i = 0; i < 25; i++)
10458 {
10459 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10460 }
10461
10462 memcpy (wpa->orig_mac1, in.mac1, 6);
10463 memcpy (wpa->orig_mac2, in.mac2, 6);
10464 memcpy (wpa->orig_nonce1, in.nonce1, 32);
10465 memcpy (wpa->orig_nonce2, in.nonce2, 32);
10466
10467 wpa->keyver = in.keyver;
10468
10469 if (wpa->keyver > 255)
10470 {
10471 log_info ("ATTENTION!");
10472 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10473 log_info (" This could be due to a recent aircrack-ng bug.");
10474 log_info (" The key version was automatically reset to a reasonable value.");
10475 log_info ("");
10476
10477 wpa->keyver &= 0xff;
10478 }
10479
10480 wpa->eapol_size = in.eapol_size;
10481
10482 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10483
10484 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10485
10486 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10487
10488 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10489
10490 if (wpa->keyver == 1)
10491 {
10492 // nothing to do
10493 }
10494 else
10495 {
10496 digest[0] = byte_swap_32 (digest[0]);
10497 digest[1] = byte_swap_32 (digest[1]);
10498 digest[2] = byte_swap_32 (digest[2]);
10499 digest[3] = byte_swap_32 (digest[3]);
10500
10501 for (int i = 0; i < 64; i++)
10502 {
10503 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10504 }
10505 }
10506
10507 uint32_t *p0 = (uint32_t *) in.essid;
10508 uint32_t c0 = 0;
10509 uint32_t c1 = 0;
10510
10511 for (uint i = 0; i < sizeof (in.essid) / sizeof (uint32_t); i++) c0 ^= *p0++;
10512 for (uint i = 0; i < sizeof (wpa->pke) / sizeof (wpa->pke[0]); i++) c1 ^= wpa->pke[i];
10513
10514 salt->salt_buf[10] = c0;
10515 salt->salt_buf[11] = c1;
10516
10517 return (PARSER_OK);
10518 }
10519
10520 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10521 {
10522 u32 *digest = (u32 *) hash_buf->digest;
10523
10524 salt_t *salt = hash_buf->salt;
10525
10526 if (input_len == 0)
10527 {
10528 log_error ("Password Safe v2 container not specified");
10529
10530 exit (-1);
10531 }
10532
10533 FILE *fp = fopen (input_buf, "rb");
10534
10535 if (fp == NULL)
10536 {
10537 log_error ("%s: %s", input_buf, strerror (errno));
10538
10539 exit (-1);
10540 }
10541
10542 psafe2_hdr buf;
10543
10544 memset (&buf, 0, sizeof (psafe2_hdr));
10545
10546 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10547
10548 fclose (fp);
10549
10550 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10551
10552 salt->salt_buf[0] = buf.random[0];
10553 salt->salt_buf[1] = buf.random[1];
10554
10555 salt->salt_len = 8;
10556 salt->salt_iter = 1000;
10557
10558 digest[0] = byte_swap_32 (buf.hash[0]);
10559 digest[1] = byte_swap_32 (buf.hash[1]);
10560 digest[2] = byte_swap_32 (buf.hash[2]);
10561 digest[3] = byte_swap_32 (buf.hash[3]);
10562 digest[4] = byte_swap_32 (buf.hash[4]);
10563
10564 return (PARSER_OK);
10565 }
10566
10567 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10568 {
10569 u32 *digest = (u32 *) hash_buf->digest;
10570
10571 salt_t *salt = hash_buf->salt;
10572
10573 if (input_len == 0)
10574 {
10575 log_error (".psafe3 not specified");
10576
10577 exit (-1);
10578 }
10579
10580 FILE *fp = fopen (input_buf, "rb");
10581
10582 if (fp == NULL)
10583 {
10584 log_error ("%s: %s", input_buf, strerror (errno));
10585
10586 exit (-1);
10587 }
10588
10589 psafe3_t in;
10590
10591 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10592
10593 fclose (fp);
10594
10595 data.hashfile = input_buf; // we will need this in case it gets cracked
10596
10597 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10598
10599 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10600
10601 salt->salt_iter = in.iterations + 1;
10602
10603 salt->salt_buf[0] = in.salt_buf[0];
10604 salt->salt_buf[1] = in.salt_buf[1];
10605 salt->salt_buf[2] = in.salt_buf[2];
10606 salt->salt_buf[3] = in.salt_buf[3];
10607 salt->salt_buf[4] = in.salt_buf[4];
10608 salt->salt_buf[5] = in.salt_buf[5];
10609 salt->salt_buf[6] = in.salt_buf[6];
10610 salt->salt_buf[7] = in.salt_buf[7];
10611
10612 salt->salt_len = 32;
10613
10614 digest[0] = in.hash_buf[0];
10615 digest[1] = in.hash_buf[1];
10616 digest[2] = in.hash_buf[2];
10617 digest[3] = in.hash_buf[3];
10618 digest[4] = in.hash_buf[4];
10619 digest[5] = in.hash_buf[5];
10620 digest[6] = in.hash_buf[6];
10621 digest[7] = in.hash_buf[7];
10622
10623 digest[0] = byte_swap_32 (digest[0]);
10624 digest[1] = byte_swap_32 (digest[1]);
10625 digest[2] = byte_swap_32 (digest[2]);
10626 digest[3] = byte_swap_32 (digest[3]);
10627 digest[4] = byte_swap_32 (digest[4]);
10628 digest[5] = byte_swap_32 (digest[5]);
10629 digest[6] = byte_swap_32 (digest[6]);
10630 digest[7] = byte_swap_32 (digest[7]);
10631
10632 return (PARSER_OK);
10633 }
10634
10635 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10636 {
10637 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10638
10639 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10640
10641 u32 *digest = (u32 *) hash_buf->digest;
10642
10643 salt_t *salt = hash_buf->salt;
10644
10645 char *iter_pos = input_buf + 3;
10646
10647 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10648
10649 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10650
10651 memcpy ((char *) salt->salt_sign, input_buf, 4);
10652
10653 salt->salt_iter = salt_iter;
10654
10655 char *salt_pos = iter_pos + 1;
10656
10657 uint salt_len = 8;
10658
10659 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10660
10661 salt->salt_len = salt_len;
10662
10663 char *hash_pos = salt_pos + salt_len;
10664
10665 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10666
10667 return (PARSER_OK);
10668 }
10669
10670 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10671 {
10672 if (input_len < DISPLAY_LEN_MIN_500) return (PARSER_GLOBAL_LENGTH);
10673
10674 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10675
10676 u32 *digest = (u32 *) hash_buf->digest;
10677
10678 salt_t *salt = hash_buf->salt;
10679
10680 char *salt_pos = input_buf + 3;
10681
10682 uint iterations_len = 0;
10683
10684 if (memcmp (salt_pos, "rounds=", 7) == 0)
10685 {
10686 salt_pos += 7;
10687
10688 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10689
10690 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10691 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10692
10693 salt_pos[0] = 0x0;
10694
10695 salt->salt_iter = atoi (salt_pos - iterations_len);
10696
10697 salt_pos += 1;
10698
10699 iterations_len += 8;
10700 }
10701 else
10702 {
10703 salt->salt_iter = ROUNDS_MD5CRYPT;
10704 }
10705
10706 if (input_len > (DISPLAY_LEN_MAX_500 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10707
10708 char *hash_pos = strchr (salt_pos, '$');
10709
10710 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10711
10712 uint salt_len = hash_pos - salt_pos;
10713
10714 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10715
10716 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10717
10718 salt->salt_len = salt_len;
10719
10720 hash_pos++;
10721
10722 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10723
10724 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10725
10726 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10727
10728 return (PARSER_OK);
10729 }
10730
10731 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10732 {
10733 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10734
10735 u32 *digest = (u32 *) hash_buf->digest;
10736
10737 salt_t *salt = hash_buf->salt;
10738
10739 char *salt_pos = input_buf + 6;
10740
10741 uint iterations_len = 0;
10742
10743 if (memcmp (salt_pos, "rounds=", 7) == 0)
10744 {
10745 salt_pos += 7;
10746
10747 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10748
10749 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10750 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10751
10752 salt_pos[0] = 0x0;
10753
10754 salt->salt_iter = atoi (salt_pos - iterations_len);
10755
10756 salt_pos += 1;
10757
10758 iterations_len += 8;
10759 }
10760 else
10761 {
10762 salt->salt_iter = ROUNDS_MD5CRYPT;
10763 }
10764
10765 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10766
10767 char *hash_pos = strchr (salt_pos, '$');
10768
10769 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10770
10771 uint salt_len = hash_pos - salt_pos;
10772
10773 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10774
10775 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10776
10777 salt->salt_len = salt_len;
10778
10779 hash_pos++;
10780
10781 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10782
10783 return (PARSER_OK);
10784 }
10785
10786 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10787 {
10788 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10789
10790 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10791
10792 u32 *digest = (u32 *) hash_buf->digest;
10793
10794 salt_t *salt = hash_buf->salt;
10795
10796 char *salt_pos = input_buf + 14;
10797
10798 char *hash_pos = strchr (salt_pos, '*');
10799
10800 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10801
10802 hash_pos++;
10803
10804 uint salt_len = hash_pos - salt_pos - 1;
10805
10806 char *salt_buf_ptr = (char *) salt->salt_buf;
10807
10808 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10809
10810 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10811
10812 salt->salt_len = salt_len;
10813
10814 u8 tmp_buf[100] = { 0 };
10815
10816 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10817
10818 memcpy (digest, tmp_buf, 20);
10819
10820 digest[0] = byte_swap_32 (digest[0]);
10821 digest[1] = byte_swap_32 (digest[1]);
10822 digest[2] = byte_swap_32 (digest[2]);
10823 digest[3] = byte_swap_32 (digest[3]);
10824 digest[4] = byte_swap_32 (digest[4]);
10825
10826 digest[0] -= SHA1M_A;
10827 digest[1] -= SHA1M_B;
10828 digest[2] -= SHA1M_C;
10829 digest[3] -= SHA1M_D;
10830 digest[4] -= SHA1M_E;
10831
10832 return (PARSER_OK);
10833 }
10834
10835 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10836 {
10837 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10838
10839 unsigned char c12 = itoa64_to_int (input_buf[12]);
10840
10841 if (c12 & 3) return (PARSER_HASH_VALUE);
10842
10843 u32 *digest = (u32 *) hash_buf->digest;
10844
10845 salt_t *salt = hash_buf->salt;
10846
10847 // for ascii_digest
10848 salt->salt_sign[0] = input_buf[0];
10849 salt->salt_sign[1] = input_buf[1];
10850
10851 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10852 | itoa64_to_int (input_buf[1]) << 6;
10853
10854 salt->salt_len = 2;
10855
10856 u8 tmp_buf[100] = { 0 };
10857
10858 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10859
10860 memcpy (digest, tmp_buf, 8);
10861
10862 uint tt;
10863
10864 IP (digest[0], digest[1], tt);
10865
10866 digest[2] = 0;
10867 digest[3] = 0;
10868
10869 return (PARSER_OK);
10870 }
10871
10872 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10873 {
10874 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10875
10876 u32 *digest = (u32 *) hash_buf->digest;
10877
10878 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10879 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10880 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10881 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10882
10883 digest[0] = byte_swap_32 (digest[0]);
10884 digest[1] = byte_swap_32 (digest[1]);
10885 digest[2] = byte_swap_32 (digest[2]);
10886 digest[3] = byte_swap_32 (digest[3]);
10887
10888 digest[0] -= MD4M_A;
10889 digest[1] -= MD4M_B;
10890 digest[2] -= MD4M_C;
10891 digest[3] -= MD4M_D;
10892
10893 return (PARSER_OK);
10894 }
10895
10896 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10897 {
10898 if (data.opts_type & OPTS_TYPE_ST_HEX)
10899 {
10900 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10901 }
10902 else
10903 {
10904 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10905 }
10906
10907 u32 *digest = (u32 *) hash_buf->digest;
10908
10909 salt_t *salt = hash_buf->salt;
10910
10911 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10912 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10913 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10914 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10915
10916 digest[0] = byte_swap_32 (digest[0]);
10917 digest[1] = byte_swap_32 (digest[1]);
10918 digest[2] = byte_swap_32 (digest[2]);
10919 digest[3] = byte_swap_32 (digest[3]);
10920
10921 digest[0] -= MD4M_A;
10922 digest[1] -= MD4M_B;
10923 digest[2] -= MD4M_C;
10924 digest[3] -= MD4M_D;
10925
10926 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10927
10928 uint salt_len = input_len - 32 - 1;
10929
10930 char *salt_buf = input_buf + 32 + 1;
10931
10932 char *salt_buf_ptr = (char *) salt->salt_buf;
10933
10934 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10935
10936 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10937
10938 salt->salt_len = salt_len;
10939
10940 return (PARSER_OK);
10941 }
10942
10943 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10944 {
10945 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10946
10947 u32 *digest = (u32 *) hash_buf->digest;
10948
10949 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10950 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10951 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10952 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10953
10954 digest[0] = byte_swap_32 (digest[0]);
10955 digest[1] = byte_swap_32 (digest[1]);
10956 digest[2] = byte_swap_32 (digest[2]);
10957 digest[3] = byte_swap_32 (digest[3]);
10958
10959 digest[0] -= MD5M_A;
10960 digest[1] -= MD5M_B;
10961 digest[2] -= MD5M_C;
10962 digest[3] -= MD5M_D;
10963
10964 return (PARSER_OK);
10965 }
10966
10967 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10968 {
10969 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10970
10971 u32 *digest = (u32 *) hash_buf->digest;
10972
10973 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10974 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10975 digest[2] = 0;
10976 digest[3] = 0;
10977
10978 digest[0] = byte_swap_32 (digest[0]);
10979 digest[1] = byte_swap_32 (digest[1]);
10980
10981 return (PARSER_OK);
10982 }
10983
10984 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10985 {
10986 if (data.opts_type & OPTS_TYPE_ST_HEX)
10987 {
10988 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10989 }
10990 else
10991 {
10992 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10993 }
10994
10995 u32 *digest = (u32 *) hash_buf->digest;
10996
10997 salt_t *salt = hash_buf->salt;
10998
10999 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11000 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11001 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11002 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11003
11004 digest[0] = byte_swap_32 (digest[0]);
11005 digest[1] = byte_swap_32 (digest[1]);
11006 digest[2] = byte_swap_32 (digest[2]);
11007 digest[3] = byte_swap_32 (digest[3]);
11008
11009 digest[0] -= MD5M_A;
11010 digest[1] -= MD5M_B;
11011 digest[2] -= MD5M_C;
11012 digest[3] -= MD5M_D;
11013
11014 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11015
11016 uint salt_len = input_len - 32 - 1;
11017
11018 char *salt_buf = input_buf + 32 + 1;
11019
11020 char *salt_buf_ptr = (char *) salt->salt_buf;
11021
11022 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11023
11024 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11025
11026 salt->salt_len = salt_len;
11027
11028 return (PARSER_OK);
11029 }
11030
11031 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11032 {
11033 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
11034
11035 u32 *digest = (u32 *) hash_buf->digest;
11036
11037 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11038 | itoa64_to_int (input_buf[ 1]) << 6
11039 | itoa64_to_int (input_buf[ 2]) << 12
11040 | itoa64_to_int (input_buf[ 3]) << 18;
11041 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11042 | itoa64_to_int (input_buf[ 5]) << 6
11043 | itoa64_to_int (input_buf[ 6]) << 12
11044 | itoa64_to_int (input_buf[ 7]) << 18;
11045 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11046 | itoa64_to_int (input_buf[ 9]) << 6
11047 | itoa64_to_int (input_buf[10]) << 12
11048 | itoa64_to_int (input_buf[11]) << 18;
11049 digest[3] = itoa64_to_int (input_buf[12]) << 0
11050 | itoa64_to_int (input_buf[13]) << 6
11051 | itoa64_to_int (input_buf[14]) << 12
11052 | itoa64_to_int (input_buf[15]) << 18;
11053
11054 digest[0] -= MD5M_A;
11055 digest[1] -= MD5M_B;
11056 digest[2] -= MD5M_C;
11057 digest[3] -= MD5M_D;
11058
11059 digest[0] &= 0x00ffffff;
11060 digest[1] &= 0x00ffffff;
11061 digest[2] &= 0x00ffffff;
11062 digest[3] &= 0x00ffffff;
11063
11064 return (PARSER_OK);
11065 }
11066
11067 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11068 {
11069 if (data.opts_type & OPTS_TYPE_ST_HEX)
11070 {
11071 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
11072 }
11073 else
11074 {
11075 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
11076 }
11077
11078 u32 *digest = (u32 *) hash_buf->digest;
11079
11080 salt_t *salt = hash_buf->salt;
11081
11082 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11083 | itoa64_to_int (input_buf[ 1]) << 6
11084 | itoa64_to_int (input_buf[ 2]) << 12
11085 | itoa64_to_int (input_buf[ 3]) << 18;
11086 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11087 | itoa64_to_int (input_buf[ 5]) << 6
11088 | itoa64_to_int (input_buf[ 6]) << 12
11089 | itoa64_to_int (input_buf[ 7]) << 18;
11090 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11091 | itoa64_to_int (input_buf[ 9]) << 6
11092 | itoa64_to_int (input_buf[10]) << 12
11093 | itoa64_to_int (input_buf[11]) << 18;
11094 digest[3] = itoa64_to_int (input_buf[12]) << 0
11095 | itoa64_to_int (input_buf[13]) << 6
11096 | itoa64_to_int (input_buf[14]) << 12
11097 | itoa64_to_int (input_buf[15]) << 18;
11098
11099 digest[0] -= MD5M_A;
11100 digest[1] -= MD5M_B;
11101 digest[2] -= MD5M_C;
11102 digest[3] -= MD5M_D;
11103
11104 digest[0] &= 0x00ffffff;
11105 digest[1] &= 0x00ffffff;
11106 digest[2] &= 0x00ffffff;
11107 digest[3] &= 0x00ffffff;
11108
11109 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11110
11111 uint salt_len = input_len - 16 - 1;
11112
11113 char *salt_buf = input_buf + 16 + 1;
11114
11115 char *salt_buf_ptr = (char *) salt->salt_buf;
11116
11117 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11118
11119 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11120
11121 salt->salt_len = salt_len;
11122
11123 return (PARSER_OK);
11124 }
11125
11126 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
11127 {
11128 key[0] = (nthash[0] >> 0);
11129 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
11130 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
11131 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
11132 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
11133 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
11134 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
11135 key[7] = (nthash[6] << 1);
11136
11137 key[0] |= 0x01;
11138 key[1] |= 0x01;
11139 key[2] |= 0x01;
11140 key[3] |= 0x01;
11141 key[4] |= 0x01;
11142 key[5] |= 0x01;
11143 key[6] |= 0x01;
11144 key[7] |= 0x01;
11145 }
11146
11147 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11148 {
11149 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
11150
11151 u32 *digest = (u32 *) hash_buf->digest;
11152
11153 salt_t *salt = hash_buf->salt;
11154
11155 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11156
11157 /**
11158 * parse line
11159 */
11160
11161 char *user_pos = input_buf;
11162
11163 char *unused_pos = strchr (user_pos, ':');
11164
11165 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11166
11167 uint user_len = unused_pos - user_pos;
11168
11169 if (user_len > 60) return (PARSER_SALT_LENGTH);
11170
11171 unused_pos++;
11172
11173 char *domain_pos = strchr (unused_pos, ':');
11174
11175 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11176
11177 uint unused_len = domain_pos - unused_pos;
11178
11179 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11180
11181 domain_pos++;
11182
11183 char *srvchall_pos = strchr (domain_pos, ':');
11184
11185 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11186
11187 uint domain_len = srvchall_pos - domain_pos;
11188
11189 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11190
11191 srvchall_pos++;
11192
11193 char *hash_pos = strchr (srvchall_pos, ':');
11194
11195 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11196
11197 uint srvchall_len = hash_pos - srvchall_pos;
11198
11199 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
11200
11201 hash_pos++;
11202
11203 char *clichall_pos = strchr (hash_pos, ':');
11204
11205 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11206
11207 uint hash_len = clichall_pos - hash_pos;
11208
11209 if (hash_len != 48) return (PARSER_HASH_LENGTH);
11210
11211 clichall_pos++;
11212
11213 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11214
11215 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
11216
11217 /**
11218 * store some data for later use
11219 */
11220
11221 netntlm->user_len = user_len * 2;
11222 netntlm->domain_len = domain_len * 2;
11223 netntlm->srvchall_len = srvchall_len / 2;
11224 netntlm->clichall_len = clichall_len / 2;
11225
11226 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11227 char *chall_ptr = (char *) netntlm->chall_buf;
11228
11229 /**
11230 * handle username and domainname
11231 */
11232
11233 for (uint i = 0; i < user_len; i++)
11234 {
11235 *userdomain_ptr++ = user_pos[i];
11236 *userdomain_ptr++ = 0;
11237 }
11238
11239 for (uint i = 0; i < domain_len; i++)
11240 {
11241 *userdomain_ptr++ = domain_pos[i];
11242 *userdomain_ptr++ = 0;
11243 }
11244
11245 /**
11246 * handle server challenge encoding
11247 */
11248
11249 for (uint i = 0; i < srvchall_len; i += 2)
11250 {
11251 const char p0 = srvchall_pos[i + 0];
11252 const char p1 = srvchall_pos[i + 1];
11253
11254 *chall_ptr++ = hex_convert (p1) << 0
11255 | hex_convert (p0) << 4;
11256 }
11257
11258 /**
11259 * handle client challenge encoding
11260 */
11261
11262 for (uint i = 0; i < clichall_len; i += 2)
11263 {
11264 const char p0 = clichall_pos[i + 0];
11265 const char p1 = clichall_pos[i + 1];
11266
11267 *chall_ptr++ = hex_convert (p1) << 0
11268 | hex_convert (p0) << 4;
11269 }
11270
11271 /**
11272 * store data
11273 */
11274
11275 char *salt_buf_ptr = (char *) salt->salt_buf;
11276
11277 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11278
11279 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11280
11281 salt->salt_len = salt_len;
11282
11283 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11284 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11285 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11286 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11287
11288 digest[0] = byte_swap_32 (digest[0]);
11289 digest[1] = byte_swap_32 (digest[1]);
11290 digest[2] = byte_swap_32 (digest[2]);
11291 digest[3] = byte_swap_32 (digest[3]);
11292
11293 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11294
11295 uint digest_tmp[2] = { 0 };
11296
11297 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11298 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11299
11300 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11301 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11302
11303 /* special case 2: ESS */
11304
11305 if (srvchall_len == 48)
11306 {
11307 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11308 {
11309 uint w[16] = { 0 };
11310
11311 w[ 0] = netntlm->chall_buf[6];
11312 w[ 1] = netntlm->chall_buf[7];
11313 w[ 2] = netntlm->chall_buf[0];
11314 w[ 3] = netntlm->chall_buf[1];
11315 w[ 4] = 0x80;
11316 w[14] = 16 * 8;
11317
11318 uint dgst[4] = { 0 };
11319
11320 dgst[0] = MAGIC_A;
11321 dgst[1] = MAGIC_B;
11322 dgst[2] = MAGIC_C;
11323 dgst[3] = MAGIC_D;
11324
11325 md5_64 (w, dgst);
11326
11327 salt->salt_buf[0] = dgst[0];
11328 salt->salt_buf[1] = dgst[1];
11329 }
11330 }
11331
11332 /* precompute netntlmv1 exploit start */
11333
11334 for (uint i = 0; i < 0x10000; i++)
11335 {
11336 uint key_md4[2] = { i, 0 };
11337 uint key_des[2] = { 0, 0 };
11338
11339 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11340
11341 uint Kc[16] = { 0 };
11342 uint Kd[16] = { 0 };
11343
11344 _des_keysetup (key_des, Kc, Kd, c_skb);
11345
11346 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11347
11348 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11349
11350 if (data3[0] != digest_tmp[0]) continue;
11351 if (data3[1] != digest_tmp[1]) continue;
11352
11353 salt->salt_buf[2] = i;
11354
11355 salt->salt_len = 24;
11356
11357 break;
11358 }
11359
11360 salt->salt_buf_pc[0] = digest_tmp[0];
11361 salt->salt_buf_pc[1] = digest_tmp[1];
11362
11363 /* precompute netntlmv1 exploit stop */
11364
11365 u32 tt;
11366
11367 IP (digest[0], digest[1], tt);
11368 IP (digest[2], digest[3], tt);
11369
11370 digest[0] = rotr32 (digest[0], 29);
11371 digest[1] = rotr32 (digest[1], 29);
11372 digest[2] = rotr32 (digest[2], 29);
11373 digest[3] = rotr32 (digest[3], 29);
11374
11375 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11376
11377 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11378 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11379
11380 return (PARSER_OK);
11381 }
11382
11383 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11384 {
11385 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11386
11387 u32 *digest = (u32 *) hash_buf->digest;
11388
11389 salt_t *salt = hash_buf->salt;
11390
11391 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11392
11393 /**
11394 * parse line
11395 */
11396
11397 char *user_pos = input_buf;
11398
11399 char *unused_pos = strchr (user_pos, ':');
11400
11401 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11402
11403 uint user_len = unused_pos - user_pos;
11404
11405 if (user_len > 60) return (PARSER_SALT_LENGTH);
11406
11407 unused_pos++;
11408
11409 char *domain_pos = strchr (unused_pos, ':');
11410
11411 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11412
11413 uint unused_len = domain_pos - unused_pos;
11414
11415 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11416
11417 domain_pos++;
11418
11419 char *srvchall_pos = strchr (domain_pos, ':');
11420
11421 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11422
11423 uint domain_len = srvchall_pos - domain_pos;
11424
11425 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11426
11427 srvchall_pos++;
11428
11429 char *hash_pos = strchr (srvchall_pos, ':');
11430
11431 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11432
11433 uint srvchall_len = hash_pos - srvchall_pos;
11434
11435 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11436
11437 hash_pos++;
11438
11439 char *clichall_pos = strchr (hash_pos, ':');
11440
11441 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11442
11443 uint hash_len = clichall_pos - hash_pos;
11444
11445 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11446
11447 clichall_pos++;
11448
11449 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11450
11451 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11452
11453 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11454
11455 /**
11456 * store some data for later use
11457 */
11458
11459 netntlm->user_len = user_len * 2;
11460 netntlm->domain_len = domain_len * 2;
11461 netntlm->srvchall_len = srvchall_len / 2;
11462 netntlm->clichall_len = clichall_len / 2;
11463
11464 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11465 char *chall_ptr = (char *) netntlm->chall_buf;
11466
11467 /**
11468 * handle username and domainname
11469 */
11470
11471 for (uint i = 0; i < user_len; i++)
11472 {
11473 *userdomain_ptr++ = toupper (user_pos[i]);
11474 *userdomain_ptr++ = 0;
11475 }
11476
11477 for (uint i = 0; i < domain_len; i++)
11478 {
11479 *userdomain_ptr++ = domain_pos[i];
11480 *userdomain_ptr++ = 0;
11481 }
11482
11483 *userdomain_ptr++ = 0x80;
11484
11485 /**
11486 * handle server challenge encoding
11487 */
11488
11489 for (uint i = 0; i < srvchall_len; i += 2)
11490 {
11491 const char p0 = srvchall_pos[i + 0];
11492 const char p1 = srvchall_pos[i + 1];
11493
11494 *chall_ptr++ = hex_convert (p1) << 0
11495 | hex_convert (p0) << 4;
11496 }
11497
11498 /**
11499 * handle client challenge encoding
11500 */
11501
11502 for (uint i = 0; i < clichall_len; i += 2)
11503 {
11504 const char p0 = clichall_pos[i + 0];
11505 const char p1 = clichall_pos[i + 1];
11506
11507 *chall_ptr++ = hex_convert (p1) << 0
11508 | hex_convert (p0) << 4;
11509 }
11510
11511 *chall_ptr++ = 0x80;
11512
11513 /**
11514 * handle hash itself
11515 */
11516
11517 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11518 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11519 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11520 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11521
11522 digest[0] = byte_swap_32 (digest[0]);
11523 digest[1] = byte_swap_32 (digest[1]);
11524 digest[2] = byte_swap_32 (digest[2]);
11525 digest[3] = byte_swap_32 (digest[3]);
11526
11527 /**
11528 * reuse challange data as salt_buf, its the buffer that is most likely unique
11529 */
11530
11531 salt->salt_buf[0] = 0;
11532 salt->salt_buf[1] = 0;
11533 salt->salt_buf[2] = 0;
11534 salt->salt_buf[3] = 0;
11535 salt->salt_buf[4] = 0;
11536 salt->salt_buf[5] = 0;
11537 salt->salt_buf[6] = 0;
11538 salt->salt_buf[7] = 0;
11539
11540 uint *uptr;
11541
11542 uptr = (uint *) netntlm->userdomain_buf;
11543
11544 for (uint i = 0; i < 16; i += 16)
11545 {
11546 md5_64 (uptr, salt->salt_buf);
11547 }
11548
11549 uptr = (uint *) netntlm->chall_buf;
11550
11551 for (uint i = 0; i < 256; i += 16)
11552 {
11553 md5_64 (uptr, salt->salt_buf);
11554 }
11555
11556 salt->salt_len = 16;
11557
11558 return (PARSER_OK);
11559 }
11560
11561 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11562 {
11563 if (data.opts_type & OPTS_TYPE_ST_HEX)
11564 {
11565 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11566 }
11567 else
11568 {
11569 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11570 }
11571
11572 u32 *digest = (u32 *) hash_buf->digest;
11573
11574 salt_t *salt = hash_buf->salt;
11575
11576 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11577 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11578 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11579 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11580
11581 digest[0] = byte_swap_32 (digest[0]);
11582 digest[1] = byte_swap_32 (digest[1]);
11583 digest[2] = byte_swap_32 (digest[2]);
11584 digest[3] = byte_swap_32 (digest[3]);
11585
11586 digest[0] -= MD5M_A;
11587 digest[1] -= MD5M_B;
11588 digest[2] -= MD5M_C;
11589 digest[3] -= MD5M_D;
11590
11591 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11592
11593 uint salt_len = input_len - 32 - 1;
11594
11595 char *salt_buf = input_buf + 32 + 1;
11596
11597 char *salt_buf_ptr = (char *) salt->salt_buf;
11598
11599 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11600
11601 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11602
11603 salt->salt_len = salt_len;
11604
11605 return (PARSER_OK);
11606 }
11607
11608 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11609 {
11610 if (data.opts_type & OPTS_TYPE_ST_HEX)
11611 {
11612 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11613 }
11614 else
11615 {
11616 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11617 }
11618
11619 u32 *digest = (u32 *) hash_buf->digest;
11620
11621 salt_t *salt = hash_buf->salt;
11622
11623 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11624 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11625 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11626 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11627
11628 digest[0] = byte_swap_32 (digest[0]);
11629 digest[1] = byte_swap_32 (digest[1]);
11630 digest[2] = byte_swap_32 (digest[2]);
11631 digest[3] = byte_swap_32 (digest[3]);
11632
11633 digest[0] -= MD5M_A;
11634 digest[1] -= MD5M_B;
11635 digest[2] -= MD5M_C;
11636 digest[3] -= MD5M_D;
11637
11638 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11639
11640 uint salt_len = input_len - 32 - 1;
11641
11642 char *salt_buf = input_buf + 32 + 1;
11643
11644 char *salt_buf_ptr = (char *) salt->salt_buf;
11645
11646 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11647
11648 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11649
11650 salt->salt_len = salt_len;
11651
11652 return (PARSER_OK);
11653 }
11654
11655 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11656 {
11657 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11658
11659 u32 *digest = (u32 *) hash_buf->digest;
11660
11661 salt_t *salt = hash_buf->salt;
11662
11663 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11664 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11665 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11666 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11667
11668 digest[0] = byte_swap_32 (digest[0]);
11669 digest[1] = byte_swap_32 (digest[1]);
11670 digest[2] = byte_swap_32 (digest[2]);
11671 digest[3] = byte_swap_32 (digest[3]);
11672
11673 digest[0] -= MD5M_A;
11674 digest[1] -= MD5M_B;
11675 digest[2] -= MD5M_C;
11676 digest[3] -= MD5M_D;
11677
11678 /**
11679 * This is a virtual salt. While the algorithm is basically not salted
11680 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11681 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11682 */
11683
11684 char *salt_buf_ptr = (char *) salt->salt_buf;
11685
11686 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11687
11688 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11689
11690 salt->salt_len = salt_len;
11691
11692 return (PARSER_OK);
11693 }
11694
11695 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11696 {
11697 if (data.opts_type & OPTS_TYPE_ST_HEX)
11698 {
11699 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11700 }
11701 else
11702 {
11703 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11704 }
11705
11706 u32 *digest = (u32 *) hash_buf->digest;
11707
11708 salt_t *salt = hash_buf->salt;
11709
11710 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11711 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11712 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11713 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11714
11715 digest[0] = byte_swap_32 (digest[0]);
11716 digest[1] = byte_swap_32 (digest[1]);
11717 digest[2] = byte_swap_32 (digest[2]);
11718 digest[3] = byte_swap_32 (digest[3]);
11719
11720 digest[0] -= MD5M_A;
11721 digest[1] -= MD5M_B;
11722 digest[2] -= MD5M_C;
11723 digest[3] -= MD5M_D;
11724
11725 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11726
11727 uint salt_len = input_len - 32 - 1;
11728
11729 char *salt_buf = input_buf + 32 + 1;
11730
11731 char *salt_buf_ptr = (char *) salt->salt_buf;
11732
11733 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11734
11735 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11736
11737 salt->salt_len = salt_len;
11738
11739 return (PARSER_OK);
11740 }
11741
11742 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11743 {
11744 if (data.opts_type & OPTS_TYPE_ST_HEX)
11745 {
11746 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11747 }
11748 else
11749 {
11750 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11751 }
11752
11753 u32 *digest = (u32 *) hash_buf->digest;
11754
11755 salt_t *salt = hash_buf->salt;
11756
11757 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11758 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11759 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11760 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11761
11762 digest[0] = byte_swap_32 (digest[0]);
11763 digest[1] = byte_swap_32 (digest[1]);
11764 digest[2] = byte_swap_32 (digest[2]);
11765 digest[3] = byte_swap_32 (digest[3]);
11766
11767 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11768
11769 uint salt_len = input_len - 32 - 1;
11770
11771 char *salt_buf = input_buf + 32 + 1;
11772
11773 char *salt_buf_ptr = (char *) salt->salt_buf;
11774
11775 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11776
11777 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11778
11779 salt->salt_len = salt_len;
11780
11781 return (PARSER_OK);
11782 }
11783
11784 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11785 {
11786 if (data.opts_type & OPTS_TYPE_ST_HEX)
11787 {
11788 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11789 }
11790 else
11791 {
11792 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11793 }
11794
11795 u32 *digest = (u32 *) hash_buf->digest;
11796
11797 salt_t *salt = hash_buf->salt;
11798
11799 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11800 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11801 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11802 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11803
11804 digest[0] = byte_swap_32 (digest[0]);
11805 digest[1] = byte_swap_32 (digest[1]);
11806 digest[2] = byte_swap_32 (digest[2]);
11807 digest[3] = byte_swap_32 (digest[3]);
11808
11809 digest[0] -= MD4M_A;
11810 digest[1] -= MD4M_B;
11811 digest[2] -= MD4M_C;
11812 digest[3] -= MD4M_D;
11813
11814 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11815
11816 uint salt_len = input_len - 32 - 1;
11817
11818 char *salt_buf = input_buf + 32 + 1;
11819
11820 char *salt_buf_ptr = (char *) salt->salt_buf;
11821
11822 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11823
11824 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11825
11826 salt->salt_len = salt_len;
11827
11828 return (PARSER_OK);
11829 }
11830
11831 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11832 {
11833 if (data.opts_type & OPTS_TYPE_ST_HEX)
11834 {
11835 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11836 }
11837 else
11838 {
11839 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11840 }
11841
11842 u32 *digest = (u32 *) hash_buf->digest;
11843
11844 salt_t *salt = hash_buf->salt;
11845
11846 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11847 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11848 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11849 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11850
11851 digest[0] = byte_swap_32 (digest[0]);
11852 digest[1] = byte_swap_32 (digest[1]);
11853 digest[2] = byte_swap_32 (digest[2]);
11854 digest[3] = byte_swap_32 (digest[3]);
11855
11856 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11857
11858 uint salt_len = input_len - 32 - 1;
11859
11860 char *salt_buf = input_buf + 32 + 1;
11861
11862 uint salt_pc_block[16] = { 0 };
11863
11864 char *salt_pc_block_ptr = (char *) salt_pc_block;
11865
11866 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11867
11868 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11869
11870 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11871
11872 salt_pc_block[14] = salt_len * 8;
11873
11874 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11875
11876 md5_64 (salt_pc_block, salt_pc_digest);
11877
11878 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11879 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11880 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11881 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11882
11883 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11884
11885 memcpy (salt_buf_ptr, salt_buf, salt_len);
11886
11887 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11888
11889 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11890 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11891 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11892 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11893
11894 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11895
11896 return (PARSER_OK);
11897 }
11898
11899 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11900 {
11901 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11902
11903 u32 *digest = (u32 *) hash_buf->digest;
11904
11905 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11906 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11907 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11908 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11909 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11910
11911 digest[0] -= SHA1M_A;
11912 digest[1] -= SHA1M_B;
11913 digest[2] -= SHA1M_C;
11914 digest[3] -= SHA1M_D;
11915 digest[4] -= SHA1M_E;
11916
11917 return (PARSER_OK);
11918 }
11919
11920 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11921 {
11922 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11923
11924 u32 *digest = (u32 *) hash_buf->digest;
11925
11926 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11927 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11928 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11929 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11930 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11931
11932 return (PARSER_OK);
11933 }
11934
11935 int sha1axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11936 {
11937 if ((input_len < DISPLAY_LEN_MIN_13300) || (input_len > DISPLAY_LEN_MAX_13300)) return (PARSER_GLOBAL_LENGTH);
11938
11939 if (memcmp (SIGNATURE_AXCRYPT_SHA1, input_buf, 13)) return (PARSER_SIGNATURE_UNMATCHED);
11940
11941 u32 *digest = (u32 *) hash_buf->digest;
11942
11943 input_buf +=14;
11944
11945 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11946 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11947 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11948 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11949 digest[4] = 0x00000000;
11950
11951 return (PARSER_OK);
11952 }
11953
11954 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11955 {
11956 if (data.opts_type & OPTS_TYPE_ST_HEX)
11957 {
11958 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11959 }
11960 else
11961 {
11962 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11963 }
11964
11965 u32 *digest = (u32 *) hash_buf->digest;
11966
11967 salt_t *salt = hash_buf->salt;
11968
11969 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11970 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11971 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11972 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11973 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11974
11975 digest[0] -= SHA1M_A;
11976 digest[1] -= SHA1M_B;
11977 digest[2] -= SHA1M_C;
11978 digest[3] -= SHA1M_D;
11979 digest[4] -= SHA1M_E;
11980
11981 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11982
11983 uint salt_len = input_len - 40 - 1;
11984
11985 char *salt_buf = input_buf + 40 + 1;
11986
11987 char *salt_buf_ptr = (char *) salt->salt_buf;
11988
11989 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11990
11991 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11992
11993 salt->salt_len = salt_len;
11994
11995 return (PARSER_OK);
11996 }
11997
11998 int pstoken_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11999 {
12000 if ((input_len < DISPLAY_LEN_MIN_13500) || (input_len > DISPLAY_LEN_MAX_13500)) return (PARSER_GLOBAL_LENGTH);
12001
12002 u32 *digest = (u32 *) hash_buf->digest;
12003
12004 salt_t *salt = hash_buf->salt;
12005
12006 pstoken_t *pstoken = (pstoken_t *) hash_buf->esalt;
12007
12008 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12009 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12010 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12011 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12012 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12013
12014 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12015
12016 uint salt_len = input_len - 40 - 1;
12017
12018 char *salt_buf = input_buf + 40 + 1;
12019
12020 if (salt_len == UINT_MAX || salt_len % 2 != 0) return (PARSER_SALT_LENGTH);
12021
12022 u8 *pstoken_ptr = (u8 *) pstoken->salt_buf;
12023
12024 for (uint i = 0, j = 0; i < salt_len; i += 2, j += 1)
12025 {
12026 pstoken_ptr[j] = hex_to_u8 ((const u8 *) &salt_buf[i]);
12027 }
12028
12029 pstoken->salt_len = salt_len / 2;
12030
12031 /* some fake salt for the sorting mechanisms */
12032
12033 salt->salt_buf[0] = pstoken->salt_buf[0];
12034 salt->salt_buf[1] = pstoken->salt_buf[1];
12035 salt->salt_buf[2] = pstoken->salt_buf[2];
12036 salt->salt_buf[3] = pstoken->salt_buf[3];
12037 salt->salt_buf[4] = pstoken->salt_buf[4];
12038 salt->salt_buf[5] = pstoken->salt_buf[5];
12039 salt->salt_buf[6] = pstoken->salt_buf[6];
12040 salt->salt_buf[7] = pstoken->salt_buf[7];
12041
12042 salt->salt_len = 32;
12043
12044 /* we need to check if we can precompute some of the data --
12045 this is possible since the scheme is badly designed */
12046
12047 pstoken->pc_digest[0] = SHA1M_A;
12048 pstoken->pc_digest[1] = SHA1M_B;
12049 pstoken->pc_digest[2] = SHA1M_C;
12050 pstoken->pc_digest[3] = SHA1M_D;
12051 pstoken->pc_digest[4] = SHA1M_E;
12052
12053 pstoken->pc_offset = 0;
12054
12055 for (int i = 0; i < (int) pstoken->salt_len - 64; i += 64)
12056 {
12057 uint w[16];
12058
12059 w[ 0] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 0]);
12060 w[ 1] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 1]);
12061 w[ 2] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 2]);
12062 w[ 3] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 3]);
12063 w[ 4] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 4]);
12064 w[ 5] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 5]);
12065 w[ 6] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 6]);
12066 w[ 7] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 7]);
12067 w[ 8] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 8]);
12068 w[ 9] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 9]);
12069 w[10] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 10]);
12070 w[11] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 11]);
12071 w[12] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 12]);
12072 w[13] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 13]);
12073 w[14] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 14]);
12074 w[15] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 15]);
12075
12076 sha1_64 (w, pstoken->pc_digest);
12077
12078 pstoken->pc_offset += 16;
12079 }
12080
12081 return (PARSER_OK);
12082 }
12083
12084 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12085 {
12086 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
12087
12088 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
12089
12090 u32 *digest = (u32 *) hash_buf->digest;
12091
12092 u8 tmp_buf[100] = { 0 };
12093
12094 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
12095
12096 memcpy (digest, tmp_buf, 20);
12097
12098 digest[0] = byte_swap_32 (digest[0]);
12099 digest[1] = byte_swap_32 (digest[1]);
12100 digest[2] = byte_swap_32 (digest[2]);
12101 digest[3] = byte_swap_32 (digest[3]);
12102 digest[4] = byte_swap_32 (digest[4]);
12103
12104 digest[0] -= SHA1M_A;
12105 digest[1] -= SHA1M_B;
12106 digest[2] -= SHA1M_C;
12107 digest[3] -= SHA1M_D;
12108 digest[4] -= SHA1M_E;
12109
12110 return (PARSER_OK);
12111 }
12112
12113 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12114 {
12115 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
12116
12117 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12118
12119 u32 *digest = (u32 *) hash_buf->digest;
12120
12121 salt_t *salt = hash_buf->salt;
12122
12123 u8 tmp_buf[100] = { 0 };
12124
12125 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
12126
12127 if (tmp_len < 20) return (PARSER_HASH_LENGTH);
12128
12129 memcpy (digest, tmp_buf, 20);
12130
12131 int salt_len = tmp_len - 20;
12132
12133 if (salt_len < 0) return (PARSER_SALT_LENGTH);
12134
12135 salt->salt_len = salt_len;
12136
12137 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
12138
12139 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12140 {
12141 char *ptr = (char *) salt->salt_buf;
12142
12143 ptr[salt->salt_len] = 0x80;
12144 }
12145
12146 digest[0] = byte_swap_32 (digest[0]);
12147 digest[1] = byte_swap_32 (digest[1]);
12148 digest[2] = byte_swap_32 (digest[2]);
12149 digest[3] = byte_swap_32 (digest[3]);
12150 digest[4] = byte_swap_32 (digest[4]);
12151
12152 digest[0] -= SHA1M_A;
12153 digest[1] -= SHA1M_B;
12154 digest[2] -= SHA1M_C;
12155 digest[3] -= SHA1M_D;
12156 digest[4] -= SHA1M_E;
12157
12158 return (PARSER_OK);
12159 }
12160
12161 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12162 {
12163 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
12164
12165 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12166
12167 u32 *digest = (u32 *) hash_buf->digest;
12168
12169 salt_t *salt = hash_buf->salt;
12170
12171 char *salt_buf = input_buf + 6;
12172
12173 uint salt_len = 8;
12174
12175 char *salt_buf_ptr = (char *) salt->salt_buf;
12176
12177 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12178
12179 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12180
12181 salt->salt_len = salt_len;
12182
12183 char *hash_pos = input_buf + 6 + 8 + 40;
12184
12185 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12186 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12187 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12188 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12189 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12190
12191 digest[0] -= SHA1M_A;
12192 digest[1] -= SHA1M_B;
12193 digest[2] -= SHA1M_C;
12194 digest[3] -= SHA1M_D;
12195 digest[4] -= SHA1M_E;
12196
12197 return (PARSER_OK);
12198 }
12199
12200 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12201 {
12202 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
12203
12204 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12205
12206 u32 *digest = (u32 *) hash_buf->digest;
12207
12208 salt_t *salt = hash_buf->salt;
12209
12210 char *salt_buf = input_buf + 6;
12211
12212 uint salt_len = 8;
12213
12214 char *salt_buf_ptr = (char *) salt->salt_buf;
12215
12216 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12217
12218 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12219
12220 salt->salt_len = salt_len;
12221
12222 char *hash_pos = input_buf + 6 + 8;
12223
12224 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12225 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12226 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12227 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12228 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12229
12230 digest[0] -= SHA1M_A;
12231 digest[1] -= SHA1M_B;
12232 digest[2] -= SHA1M_C;
12233 digest[3] -= SHA1M_D;
12234 digest[4] -= SHA1M_E;
12235
12236 return (PARSER_OK);
12237 }
12238
12239 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12240 {
12241 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
12242
12243 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12244
12245 u64 *digest = (u64 *) hash_buf->digest;
12246
12247 salt_t *salt = hash_buf->salt;
12248
12249 char *salt_buf = input_buf + 6;
12250
12251 uint salt_len = 8;
12252
12253 char *salt_buf_ptr = (char *) salt->salt_buf;
12254
12255 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12256
12257 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12258
12259 salt->salt_len = salt_len;
12260
12261 char *hash_pos = input_buf + 6 + 8;
12262
12263 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12264 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12265 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12266 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12267 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12268 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12269 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12270 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12271
12272 digest[0] -= SHA512M_A;
12273 digest[1] -= SHA512M_B;
12274 digest[2] -= SHA512M_C;
12275 digest[3] -= SHA512M_D;
12276 digest[4] -= SHA512M_E;
12277 digest[5] -= SHA512M_F;
12278 digest[6] -= SHA512M_G;
12279 digest[7] -= SHA512M_H;
12280
12281 return (PARSER_OK);
12282 }
12283
12284 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12285 {
12286 if (data.opts_type & OPTS_TYPE_ST_HEX)
12287 {
12288 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
12289 }
12290 else
12291 {
12292 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
12293 }
12294
12295 u32 *digest = (u32 *) hash_buf->digest;
12296
12297 salt_t *salt = hash_buf->salt;
12298
12299 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12300 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12301 digest[2] = 0;
12302 digest[3] = 0;
12303
12304 digest[0] = byte_swap_32 (digest[0]);
12305 digest[1] = byte_swap_32 (digest[1]);
12306
12307 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12308
12309 uint salt_len = input_len - 16 - 1;
12310
12311 char *salt_buf = input_buf + 16 + 1;
12312
12313 char *salt_buf_ptr = (char *) salt->salt_buf;
12314
12315 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12316
12317 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12318
12319 salt->salt_len = salt_len;
12320
12321 return (PARSER_OK);
12322 }
12323
12324 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12325 {
12326 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
12327
12328 u32 *digest = (u32 *) hash_buf->digest;
12329
12330 salt_t *salt = hash_buf->salt;
12331
12332 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12333 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12334 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12335 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12336 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12337
12338 digest[0] -= SHA1M_A;
12339 digest[1] -= SHA1M_B;
12340 digest[2] -= SHA1M_C;
12341 digest[3] -= SHA1M_D;
12342 digest[4] -= SHA1M_E;
12343
12344 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12345
12346 uint salt_len = input_len - 40 - 1;
12347
12348 char *salt_buf = input_buf + 40 + 1;
12349
12350 char *salt_buf_ptr = (char *) salt->salt_buf;
12351
12352 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12353
12354 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12355
12356 salt->salt_len = salt_len;
12357
12358 return (PARSER_OK);
12359 }
12360
12361 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12362 {
12363 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
12364
12365 u32 *digest = (u32 *) hash_buf->digest;
12366
12367 salt_t *salt = hash_buf->salt;
12368
12369 char *hash_pos = input_buf;
12370
12371 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12372 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12373 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
12374 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
12375 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
12376 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
12377 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
12378 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
12379 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12380 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12381 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12382 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12383 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12384 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12385 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12386 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12387
12388 char *salt_pos = input_buf + 128;
12389
12390 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12391 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12392 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12393 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12394
12395 salt->salt_iter = ROUNDS_ORACLET - 1;
12396 salt->salt_len = 16;
12397
12398 return (PARSER_OK);
12399 }
12400
12401 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12402 {
12403 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12404
12405 u32 *digest = (u32 *) hash_buf->digest;
12406
12407 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12408 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12409 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12410 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12411 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12412 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12413 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12414 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12415
12416 digest[0] -= SHA256M_A;
12417 digest[1] -= SHA256M_B;
12418 digest[2] -= SHA256M_C;
12419 digest[3] -= SHA256M_D;
12420 digest[4] -= SHA256M_E;
12421 digest[5] -= SHA256M_F;
12422 digest[6] -= SHA256M_G;
12423 digest[7] -= SHA256M_H;
12424
12425 return (PARSER_OK);
12426 }
12427
12428 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12429 {
12430 if (data.opts_type & OPTS_TYPE_ST_HEX)
12431 {
12432 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12433 }
12434 else
12435 {
12436 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
12437 }
12438
12439 u32 *digest = (u32 *) hash_buf->digest;
12440
12441 salt_t *salt = hash_buf->salt;
12442
12443 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12444 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12445 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12446 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12447 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12448 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12449 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12450 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12451
12452 digest[0] -= SHA256M_A;
12453 digest[1] -= SHA256M_B;
12454 digest[2] -= SHA256M_C;
12455 digest[3] -= SHA256M_D;
12456 digest[4] -= SHA256M_E;
12457 digest[5] -= SHA256M_F;
12458 digest[6] -= SHA256M_G;
12459 digest[7] -= SHA256M_H;
12460
12461 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12462
12463 uint salt_len = input_len - 64 - 1;
12464
12465 char *salt_buf = input_buf + 64 + 1;
12466
12467 char *salt_buf_ptr = (char *) salt->salt_buf;
12468
12469 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12470
12471 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12472
12473 salt->salt_len = salt_len;
12474
12475 return (PARSER_OK);
12476 }
12477
12478 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12479 {
12480 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12481
12482 u64 *digest = (u64 *) hash_buf->digest;
12483
12484 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12485 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12486 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12487 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12488 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12489 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12490 digest[6] = 0;
12491 digest[7] = 0;
12492
12493 digest[0] -= SHA384M_A;
12494 digest[1] -= SHA384M_B;
12495 digest[2] -= SHA384M_C;
12496 digest[3] -= SHA384M_D;
12497 digest[4] -= SHA384M_E;
12498 digest[5] -= SHA384M_F;
12499 digest[6] -= 0;
12500 digest[7] -= 0;
12501
12502 return (PARSER_OK);
12503 }
12504
12505 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12506 {
12507 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12508
12509 u64 *digest = (u64 *) hash_buf->digest;
12510
12511 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12512 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12513 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12514 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12515 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12516 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12517 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12518 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12519
12520 digest[0] -= SHA512M_A;
12521 digest[1] -= SHA512M_B;
12522 digest[2] -= SHA512M_C;
12523 digest[3] -= SHA512M_D;
12524 digest[4] -= SHA512M_E;
12525 digest[5] -= SHA512M_F;
12526 digest[6] -= SHA512M_G;
12527 digest[7] -= SHA512M_H;
12528
12529 return (PARSER_OK);
12530 }
12531
12532 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12533 {
12534 if (data.opts_type & OPTS_TYPE_ST_HEX)
12535 {
12536 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12537 }
12538 else
12539 {
12540 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12541 }
12542
12543 u64 *digest = (u64 *) hash_buf->digest;
12544
12545 salt_t *salt = hash_buf->salt;
12546
12547 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12548 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12549 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12550 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12551 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12552 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12553 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12554 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12555
12556 digest[0] -= SHA512M_A;
12557 digest[1] -= SHA512M_B;
12558 digest[2] -= SHA512M_C;
12559 digest[3] -= SHA512M_D;
12560 digest[4] -= SHA512M_E;
12561 digest[5] -= SHA512M_F;
12562 digest[6] -= SHA512M_G;
12563 digest[7] -= SHA512M_H;
12564
12565 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12566
12567 uint salt_len = input_len - 128 - 1;
12568
12569 char *salt_buf = input_buf + 128 + 1;
12570
12571 char *salt_buf_ptr = (char *) salt->salt_buf;
12572
12573 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12574
12575 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12576
12577 salt->salt_len = salt_len;
12578
12579 return (PARSER_OK);
12580 }
12581
12582 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12583 {
12584 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12585
12586 u64 *digest = (u64 *) hash_buf->digest;
12587
12588 salt_t *salt = hash_buf->salt;
12589
12590 char *salt_pos = input_buf + 3;
12591
12592 uint iterations_len = 0;
12593
12594 if (memcmp (salt_pos, "rounds=", 7) == 0)
12595 {
12596 salt_pos += 7;
12597
12598 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12599
12600 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12601 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12602
12603 salt_pos[0] = 0x0;
12604
12605 salt->salt_iter = atoi (salt_pos - iterations_len);
12606
12607 salt_pos += 1;
12608
12609 iterations_len += 8;
12610 }
12611 else
12612 {
12613 salt->salt_iter = ROUNDS_SHA512CRYPT;
12614 }
12615
12616 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12617
12618 char *hash_pos = strchr (salt_pos, '$');
12619
12620 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12621
12622 uint salt_len = hash_pos - salt_pos;
12623
12624 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12625
12626 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12627
12628 salt->salt_len = salt_len;
12629
12630 hash_pos++;
12631
12632 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12633
12634 return (PARSER_OK);
12635 }
12636
12637 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12638 {
12639 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12640
12641 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12642
12643 u64 *digest = (u64 *) hash_buf->digest;
12644
12645 salt_t *salt = hash_buf->salt;
12646
12647 uint keccak_mdlen = input_len / 2;
12648
12649 for (uint i = 0; i < keccak_mdlen / 8; i++)
12650 {
12651 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12652
12653 digest[i] = byte_swap_64 (digest[i]);
12654 }
12655
12656 salt->keccak_mdlen = keccak_mdlen;
12657
12658 return (PARSER_OK);
12659 }
12660
12661 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12662 {
12663 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12664
12665 u32 *digest = (u32 *) hash_buf->digest;
12666
12667 salt_t *salt = hash_buf->salt;
12668
12669 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12670
12671 /**
12672 * Parse that strange long line
12673 */
12674
12675 char *in_off[9];
12676
12677 size_t in_len[9] = { 0 };
12678
12679 in_off[0] = strtok (input_buf, ":");
12680
12681 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12682
12683 in_len[0] = strlen (in_off[0]);
12684
12685 size_t i;
12686
12687 for (i = 1; i < 9; i++)
12688 {
12689 in_off[i] = strtok (NULL, ":");
12690
12691 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12692
12693 in_len[i] = strlen (in_off[i]);
12694 }
12695
12696 char *ptr = (char *) ikepsk->msg_buf;
12697
12698 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12699 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12700 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12701 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12702 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12703 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12704
12705 *ptr = 0x80;
12706
12707 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12708
12709 ptr = (char *) ikepsk->nr_buf;
12710
12711 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12712 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12713
12714 *ptr = 0x80;
12715
12716 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12717
12718 /**
12719 * Store to database
12720 */
12721
12722 ptr = in_off[8];
12723
12724 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12725 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12726 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12727 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12728
12729 digest[0] = byte_swap_32 (digest[0]);
12730 digest[1] = byte_swap_32 (digest[1]);
12731 digest[2] = byte_swap_32 (digest[2]);
12732 digest[3] = byte_swap_32 (digest[3]);
12733
12734 salt->salt_len = 32;
12735
12736 salt->salt_buf[0] = ikepsk->nr_buf[0];
12737 salt->salt_buf[1] = ikepsk->nr_buf[1];
12738 salt->salt_buf[2] = ikepsk->nr_buf[2];
12739 salt->salt_buf[3] = ikepsk->nr_buf[3];
12740 salt->salt_buf[4] = ikepsk->nr_buf[4];
12741 salt->salt_buf[5] = ikepsk->nr_buf[5];
12742 salt->salt_buf[6] = ikepsk->nr_buf[6];
12743 salt->salt_buf[7] = ikepsk->nr_buf[7];
12744
12745 return (PARSER_OK);
12746 }
12747
12748 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12749 {
12750 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12751
12752 u32 *digest = (u32 *) hash_buf->digest;
12753
12754 salt_t *salt = hash_buf->salt;
12755
12756 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12757
12758 /**
12759 * Parse that strange long line
12760 */
12761
12762 char *in_off[9];
12763
12764 size_t in_len[9] = { 0 };
12765
12766 in_off[0] = strtok (input_buf, ":");
12767
12768 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12769
12770 in_len[0] = strlen (in_off[0]);
12771
12772 size_t i;
12773
12774 for (i = 1; i < 9; i++)
12775 {
12776 in_off[i] = strtok (NULL, ":");
12777
12778 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12779
12780 in_len[i] = strlen (in_off[i]);
12781 }
12782
12783 char *ptr = (char *) ikepsk->msg_buf;
12784
12785 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12786 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12787 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12788 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12789 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12790 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12791
12792 *ptr = 0x80;
12793
12794 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12795
12796 ptr = (char *) ikepsk->nr_buf;
12797
12798 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12799 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12800
12801 *ptr = 0x80;
12802
12803 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12804
12805 /**
12806 * Store to database
12807 */
12808
12809 ptr = in_off[8];
12810
12811 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12812 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12813 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12814 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12815 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12816
12817 salt->salt_len = 32;
12818
12819 salt->salt_buf[0] = ikepsk->nr_buf[0];
12820 salt->salt_buf[1] = ikepsk->nr_buf[1];
12821 salt->salt_buf[2] = ikepsk->nr_buf[2];
12822 salt->salt_buf[3] = ikepsk->nr_buf[3];
12823 salt->salt_buf[4] = ikepsk->nr_buf[4];
12824 salt->salt_buf[5] = ikepsk->nr_buf[5];
12825 salt->salt_buf[6] = ikepsk->nr_buf[6];
12826 salt->salt_buf[7] = ikepsk->nr_buf[7];
12827
12828 return (PARSER_OK);
12829 }
12830
12831 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12832 {
12833 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12834
12835 u32 *digest = (u32 *) hash_buf->digest;
12836
12837 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12838 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12839 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12840 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12841 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12842
12843 digest[0] = byte_swap_32 (digest[0]);
12844 digest[1] = byte_swap_32 (digest[1]);
12845 digest[2] = byte_swap_32 (digest[2]);
12846 digest[3] = byte_swap_32 (digest[3]);
12847 digest[4] = byte_swap_32 (digest[4]);
12848
12849 return (PARSER_OK);
12850 }
12851
12852 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12853 {
12854 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12855
12856 u32 *digest = (u32 *) hash_buf->digest;
12857
12858 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12859 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12860 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12861 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12862 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12863 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12864 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12865 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12866 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12867 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12868 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12869 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12870 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12871 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12872 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12873 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12874
12875 return (PARSER_OK);
12876 }
12877
12878 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12879 {
12880 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12881
12882 u32 *digest = (u32 *) hash_buf->digest;
12883
12884 salt_t *salt = hash_buf->salt;
12885
12886 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12887 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12888 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12889 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12890 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12891
12892 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12893
12894 uint salt_len = input_len - 40 - 1;
12895
12896 char *salt_buf = input_buf + 40 + 1;
12897
12898 char *salt_buf_ptr = (char *) salt->salt_buf;
12899
12900 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12901
12902 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12903
12904 salt->salt_len = salt_len;
12905
12906 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12907
12908 return (PARSER_OK);
12909 }
12910
12911 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12912 {
12913 u32 *digest = (u32 *) hash_buf->digest;
12914
12915 salt_t *salt = hash_buf->salt;
12916
12917 tc_t *tc = (tc_t *) hash_buf->esalt;
12918
12919 if (input_len == 0)
12920 {
12921 log_error ("TrueCrypt container not specified");
12922
12923 exit (-1);
12924 }
12925
12926 FILE *fp = fopen (input_buf, "rb");
12927
12928 if (fp == NULL)
12929 {
12930 log_error ("%s: %s", input_buf, strerror (errno));
12931
12932 exit (-1);
12933 }
12934
12935 char buf[512] = { 0 };
12936
12937 int n = fread (buf, 1, sizeof (buf), fp);
12938
12939 fclose (fp);
12940
12941 if (n != 512) return (PARSER_TC_FILE_SIZE);
12942
12943 memcpy (tc->salt_buf, buf, 64);
12944
12945 memcpy (tc->data_buf, buf + 64, 512 - 64);
12946
12947 salt->salt_buf[0] = tc->salt_buf[0];
12948
12949 salt->salt_len = 4;
12950
12951 salt->salt_iter = ROUNDS_TRUECRYPT_1K - 1;
12952
12953 tc->signature = 0x45555254; // "TRUE"
12954
12955 digest[0] = tc->data_buf[0];
12956
12957 return (PARSER_OK);
12958 }
12959
12960 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12961 {
12962 u32 *digest = (u32 *) hash_buf->digest;
12963
12964 salt_t *salt = hash_buf->salt;
12965
12966 tc_t *tc = (tc_t *) hash_buf->esalt;
12967
12968 if (input_len == 0)
12969 {
12970 log_error ("TrueCrypt container not specified");
12971
12972 exit (-1);
12973 }
12974
12975 FILE *fp = fopen (input_buf, "rb");
12976
12977 if (fp == NULL)
12978 {
12979 log_error ("%s: %s", input_buf, strerror (errno));
12980
12981 exit (-1);
12982 }
12983
12984 char buf[512] = { 0 };
12985
12986 int n = fread (buf, 1, sizeof (buf), fp);
12987
12988 fclose (fp);
12989
12990 if (n != 512) return (PARSER_TC_FILE_SIZE);
12991
12992 memcpy (tc->salt_buf, buf, 64);
12993
12994 memcpy (tc->data_buf, buf + 64, 512 - 64);
12995
12996 salt->salt_buf[0] = tc->salt_buf[0];
12997
12998 salt->salt_len = 4;
12999
13000 salt->salt_iter = ROUNDS_TRUECRYPT_2K - 1;
13001
13002 tc->signature = 0x45555254; // "TRUE"
13003
13004 digest[0] = tc->data_buf[0];
13005
13006 return (PARSER_OK);
13007 }
13008
13009 int veracrypt_parse_hash_200000 (char *input_buf, uint input_len, hash_t *hash_buf)
13010 {
13011 u32 *digest = (u32 *) hash_buf->digest;
13012
13013 salt_t *salt = hash_buf->salt;
13014
13015 tc_t *tc = (tc_t *) hash_buf->esalt;
13016
13017 if (input_len == 0)
13018 {
13019 log_error ("VeraCrypt container not specified");
13020
13021 exit (-1);
13022 }
13023
13024 FILE *fp = fopen (input_buf, "rb");
13025
13026 if (fp == NULL)
13027 {
13028 log_error ("%s: %s", input_buf, strerror (errno));
13029
13030 exit (-1);
13031 }
13032
13033 char buf[512] = { 0 };
13034
13035 int n = fread (buf, 1, sizeof (buf), fp);
13036
13037 fclose (fp);
13038
13039 if (n != 512) return (PARSER_VC_FILE_SIZE);
13040
13041 memcpy (tc->salt_buf, buf, 64);
13042
13043 memcpy (tc->data_buf, buf + 64, 512 - 64);
13044
13045 salt->salt_buf[0] = tc->salt_buf[0];
13046
13047 salt->salt_len = 4;
13048
13049 salt->salt_iter = ROUNDS_VERACRYPT_200000 - 1;
13050
13051 tc->signature = 0x41524556; // "VERA"
13052
13053 digest[0] = tc->data_buf[0];
13054
13055 return (PARSER_OK);
13056 }
13057
13058 int veracrypt_parse_hash_500000 (char *input_buf, uint input_len, hash_t *hash_buf)
13059 {
13060 u32 *digest = (u32 *) hash_buf->digest;
13061
13062 salt_t *salt = hash_buf->salt;
13063
13064 tc_t *tc = (tc_t *) hash_buf->esalt;
13065
13066 if (input_len == 0)
13067 {
13068 log_error ("VeraCrypt container not specified");
13069
13070 exit (-1);
13071 }
13072
13073 FILE *fp = fopen (input_buf, "rb");
13074
13075 if (fp == NULL)
13076 {
13077 log_error ("%s: %s", input_buf, strerror (errno));
13078
13079 exit (-1);
13080 }
13081
13082 char buf[512] = { 0 };
13083
13084 int n = fread (buf, 1, sizeof (buf), fp);
13085
13086 fclose (fp);
13087
13088 if (n != 512) return (PARSER_VC_FILE_SIZE);
13089
13090 memcpy (tc->salt_buf, buf, 64);
13091
13092 memcpy (tc->data_buf, buf + 64, 512 - 64);
13093
13094 salt->salt_buf[0] = tc->salt_buf[0];
13095
13096 salt->salt_len = 4;
13097
13098 salt->salt_iter = ROUNDS_VERACRYPT_500000 - 1;
13099
13100 tc->signature = 0x41524556; // "VERA"
13101
13102 digest[0] = tc->data_buf[0];
13103
13104 return (PARSER_OK);
13105 }
13106
13107 int veracrypt_parse_hash_327661 (char *input_buf, uint input_len, hash_t *hash_buf)
13108 {
13109 u32 *digest = (u32 *) hash_buf->digest;
13110
13111 salt_t *salt = hash_buf->salt;
13112
13113 tc_t *tc = (tc_t *) hash_buf->esalt;
13114
13115 if (input_len == 0)
13116 {
13117 log_error ("VeraCrypt container not specified");
13118
13119 exit (-1);
13120 }
13121
13122 FILE *fp = fopen (input_buf, "rb");
13123
13124 if (fp == NULL)
13125 {
13126 log_error ("%s: %s", input_buf, strerror (errno));
13127
13128 exit (-1);
13129 }
13130
13131 char buf[512] = { 0 };
13132
13133 int n = fread (buf, 1, sizeof (buf), fp);
13134
13135 fclose (fp);
13136
13137 if (n != 512) return (PARSER_VC_FILE_SIZE);
13138
13139 memcpy (tc->salt_buf, buf, 64);
13140
13141 memcpy (tc->data_buf, buf + 64, 512 - 64);
13142
13143 salt->salt_buf[0] = tc->salt_buf[0];
13144
13145 salt->salt_len = 4;
13146
13147 salt->salt_iter = ROUNDS_VERACRYPT_327661 - 1;
13148
13149 tc->signature = 0x41524556; // "VERA"
13150
13151 digest[0] = tc->data_buf[0];
13152
13153 return (PARSER_OK);
13154 }
13155
13156 int veracrypt_parse_hash_655331 (char *input_buf, uint input_len, hash_t *hash_buf)
13157 {
13158 u32 *digest = (u32 *) hash_buf->digest;
13159
13160 salt_t *salt = hash_buf->salt;
13161
13162 tc_t *tc = (tc_t *) hash_buf->esalt;
13163
13164 if (input_len == 0)
13165 {
13166 log_error ("VeraCrypt container not specified");
13167
13168 exit (-1);
13169 }
13170
13171 FILE *fp = fopen (input_buf, "rb");
13172
13173 if (fp == NULL)
13174 {
13175 log_error ("%s: %s", input_buf, strerror (errno));
13176
13177 exit (-1);
13178 }
13179
13180 char buf[512] = { 0 };
13181
13182 int n = fread (buf, 1, sizeof (buf), fp);
13183
13184 fclose (fp);
13185
13186 if (n != 512) return (PARSER_VC_FILE_SIZE);
13187
13188 memcpy (tc->salt_buf, buf, 64);
13189
13190 memcpy (tc->data_buf, buf + 64, 512 - 64);
13191
13192 salt->salt_buf[0] = tc->salt_buf[0];
13193
13194 salt->salt_len = 4;
13195
13196 salt->salt_iter = ROUNDS_VERACRYPT_655331 - 1;
13197
13198 tc->signature = 0x41524556; // "VERA"
13199
13200 digest[0] = tc->data_buf[0];
13201
13202 return (PARSER_OK);
13203 }
13204
13205 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13206 {
13207 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
13208
13209 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13210
13211 u32 *digest = (u32 *) hash_buf->digest;
13212
13213 salt_t *salt = hash_buf->salt;
13214
13215 char *salt_pos = input_buf + 6;
13216
13217 char *hash_pos = strchr (salt_pos, '$');
13218
13219 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13220
13221 uint salt_len = hash_pos - salt_pos;
13222
13223 if (salt_len < 8) return (PARSER_SALT_LENGTH);
13224
13225 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13226
13227 salt->salt_len = salt_len;
13228
13229 salt->salt_iter = 1000;
13230
13231 hash_pos++;
13232
13233 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13234
13235 return (PARSER_OK);
13236 }
13237
13238 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13239 {
13240 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
13241
13242 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
13243
13244 u32 *digest = (u32 *) hash_buf->digest;
13245
13246 salt_t *salt = hash_buf->salt;
13247
13248 char *iter_pos = input_buf + 7;
13249
13250 char *salt_pos = strchr (iter_pos, '$');
13251
13252 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13253
13254 salt_pos++;
13255
13256 char *hash_pos = strchr (salt_pos, '$');
13257
13258 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13259
13260 uint salt_len = hash_pos - salt_pos;
13261
13262 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13263
13264 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13265
13266 salt->salt_len = salt_len;
13267
13268 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13269
13270 salt->salt_sign[0] = atoi (salt_iter);
13271
13272 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13273
13274 hash_pos++;
13275
13276 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13277
13278 digest[0] = byte_swap_32 (digest[0]);
13279 digest[1] = byte_swap_32 (digest[1]);
13280 digest[2] = byte_swap_32 (digest[2]);
13281 digest[3] = byte_swap_32 (digest[3]);
13282 digest[4] = byte_swap_32 (digest[4]);
13283
13284 return (PARSER_OK);
13285 }
13286
13287 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13288 {
13289 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
13290
13291 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13292
13293 u32 *digest = (u32 *) hash_buf->digest;
13294
13295 salt_t *salt = hash_buf->salt;
13296
13297 char *iter_pos = input_buf + 9;
13298
13299 char *salt_pos = strchr (iter_pos, '$');
13300
13301 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13302
13303 salt_pos++;
13304
13305 char *hash_pos = strchr (salt_pos, '$');
13306
13307 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13308
13309 uint salt_len = hash_pos - salt_pos;
13310
13311 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13312
13313 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13314
13315 salt->salt_len = salt_len;
13316
13317 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13318
13319 salt->salt_sign[0] = atoi (salt_iter);
13320
13321 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13322
13323 hash_pos++;
13324
13325 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13326
13327 digest[0] = byte_swap_32 (digest[0]);
13328 digest[1] = byte_swap_32 (digest[1]);
13329 digest[2] = byte_swap_32 (digest[2]);
13330 digest[3] = byte_swap_32 (digest[3]);
13331 digest[4] = byte_swap_32 (digest[4]);
13332 digest[5] = byte_swap_32 (digest[5]);
13333 digest[6] = byte_swap_32 (digest[6]);
13334 digest[7] = byte_swap_32 (digest[7]);
13335
13336 return (PARSER_OK);
13337 }
13338
13339 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13340 {
13341 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
13342
13343 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13344
13345 u64 *digest = (u64 *) hash_buf->digest;
13346
13347 salt_t *salt = hash_buf->salt;
13348
13349 char *iter_pos = input_buf + 9;
13350
13351 char *salt_pos = strchr (iter_pos, '$');
13352
13353 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13354
13355 salt_pos++;
13356
13357 char *hash_pos = strchr (salt_pos, '$');
13358
13359 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13360
13361 uint salt_len = hash_pos - salt_pos;
13362
13363 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13364
13365 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13366
13367 salt->salt_len = salt_len;
13368
13369 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13370
13371 salt->salt_sign[0] = atoi (salt_iter);
13372
13373 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13374
13375 hash_pos++;
13376
13377 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13378
13379 digest[0] = byte_swap_64 (digest[0]);
13380 digest[1] = byte_swap_64 (digest[1]);
13381 digest[2] = byte_swap_64 (digest[2]);
13382 digest[3] = byte_swap_64 (digest[3]);
13383 digest[4] = byte_swap_64 (digest[4]);
13384 digest[5] = byte_swap_64 (digest[5]);
13385 digest[6] = byte_swap_64 (digest[6]);
13386 digest[7] = byte_swap_64 (digest[7]);
13387
13388 return (PARSER_OK);
13389 }
13390
13391 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13392 {
13393 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
13394
13395 u32 *digest = (u32 *) hash_buf->digest;
13396
13397 salt_t *salt = hash_buf->salt;
13398
13399 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
13400
13401 /**
13402 * parse line
13403 */
13404
13405 char *iterations_pos = input_buf;
13406
13407 char *saltbuf_pos = strchr (iterations_pos, ':');
13408
13409 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13410
13411 uint iterations_len = saltbuf_pos - iterations_pos;
13412
13413 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
13414
13415 saltbuf_pos++;
13416
13417 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
13418
13419 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13420
13421 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
13422
13423 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
13424
13425 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
13426
13427 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
13428
13429 cipherbuf_pos++;
13430
13431 /**
13432 * pbkdf2 iterations
13433 */
13434
13435 salt->salt_iter = atoi (iterations_pos) - 1;
13436
13437 /**
13438 * handle salt encoding
13439 */
13440
13441 char *saltbuf_ptr = (char *) salt->salt_buf;
13442
13443 for (uint i = 0; i < saltbuf_len; i += 2)
13444 {
13445 const char p0 = saltbuf_pos[i + 0];
13446 const char p1 = saltbuf_pos[i + 1];
13447
13448 *saltbuf_ptr++ = hex_convert (p1) << 0
13449 | hex_convert (p0) << 4;
13450 }
13451
13452 salt->salt_len = saltbuf_len / 2;
13453
13454 /**
13455 * handle cipher encoding
13456 */
13457
13458 uint *tmp = (uint *) mymalloc (32);
13459
13460 char *cipherbuf_ptr = (char *) tmp;
13461
13462 for (uint i = 2016; i < cipherbuf_len; i += 2)
13463 {
13464 const char p0 = cipherbuf_pos[i + 0];
13465 const char p1 = cipherbuf_pos[i + 1];
13466
13467 *cipherbuf_ptr++ = hex_convert (p1) << 0
13468 | hex_convert (p0) << 4;
13469 }
13470
13471 // iv is stored at salt_buf 4 (length 16)
13472 // data is stored at salt_buf 8 (length 16)
13473
13474 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
13475 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
13476 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
13477 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
13478
13479 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
13480 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
13481 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
13482 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
13483
13484 free (tmp);
13485
13486 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
13487 {
13488 const char p0 = cipherbuf_pos[j + 0];
13489 const char p1 = cipherbuf_pos[j + 1];
13490
13491 agilekey->cipher[i] = hex_convert (p1) << 0
13492 | hex_convert (p0) << 4;
13493 }
13494
13495 /**
13496 * digest buf
13497 */
13498
13499 digest[0] = 0x10101010;
13500 digest[1] = 0x10101010;
13501 digest[2] = 0x10101010;
13502 digest[3] = 0x10101010;
13503
13504 return (PARSER_OK);
13505 }
13506
13507 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13508 {
13509 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
13510
13511 u32 *digest = (u32 *) hash_buf->digest;
13512
13513 salt_t *salt = hash_buf->salt;
13514
13515 char *hashbuf_pos = input_buf;
13516
13517 char *iterations_pos = strchr (hashbuf_pos, ':');
13518
13519 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13520
13521 uint hash_len = iterations_pos - hashbuf_pos;
13522
13523 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
13524
13525 iterations_pos++;
13526
13527 char *saltbuf_pos = strchr (iterations_pos, ':');
13528
13529 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13530
13531 uint iterations_len = saltbuf_pos - iterations_pos;
13532
13533 saltbuf_pos++;
13534
13535 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
13536
13537 if (salt_len > 32) return (PARSER_SALT_LENGTH);
13538
13539 char *salt_buf_ptr = (char *) salt->salt_buf;
13540
13541 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
13542
13543 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13544
13545 salt->salt_len = salt_len;
13546
13547 salt->salt_iter = atoi (iterations_pos) - 1;
13548
13549 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13550 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13551 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13552 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13553
13554 return (PARSER_OK);
13555 }
13556
13557 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13558 {
13559 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
13560
13561 u32 *digest = (u32 *) hash_buf->digest;
13562
13563 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13564 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13565 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13566 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13567 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13568 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13569 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13570 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13571
13572 digest[0] = byte_swap_32 (digest[0]);
13573 digest[1] = byte_swap_32 (digest[1]);
13574 digest[2] = byte_swap_32 (digest[2]);
13575 digest[3] = byte_swap_32 (digest[3]);
13576 digest[4] = byte_swap_32 (digest[4]);
13577 digest[5] = byte_swap_32 (digest[5]);
13578 digest[6] = byte_swap_32 (digest[6]);
13579 digest[7] = byte_swap_32 (digest[7]);
13580
13581 return (PARSER_OK);
13582 }
13583
13584 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13585 {
13586 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13587
13588 u32 *digest = (u32 *) hash_buf->digest;
13589
13590 salt_t *salt = hash_buf->salt;
13591
13592 char *salt_pos = input_buf + 3;
13593
13594 uint iterations_len = 0;
13595
13596 if (memcmp (salt_pos, "rounds=", 7) == 0)
13597 {
13598 salt_pos += 7;
13599
13600 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13601
13602 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13603 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13604
13605 salt_pos[0] = 0x0;
13606
13607 salt->salt_iter = atoi (salt_pos - iterations_len);
13608
13609 salt_pos += 1;
13610
13611 iterations_len += 8;
13612 }
13613 else
13614 {
13615 salt->salt_iter = ROUNDS_SHA256CRYPT;
13616 }
13617
13618 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13619
13620 char *hash_pos = strchr (salt_pos, '$');
13621
13622 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13623
13624 uint salt_len = hash_pos - salt_pos;
13625
13626 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13627
13628 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13629
13630 salt->salt_len = salt_len;
13631
13632 hash_pos++;
13633
13634 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13635
13636 return (PARSER_OK);
13637 }
13638
13639 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13640 {
13641 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13642
13643 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13644
13645 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13646
13647 u64 *digest = (u64 *) hash_buf->digest;
13648
13649 salt_t *salt = hash_buf->salt;
13650
13651 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13652
13653 char *iter_pos = input_buf + 4;
13654
13655 char *salt_pos = strchr (iter_pos, '$');
13656
13657 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13658
13659 salt_pos++;
13660
13661 char *hash_pos = strchr (salt_pos, '$');
13662
13663 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13664
13665 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13666
13667 hash_pos++;
13668
13669 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13670 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13671 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13672 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13673 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13674 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13675 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13676 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13677
13678 uint salt_len = hash_pos - salt_pos - 1;
13679
13680 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13681
13682 salt->salt_len = salt_len / 2;
13683
13684 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13685 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13686 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13687 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13688 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13689 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13690 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13691 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13692
13693 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13694 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13695 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13696 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13697 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13698 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13699 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13700 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13701 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13702 pbkdf2_sha512->salt_buf[9] = 0x80;
13703
13704 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13705
13706 salt->salt_iter = atoi (iter_pos) - 1;
13707
13708 return (PARSER_OK);
13709 }
13710
13711 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13712 {
13713 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13714
13715 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13716
13717 u32 *digest = (u32 *) hash_buf->digest;
13718
13719 salt_t *salt = hash_buf->salt;
13720
13721 char *salt_pos = input_buf + 14;
13722
13723 char *hash_pos = strchr (salt_pos, '*');
13724
13725 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13726
13727 hash_pos++;
13728
13729 uint salt_len = hash_pos - salt_pos - 1;
13730
13731 char *salt_buf_ptr = (char *) salt->salt_buf;
13732
13733 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13734
13735 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13736
13737 salt->salt_len = salt_len;
13738
13739 u8 tmp_buf[100] = { 0 };
13740
13741 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13742
13743 memcpy (digest, tmp_buf, 32);
13744
13745 digest[0] = byte_swap_32 (digest[0]);
13746 digest[1] = byte_swap_32 (digest[1]);
13747 digest[2] = byte_swap_32 (digest[2]);
13748 digest[3] = byte_swap_32 (digest[3]);
13749 digest[4] = byte_swap_32 (digest[4]);
13750 digest[5] = byte_swap_32 (digest[5]);
13751 digest[6] = byte_swap_32 (digest[6]);
13752 digest[7] = byte_swap_32 (digest[7]);
13753
13754 digest[0] -= SHA256M_A;
13755 digest[1] -= SHA256M_B;
13756 digest[2] -= SHA256M_C;
13757 digest[3] -= SHA256M_D;
13758 digest[4] -= SHA256M_E;
13759 digest[5] -= SHA256M_F;
13760 digest[6] -= SHA256M_G;
13761 digest[7] -= SHA256M_H;
13762
13763 return (PARSER_OK);
13764 }
13765
13766 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13767 {
13768 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13769
13770 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13771
13772 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13773
13774 u64 *digest = (u64 *) hash_buf->digest;
13775
13776 salt_t *salt = hash_buf->salt;
13777
13778 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13779
13780 char *iter_pos = input_buf + 19;
13781
13782 char *salt_pos = strchr (iter_pos, '.');
13783
13784 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13785
13786 salt_pos++;
13787
13788 char *hash_pos = strchr (salt_pos, '.');
13789
13790 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13791
13792 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13793
13794 hash_pos++;
13795
13796 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13797 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13798 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13799 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13800 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13801 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13802 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13803 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13804
13805 uint salt_len = hash_pos - salt_pos - 1;
13806
13807 salt_len /= 2;
13808
13809 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13810
13811 uint i;
13812
13813 for (i = 0; i < salt_len; i++)
13814 {
13815 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13816 }
13817
13818 salt_buf_ptr[salt_len + 3] = 0x01;
13819 salt_buf_ptr[salt_len + 4] = 0x80;
13820
13821 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13822
13823 salt->salt_len = salt_len;
13824
13825 salt->salt_iter = atoi (iter_pos) - 1;
13826
13827 return (PARSER_OK);
13828 }
13829
13830 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13831 {
13832 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13833
13834 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13835
13836 u64 *digest = (u64 *) hash_buf->digest;
13837
13838 salt_t *salt = hash_buf->salt;
13839
13840 u8 tmp_buf[120] = { 0 };
13841
13842 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13843
13844 if (tmp_len < 64) return (PARSER_HASH_LENGTH);
13845
13846 memcpy (digest, tmp_buf, 64);
13847
13848 digest[0] = byte_swap_64 (digest[0]);
13849 digest[1] = byte_swap_64 (digest[1]);
13850 digest[2] = byte_swap_64 (digest[2]);
13851 digest[3] = byte_swap_64 (digest[3]);
13852 digest[4] = byte_swap_64 (digest[4]);
13853 digest[5] = byte_swap_64 (digest[5]);
13854 digest[6] = byte_swap_64 (digest[6]);
13855 digest[7] = byte_swap_64 (digest[7]);
13856
13857 digest[0] -= SHA512M_A;
13858 digest[1] -= SHA512M_B;
13859 digest[2] -= SHA512M_C;
13860 digest[3] -= SHA512M_D;
13861 digest[4] -= SHA512M_E;
13862 digest[5] -= SHA512M_F;
13863 digest[6] -= SHA512M_G;
13864 digest[7] -= SHA512M_H;
13865
13866 int salt_len = tmp_len - 64;
13867
13868 if (salt_len < 0) return (PARSER_SALT_LENGTH);
13869
13870 salt->salt_len = salt_len;
13871
13872 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13873
13874 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13875 {
13876 char *ptr = (char *) salt->salt_buf;
13877
13878 ptr[salt->salt_len] = 0x80;
13879 }
13880
13881 return (PARSER_OK);
13882 }
13883
13884 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13885 {
13886 if (data.opts_type & OPTS_TYPE_ST_HEX)
13887 {
13888 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13889 }
13890 else
13891 {
13892 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13893 }
13894
13895 u32 *digest = (u32 *) hash_buf->digest;
13896
13897 salt_t *salt = hash_buf->salt;
13898
13899 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13900 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13901 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13902 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13903
13904 digest[0] = byte_swap_32 (digest[0]);
13905 digest[1] = byte_swap_32 (digest[1]);
13906 digest[2] = byte_swap_32 (digest[2]);
13907 digest[3] = byte_swap_32 (digest[3]);
13908
13909 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13910
13911 uint salt_len = input_len - 32 - 1;
13912
13913 char *salt_buf = input_buf + 32 + 1;
13914
13915 char *salt_buf_ptr = (char *) salt->salt_buf;
13916
13917 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13918
13919 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13920
13921 salt->salt_len = salt_len;
13922
13923 return (PARSER_OK);
13924 }
13925
13926 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13927 {
13928 if (data.opts_type & OPTS_TYPE_ST_HEX)
13929 {
13930 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13931 }
13932 else
13933 {
13934 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13935 }
13936
13937 u32 *digest = (u32 *) hash_buf->digest;
13938
13939 salt_t *salt = hash_buf->salt;
13940
13941 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13942 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13943 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13944 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13945 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13946
13947 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13948
13949 uint salt_len = input_len - 40 - 1;
13950
13951 char *salt_buf = input_buf + 40 + 1;
13952
13953 char *salt_buf_ptr = (char *) salt->salt_buf;
13954
13955 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13956
13957 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13958
13959 salt->salt_len = salt_len;
13960
13961 return (PARSER_OK);
13962 }
13963
13964 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13965 {
13966 if (data.opts_type & OPTS_TYPE_ST_HEX)
13967 {
13968 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13969 }
13970 else
13971 {
13972 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13973 }
13974
13975 u32 *digest = (u32 *) hash_buf->digest;
13976
13977 salt_t *salt = hash_buf->salt;
13978
13979 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13980 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13981 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13982 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13983 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13984 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13985 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13986 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13987
13988 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13989
13990 uint salt_len = input_len - 64 - 1;
13991
13992 char *salt_buf = input_buf + 64 + 1;
13993
13994 char *salt_buf_ptr = (char *) salt->salt_buf;
13995
13996 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13997
13998 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13999
14000 salt->salt_len = salt_len;
14001
14002 return (PARSER_OK);
14003 }
14004
14005 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14006 {
14007 if (data.opts_type & OPTS_TYPE_ST_HEX)
14008 {
14009 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
14010 }
14011 else
14012 {
14013 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
14014 }
14015
14016 u64 *digest = (u64 *) hash_buf->digest;
14017
14018 salt_t *salt = hash_buf->salt;
14019
14020 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
14021 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
14022 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
14023 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
14024 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
14025 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
14026 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
14027 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
14028
14029 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14030
14031 uint salt_len = input_len - 128 - 1;
14032
14033 char *salt_buf = input_buf + 128 + 1;
14034
14035 char *salt_buf_ptr = (char *) salt->salt_buf;
14036
14037 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14038
14039 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14040
14041 salt->salt_len = salt_len;
14042
14043 return (PARSER_OK);
14044 }
14045
14046 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14047 {
14048 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
14049
14050 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
14051
14052 u32 *digest = (u32 *) hash_buf->digest;
14053
14054 salt_t *salt = hash_buf->salt;
14055
14056 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
14057
14058 /**
14059 * parse line
14060 */
14061
14062 char *user_pos = input_buf + 10 + 1;
14063
14064 char *realm_pos = strchr (user_pos, '$');
14065
14066 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14067
14068 uint user_len = realm_pos - user_pos;
14069
14070 if (user_len >= 64) return (PARSER_SALT_LENGTH);
14071
14072 realm_pos++;
14073
14074 char *salt_pos = strchr (realm_pos, '$');
14075
14076 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14077
14078 uint realm_len = salt_pos - realm_pos;
14079
14080 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
14081
14082 salt_pos++;
14083
14084 char *data_pos = strchr (salt_pos, '$');
14085
14086 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14087
14088 uint salt_len = data_pos - salt_pos;
14089
14090 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
14091
14092 data_pos++;
14093
14094 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
14095
14096 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
14097
14098 /**
14099 * copy data
14100 */
14101
14102 memcpy (krb5pa->user, user_pos, user_len);
14103 memcpy (krb5pa->realm, realm_pos, realm_len);
14104 memcpy (krb5pa->salt, salt_pos, salt_len);
14105
14106 char *timestamp_ptr = (char *) krb5pa->timestamp;
14107
14108 for (uint i = 0; i < (36 * 2); i += 2)
14109 {
14110 const char p0 = data_pos[i + 0];
14111 const char p1 = data_pos[i + 1];
14112
14113 *timestamp_ptr++ = hex_convert (p1) << 0
14114 | hex_convert (p0) << 4;
14115 }
14116
14117 char *checksum_ptr = (char *) krb5pa->checksum;
14118
14119 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
14120 {
14121 const char p0 = data_pos[i + 0];
14122 const char p1 = data_pos[i + 1];
14123
14124 *checksum_ptr++ = hex_convert (p1) << 0
14125 | hex_convert (p0) << 4;
14126 }
14127
14128 /**
14129 * copy some data to generic buffers to make sorting happy
14130 */
14131
14132 salt->salt_buf[0] = krb5pa->timestamp[0];
14133 salt->salt_buf[1] = krb5pa->timestamp[1];
14134 salt->salt_buf[2] = krb5pa->timestamp[2];
14135 salt->salt_buf[3] = krb5pa->timestamp[3];
14136 salt->salt_buf[4] = krb5pa->timestamp[4];
14137 salt->salt_buf[5] = krb5pa->timestamp[5];
14138 salt->salt_buf[6] = krb5pa->timestamp[6];
14139 salt->salt_buf[7] = krb5pa->timestamp[7];
14140 salt->salt_buf[8] = krb5pa->timestamp[8];
14141
14142 salt->salt_len = 36;
14143
14144 digest[0] = krb5pa->checksum[0];
14145 digest[1] = krb5pa->checksum[1];
14146 digest[2] = krb5pa->checksum[2];
14147 digest[3] = krb5pa->checksum[3];
14148
14149 return (PARSER_OK);
14150 }
14151
14152 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14153 {
14154 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
14155
14156 u32 *digest = (u32 *) hash_buf->digest;
14157
14158 salt_t *salt = hash_buf->salt;
14159
14160 /**
14161 * parse line
14162 */
14163
14164 char *salt_pos = input_buf;
14165
14166 char *hash_pos = strchr (salt_pos, '$');
14167
14168 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14169
14170 uint salt_len = hash_pos - salt_pos;
14171
14172 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14173
14174 hash_pos++;
14175
14176 uint hash_len = input_len - 1 - salt_len;
14177
14178 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14179
14180 /**
14181 * valid some data
14182 */
14183
14184 uint user_len = 0;
14185
14186 for (uint i = 0; i < salt_len; i++)
14187 {
14188 if (salt_pos[i] == ' ') continue;
14189
14190 user_len++;
14191 }
14192
14193 // SAP user names cannot be longer than 12 characters
14194 if (user_len > 12) return (PARSER_SALT_LENGTH);
14195
14196 // SAP user name cannot start with ! or ?
14197 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14198
14199 /**
14200 * copy data
14201 */
14202
14203 char *salt_buf_ptr = (char *) salt->salt_buf;
14204
14205 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14206
14207 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14208
14209 salt->salt_len = salt_len;
14210
14211 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
14212 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
14213 digest[2] = 0;
14214 digest[3] = 0;
14215
14216 digest[0] = byte_swap_32 (digest[0]);
14217 digest[1] = byte_swap_32 (digest[1]);
14218
14219 return (PARSER_OK);
14220 }
14221
14222 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14223 {
14224 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
14225
14226 u32 *digest = (u32 *) hash_buf->digest;
14227
14228 salt_t *salt = hash_buf->salt;
14229
14230 /**
14231 * parse line
14232 */
14233
14234 char *salt_pos = input_buf;
14235
14236 char *hash_pos = strchr (salt_pos, '$');
14237
14238 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14239
14240 uint salt_len = hash_pos - salt_pos;
14241
14242 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14243
14244 hash_pos++;
14245
14246 uint hash_len = input_len - 1 - salt_len;
14247
14248 if (hash_len != 40) return (PARSER_HASH_LENGTH);
14249
14250 /**
14251 * valid some data
14252 */
14253
14254 uint user_len = 0;
14255
14256 for (uint i = 0; i < salt_len; i++)
14257 {
14258 if (salt_pos[i] == ' ') continue;
14259
14260 user_len++;
14261 }
14262
14263 // SAP user names cannot be longer than 12 characters
14264 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
14265 // so far nobody complained so we stay with this because it helps in optimization
14266 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
14267
14268 if (user_len > 12) return (PARSER_SALT_LENGTH);
14269
14270 // SAP user name cannot start with ! or ?
14271 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14272
14273 /**
14274 * copy data
14275 */
14276
14277 char *salt_buf_ptr = (char *) salt->salt_buf;
14278
14279 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14280
14281 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14282
14283 salt->salt_len = salt_len;
14284
14285 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14286 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14287 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14288 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14289 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14290
14291 return (PARSER_OK);
14292 }
14293
14294 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14295 {
14296 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
14297
14298 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14299
14300 u64 *digest = (u64 *) hash_buf->digest;
14301
14302 salt_t *salt = hash_buf->salt;
14303
14304 char *iter_pos = input_buf + 3;
14305
14306 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
14307
14308 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
14309
14310 memcpy ((char *) salt->salt_sign, input_buf, 4);
14311
14312 salt->salt_iter = salt_iter;
14313
14314 char *salt_pos = iter_pos + 1;
14315
14316 uint salt_len = 8;
14317
14318 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
14319
14320 salt->salt_len = salt_len;
14321
14322 char *hash_pos = salt_pos + salt_len;
14323
14324 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14325
14326 // ugly hack start
14327
14328 char *tmp = (char *) salt->salt_buf_pc;
14329
14330 tmp[0] = hash_pos[42];
14331
14332 // ugly hack end
14333
14334 digest[ 0] = byte_swap_64 (digest[ 0]);
14335 digest[ 1] = byte_swap_64 (digest[ 1]);
14336 digest[ 2] = byte_swap_64 (digest[ 2]);
14337 digest[ 3] = byte_swap_64 (digest[ 3]);
14338 digest[ 4] = 0;
14339 digest[ 5] = 0;
14340 digest[ 6] = 0;
14341 digest[ 7] = 0;
14342
14343 return (PARSER_OK);
14344 }
14345
14346 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14347 {
14348 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
14349
14350 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14351
14352 u32 *digest = (u32 *) hash_buf->digest;
14353
14354 salt_t *salt = hash_buf->salt;
14355
14356 char *salt_buf = input_buf + 6;
14357
14358 uint salt_len = 16;
14359
14360 char *salt_buf_ptr = (char *) salt->salt_buf;
14361
14362 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14363
14364 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14365
14366 salt->salt_len = salt_len;
14367
14368 char *hash_pos = input_buf + 6 + 16;
14369
14370 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14371 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14372 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14373 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14374 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14375 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
14376 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
14377 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
14378
14379 return (PARSER_OK);
14380 }
14381
14382 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14383 {
14384 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
14385
14386 u32 *digest = (u32 *) hash_buf->digest;
14387
14388 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14389 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14390 digest[2] = 0;
14391 digest[3] = 0;
14392
14393 return (PARSER_OK);
14394 }
14395
14396 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14397 {
14398 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
14399
14400 u32 *digest = (u32 *) hash_buf->digest;
14401
14402 salt_t *salt = hash_buf->salt;
14403
14404 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
14405
14406 char *saltbuf_pos = input_buf;
14407
14408 char *hashbuf_pos = strchr (saltbuf_pos, ':');
14409
14410 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14411
14412 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
14413
14414 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
14415 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
14416
14417 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
14418
14419 hashbuf_pos++;
14420
14421 uint hashbuf_len = input_len - saltbuf_len - 1;
14422
14423 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
14424
14425 char *salt_ptr = (char *) saltbuf_pos;
14426 char *rakp_ptr = (char *) rakp->salt_buf;
14427
14428 uint i;
14429 uint j;
14430
14431 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
14432 {
14433 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
14434 }
14435
14436 rakp_ptr[j] = 0x80;
14437
14438 rakp->salt_len = j;
14439
14440 for (i = 0; i < 64; i++)
14441 {
14442 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
14443 }
14444
14445 salt->salt_buf[0] = rakp->salt_buf[0];
14446 salt->salt_buf[1] = rakp->salt_buf[1];
14447 salt->salt_buf[2] = rakp->salt_buf[2];
14448 salt->salt_buf[3] = rakp->salt_buf[3];
14449 salt->salt_buf[4] = rakp->salt_buf[4];
14450 salt->salt_buf[5] = rakp->salt_buf[5];
14451 salt->salt_buf[6] = rakp->salt_buf[6];
14452 salt->salt_buf[7] = rakp->salt_buf[7];
14453
14454 salt->salt_len = 32; // muss min. 32 haben
14455
14456 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14457 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14458 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14459 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14460 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14461
14462 return (PARSER_OK);
14463 }
14464
14465 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14466 {
14467 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
14468
14469 u32 *digest = (u32 *) hash_buf->digest;
14470
14471 salt_t *salt = hash_buf->salt;
14472
14473 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
14474
14475 char *salt_pos = input_buf + 1;
14476
14477 memcpy (salt->salt_buf, salt_pos, 8);
14478
14479 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14480 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14481
14482 salt->salt_len = 8;
14483
14484 char *hash_pos = salt_pos + 8;
14485
14486 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14487 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14488 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14489 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14490 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14491
14492 digest[0] -= SHA1M_A;
14493 digest[1] -= SHA1M_B;
14494 digest[2] -= SHA1M_C;
14495 digest[3] -= SHA1M_D;
14496 digest[4] -= SHA1M_E;
14497
14498 return (PARSER_OK);
14499 }
14500
14501 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14502 {
14503 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
14504
14505 u32 *digest = (u32 *) hash_buf->digest;
14506
14507 salt_t *salt = hash_buf->salt;
14508
14509 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14510 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14511 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14512 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14513
14514 digest[0] = byte_swap_32 (digest[0]);
14515 digest[1] = byte_swap_32 (digest[1]);
14516 digest[2] = byte_swap_32 (digest[2]);
14517 digest[3] = byte_swap_32 (digest[3]);
14518
14519 digest[0] -= MD5M_A;
14520 digest[1] -= MD5M_B;
14521 digest[2] -= MD5M_C;
14522 digest[3] -= MD5M_D;
14523
14524 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14525
14526 char *salt_buf_ptr = input_buf + 32 + 1;
14527
14528 u32 *salt_buf = salt->salt_buf;
14529
14530 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
14531 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
14532 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
14533 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
14534
14535 salt_buf[0] = byte_swap_32 (salt_buf[0]);
14536 salt_buf[1] = byte_swap_32 (salt_buf[1]);
14537 salt_buf[2] = byte_swap_32 (salt_buf[2]);
14538 salt_buf[3] = byte_swap_32 (salt_buf[3]);
14539
14540 salt->salt_len = 16 + 1;
14541
14542 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14543
14544 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
14545
14546 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
14547
14548 return (PARSER_OK);
14549 }
14550
14551 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14552 {
14553 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
14554
14555 u32 *digest = (u32 *) hash_buf->digest;
14556
14557 salt_t *salt = hash_buf->salt;
14558
14559 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
14560
14561 /**
14562 * parse line
14563 */
14564
14565 char *hashbuf_pos = input_buf;
14566
14567 char *saltbuf_pos = strchr (hashbuf_pos, ':');
14568
14569 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14570
14571 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
14572
14573 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
14574
14575 saltbuf_pos++;
14576
14577 char *iteration_pos = strchr (saltbuf_pos, ':');
14578
14579 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14580
14581 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14582
14583 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14584
14585 iteration_pos++;
14586
14587 char *databuf_pos = strchr (iteration_pos, ':');
14588
14589 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14590
14591 const uint iteration_len = databuf_pos - iteration_pos;
14592
14593 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14594 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14595
14596 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14597
14598 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14599 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14600
14601 databuf_pos++;
14602
14603 // digest
14604
14605 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14606 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14607 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14608 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14609 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14610 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14611 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14612 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14613
14614 // salt
14615
14616 char *saltbuf_ptr = (char *) salt->salt_buf;
14617
14618 for (uint i = 0; i < saltbuf_len; i += 2)
14619 {
14620 const char p0 = saltbuf_pos[i + 0];
14621 const char p1 = saltbuf_pos[i + 1];
14622
14623 *saltbuf_ptr++ = hex_convert (p1) << 0
14624 | hex_convert (p0) << 4;
14625 }
14626
14627 salt->salt_buf[4] = 0x01000000;
14628 salt->salt_buf[5] = 0x80;
14629
14630 salt->salt_len = saltbuf_len / 2;
14631
14632 // iteration
14633
14634 salt->salt_iter = atoi (iteration_pos) - 1;
14635
14636 // data
14637
14638 char *databuf_ptr = (char *) cloudkey->data_buf;
14639
14640 for (uint i = 0; i < databuf_len; i += 2)
14641 {
14642 const char p0 = databuf_pos[i + 0];
14643 const char p1 = databuf_pos[i + 1];
14644
14645 *databuf_ptr++ = hex_convert (p1) << 0
14646 | hex_convert (p0) << 4;
14647 }
14648
14649 *databuf_ptr++ = 0x80;
14650
14651 for (uint i = 0; i < 512; i++)
14652 {
14653 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14654 }
14655
14656 cloudkey->data_len = databuf_len / 2;
14657
14658 return (PARSER_OK);
14659 }
14660
14661 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14662 {
14663 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14664
14665 u32 *digest = (u32 *) hash_buf->digest;
14666
14667 salt_t *salt = hash_buf->salt;
14668
14669 /**
14670 * parse line
14671 */
14672
14673 char *hashbuf_pos = input_buf;
14674
14675 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14676
14677 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14678
14679 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14680
14681 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14682
14683 domainbuf_pos++;
14684
14685 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14686
14687 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14688
14689 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14690
14691 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14692
14693 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14694
14695 saltbuf_pos++;
14696
14697 char *iteration_pos = strchr (saltbuf_pos, ':');
14698
14699 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14700
14701 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14702
14703 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14704
14705 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14706
14707 iteration_pos++;
14708
14709 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14710
14711 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14712 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14713
14714 // ok, the plan for this algorithm is the following:
14715 // we have 2 salts here, the domain-name and a random salt
14716 // while both are used in the initial transformation,
14717 // only the random salt is used in the following iterations
14718 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14719 // and one that includes only the real salt (stored into salt_buf[]).
14720 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14721
14722 u8 tmp_buf[100] = { 0 };
14723
14724 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14725
14726 memcpy (digest, tmp_buf, 20);
14727
14728 digest[0] = byte_swap_32 (digest[0]);
14729 digest[1] = byte_swap_32 (digest[1]);
14730 digest[2] = byte_swap_32 (digest[2]);
14731 digest[3] = byte_swap_32 (digest[3]);
14732 digest[4] = byte_swap_32 (digest[4]);
14733
14734 // domain
14735
14736 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14737
14738 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14739
14740 char *len_ptr = NULL;
14741
14742 for (uint i = 0; i < domainbuf_len; i++)
14743 {
14744 if (salt_buf_pc_ptr[i] == '.')
14745 {
14746 len_ptr = &salt_buf_pc_ptr[i];
14747
14748 *len_ptr = 0;
14749 }
14750 else
14751 {
14752 *len_ptr += 1;
14753 }
14754 }
14755
14756 salt->salt_buf_pc[7] = domainbuf_len;
14757
14758 // "real" salt
14759
14760 char *salt_buf_ptr = (char *) salt->salt_buf;
14761
14762 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14763
14764 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14765
14766 salt->salt_len = salt_len;
14767
14768 // iteration
14769
14770 salt->salt_iter = atoi (iteration_pos);
14771
14772 return (PARSER_OK);
14773 }
14774
14775 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14776 {
14777 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14778
14779 u32 *digest = (u32 *) hash_buf->digest;
14780
14781 salt_t *salt = hash_buf->salt;
14782
14783 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14784 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14785 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14786 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14787 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14788
14789 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14790
14791 uint salt_len = input_len - 40 - 1;
14792
14793 char *salt_buf = input_buf + 40 + 1;
14794
14795 char *salt_buf_ptr = (char *) salt->salt_buf;
14796
14797 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14798
14799 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14800
14801 salt->salt_len = salt_len;
14802
14803 return (PARSER_OK);
14804 }
14805
14806 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14807 {
14808 const u8 ascii_to_ebcdic[] =
14809 {
14810 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14811 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14812 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14813 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14814 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14815 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14816 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14817 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14818 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14819 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14820 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14821 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14822 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14823 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14824 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14825 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14826 };
14827
14828 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14829
14830 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14831
14832 u32 *digest = (u32 *) hash_buf->digest;
14833
14834 salt_t *salt = hash_buf->salt;
14835
14836 char *salt_pos = input_buf + 6 + 1;
14837
14838 char *digest_pos = strchr (salt_pos, '*');
14839
14840 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14841
14842 uint salt_len = digest_pos - salt_pos;
14843
14844 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14845
14846 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14847
14848 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14849
14850 digest_pos++;
14851
14852 char *salt_buf_ptr = (char *) salt->salt_buf;
14853 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14854
14855 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14856
14857 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14858
14859 salt->salt_len = salt_len;
14860
14861 for (uint i = 0; i < salt_len; i++)
14862 {
14863 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14864 }
14865 for (uint i = salt_len; i < 8; i++)
14866 {
14867 salt_buf_pc_ptr[i] = 0x40;
14868 }
14869
14870 uint tt;
14871
14872 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14873
14874 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14875 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14876
14877 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14878 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14879
14880 digest[0] = byte_swap_32 (digest[0]);
14881 digest[1] = byte_swap_32 (digest[1]);
14882
14883 IP (digest[0], digest[1], tt);
14884
14885 digest[0] = rotr32 (digest[0], 29);
14886 digest[1] = rotr32 (digest[1], 29);
14887 digest[2] = 0;
14888 digest[3] = 0;
14889
14890 return (PARSER_OK);
14891 }
14892
14893 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14894 {
14895 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14896
14897 u32 *digest = (u32 *) hash_buf->digest;
14898
14899 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14900 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14901 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14902 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14903
14904 digest[0] = byte_swap_32 (digest[0]);
14905 digest[1] = byte_swap_32 (digest[1]);
14906 digest[2] = byte_swap_32 (digest[2]);
14907 digest[3] = byte_swap_32 (digest[3]);
14908
14909 return (PARSER_OK);
14910 }
14911
14912 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14913 {
14914 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14915
14916 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14917
14918 u32 *digest = (u32 *) hash_buf->digest;
14919
14920 salt_t *salt = hash_buf->salt;
14921
14922 u8 tmp_buf[120] = { 0 };
14923
14924 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14925
14926 tmp_buf[3] += -4; // dont ask!
14927
14928 memcpy (salt->salt_buf, tmp_buf, 5);
14929
14930 salt->salt_len = 5;
14931
14932 memcpy (digest, tmp_buf + 5, 9);
14933
14934 // yes, only 9 byte are needed to crack, but 10 to display
14935
14936 salt->salt_buf_pc[7] = input_buf[20];
14937
14938 return (PARSER_OK);
14939 }
14940
14941 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14942 {
14943 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14944
14945 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14946
14947 u32 *digest = (u32 *) hash_buf->digest;
14948
14949 salt_t *salt = hash_buf->salt;
14950
14951 u8 tmp_buf[120] = { 0 };
14952
14953 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14954
14955 tmp_buf[3] += -4; // dont ask!
14956
14957 // salt
14958
14959 memcpy (salt->salt_buf, tmp_buf, 16);
14960
14961 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)
14962
14963 // iteration
14964
14965 char tmp_iter_buf[11] = { 0 };
14966
14967 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14968
14969 tmp_iter_buf[10] = 0;
14970
14971 salt->salt_iter = atoi (tmp_iter_buf);
14972
14973 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14974 {
14975 return (PARSER_SALT_ITERATION);
14976 }
14977
14978 salt->salt_iter--; // first round in init
14979
14980 // 2 additional bytes for display only
14981
14982 salt->salt_buf_pc[0] = tmp_buf[26];
14983 salt->salt_buf_pc[1] = tmp_buf[27];
14984
14985 // digest
14986
14987 memcpy (digest, tmp_buf + 28, 8);
14988
14989 digest[0] = byte_swap_32 (digest[0]);
14990 digest[1] = byte_swap_32 (digest[1]);
14991 digest[2] = 0;
14992 digest[3] = 0;
14993
14994 return (PARSER_OK);
14995 }
14996
14997 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14998 {
14999 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
15000
15001 u32 *digest = (u32 *) hash_buf->digest;
15002
15003 salt_t *salt = hash_buf->salt;
15004
15005 char *salt_buf_pos = input_buf;
15006
15007 char *hash_buf_pos = salt_buf_pos + 6;
15008
15009 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
15010 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
15011 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
15012 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
15013 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
15014 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
15015 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
15016 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
15017
15018 digest[0] -= SHA256M_A;
15019 digest[1] -= SHA256M_B;
15020 digest[2] -= SHA256M_C;
15021 digest[3] -= SHA256M_D;
15022 digest[4] -= SHA256M_E;
15023 digest[5] -= SHA256M_F;
15024 digest[6] -= SHA256M_G;
15025 digest[7] -= SHA256M_H;
15026
15027 char *salt_buf_ptr = (char *) salt->salt_buf;
15028
15029 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
15030
15031 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15032
15033 salt->salt_len = salt_len;
15034
15035 return (PARSER_OK);
15036 }
15037
15038 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15039 {
15040 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
15041
15042 u32 *digest = (u32 *) hash_buf->digest;
15043
15044 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15045
15046 salt_t *salt = hash_buf->salt;
15047
15048 char *salt_buf = input_buf + 6;
15049
15050 char *digest_buf = strchr (salt_buf, '$');
15051
15052 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15053
15054 uint salt_len = digest_buf - salt_buf;
15055
15056 digest_buf++; // skip the '$' symbol
15057
15058 char *salt_buf_ptr = (char *) salt->salt_buf;
15059
15060 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15061
15062 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15063
15064 salt->salt_len = salt_len;
15065
15066 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15067 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15068 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15069 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15070
15071 digest[0] = byte_swap_32 (digest[0]);
15072 digest[1] = byte_swap_32 (digest[1]);
15073 digest[2] = byte_swap_32 (digest[2]);
15074 digest[3] = byte_swap_32 (digest[3]);
15075
15076 digest[0] -= MD5M_A;
15077 digest[1] -= MD5M_B;
15078 digest[2] -= MD5M_C;
15079 digest[3] -= MD5M_D;
15080
15081 return (PARSER_OK);
15082 }
15083
15084 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15085 {
15086 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
15087
15088 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15089
15090 u32 *digest = (u32 *) hash_buf->digest;
15091
15092 salt_t *salt = hash_buf->salt;
15093
15094 char *salt_buf = input_buf + 3;
15095
15096 char *digest_buf = strchr (salt_buf, '$');
15097
15098 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15099
15100 uint salt_len = digest_buf - salt_buf;
15101
15102 digest_buf++; // skip the '$' symbol
15103
15104 char *salt_buf_ptr = (char *) salt->salt_buf;
15105
15106 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15107
15108 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15109
15110 salt_buf_ptr[salt_len] = 0x2d;
15111
15112 salt->salt_len = salt_len + 1;
15113
15114 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15115 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15116 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15117 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15118
15119 digest[0] = byte_swap_32 (digest[0]);
15120 digest[1] = byte_swap_32 (digest[1]);
15121 digest[2] = byte_swap_32 (digest[2]);
15122 digest[3] = byte_swap_32 (digest[3]);
15123
15124 digest[0] -= MD5M_A;
15125 digest[1] -= MD5M_B;
15126 digest[2] -= MD5M_C;
15127 digest[3] -= MD5M_D;
15128
15129 return (PARSER_OK);
15130 }
15131
15132 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15133 {
15134 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
15135
15136 u32 *digest = (u32 *) hash_buf->digest;
15137
15138 salt_t *salt = hash_buf->salt;
15139
15140 u8 tmp_buf[100] = { 0 };
15141
15142 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
15143
15144 memcpy (digest, tmp_buf, 20);
15145
15146 digest[0] = byte_swap_32 (digest[0]);
15147 digest[1] = byte_swap_32 (digest[1]);
15148 digest[2] = byte_swap_32 (digest[2]);
15149 digest[3] = byte_swap_32 (digest[3]);
15150 digest[4] = byte_swap_32 (digest[4]);
15151
15152 digest[0] -= SHA1M_A;
15153 digest[1] -= SHA1M_B;
15154 digest[2] -= SHA1M_C;
15155 digest[3] -= SHA1M_D;
15156 digest[4] -= SHA1M_E;
15157
15158 salt->salt_buf[0] = 0x80;
15159
15160 salt->salt_len = 0;
15161
15162 return (PARSER_OK);
15163 }
15164
15165 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15166 {
15167 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
15168
15169 u32 *digest = (u32 *) hash_buf->digest;
15170
15171 salt_t *salt = hash_buf->salt;
15172
15173 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15174 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15175 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15176 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15177
15178 digest[0] = byte_swap_32 (digest[0]);
15179 digest[1] = byte_swap_32 (digest[1]);
15180 digest[2] = byte_swap_32 (digest[2]);
15181 digest[3] = byte_swap_32 (digest[3]);
15182
15183 digest[0] -= MD5M_A;
15184 digest[1] -= MD5M_B;
15185 digest[2] -= MD5M_C;
15186 digest[3] -= MD5M_D;
15187
15188 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15189
15190 uint salt_len = input_len - 32 - 1;
15191
15192 char *salt_buf = input_buf + 32 + 1;
15193
15194 char *salt_buf_ptr = (char *) salt->salt_buf;
15195
15196 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15197
15198 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15199
15200 /*
15201 * add static "salt" part
15202 */
15203
15204 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
15205
15206 salt_len += 8;
15207
15208 salt->salt_len = salt_len;
15209
15210 return (PARSER_OK);
15211 }
15212
15213 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15214 {
15215 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
15216
15217 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
15218
15219 u32 *digest = (u32 *) hash_buf->digest;
15220
15221 salt_t *salt = hash_buf->salt;
15222
15223 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
15224
15225 /**
15226 * parse line
15227 */
15228
15229 char *saltlen_pos = input_buf + 1 + 3 + 1;
15230
15231 char *saltbuf_pos = strchr (saltlen_pos, '$');
15232
15233 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15234
15235 uint saltlen_len = saltbuf_pos - saltlen_pos;
15236
15237 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
15238
15239 saltbuf_pos++;
15240
15241 char *keylen_pos = strchr (saltbuf_pos, '$');
15242
15243 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15244
15245 uint saltbuf_len = keylen_pos - saltbuf_pos;
15246
15247 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
15248
15249 keylen_pos++;
15250
15251 char *keybuf_pos = strchr (keylen_pos, '$');
15252
15253 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15254
15255 uint keylen_len = keybuf_pos - keylen_pos;
15256
15257 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
15258
15259 keybuf_pos++;
15260
15261 char *databuf_pos = strchr (keybuf_pos, '$');
15262
15263 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15264
15265 uint keybuf_len = databuf_pos - keybuf_pos;
15266
15267 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
15268
15269 databuf_pos++;
15270
15271 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
15272
15273 if (data_len != 3072) return (PARSER_SALT_LENGTH);
15274
15275 /**
15276 * copy data
15277 */
15278
15279 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
15280 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
15281 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
15282 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
15283
15284 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
15285 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
15286 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
15287 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
15288
15289 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15290 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15291 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15292 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15293
15294 salt->salt_len = 16;
15295 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
15296
15297 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
15298 {
15299 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
15300 }
15301
15302 return (PARSER_OK);
15303 }
15304
15305 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15306 {
15307 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
15308
15309 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15310
15311 u32 *digest = (u32 *) hash_buf->digest;
15312
15313 salt_t *salt = hash_buf->salt;
15314
15315 /**
15316 * parse line
15317 */
15318
15319 // first is the N salt parameter
15320
15321 char *N_pos = input_buf + 6;
15322
15323 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15324
15325 N_pos++;
15326
15327 salt->scrypt_N = atoi (N_pos);
15328
15329 // r
15330
15331 char *r_pos = strchr (N_pos, ':');
15332
15333 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15334
15335 r_pos++;
15336
15337 salt->scrypt_r = atoi (r_pos);
15338
15339 // p
15340
15341 char *p_pos = strchr (r_pos, ':');
15342
15343 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15344
15345 p_pos++;
15346
15347 salt->scrypt_p = atoi (p_pos);
15348
15349 // salt
15350
15351 char *saltbuf_pos = strchr (p_pos, ':');
15352
15353 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15354
15355 saltbuf_pos++;
15356
15357 char *hash_pos = strchr (saltbuf_pos, ':');
15358
15359 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15360
15361 hash_pos++;
15362
15363 // base64 decode
15364
15365 int salt_len_base64 = hash_pos - saltbuf_pos;
15366
15367 if (salt_len_base64 > 45) return (PARSER_SALT_LENGTH);
15368
15369 u8 tmp_buf[33] = { 0 };
15370
15371 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, salt_len_base64, tmp_buf);
15372
15373 char *salt_buf_ptr = (char *) salt->salt_buf;
15374
15375 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
15376
15377 salt->salt_len = tmp_len;
15378 salt->salt_iter = 1;
15379
15380 // digest - base64 decode
15381
15382 memset (tmp_buf, 0, sizeof (tmp_buf));
15383
15384 tmp_len = input_len - (hash_pos - input_buf);
15385
15386 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
15387
15388 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
15389
15390 memcpy (digest, tmp_buf, 32);
15391
15392 return (PARSER_OK);
15393 }
15394
15395 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15396 {
15397 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
15398
15399 u32 *digest = (u32 *) hash_buf->digest;
15400
15401 salt_t *salt = hash_buf->salt;
15402
15403 /**
15404 * parse line
15405 */
15406
15407 char decrypted[76] = { 0 }; // iv + hash
15408
15409 juniper_decrypt_hash (input_buf, decrypted);
15410
15411 char *md5crypt_hash = decrypted + 12;
15412
15413 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
15414
15415 salt->salt_iter = ROUNDS_MD5CRYPT;
15416
15417 char *salt_pos = md5crypt_hash + 3;
15418
15419 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
15420
15421 salt->salt_len = hash_pos - salt_pos; // should be 8
15422
15423 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
15424
15425 hash_pos++;
15426
15427 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
15428
15429 return (PARSER_OK);
15430 }
15431
15432 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15433 {
15434 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
15435
15436 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15437
15438 u32 *digest = (u32 *) hash_buf->digest;
15439
15440 salt_t *salt = hash_buf->salt;
15441
15442 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15443
15444 /**
15445 * parse line
15446 */
15447
15448 // first is *raw* salt
15449
15450 char *salt_pos = input_buf + 3;
15451
15452 char *hash_pos = strchr (salt_pos, '$');
15453
15454 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15455
15456 uint salt_len = hash_pos - salt_pos;
15457
15458 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15459
15460 hash_pos++;
15461
15462 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15463
15464 memcpy (salt_buf_ptr, salt_pos, 14);
15465
15466 salt_buf_ptr[17] = 0x01;
15467 salt_buf_ptr[18] = 0x80;
15468
15469 // add some stuff to normal salt to make sorted happy
15470
15471 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15472 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15473 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15474 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15475
15476 salt->salt_len = salt_len;
15477 salt->salt_iter = ROUNDS_CISCO8 - 1;
15478
15479 // base64 decode hash
15480
15481 u8 tmp_buf[100] = { 0 };
15482
15483 uint hash_len = input_len - 3 - salt_len - 1;
15484
15485 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15486
15487 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15488
15489 memcpy (digest, tmp_buf, 32);
15490
15491 digest[0] = byte_swap_32 (digest[0]);
15492 digest[1] = byte_swap_32 (digest[1]);
15493 digest[2] = byte_swap_32 (digest[2]);
15494 digest[3] = byte_swap_32 (digest[3]);
15495 digest[4] = byte_swap_32 (digest[4]);
15496 digest[5] = byte_swap_32 (digest[5]);
15497 digest[6] = byte_swap_32 (digest[6]);
15498 digest[7] = byte_swap_32 (digest[7]);
15499
15500 return (PARSER_OK);
15501 }
15502
15503 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15504 {
15505 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
15506
15507 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15508
15509 u32 *digest = (u32 *) hash_buf->digest;
15510
15511 salt_t *salt = hash_buf->salt;
15512
15513 /**
15514 * parse line
15515 */
15516
15517 // first is *raw* salt
15518
15519 char *salt_pos = input_buf + 3;
15520
15521 char *hash_pos = strchr (salt_pos, '$');
15522
15523 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15524
15525 uint salt_len = hash_pos - salt_pos;
15526
15527 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15528
15529 salt->salt_len = salt_len;
15530 hash_pos++;
15531
15532 char *salt_buf_ptr = (char *) salt->salt_buf;
15533
15534 memcpy (salt_buf_ptr, salt_pos, salt_len);
15535 salt_buf_ptr[salt_len] = 0;
15536
15537 // base64 decode hash
15538
15539 u8 tmp_buf[100] = { 0 };
15540
15541 uint hash_len = input_len - 3 - salt_len - 1;
15542
15543 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15544
15545 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15546
15547 memcpy (digest, tmp_buf, 32);
15548
15549 // fixed:
15550 salt->scrypt_N = 16384;
15551 salt->scrypt_r = 1;
15552 salt->scrypt_p = 1;
15553 salt->salt_iter = 1;
15554
15555 return (PARSER_OK);
15556 }
15557
15558 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15559 {
15560 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
15561
15562 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15563
15564 u32 *digest = (u32 *) hash_buf->digest;
15565
15566 salt_t *salt = hash_buf->salt;
15567
15568 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
15569
15570 /**
15571 * parse line
15572 */
15573
15574 char *version_pos = input_buf + 8 + 1;
15575
15576 char *verifierHashSize_pos = strchr (version_pos, '*');
15577
15578 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15579
15580 u32 version_len = verifierHashSize_pos - version_pos;
15581
15582 if (version_len != 4) return (PARSER_SALT_LENGTH);
15583
15584 verifierHashSize_pos++;
15585
15586 char *keySize_pos = strchr (verifierHashSize_pos, '*');
15587
15588 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15589
15590 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
15591
15592 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
15593
15594 keySize_pos++;
15595
15596 char *saltSize_pos = strchr (keySize_pos, '*');
15597
15598 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15599
15600 u32 keySize_len = saltSize_pos - keySize_pos;
15601
15602 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15603
15604 saltSize_pos++;
15605
15606 char *osalt_pos = strchr (saltSize_pos, '*');
15607
15608 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15609
15610 u32 saltSize_len = osalt_pos - saltSize_pos;
15611
15612 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15613
15614 osalt_pos++;
15615
15616 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15617
15618 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15619
15620 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15621
15622 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15623
15624 encryptedVerifier_pos++;
15625
15626 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15627
15628 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15629
15630 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15631
15632 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15633
15634 encryptedVerifierHash_pos++;
15635
15636 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;
15637
15638 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15639
15640 const uint version = atoi (version_pos);
15641
15642 if (version != 2007) return (PARSER_SALT_VALUE);
15643
15644 const uint verifierHashSize = atoi (verifierHashSize_pos);
15645
15646 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15647
15648 const uint keySize = atoi (keySize_pos);
15649
15650 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15651
15652 office2007->keySize = keySize;
15653
15654 const uint saltSize = atoi (saltSize_pos);
15655
15656 if (saltSize != 16) return (PARSER_SALT_VALUE);
15657
15658 /**
15659 * salt
15660 */
15661
15662 salt->salt_len = 16;
15663 salt->salt_iter = ROUNDS_OFFICE2007;
15664
15665 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15666 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15667 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15668 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15669
15670 /**
15671 * esalt
15672 */
15673
15674 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15675 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15676 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15677 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15678
15679 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15680 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15681 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15682 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15683 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15684
15685 /**
15686 * digest
15687 */
15688
15689 digest[0] = office2007->encryptedVerifierHash[0];
15690 digest[1] = office2007->encryptedVerifierHash[1];
15691 digest[2] = office2007->encryptedVerifierHash[2];
15692 digest[3] = office2007->encryptedVerifierHash[3];
15693
15694 return (PARSER_OK);
15695 }
15696
15697 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15698 {
15699 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15700
15701 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15702
15703 u32 *digest = (u32 *) hash_buf->digest;
15704
15705 salt_t *salt = hash_buf->salt;
15706
15707 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15708
15709 /**
15710 * parse line
15711 */
15712
15713 char *version_pos = input_buf + 8 + 1;
15714
15715 char *spinCount_pos = strchr (version_pos, '*');
15716
15717 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15718
15719 u32 version_len = spinCount_pos - version_pos;
15720
15721 if (version_len != 4) return (PARSER_SALT_LENGTH);
15722
15723 spinCount_pos++;
15724
15725 char *keySize_pos = strchr (spinCount_pos, '*');
15726
15727 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15728
15729 u32 spinCount_len = keySize_pos - spinCount_pos;
15730
15731 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15732
15733 keySize_pos++;
15734
15735 char *saltSize_pos = strchr (keySize_pos, '*');
15736
15737 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15738
15739 u32 keySize_len = saltSize_pos - keySize_pos;
15740
15741 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15742
15743 saltSize_pos++;
15744
15745 char *osalt_pos = strchr (saltSize_pos, '*');
15746
15747 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15748
15749 u32 saltSize_len = osalt_pos - saltSize_pos;
15750
15751 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15752
15753 osalt_pos++;
15754
15755 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15756
15757 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15758
15759 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15760
15761 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15762
15763 encryptedVerifier_pos++;
15764
15765 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15766
15767 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15768
15769 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15770
15771 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15772
15773 encryptedVerifierHash_pos++;
15774
15775 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;
15776
15777 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15778
15779 const uint version = atoi (version_pos);
15780
15781 if (version != 2010) return (PARSER_SALT_VALUE);
15782
15783 const uint spinCount = atoi (spinCount_pos);
15784
15785 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15786
15787 const uint keySize = atoi (keySize_pos);
15788
15789 if (keySize != 128) return (PARSER_SALT_VALUE);
15790
15791 const uint saltSize = atoi (saltSize_pos);
15792
15793 if (saltSize != 16) return (PARSER_SALT_VALUE);
15794
15795 /**
15796 * salt
15797 */
15798
15799 salt->salt_len = 16;
15800 salt->salt_iter = spinCount;
15801
15802 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15803 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15804 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15805 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15806
15807 /**
15808 * esalt
15809 */
15810
15811 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15812 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15813 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15814 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15815
15816 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15817 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15818 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15819 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15820 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15821 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15822 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15823 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15824
15825 /**
15826 * digest
15827 */
15828
15829 digest[0] = office2010->encryptedVerifierHash[0];
15830 digest[1] = office2010->encryptedVerifierHash[1];
15831 digest[2] = office2010->encryptedVerifierHash[2];
15832 digest[3] = office2010->encryptedVerifierHash[3];
15833
15834 return (PARSER_OK);
15835 }
15836
15837 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15838 {
15839 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15840
15841 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15842
15843 u32 *digest = (u32 *) hash_buf->digest;
15844
15845 salt_t *salt = hash_buf->salt;
15846
15847 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15848
15849 /**
15850 * parse line
15851 */
15852
15853 char *version_pos = input_buf + 8 + 1;
15854
15855 char *spinCount_pos = strchr (version_pos, '*');
15856
15857 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15858
15859 u32 version_len = spinCount_pos - version_pos;
15860
15861 if (version_len != 4) return (PARSER_SALT_LENGTH);
15862
15863 spinCount_pos++;
15864
15865 char *keySize_pos = strchr (spinCount_pos, '*');
15866
15867 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15868
15869 u32 spinCount_len = keySize_pos - spinCount_pos;
15870
15871 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15872
15873 keySize_pos++;
15874
15875 char *saltSize_pos = strchr (keySize_pos, '*');
15876
15877 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15878
15879 u32 keySize_len = saltSize_pos - keySize_pos;
15880
15881 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15882
15883 saltSize_pos++;
15884
15885 char *osalt_pos = strchr (saltSize_pos, '*');
15886
15887 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15888
15889 u32 saltSize_len = osalt_pos - saltSize_pos;
15890
15891 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15892
15893 osalt_pos++;
15894
15895 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15896
15897 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15898
15899 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15900
15901 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15902
15903 encryptedVerifier_pos++;
15904
15905 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15906
15907 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15908
15909 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15910
15911 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15912
15913 encryptedVerifierHash_pos++;
15914
15915 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;
15916
15917 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15918
15919 const uint version = atoi (version_pos);
15920
15921 if (version != 2013) return (PARSER_SALT_VALUE);
15922
15923 const uint spinCount = atoi (spinCount_pos);
15924
15925 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15926
15927 const uint keySize = atoi (keySize_pos);
15928
15929 if (keySize != 256) return (PARSER_SALT_VALUE);
15930
15931 const uint saltSize = atoi (saltSize_pos);
15932
15933 if (saltSize != 16) return (PARSER_SALT_VALUE);
15934
15935 /**
15936 * salt
15937 */
15938
15939 salt->salt_len = 16;
15940 salt->salt_iter = spinCount;
15941
15942 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15943 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15944 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15945 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15946
15947 /**
15948 * esalt
15949 */
15950
15951 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15952 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15953 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15954 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15955
15956 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15957 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15958 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15959 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15960 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15961 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15962 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15963 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15964
15965 /**
15966 * digest
15967 */
15968
15969 digest[0] = office2013->encryptedVerifierHash[0];
15970 digest[1] = office2013->encryptedVerifierHash[1];
15971 digest[2] = office2013->encryptedVerifierHash[2];
15972 digest[3] = office2013->encryptedVerifierHash[3];
15973
15974 return (PARSER_OK);
15975 }
15976
15977 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15978 {
15979 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15980
15981 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15982
15983 u32 *digest = (u32 *) hash_buf->digest;
15984
15985 salt_t *salt = hash_buf->salt;
15986
15987 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15988
15989 /**
15990 * parse line
15991 */
15992
15993 char *version_pos = input_buf + 11;
15994
15995 char *osalt_pos = strchr (version_pos, '*');
15996
15997 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15998
15999 u32 version_len = osalt_pos - version_pos;
16000
16001 if (version_len != 1) return (PARSER_SALT_LENGTH);
16002
16003 osalt_pos++;
16004
16005 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16006
16007 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16008
16009 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16010
16011 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16012
16013 encryptedVerifier_pos++;
16014
16015 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16016
16017 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16018
16019 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16020
16021 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16022
16023 encryptedVerifierHash_pos++;
16024
16025 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16026
16027 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16028
16029 const uint version = *version_pos - 0x30;
16030
16031 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16032
16033 /**
16034 * esalt
16035 */
16036
16037 oldoffice01->version = version;
16038
16039 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16040 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16041 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16042 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16043
16044 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16045 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16046 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16047 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16048
16049 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16050 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16051 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16052 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16053
16054 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16055 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16056 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16057 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16058
16059 /**
16060 * salt
16061 */
16062
16063 salt->salt_len = 16;
16064
16065 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16066 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16067 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16068 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16069
16070 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16071 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16072 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16073 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16074
16075 // this is a workaround as office produces multiple documents with the same salt
16076
16077 salt->salt_len += 32;
16078
16079 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16080 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16081 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16082 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16083 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16084 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16085 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16086 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16087
16088 /**
16089 * digest
16090 */
16091
16092 digest[0] = oldoffice01->encryptedVerifierHash[0];
16093 digest[1] = oldoffice01->encryptedVerifierHash[1];
16094 digest[2] = oldoffice01->encryptedVerifierHash[2];
16095 digest[3] = oldoffice01->encryptedVerifierHash[3];
16096
16097 return (PARSER_OK);
16098 }
16099
16100 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16101 {
16102 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
16103 }
16104
16105 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16106 {
16107 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
16108
16109 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16110
16111 u32 *digest = (u32 *) hash_buf->digest;
16112
16113 salt_t *salt = hash_buf->salt;
16114
16115 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16116
16117 /**
16118 * parse line
16119 */
16120
16121 char *version_pos = input_buf + 11;
16122
16123 char *osalt_pos = strchr (version_pos, '*');
16124
16125 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16126
16127 u32 version_len = osalt_pos - version_pos;
16128
16129 if (version_len != 1) return (PARSER_SALT_LENGTH);
16130
16131 osalt_pos++;
16132
16133 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16134
16135 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16136
16137 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16138
16139 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16140
16141 encryptedVerifier_pos++;
16142
16143 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16144
16145 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16146
16147 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16148
16149 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16150
16151 encryptedVerifierHash_pos++;
16152
16153 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16154
16155 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16156
16157 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16158
16159 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16160
16161 rc4key_pos++;
16162
16163 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16164
16165 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16166
16167 const uint version = *version_pos - 0x30;
16168
16169 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16170
16171 /**
16172 * esalt
16173 */
16174
16175 oldoffice01->version = version;
16176
16177 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16178 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16179 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16180 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16181
16182 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16183 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16184 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16185 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16186
16187 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16188 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16189 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16190 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16191
16192 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16193 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16194 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16195 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16196
16197 oldoffice01->rc4key[1] = 0;
16198 oldoffice01->rc4key[0] = 0;
16199
16200 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16201 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16202 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16203 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16204 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16205 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16206 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16207 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16208 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16209 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16210
16211 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
16212 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
16213
16214 /**
16215 * salt
16216 */
16217
16218 salt->salt_len = 16;
16219
16220 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16221 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16222 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16223 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16224
16225 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16226 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16227 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16228 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16229
16230 // this is a workaround as office produces multiple documents with the same salt
16231
16232 salt->salt_len += 32;
16233
16234 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16235 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16236 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16237 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16238 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16239 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16240 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16241 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16242
16243 /**
16244 * digest
16245 */
16246
16247 digest[0] = oldoffice01->rc4key[0];
16248 digest[1] = oldoffice01->rc4key[1];
16249 digest[2] = 0;
16250 digest[3] = 0;
16251
16252 return (PARSER_OK);
16253 }
16254
16255 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16256 {
16257 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
16258
16259 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16260
16261 u32 *digest = (u32 *) hash_buf->digest;
16262
16263 salt_t *salt = hash_buf->salt;
16264
16265 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16266
16267 /**
16268 * parse line
16269 */
16270
16271 char *version_pos = input_buf + 11;
16272
16273 char *osalt_pos = strchr (version_pos, '*');
16274
16275 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16276
16277 u32 version_len = osalt_pos - version_pos;
16278
16279 if (version_len != 1) return (PARSER_SALT_LENGTH);
16280
16281 osalt_pos++;
16282
16283 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16284
16285 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16286
16287 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16288
16289 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16290
16291 encryptedVerifier_pos++;
16292
16293 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16294
16295 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16296
16297 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16298
16299 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16300
16301 encryptedVerifierHash_pos++;
16302
16303 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16304
16305 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16306
16307 const uint version = *version_pos - 0x30;
16308
16309 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16310
16311 /**
16312 * esalt
16313 */
16314
16315 oldoffice34->version = version;
16316
16317 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16318 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16319 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16320 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16321
16322 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16323 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16324 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16325 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16326
16327 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16328 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16329 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16330 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16331 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16332
16333 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16334 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16335 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16336 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16337 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16338
16339 /**
16340 * salt
16341 */
16342
16343 salt->salt_len = 16;
16344
16345 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16346 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16347 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16348 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16349
16350 // this is a workaround as office produces multiple documents with the same salt
16351
16352 salt->salt_len += 32;
16353
16354 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16355 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16356 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16357 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16358 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16359 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16360 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16361 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16362
16363 /**
16364 * digest
16365 */
16366
16367 digest[0] = oldoffice34->encryptedVerifierHash[0];
16368 digest[1] = oldoffice34->encryptedVerifierHash[1];
16369 digest[2] = oldoffice34->encryptedVerifierHash[2];
16370 digest[3] = oldoffice34->encryptedVerifierHash[3];
16371
16372 return (PARSER_OK);
16373 }
16374
16375 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16376 {
16377 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16378
16379 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
16380 }
16381
16382 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16383 {
16384 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
16385
16386 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16387
16388 u32 *digest = (u32 *) hash_buf->digest;
16389
16390 salt_t *salt = hash_buf->salt;
16391
16392 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16393
16394 /**
16395 * parse line
16396 */
16397
16398 char *version_pos = input_buf + 11;
16399
16400 char *osalt_pos = strchr (version_pos, '*');
16401
16402 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16403
16404 u32 version_len = osalt_pos - version_pos;
16405
16406 if (version_len != 1) return (PARSER_SALT_LENGTH);
16407
16408 osalt_pos++;
16409
16410 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16411
16412 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16413
16414 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16415
16416 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16417
16418 encryptedVerifier_pos++;
16419
16420 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16421
16422 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16423
16424 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16425
16426 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16427
16428 encryptedVerifierHash_pos++;
16429
16430 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16431
16432 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16433
16434 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16435
16436 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16437
16438 rc4key_pos++;
16439
16440 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16441
16442 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16443
16444 const uint version = *version_pos - 0x30;
16445
16446 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16447
16448 /**
16449 * esalt
16450 */
16451
16452 oldoffice34->version = version;
16453
16454 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16455 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16456 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16457 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16458
16459 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16460 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16461 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16462 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16463
16464 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16465 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16466 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16467 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16468 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16469
16470 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16471 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16472 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16473 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16474 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16475
16476 oldoffice34->rc4key[1] = 0;
16477 oldoffice34->rc4key[0] = 0;
16478
16479 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16480 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16481 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16482 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16483 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16484 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16485 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16486 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16487 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16488 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16489
16490 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
16491 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
16492
16493 /**
16494 * salt
16495 */
16496
16497 salt->salt_len = 16;
16498
16499 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16500 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16501 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16502 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16503
16504 // this is a workaround as office produces multiple documents with the same salt
16505
16506 salt->salt_len += 32;
16507
16508 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16509 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16510 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16511 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16512 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16513 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16514 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16515 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16516
16517 /**
16518 * digest
16519 */
16520
16521 digest[0] = oldoffice34->rc4key[0];
16522 digest[1] = oldoffice34->rc4key[1];
16523 digest[2] = 0;
16524 digest[3] = 0;
16525
16526 return (PARSER_OK);
16527 }
16528
16529 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16530 {
16531 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
16532
16533 u32 *digest = (u32 *) hash_buf->digest;
16534
16535 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16536 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16537 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16538 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16539
16540 digest[0] = byte_swap_32 (digest[0]);
16541 digest[1] = byte_swap_32 (digest[1]);
16542 digest[2] = byte_swap_32 (digest[2]);
16543 digest[3] = byte_swap_32 (digest[3]);
16544
16545 return (PARSER_OK);
16546 }
16547
16548 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16549 {
16550 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
16551
16552 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16553
16554 u32 *digest = (u32 *) hash_buf->digest;
16555
16556 salt_t *salt = hash_buf->salt;
16557
16558 char *signature_pos = input_buf;
16559
16560 char *salt_pos = strchr (signature_pos, '$');
16561
16562 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16563
16564 u32 signature_len = salt_pos - signature_pos;
16565
16566 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
16567
16568 salt_pos++;
16569
16570 char *hash_pos = strchr (salt_pos, '$');
16571
16572 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16573
16574 u32 salt_len = hash_pos - salt_pos;
16575
16576 if (salt_len > 32) return (PARSER_SALT_LENGTH);
16577
16578 hash_pos++;
16579
16580 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
16581
16582 if (hash_len != 40) return (PARSER_SALT_LENGTH);
16583
16584 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
16585 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
16586 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
16587 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
16588 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
16589
16590 digest[0] -= SHA1M_A;
16591 digest[1] -= SHA1M_B;
16592 digest[2] -= SHA1M_C;
16593 digest[3] -= SHA1M_D;
16594 digest[4] -= SHA1M_E;
16595
16596 char *salt_buf_ptr = (char *) salt->salt_buf;
16597
16598 memcpy (salt_buf_ptr, salt_pos, salt_len);
16599
16600 salt->salt_len = salt_len;
16601
16602 return (PARSER_OK);
16603 }
16604
16605 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16606 {
16607 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16608
16609 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16610
16611 u32 *digest = (u32 *) hash_buf->digest;
16612
16613 salt_t *salt = hash_buf->salt;
16614
16615 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16616
16617 /**
16618 * parse line
16619 */
16620
16621 char *iter_pos = input_buf + 14;
16622
16623 const int iter = atoi (iter_pos);
16624
16625 if (iter < 1) return (PARSER_SALT_ITERATION);
16626
16627 salt->salt_iter = iter - 1;
16628
16629 char *salt_pos = strchr (iter_pos, '$');
16630
16631 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16632
16633 salt_pos++;
16634
16635 char *hash_pos = strchr (salt_pos, '$');
16636
16637 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16638
16639 const uint salt_len = hash_pos - salt_pos;
16640
16641 hash_pos++;
16642
16643 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16644
16645 memcpy (salt_buf_ptr, salt_pos, salt_len);
16646
16647 salt->salt_len = salt_len;
16648
16649 salt_buf_ptr[salt_len + 3] = 0x01;
16650 salt_buf_ptr[salt_len + 4] = 0x80;
16651
16652 // add some stuff to normal salt to make sorted happy
16653
16654 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16655 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16656 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16657 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16658 salt->salt_buf[4] = salt->salt_iter;
16659
16660 // base64 decode hash
16661
16662 u8 tmp_buf[100] = { 0 };
16663
16664 uint hash_len = input_len - (hash_pos - input_buf);
16665
16666 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16667
16668 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16669
16670 memcpy (digest, tmp_buf, 32);
16671
16672 digest[0] = byte_swap_32 (digest[0]);
16673 digest[1] = byte_swap_32 (digest[1]);
16674 digest[2] = byte_swap_32 (digest[2]);
16675 digest[3] = byte_swap_32 (digest[3]);
16676 digest[4] = byte_swap_32 (digest[4]);
16677 digest[5] = byte_swap_32 (digest[5]);
16678 digest[6] = byte_swap_32 (digest[6]);
16679 digest[7] = byte_swap_32 (digest[7]);
16680
16681 return (PARSER_OK);
16682 }
16683
16684 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16685 {
16686 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16687
16688 u32 *digest = (u32 *) hash_buf->digest;
16689
16690 salt_t *salt = hash_buf->salt;
16691
16692 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16693 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16694 digest[2] = 0;
16695 digest[3] = 0;
16696
16697 digest[0] = byte_swap_32 (digest[0]);
16698 digest[1] = byte_swap_32 (digest[1]);
16699
16700 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16701 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16702 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16703
16704 char iter_c = input_buf[17];
16705 char iter_d = input_buf[19];
16706
16707 // atm only defaults, let's see if there's more request
16708 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16709 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16710
16711 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16712
16713 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16714 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16715 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16716 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16717
16718 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16719 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16720 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16721 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16722
16723 salt->salt_len = 16;
16724
16725 return (PARSER_OK);
16726 }
16727
16728 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16729 {
16730 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16731
16732 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16733
16734 u32 *digest = (u32 *) hash_buf->digest;
16735
16736 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16737
16738 salt_t *salt = hash_buf->salt;
16739
16740 char *salt_pos = input_buf + 10;
16741
16742 char *hash_pos = strchr (salt_pos, '$');
16743
16744 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16745
16746 uint salt_len = hash_pos - salt_pos;
16747
16748 hash_pos++;
16749
16750 uint hash_len = input_len - 10 - salt_len - 1;
16751
16752 // base64 decode salt
16753
16754 if (salt_len > 133) return (PARSER_SALT_LENGTH);
16755
16756 u8 tmp_buf[100] = { 0 };
16757
16758 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16759
16760 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16761
16762 tmp_buf[salt_len] = 0x80;
16763
16764 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16765
16766 salt->salt_len = salt_len;
16767
16768 // base64 decode hash
16769
16770 if (hash_len > 133) return (PARSER_HASH_LENGTH);
16771
16772 memset (tmp_buf, 0, sizeof (tmp_buf));
16773
16774 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16775
16776 if (hash_len < 32 + 1) return (PARSER_SALT_LENGTH);
16777
16778 uint user_len = hash_len - 32;
16779
16780 const u8 *tmp_hash = tmp_buf + user_len;
16781
16782 user_len--; // skip the trailing space
16783
16784 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16785 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16786 digest[2] = hex_to_u32 (&tmp_hash[16]);
16787 digest[3] = hex_to_u32 (&tmp_hash[24]);
16788
16789 digest[0] = byte_swap_32 (digest[0]);
16790 digest[1] = byte_swap_32 (digest[1]);
16791 digest[2] = byte_swap_32 (digest[2]);
16792 digest[3] = byte_swap_32 (digest[3]);
16793
16794 // store username for host only (output hash if cracked)
16795
16796 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16797 memcpy (cram_md5->user, tmp_buf, user_len);
16798
16799 return (PARSER_OK);
16800 }
16801
16802 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16803 {
16804 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16805
16806 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16807
16808 u32 *digest = (u32 *) hash_buf->digest;
16809
16810 salt_t *salt = hash_buf->salt;
16811
16812 char *iter_pos = input_buf + 10;
16813
16814 u32 iter = atoi (iter_pos);
16815
16816 if (iter < 1)
16817 {
16818 return (PARSER_SALT_ITERATION);
16819 }
16820
16821 iter--; // first iteration is special
16822
16823 salt->salt_iter = iter;
16824
16825 char *base64_pos = strchr (iter_pos, '}');
16826
16827 if (base64_pos == NULL)
16828 {
16829 return (PARSER_SIGNATURE_UNMATCHED);
16830 }
16831
16832 base64_pos++;
16833
16834 // base64 decode salt
16835
16836 u32 base64_len = input_len - (base64_pos - input_buf);
16837
16838 u8 tmp_buf[100] = { 0 };
16839
16840 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16841
16842 if (decoded_len < 24)
16843 {
16844 return (PARSER_SALT_LENGTH);
16845 }
16846
16847 // copy the salt
16848
16849 uint salt_len = decoded_len - 20;
16850
16851 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16852 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16853
16854 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16855
16856 salt->salt_len = salt_len;
16857
16858 // set digest
16859
16860 u32 *digest_ptr = (u32*) tmp_buf;
16861
16862 digest[0] = byte_swap_32 (digest_ptr[0]);
16863 digest[1] = byte_swap_32 (digest_ptr[1]);
16864 digest[2] = byte_swap_32 (digest_ptr[2]);
16865 digest[3] = byte_swap_32 (digest_ptr[3]);
16866 digest[4] = byte_swap_32 (digest_ptr[4]);
16867
16868 return (PARSER_OK);
16869 }
16870
16871 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16872 {
16873 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16874
16875 u32 *digest = (u32 *) hash_buf->digest;
16876
16877 salt_t *salt = hash_buf->salt;
16878
16879 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16880 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16881 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16882 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16883 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16884
16885 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16886
16887 uint salt_len = input_len - 40 - 1;
16888
16889 char *salt_buf = input_buf + 40 + 1;
16890
16891 char *salt_buf_ptr = (char *) salt->salt_buf;
16892
16893 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16894
16895 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16896
16897 salt->salt_len = salt_len;
16898
16899 return (PARSER_OK);
16900 }
16901
16902 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16903 {
16904 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16905
16906 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16907
16908 u32 *digest = (u32 *) hash_buf->digest;
16909
16910 salt_t *salt = hash_buf->salt;
16911
16912 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16913
16914 /**
16915 * parse line
16916 */
16917
16918 char *V_pos = input_buf + 5;
16919
16920 char *R_pos = strchr (V_pos, '*');
16921
16922 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16923
16924 u32 V_len = R_pos - V_pos;
16925
16926 R_pos++;
16927
16928 char *bits_pos = strchr (R_pos, '*');
16929
16930 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16931
16932 u32 R_len = bits_pos - R_pos;
16933
16934 bits_pos++;
16935
16936 char *P_pos = strchr (bits_pos, '*');
16937
16938 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16939
16940 u32 bits_len = P_pos - bits_pos;
16941
16942 P_pos++;
16943
16944 char *enc_md_pos = strchr (P_pos, '*');
16945
16946 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16947
16948 u32 P_len = enc_md_pos - P_pos;
16949
16950 enc_md_pos++;
16951
16952 char *id_len_pos = strchr (enc_md_pos, '*');
16953
16954 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16955
16956 u32 enc_md_len = id_len_pos - enc_md_pos;
16957
16958 id_len_pos++;
16959
16960 char *id_buf_pos = strchr (id_len_pos, '*');
16961
16962 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16963
16964 u32 id_len_len = id_buf_pos - id_len_pos;
16965
16966 id_buf_pos++;
16967
16968 char *u_len_pos = strchr (id_buf_pos, '*');
16969
16970 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16971
16972 u32 id_buf_len = u_len_pos - id_buf_pos;
16973
16974 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16975
16976 u_len_pos++;
16977
16978 char *u_buf_pos = strchr (u_len_pos, '*');
16979
16980 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16981
16982 u32 u_len_len = u_buf_pos - u_len_pos;
16983
16984 u_buf_pos++;
16985
16986 char *o_len_pos = strchr (u_buf_pos, '*');
16987
16988 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16989
16990 u32 u_buf_len = o_len_pos - u_buf_pos;
16991
16992 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16993
16994 o_len_pos++;
16995
16996 char *o_buf_pos = strchr (o_len_pos, '*');
16997
16998 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16999
17000 u32 o_len_len = o_buf_pos - o_len_pos;
17001
17002 o_buf_pos++;
17003
17004 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;
17005
17006 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17007
17008 // validate data
17009
17010 const int V = atoi (V_pos);
17011 const int R = atoi (R_pos);
17012 const int P = atoi (P_pos);
17013
17014 if (V != 1) return (PARSER_SALT_VALUE);
17015 if (R != 2) return (PARSER_SALT_VALUE);
17016
17017 const int enc_md = atoi (enc_md_pos);
17018
17019 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17020
17021 const int id_len = atoi (id_len_pos);
17022 const int u_len = atoi (u_len_pos);
17023 const int o_len = atoi (o_len_pos);
17024
17025 if (id_len != 16) return (PARSER_SALT_VALUE);
17026 if (u_len != 32) return (PARSER_SALT_VALUE);
17027 if (o_len != 32) return (PARSER_SALT_VALUE);
17028
17029 const int bits = atoi (bits_pos);
17030
17031 if (bits != 40) return (PARSER_SALT_VALUE);
17032
17033 // copy data to esalt
17034
17035 pdf->V = V;
17036 pdf->R = R;
17037 pdf->P = P;
17038
17039 pdf->enc_md = enc_md;
17040
17041 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17042 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17043 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17044 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17045 pdf->id_len = id_len;
17046
17047 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17048 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17049 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17050 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17051 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17052 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17053 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17054 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17055 pdf->u_len = u_len;
17056
17057 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17058 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17059 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17060 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17061 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17062 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17063 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17064 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17065 pdf->o_len = o_len;
17066
17067 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17068 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17069 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17070 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17071
17072 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17073 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17074 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17075 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17076 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17077 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17078 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17079 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17080
17081 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17082 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17083 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17084 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17085 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17086 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17087 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17088 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17089
17090 // we use ID for salt, maybe needs to change, we will see...
17091
17092 salt->salt_buf[0] = pdf->id_buf[0];
17093 salt->salt_buf[1] = pdf->id_buf[1];
17094 salt->salt_buf[2] = pdf->id_buf[2];
17095 salt->salt_buf[3] = pdf->id_buf[3];
17096 salt->salt_len = pdf->id_len;
17097
17098 digest[0] = pdf->u_buf[0];
17099 digest[1] = pdf->u_buf[1];
17100 digest[2] = pdf->u_buf[2];
17101 digest[3] = pdf->u_buf[3];
17102
17103 return (PARSER_OK);
17104 }
17105
17106 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17107 {
17108 return pdf11_parse_hash (input_buf, input_len, hash_buf);
17109 }
17110
17111 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17112 {
17113 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
17114
17115 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17116
17117 u32 *digest = (u32 *) hash_buf->digest;
17118
17119 salt_t *salt = hash_buf->salt;
17120
17121 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17122
17123 /**
17124 * parse line
17125 */
17126
17127 char *V_pos = input_buf + 5;
17128
17129 char *R_pos = strchr (V_pos, '*');
17130
17131 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17132
17133 u32 V_len = R_pos - V_pos;
17134
17135 R_pos++;
17136
17137 char *bits_pos = strchr (R_pos, '*');
17138
17139 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17140
17141 u32 R_len = bits_pos - R_pos;
17142
17143 bits_pos++;
17144
17145 char *P_pos = strchr (bits_pos, '*');
17146
17147 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17148
17149 u32 bits_len = P_pos - bits_pos;
17150
17151 P_pos++;
17152
17153 char *enc_md_pos = strchr (P_pos, '*');
17154
17155 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17156
17157 u32 P_len = enc_md_pos - P_pos;
17158
17159 enc_md_pos++;
17160
17161 char *id_len_pos = strchr (enc_md_pos, '*');
17162
17163 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17164
17165 u32 enc_md_len = id_len_pos - enc_md_pos;
17166
17167 id_len_pos++;
17168
17169 char *id_buf_pos = strchr (id_len_pos, '*');
17170
17171 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17172
17173 u32 id_len_len = id_buf_pos - id_len_pos;
17174
17175 id_buf_pos++;
17176
17177 char *u_len_pos = strchr (id_buf_pos, '*');
17178
17179 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17180
17181 u32 id_buf_len = u_len_pos - id_buf_pos;
17182
17183 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17184
17185 u_len_pos++;
17186
17187 char *u_buf_pos = strchr (u_len_pos, '*');
17188
17189 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17190
17191 u32 u_len_len = u_buf_pos - u_len_pos;
17192
17193 u_buf_pos++;
17194
17195 char *o_len_pos = strchr (u_buf_pos, '*');
17196
17197 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17198
17199 u32 u_buf_len = o_len_pos - u_buf_pos;
17200
17201 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17202
17203 o_len_pos++;
17204
17205 char *o_buf_pos = strchr (o_len_pos, '*');
17206
17207 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17208
17209 u32 o_len_len = o_buf_pos - o_len_pos;
17210
17211 o_buf_pos++;
17212
17213 char *rc4key_pos = strchr (o_buf_pos, ':');
17214
17215 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17216
17217 u32 o_buf_len = rc4key_pos - o_buf_pos;
17218
17219 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17220
17221 rc4key_pos++;
17222
17223 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;
17224
17225 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
17226
17227 // validate data
17228
17229 const int V = atoi (V_pos);
17230 const int R = atoi (R_pos);
17231 const int P = atoi (P_pos);
17232
17233 if (V != 1) return (PARSER_SALT_VALUE);
17234 if (R != 2) return (PARSER_SALT_VALUE);
17235
17236 const int enc_md = atoi (enc_md_pos);
17237
17238 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17239
17240 const int id_len = atoi (id_len_pos);
17241 const int u_len = atoi (u_len_pos);
17242 const int o_len = atoi (o_len_pos);
17243
17244 if (id_len != 16) return (PARSER_SALT_VALUE);
17245 if (u_len != 32) return (PARSER_SALT_VALUE);
17246 if (o_len != 32) return (PARSER_SALT_VALUE);
17247
17248 const int bits = atoi (bits_pos);
17249
17250 if (bits != 40) return (PARSER_SALT_VALUE);
17251
17252 // copy data to esalt
17253
17254 pdf->V = V;
17255 pdf->R = R;
17256 pdf->P = P;
17257
17258 pdf->enc_md = enc_md;
17259
17260 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17261 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17262 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17263 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17264 pdf->id_len = id_len;
17265
17266 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17267 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17268 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17269 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17270 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17271 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17272 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17273 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17274 pdf->u_len = u_len;
17275
17276 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17277 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17278 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17279 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17280 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17281 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17282 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17283 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17284 pdf->o_len = o_len;
17285
17286 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17287 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17288 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17289 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17290
17291 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17292 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17293 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17294 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17295 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17296 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17297 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17298 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17299
17300 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17301 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17302 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17303 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17304 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17305 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17306 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17307 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17308
17309 pdf->rc4key[1] = 0;
17310 pdf->rc4key[0] = 0;
17311
17312 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
17313 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
17314 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
17315 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
17316 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
17317 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
17318 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
17319 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
17320 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
17321 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
17322
17323 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
17324 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
17325
17326 // we use ID for salt, maybe needs to change, we will see...
17327
17328 salt->salt_buf[0] = pdf->id_buf[0];
17329 salt->salt_buf[1] = pdf->id_buf[1];
17330 salt->salt_buf[2] = pdf->id_buf[2];
17331 salt->salt_buf[3] = pdf->id_buf[3];
17332 salt->salt_buf[4] = pdf->u_buf[0];
17333 salt->salt_buf[5] = pdf->u_buf[1];
17334 salt->salt_buf[6] = pdf->o_buf[0];
17335 salt->salt_buf[7] = pdf->o_buf[1];
17336 salt->salt_len = pdf->id_len + 16;
17337
17338 digest[0] = pdf->rc4key[0];
17339 digest[1] = pdf->rc4key[1];
17340 digest[2] = 0;
17341 digest[3] = 0;
17342
17343 return (PARSER_OK);
17344 }
17345
17346 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17347 {
17348 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
17349
17350 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17351
17352 u32 *digest = (u32 *) hash_buf->digest;
17353
17354 salt_t *salt = hash_buf->salt;
17355
17356 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17357
17358 /**
17359 * parse line
17360 */
17361
17362 char *V_pos = input_buf + 5;
17363
17364 char *R_pos = strchr (V_pos, '*');
17365
17366 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17367
17368 u32 V_len = R_pos - V_pos;
17369
17370 R_pos++;
17371
17372 char *bits_pos = strchr (R_pos, '*');
17373
17374 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17375
17376 u32 R_len = bits_pos - R_pos;
17377
17378 bits_pos++;
17379
17380 char *P_pos = strchr (bits_pos, '*');
17381
17382 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17383
17384 u32 bits_len = P_pos - bits_pos;
17385
17386 P_pos++;
17387
17388 char *enc_md_pos = strchr (P_pos, '*');
17389
17390 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17391
17392 u32 P_len = enc_md_pos - P_pos;
17393
17394 enc_md_pos++;
17395
17396 char *id_len_pos = strchr (enc_md_pos, '*');
17397
17398 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17399
17400 u32 enc_md_len = id_len_pos - enc_md_pos;
17401
17402 id_len_pos++;
17403
17404 char *id_buf_pos = strchr (id_len_pos, '*');
17405
17406 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17407
17408 u32 id_len_len = id_buf_pos - id_len_pos;
17409
17410 id_buf_pos++;
17411
17412 char *u_len_pos = strchr (id_buf_pos, '*');
17413
17414 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17415
17416 u32 id_buf_len = u_len_pos - id_buf_pos;
17417
17418 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
17419
17420 u_len_pos++;
17421
17422 char *u_buf_pos = strchr (u_len_pos, '*');
17423
17424 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17425
17426 u32 u_len_len = u_buf_pos - u_len_pos;
17427
17428 u_buf_pos++;
17429
17430 char *o_len_pos = strchr (u_buf_pos, '*');
17431
17432 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17433
17434 u32 u_buf_len = o_len_pos - u_buf_pos;
17435
17436 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17437
17438 o_len_pos++;
17439
17440 char *o_buf_pos = strchr (o_len_pos, '*');
17441
17442 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17443
17444 u32 o_len_len = o_buf_pos - o_len_pos;
17445
17446 o_buf_pos++;
17447
17448 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;
17449
17450 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17451
17452 // validate data
17453
17454 const int V = atoi (V_pos);
17455 const int R = atoi (R_pos);
17456 const int P = atoi (P_pos);
17457
17458 int vr_ok = 0;
17459
17460 if ((V == 2) && (R == 3)) vr_ok = 1;
17461 if ((V == 4) && (R == 4)) vr_ok = 1;
17462
17463 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17464
17465 const int id_len = atoi (id_len_pos);
17466 const int u_len = atoi (u_len_pos);
17467 const int o_len = atoi (o_len_pos);
17468
17469 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
17470
17471 if (u_len != 32) return (PARSER_SALT_VALUE);
17472 if (o_len != 32) return (PARSER_SALT_VALUE);
17473
17474 const int bits = atoi (bits_pos);
17475
17476 if (bits != 128) return (PARSER_SALT_VALUE);
17477
17478 int enc_md = 1;
17479
17480 if (R >= 4)
17481 {
17482 enc_md = atoi (enc_md_pos);
17483 }
17484
17485 // copy data to esalt
17486
17487 pdf->V = V;
17488 pdf->R = R;
17489 pdf->P = P;
17490
17491 pdf->enc_md = enc_md;
17492
17493 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17494 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17495 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17496 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17497
17498 if (id_len == 32)
17499 {
17500 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
17501 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
17502 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
17503 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
17504 }
17505
17506 pdf->id_len = id_len;
17507
17508 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17509 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17510 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17511 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17512 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17513 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17514 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17515 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17516 pdf->u_len = u_len;
17517
17518 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17519 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17520 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17521 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17522 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17523 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17524 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17525 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17526 pdf->o_len = o_len;
17527
17528 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17529 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17530 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17531 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17532
17533 if (id_len == 32)
17534 {
17535 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
17536 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
17537 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
17538 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
17539 }
17540
17541 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17542 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17543 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17544 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17545 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17546 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17547 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17548 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17549
17550 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17551 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17552 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17553 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17554 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17555 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17556 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17557 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17558
17559 // precompute rc4 data for later use
17560
17561 uint padding[8] =
17562 {
17563 0x5e4ebf28,
17564 0x418a754e,
17565 0x564e0064,
17566 0x0801faff,
17567 0xb6002e2e,
17568 0x803e68d0,
17569 0xfea90c2f,
17570 0x7a695364
17571 };
17572
17573 // md5
17574
17575 uint salt_pc_block[32] = { 0 };
17576
17577 char *salt_pc_ptr = (char *) salt_pc_block;
17578
17579 memcpy (salt_pc_ptr, padding, 32);
17580 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
17581
17582 uint salt_pc_digest[4] = { 0 };
17583
17584 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
17585
17586 pdf->rc4data[0] = salt_pc_digest[0];
17587 pdf->rc4data[1] = salt_pc_digest[1];
17588
17589 // we use ID for salt, maybe needs to change, we will see...
17590
17591 salt->salt_buf[0] = pdf->id_buf[0];
17592 salt->salt_buf[1] = pdf->id_buf[1];
17593 salt->salt_buf[2] = pdf->id_buf[2];
17594 salt->salt_buf[3] = pdf->id_buf[3];
17595 salt->salt_buf[4] = pdf->u_buf[0];
17596 salt->salt_buf[5] = pdf->u_buf[1];
17597 salt->salt_buf[6] = pdf->o_buf[0];
17598 salt->salt_buf[7] = pdf->o_buf[1];
17599 salt->salt_len = pdf->id_len + 16;
17600
17601 salt->salt_iter = ROUNDS_PDF14;
17602
17603 digest[0] = pdf->u_buf[0];
17604 digest[1] = pdf->u_buf[1];
17605 digest[2] = 0;
17606 digest[3] = 0;
17607
17608 return (PARSER_OK);
17609 }
17610
17611 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17612 {
17613 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17614
17615 if (ret != PARSER_OK)
17616 {
17617 return ret;
17618 }
17619
17620 u32 *digest = (u32 *) hash_buf->digest;
17621
17622 salt_t *salt = hash_buf->salt;
17623
17624 digest[0] -= SHA256M_A;
17625 digest[1] -= SHA256M_B;
17626 digest[2] -= SHA256M_C;
17627 digest[3] -= SHA256M_D;
17628 digest[4] -= SHA256M_E;
17629 digest[5] -= SHA256M_F;
17630 digest[6] -= SHA256M_G;
17631 digest[7] -= SHA256M_H;
17632
17633 salt->salt_buf[2] = 0x80;
17634
17635 return (PARSER_OK);
17636 }
17637
17638 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17639 {
17640 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17641
17642 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17643
17644 u32 *digest = (u32 *) hash_buf->digest;
17645
17646 salt_t *salt = hash_buf->salt;
17647
17648 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17649
17650 /**
17651 * parse line
17652 */
17653
17654 char *V_pos = input_buf + 5;
17655
17656 char *R_pos = strchr (V_pos, '*');
17657
17658 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17659
17660 u32 V_len = R_pos - V_pos;
17661
17662 R_pos++;
17663
17664 char *bits_pos = strchr (R_pos, '*');
17665
17666 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17667
17668 u32 R_len = bits_pos - R_pos;
17669
17670 bits_pos++;
17671
17672 char *P_pos = strchr (bits_pos, '*');
17673
17674 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17675
17676 u32 bits_len = P_pos - bits_pos;
17677
17678 P_pos++;
17679
17680 char *enc_md_pos = strchr (P_pos, '*');
17681
17682 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17683
17684 u32 P_len = enc_md_pos - P_pos;
17685
17686 enc_md_pos++;
17687
17688 char *id_len_pos = strchr (enc_md_pos, '*');
17689
17690 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17691
17692 u32 enc_md_len = id_len_pos - enc_md_pos;
17693
17694 id_len_pos++;
17695
17696 char *id_buf_pos = strchr (id_len_pos, '*');
17697
17698 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17699
17700 u32 id_len_len = id_buf_pos - id_len_pos;
17701
17702 id_buf_pos++;
17703
17704 char *u_len_pos = strchr (id_buf_pos, '*');
17705
17706 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17707
17708 u32 id_buf_len = u_len_pos - id_buf_pos;
17709
17710 u_len_pos++;
17711
17712 char *u_buf_pos = strchr (u_len_pos, '*');
17713
17714 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17715
17716 u32 u_len_len = u_buf_pos - u_len_pos;
17717
17718 u_buf_pos++;
17719
17720 char *o_len_pos = strchr (u_buf_pos, '*');
17721
17722 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17723
17724 u32 u_buf_len = o_len_pos - u_buf_pos;
17725
17726 o_len_pos++;
17727
17728 char *o_buf_pos = strchr (o_len_pos, '*');
17729
17730 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17731
17732 u32 o_len_len = o_buf_pos - o_len_pos;
17733
17734 o_buf_pos++;
17735
17736 char *last = strchr (o_buf_pos, '*');
17737
17738 if (last == NULL) last = input_buf + input_len;
17739
17740 u32 o_buf_len = last - o_buf_pos;
17741
17742 // validate data
17743
17744 const int V = atoi (V_pos);
17745 const int R = atoi (R_pos);
17746
17747 int vr_ok = 0;
17748
17749 if ((V == 5) && (R == 5)) vr_ok = 1;
17750 if ((V == 5) && (R == 6)) vr_ok = 1;
17751
17752 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17753
17754 const int bits = atoi (bits_pos);
17755
17756 if (bits != 256) return (PARSER_SALT_VALUE);
17757
17758 int enc_md = atoi (enc_md_pos);
17759
17760 if (enc_md != 1) return (PARSER_SALT_VALUE);
17761
17762 const uint id_len = atoi (id_len_pos);
17763 const uint u_len = atoi (u_len_pos);
17764 const uint o_len = atoi (o_len_pos);
17765
17766 if (V_len > 6) return (PARSER_SALT_LENGTH);
17767 if (R_len > 6) return (PARSER_SALT_LENGTH);
17768 if (P_len > 6) return (PARSER_SALT_LENGTH);
17769 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17770 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17771 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17772 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17773 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17774
17775 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17776 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17777 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17778
17779 // copy data to esalt
17780
17781 if (u_len < 40) return (PARSER_SALT_VALUE);
17782
17783 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17784 {
17785 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17786 }
17787
17788 salt->salt_buf[0] = pdf->u_buf[8];
17789 salt->salt_buf[1] = pdf->u_buf[9];
17790
17791 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17792 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17793
17794 salt->salt_len = 8;
17795 salt->salt_iter = ROUNDS_PDF17L8;
17796
17797 digest[0] = pdf->u_buf[0];
17798 digest[1] = pdf->u_buf[1];
17799 digest[2] = pdf->u_buf[2];
17800 digest[3] = pdf->u_buf[3];
17801 digest[4] = pdf->u_buf[4];
17802 digest[5] = pdf->u_buf[5];
17803 digest[6] = pdf->u_buf[6];
17804 digest[7] = pdf->u_buf[7];
17805
17806 return (PARSER_OK);
17807 }
17808
17809 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17810 {
17811 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17812
17813 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17814
17815 u32 *digest = (u32 *) hash_buf->digest;
17816
17817 salt_t *salt = hash_buf->salt;
17818
17819 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17820
17821 /**
17822 * parse line
17823 */
17824
17825 // iterations
17826
17827 char *iter_pos = input_buf + 7;
17828
17829 u32 iter = atoi (iter_pos);
17830
17831 if (iter < 1) return (PARSER_SALT_ITERATION);
17832 if (iter > 999999) return (PARSER_SALT_ITERATION);
17833
17834 // first is *raw* salt
17835
17836 char *salt_pos = strchr (iter_pos, ':');
17837
17838 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17839
17840 salt_pos++;
17841
17842 char *hash_pos = strchr (salt_pos, ':');
17843
17844 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17845
17846 u32 salt_len = hash_pos - salt_pos;
17847
17848 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17849
17850 hash_pos++;
17851
17852 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17853
17854 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17855
17856 // decode salt
17857
17858 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17859
17860 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17861
17862 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17863
17864 salt_buf_ptr[salt_len + 3] = 0x01;
17865 salt_buf_ptr[salt_len + 4] = 0x80;
17866
17867 salt->salt_len = salt_len;
17868 salt->salt_iter = iter - 1;
17869
17870 // decode hash
17871
17872 u8 tmp_buf[100] = { 0 };
17873
17874 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17875
17876 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17877
17878 memcpy (digest, tmp_buf, 16);
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 // add some stuff to normal salt to make sorted happy
17886
17887 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17888 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17889 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17890 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17891 salt->salt_buf[4] = salt->salt_iter;
17892
17893 return (PARSER_OK);
17894 }
17895
17896 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17897 {
17898 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17899
17900 u32 *digest = (u32 *) hash_buf->digest;
17901
17902 salt_t *salt = hash_buf->salt;
17903
17904 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17905 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17906 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17907 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17908
17909 digest[0] = byte_swap_32 (digest[0]);
17910 digest[1] = byte_swap_32 (digest[1]);
17911 digest[2] = byte_swap_32 (digest[2]);
17912 digest[3] = byte_swap_32 (digest[3]);
17913
17914 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17915
17916 uint salt_len = input_len - 32 - 1;
17917
17918 char *salt_buf = input_buf + 32 + 1;
17919
17920 char *salt_buf_ptr = (char *) salt->salt_buf;
17921
17922 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17923
17924 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17925
17926 salt->salt_len = salt_len;
17927
17928 return (PARSER_OK);
17929 }
17930
17931 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17932 {
17933 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17934
17935 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17936
17937 u32 *digest = (u32 *) hash_buf->digest;
17938
17939 salt_t *salt = hash_buf->salt;
17940
17941 char *user_pos = input_buf + 10;
17942
17943 char *salt_pos = strchr (user_pos, '*');
17944
17945 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17946
17947 salt_pos++;
17948
17949 char *hash_pos = strchr (salt_pos, '*');
17950
17951 hash_pos++;
17952
17953 uint hash_len = input_len - (hash_pos - input_buf);
17954
17955 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17956
17957 uint user_len = salt_pos - user_pos - 1;
17958
17959 uint salt_len = hash_pos - salt_pos - 1;
17960
17961 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17962
17963 /*
17964 * store digest
17965 */
17966
17967 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17968 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17969 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17970 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17971
17972 digest[0] = byte_swap_32 (digest[0]);
17973 digest[1] = byte_swap_32 (digest[1]);
17974 digest[2] = byte_swap_32 (digest[2]);
17975 digest[3] = byte_swap_32 (digest[3]);
17976
17977 digest[0] -= MD5M_A;
17978 digest[1] -= MD5M_B;
17979 digest[2] -= MD5M_C;
17980 digest[3] -= MD5M_D;
17981
17982 /*
17983 * store salt
17984 */
17985
17986 char *salt_buf_ptr = (char *) salt->salt_buf;
17987
17988 // first 4 bytes are the "challenge"
17989
17990 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17991 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17992 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17993 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17994
17995 // append the user name
17996
17997 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17998
17999 salt->salt_len = 4 + user_len;
18000
18001 return (PARSER_OK);
18002 }
18003
18004 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18005 {
18006 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
18007
18008 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18009
18010 u32 *digest = (u32 *) hash_buf->digest;
18011
18012 salt_t *salt = hash_buf->salt;
18013
18014 char *salt_pos = input_buf + 9;
18015
18016 char *hash_pos = strchr (salt_pos, '*');
18017
18018 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18019
18020 hash_pos++;
18021
18022 uint hash_len = input_len - (hash_pos - input_buf);
18023
18024 if (hash_len != 40) return (PARSER_HASH_LENGTH);
18025
18026 uint salt_len = hash_pos - salt_pos - 1;
18027
18028 if (salt_len != 40) return (PARSER_SALT_LENGTH);
18029
18030 /*
18031 * store digest
18032 */
18033
18034 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18035 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18036 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18037 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18038 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18039
18040 /*
18041 * store salt
18042 */
18043
18044 char *salt_buf_ptr = (char *) salt->salt_buf;
18045
18046 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18047
18048 salt->salt_len = salt_len;
18049
18050 return (PARSER_OK);
18051 }
18052
18053 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18054 {
18055 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
18056
18057 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18058
18059 u32 *digest = (u32 *) hash_buf->digest;
18060
18061 salt_t *salt = hash_buf->salt;
18062
18063 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
18064
18065 /**
18066 * parse line
18067 */
18068
18069 char *cry_master_len_pos = input_buf + 9;
18070
18071 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
18072
18073 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18074
18075 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
18076
18077 cry_master_buf_pos++;
18078
18079 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
18080
18081 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18082
18083 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
18084
18085 cry_salt_len_pos++;
18086
18087 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
18088
18089 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18090
18091 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
18092
18093 cry_salt_buf_pos++;
18094
18095 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
18096
18097 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18098
18099 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
18100
18101 cry_rounds_pos++;
18102
18103 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
18104
18105 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18106
18107 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
18108
18109 ckey_len_pos++;
18110
18111 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
18112
18113 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18114
18115 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
18116
18117 ckey_buf_pos++;
18118
18119 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
18120
18121 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18122
18123 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
18124
18125 public_key_len_pos++;
18126
18127 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
18128
18129 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18130
18131 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
18132
18133 public_key_buf_pos++;
18134
18135 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;
18136
18137 const uint cry_master_len = atoi (cry_master_len_pos);
18138 const uint cry_salt_len = atoi (cry_salt_len_pos);
18139 const uint ckey_len = atoi (ckey_len_pos);
18140 const uint public_key_len = atoi (public_key_len_pos);
18141
18142 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
18143 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
18144 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
18145 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
18146
18147 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
18148 {
18149 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
18150
18151 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
18152 }
18153
18154 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
18155 {
18156 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
18157
18158 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
18159 }
18160
18161 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
18162 {
18163 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
18164
18165 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
18166 }
18167
18168 bitcoin_wallet->cry_master_len = cry_master_len / 2;
18169 bitcoin_wallet->ckey_len = ckey_len / 2;
18170 bitcoin_wallet->public_key_len = public_key_len / 2;
18171
18172 /*
18173 * store digest (should be unique enought, hopefully)
18174 */
18175
18176 digest[0] = bitcoin_wallet->cry_master_buf[0];
18177 digest[1] = bitcoin_wallet->cry_master_buf[1];
18178 digest[2] = bitcoin_wallet->cry_master_buf[2];
18179 digest[3] = bitcoin_wallet->cry_master_buf[3];
18180
18181 /*
18182 * store salt
18183 */
18184
18185 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
18186
18187 const uint cry_rounds = atoi (cry_rounds_pos);
18188
18189 salt->salt_iter = cry_rounds - 1;
18190
18191 char *salt_buf_ptr = (char *) salt->salt_buf;
18192
18193 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
18194
18195 salt->salt_len = salt_len;
18196
18197 return (PARSER_OK);
18198 }
18199
18200 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18201 {
18202 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
18203
18204 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18205
18206 u32 *digest = (u32 *) hash_buf->digest;
18207
18208 salt_t *salt = hash_buf->salt;
18209
18210 sip_t *sip = (sip_t *) hash_buf->esalt;
18211
18212 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
18213
18214 char *temp_input_buf = (char *) mymalloc (input_len + 1);
18215
18216 memcpy (temp_input_buf, input_buf, input_len);
18217
18218 // URI_server:
18219
18220 char *URI_server_pos = temp_input_buf + 6;
18221
18222 char *URI_client_pos = strchr (URI_server_pos, '*');
18223
18224 if (URI_client_pos == NULL)
18225 {
18226 myfree (temp_input_buf);
18227
18228 return (PARSER_SEPARATOR_UNMATCHED);
18229 }
18230
18231 URI_client_pos[0] = 0;
18232 URI_client_pos++;
18233
18234 uint URI_server_len = strlen (URI_server_pos);
18235
18236 if (URI_server_len > 512)
18237 {
18238 myfree (temp_input_buf);
18239
18240 return (PARSER_SALT_LENGTH);
18241 }
18242
18243 // URI_client:
18244
18245 char *user_pos = strchr (URI_client_pos, '*');
18246
18247 if (user_pos == NULL)
18248 {
18249 myfree (temp_input_buf);
18250
18251 return (PARSER_SEPARATOR_UNMATCHED);
18252 }
18253
18254 user_pos[0] = 0;
18255 user_pos++;
18256
18257 uint URI_client_len = strlen (URI_client_pos);
18258
18259 if (URI_client_len > 512)
18260 {
18261 myfree (temp_input_buf);
18262
18263 return (PARSER_SALT_LENGTH);
18264 }
18265
18266 // user:
18267
18268 char *realm_pos = strchr (user_pos, '*');
18269
18270 if (realm_pos == NULL)
18271 {
18272 myfree (temp_input_buf);
18273
18274 return (PARSER_SEPARATOR_UNMATCHED);
18275 }
18276
18277 realm_pos[0] = 0;
18278 realm_pos++;
18279
18280 uint user_len = strlen (user_pos);
18281
18282 if (user_len > 116)
18283 {
18284 myfree (temp_input_buf);
18285
18286 return (PARSER_SALT_LENGTH);
18287 }
18288
18289 // realm:
18290
18291 char *method_pos = strchr (realm_pos, '*');
18292
18293 if (method_pos == NULL)
18294 {
18295 myfree (temp_input_buf);
18296
18297 return (PARSER_SEPARATOR_UNMATCHED);
18298 }
18299
18300 method_pos[0] = 0;
18301 method_pos++;
18302
18303 uint realm_len = strlen (realm_pos);
18304
18305 if (realm_len > 116)
18306 {
18307 myfree (temp_input_buf);
18308
18309 return (PARSER_SALT_LENGTH);
18310 }
18311
18312 // method:
18313
18314 char *URI_prefix_pos = strchr (method_pos, '*');
18315
18316 if (URI_prefix_pos == NULL)
18317 {
18318 myfree (temp_input_buf);
18319
18320 return (PARSER_SEPARATOR_UNMATCHED);
18321 }
18322
18323 URI_prefix_pos[0] = 0;
18324 URI_prefix_pos++;
18325
18326 uint method_len = strlen (method_pos);
18327
18328 if (method_len > 246)
18329 {
18330 myfree (temp_input_buf);
18331
18332 return (PARSER_SALT_LENGTH);
18333 }
18334
18335 // URI_prefix:
18336
18337 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
18338
18339 if (URI_resource_pos == NULL)
18340 {
18341 myfree (temp_input_buf);
18342
18343 return (PARSER_SEPARATOR_UNMATCHED);
18344 }
18345
18346 URI_resource_pos[0] = 0;
18347 URI_resource_pos++;
18348
18349 uint URI_prefix_len = strlen (URI_prefix_pos);
18350
18351 if (URI_prefix_len > 245)
18352 {
18353 myfree (temp_input_buf);
18354
18355 return (PARSER_SALT_LENGTH);
18356 }
18357
18358 // URI_resource:
18359
18360 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
18361
18362 if (URI_suffix_pos == NULL)
18363 {
18364 myfree (temp_input_buf);
18365
18366 return (PARSER_SEPARATOR_UNMATCHED);
18367 }
18368
18369 URI_suffix_pos[0] = 0;
18370 URI_suffix_pos++;
18371
18372 uint URI_resource_len = strlen (URI_resource_pos);
18373
18374 if (URI_resource_len < 1 || URI_resource_len > 246)
18375 {
18376 myfree (temp_input_buf);
18377
18378 return (PARSER_SALT_LENGTH);
18379 }
18380
18381 // URI_suffix:
18382
18383 char *nonce_pos = strchr (URI_suffix_pos, '*');
18384
18385 if (nonce_pos == NULL)
18386 {
18387 myfree (temp_input_buf);
18388
18389 return (PARSER_SEPARATOR_UNMATCHED);
18390 }
18391
18392 nonce_pos[0] = 0;
18393 nonce_pos++;
18394
18395 uint URI_suffix_len = strlen (URI_suffix_pos);
18396
18397 if (URI_suffix_len > 245)
18398 {
18399 myfree (temp_input_buf);
18400
18401 return (PARSER_SALT_LENGTH);
18402 }
18403
18404 // nonce:
18405
18406 char *nonce_client_pos = strchr (nonce_pos, '*');
18407
18408 if (nonce_client_pos == NULL)
18409 {
18410 myfree (temp_input_buf);
18411
18412 return (PARSER_SEPARATOR_UNMATCHED);
18413 }
18414
18415 nonce_client_pos[0] = 0;
18416 nonce_client_pos++;
18417
18418 uint nonce_len = strlen (nonce_pos);
18419
18420 if (nonce_len < 1 || nonce_len > 50)
18421 {
18422 myfree (temp_input_buf);
18423
18424 return (PARSER_SALT_LENGTH);
18425 }
18426
18427 // nonce_client:
18428
18429 char *nonce_count_pos = strchr (nonce_client_pos, '*');
18430
18431 if (nonce_count_pos == NULL)
18432 {
18433 myfree (temp_input_buf);
18434
18435 return (PARSER_SEPARATOR_UNMATCHED);
18436 }
18437
18438 nonce_count_pos[0] = 0;
18439 nonce_count_pos++;
18440
18441 uint nonce_client_len = strlen (nonce_client_pos);
18442
18443 if (nonce_client_len > 50)
18444 {
18445 myfree (temp_input_buf);
18446
18447 return (PARSER_SALT_LENGTH);
18448 }
18449
18450 // nonce_count:
18451
18452 char *qop_pos = strchr (nonce_count_pos, '*');
18453
18454 if (qop_pos == NULL)
18455 {
18456 myfree (temp_input_buf);
18457
18458 return (PARSER_SEPARATOR_UNMATCHED);
18459 }
18460
18461 qop_pos[0] = 0;
18462 qop_pos++;
18463
18464 uint nonce_count_len = strlen (nonce_count_pos);
18465
18466 if (nonce_count_len > 50)
18467 {
18468 myfree (temp_input_buf);
18469
18470 return (PARSER_SALT_LENGTH);
18471 }
18472
18473 // qop:
18474
18475 char *directive_pos = strchr (qop_pos, '*');
18476
18477 if (directive_pos == NULL)
18478 {
18479 myfree (temp_input_buf);
18480
18481 return (PARSER_SEPARATOR_UNMATCHED);
18482 }
18483
18484 directive_pos[0] = 0;
18485 directive_pos++;
18486
18487 uint qop_len = strlen (qop_pos);
18488
18489 if (qop_len > 50)
18490 {
18491 myfree (temp_input_buf);
18492
18493 return (PARSER_SALT_LENGTH);
18494 }
18495
18496 // directive
18497
18498 char *digest_pos = strchr (directive_pos, '*');
18499
18500 if (digest_pos == NULL)
18501 {
18502 myfree (temp_input_buf);
18503
18504 return (PARSER_SEPARATOR_UNMATCHED);
18505 }
18506
18507 digest_pos[0] = 0;
18508 digest_pos++;
18509
18510 uint directive_len = strlen (directive_pos);
18511
18512 if (directive_len != 3)
18513 {
18514 myfree (temp_input_buf);
18515
18516 return (PARSER_SALT_LENGTH);
18517 }
18518
18519 if (memcmp (directive_pos, "MD5", 3))
18520 {
18521 log_info ("ERROR: only the MD5 directive is currently supported\n");
18522
18523 myfree (temp_input_buf);
18524
18525 return (PARSER_SIP_AUTH_DIRECTIVE);
18526 }
18527
18528 /*
18529 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
18530 */
18531
18532 uint md5_len = 0;
18533
18534 uint md5_max_len = 4 * 64;
18535
18536 uint md5_remaining_len = md5_max_len;
18537
18538 uint tmp_md5_buf[64] = { 0 };
18539
18540 char *tmp_md5_ptr = (char *) tmp_md5_buf;
18541
18542 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
18543
18544 md5_len += method_len + 1;
18545 tmp_md5_ptr += method_len + 1;
18546
18547 if (URI_prefix_len > 0)
18548 {
18549 md5_remaining_len = md5_max_len - md5_len;
18550
18551 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
18552
18553 md5_len += URI_prefix_len + 1;
18554 tmp_md5_ptr += URI_prefix_len + 1;
18555 }
18556
18557 md5_remaining_len = md5_max_len - md5_len;
18558
18559 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
18560
18561 md5_len += URI_resource_len;
18562 tmp_md5_ptr += URI_resource_len;
18563
18564 if (URI_suffix_len > 0)
18565 {
18566 md5_remaining_len = md5_max_len - md5_len;
18567
18568 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
18569
18570 md5_len += 1 + URI_suffix_len;
18571 }
18572
18573 uint tmp_digest[4] = { 0 };
18574
18575 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
18576
18577 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
18578 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
18579 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
18580 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
18581
18582 /*
18583 * esalt
18584 */
18585
18586 char *esalt_buf_ptr = (char *) sip->esalt_buf;
18587
18588 uint esalt_len = 0;
18589
18590 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
18591
18592 // there are 2 possibilities for the esalt:
18593
18594 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
18595 {
18596 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
18597
18598 if (esalt_len > max_esalt_len)
18599 {
18600 myfree (temp_input_buf);
18601
18602 return (PARSER_SALT_LENGTH);
18603 }
18604
18605 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18606 nonce_pos,
18607 nonce_count_pos,
18608 nonce_client_pos,
18609 qop_pos,
18610 tmp_digest[0],
18611 tmp_digest[1],
18612 tmp_digest[2],
18613 tmp_digest[3]);
18614 }
18615 else
18616 {
18617 esalt_len = 1 + nonce_len + 1 + 32;
18618
18619 if (esalt_len > max_esalt_len)
18620 {
18621 myfree (temp_input_buf);
18622
18623 return (PARSER_SALT_LENGTH);
18624 }
18625
18626 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18627 nonce_pos,
18628 tmp_digest[0],
18629 tmp_digest[1],
18630 tmp_digest[2],
18631 tmp_digest[3]);
18632 }
18633
18634 // add 0x80 to esalt
18635
18636 esalt_buf_ptr[esalt_len] = 0x80;
18637
18638 sip->esalt_len = esalt_len;
18639
18640 /*
18641 * actual salt
18642 */
18643
18644 char *sip_salt_ptr = (char *) sip->salt_buf;
18645
18646 uint salt_len = user_len + 1 + realm_len + 1;
18647
18648 uint max_salt_len = 119;
18649
18650 if (salt_len > max_salt_len)
18651 {
18652 myfree (temp_input_buf);
18653
18654 return (PARSER_SALT_LENGTH);
18655 }
18656
18657 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18658
18659 sip->salt_len = salt_len;
18660
18661 /*
18662 * fake salt (for sorting)
18663 */
18664
18665 char *salt_buf_ptr = (char *) salt->salt_buf;
18666
18667 max_salt_len = 55;
18668
18669 uint fake_salt_len = salt_len;
18670
18671 if (fake_salt_len > max_salt_len)
18672 {
18673 fake_salt_len = max_salt_len;
18674 }
18675
18676 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18677
18678 salt->salt_len = fake_salt_len;
18679
18680 /*
18681 * digest
18682 */
18683
18684 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18685 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18686 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18687 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18688
18689 digest[0] = byte_swap_32 (digest[0]);
18690 digest[1] = byte_swap_32 (digest[1]);
18691 digest[2] = byte_swap_32 (digest[2]);
18692 digest[3] = byte_swap_32 (digest[3]);
18693
18694 myfree (temp_input_buf);
18695
18696 return (PARSER_OK);
18697 }
18698
18699 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18700 {
18701 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18702
18703 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18704
18705 u32 *digest = (u32 *) hash_buf->digest;
18706
18707 salt_t *salt = hash_buf->salt;
18708
18709 // digest
18710
18711 char *digest_pos = input_buf;
18712
18713 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18714 digest[1] = 0;
18715 digest[2] = 0;
18716 digest[3] = 0;
18717
18718 // salt
18719
18720 char *salt_buf = input_buf + 8 + 1;
18721
18722 uint salt_len = 8;
18723
18724 char *salt_buf_ptr = (char *) salt->salt_buf;
18725
18726 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18727
18728 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18729
18730 salt->salt_len = salt_len;
18731
18732 return (PARSER_OK);
18733 }
18734
18735 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18736 {
18737 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18738
18739 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18740
18741 u32 *digest = (u32 *) hash_buf->digest;
18742
18743 salt_t *salt = hash_buf->salt;
18744
18745 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18746
18747 /**
18748 * parse line
18749 */
18750
18751 char *p_buf_pos = input_buf + 4;
18752
18753 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18754
18755 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18756
18757 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18758
18759 NumCyclesPower_pos++;
18760
18761 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18762
18763 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18764
18765 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18766
18767 salt_len_pos++;
18768
18769 char *salt_buf_pos = strchr (salt_len_pos, '$');
18770
18771 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18772
18773 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18774
18775 salt_buf_pos++;
18776
18777 char *iv_len_pos = strchr (salt_buf_pos, '$');
18778
18779 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18780
18781 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18782
18783 iv_len_pos++;
18784
18785 char *iv_buf_pos = strchr (iv_len_pos, '$');
18786
18787 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18788
18789 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18790
18791 iv_buf_pos++;
18792
18793 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18794
18795 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18796
18797 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18798
18799 crc_buf_pos++;
18800
18801 char *data_len_pos = strchr (crc_buf_pos, '$');
18802
18803 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18804
18805 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18806
18807 data_len_pos++;
18808
18809 char *unpack_size_pos = strchr (data_len_pos, '$');
18810
18811 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18812
18813 u32 data_len_len = unpack_size_pos - data_len_pos;
18814
18815 unpack_size_pos++;
18816
18817 char *data_buf_pos = strchr (unpack_size_pos, '$');
18818
18819 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18820
18821 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18822
18823 data_buf_pos++;
18824
18825 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;
18826
18827 const uint iter = atoi (NumCyclesPower_pos);
18828 const uint crc = atoi (crc_buf_pos);
18829 const uint p_buf = atoi (p_buf_pos);
18830 const uint salt_len = atoi (salt_len_pos);
18831 const uint iv_len = atoi (iv_len_pos);
18832 const uint unpack_size = atoi (unpack_size_pos);
18833 const uint data_len = atoi (data_len_pos);
18834
18835 /**
18836 * verify some data
18837 */
18838
18839 if (p_buf != 0) return (PARSER_SALT_VALUE);
18840 if (salt_len != 0) return (PARSER_SALT_VALUE);
18841
18842 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18843
18844 if (data_len > 384) return (PARSER_SALT_VALUE);
18845
18846 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18847
18848 /**
18849 * store data
18850 */
18851
18852 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18853 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18854 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18855 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18856
18857 seven_zip->iv_len = iv_len;
18858
18859 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18860
18861 seven_zip->salt_len = 0;
18862
18863 seven_zip->crc = crc;
18864
18865 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18866 {
18867 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18868
18869 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18870 }
18871
18872 seven_zip->data_len = data_len;
18873
18874 seven_zip->unpack_size = unpack_size;
18875
18876 // real salt
18877
18878 salt->salt_buf[0] = seven_zip->data_buf[0];
18879 salt->salt_buf[1] = seven_zip->data_buf[1];
18880 salt->salt_buf[2] = seven_zip->data_buf[2];
18881 salt->salt_buf[3] = seven_zip->data_buf[3];
18882
18883 salt->salt_len = 16;
18884
18885 salt->salt_sign[0] = iter;
18886
18887 salt->salt_iter = 1 << iter;
18888
18889 /**
18890 * digest
18891 */
18892
18893 digest[0] = crc;
18894 digest[1] = 0;
18895 digest[2] = 0;
18896 digest[3] = 0;
18897
18898 return (PARSER_OK);
18899 }
18900
18901 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18902 {
18903 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18904
18905 u32 *digest = (u32 *) hash_buf->digest;
18906
18907 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18908 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18909 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18910 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18911 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18912 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18913 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18914 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18915
18916 digest[0] = byte_swap_32 (digest[0]);
18917 digest[1] = byte_swap_32 (digest[1]);
18918 digest[2] = byte_swap_32 (digest[2]);
18919 digest[3] = byte_swap_32 (digest[3]);
18920 digest[4] = byte_swap_32 (digest[4]);
18921 digest[5] = byte_swap_32 (digest[5]);
18922 digest[6] = byte_swap_32 (digest[6]);
18923 digest[7] = byte_swap_32 (digest[7]);
18924
18925 return (PARSER_OK);
18926 }
18927
18928 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18929 {
18930 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18931
18932 u32 *digest = (u32 *) hash_buf->digest;
18933
18934 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18935 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18936 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18937 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18938 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18939 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18940 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18941 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18942 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18943 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18944 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18945 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18946 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18947 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18948 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18949 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18950
18951 digest[ 0] = byte_swap_32 (digest[ 0]);
18952 digest[ 1] = byte_swap_32 (digest[ 1]);
18953 digest[ 2] = byte_swap_32 (digest[ 2]);
18954 digest[ 3] = byte_swap_32 (digest[ 3]);
18955 digest[ 4] = byte_swap_32 (digest[ 4]);
18956 digest[ 5] = byte_swap_32 (digest[ 5]);
18957 digest[ 6] = byte_swap_32 (digest[ 6]);
18958 digest[ 7] = byte_swap_32 (digest[ 7]);
18959 digest[ 8] = byte_swap_32 (digest[ 8]);
18960 digest[ 9] = byte_swap_32 (digest[ 9]);
18961 digest[10] = byte_swap_32 (digest[10]);
18962 digest[11] = byte_swap_32 (digest[11]);
18963 digest[12] = byte_swap_32 (digest[12]);
18964 digest[13] = byte_swap_32 (digest[13]);
18965 digest[14] = byte_swap_32 (digest[14]);
18966 digest[15] = byte_swap_32 (digest[15]);
18967
18968 return (PARSER_OK);
18969 }
18970
18971 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18972 {
18973 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18974
18975 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18976
18977 u32 *digest = (u32 *) hash_buf->digest;
18978
18979 salt_t *salt = hash_buf->salt;
18980
18981 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18982
18983 /**
18984 * parse line
18985 */
18986
18987 // iterations
18988
18989 char *iter_pos = input_buf + 4;
18990
18991 u32 iter = atoi (iter_pos);
18992
18993 if (iter < 1) return (PARSER_SALT_ITERATION);
18994 if (iter > 999999) return (PARSER_SALT_ITERATION);
18995
18996 // first is *raw* salt
18997
18998 char *salt_pos = strchr (iter_pos, ':');
18999
19000 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19001
19002 salt_pos++;
19003
19004 char *hash_pos = strchr (salt_pos, ':');
19005
19006 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19007
19008 u32 salt_len = hash_pos - salt_pos;
19009
19010 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19011
19012 hash_pos++;
19013
19014 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19015
19016 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19017
19018 // decode salt
19019
19020 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
19021
19022 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19023
19024 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19025
19026 salt_buf_ptr[salt_len + 3] = 0x01;
19027 salt_buf_ptr[salt_len + 4] = 0x80;
19028
19029 salt->salt_len = salt_len;
19030 salt->salt_iter = iter - 1;
19031
19032 // decode hash
19033
19034 u8 tmp_buf[100] = { 0 };
19035
19036 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19037
19038 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19039
19040 memcpy (digest, tmp_buf, 16);
19041
19042 // add some stuff to normal salt to make sorted happy
19043
19044 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
19045 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
19046 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
19047 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
19048 salt->salt_buf[4] = salt->salt_iter;
19049
19050 return (PARSER_OK);
19051 }
19052
19053 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19054 {
19055 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
19056
19057 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
19058
19059 u32 *digest = (u32 *) hash_buf->digest;
19060
19061 salt_t *salt = hash_buf->salt;
19062
19063 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
19064
19065 /**
19066 * parse line
19067 */
19068
19069 // iterations
19070
19071 char *iter_pos = input_buf + 5;
19072
19073 u32 iter = atoi (iter_pos);
19074
19075 if (iter < 1) return (PARSER_SALT_ITERATION);
19076 if (iter > 999999) return (PARSER_SALT_ITERATION);
19077
19078 // first is *raw* salt
19079
19080 char *salt_pos = strchr (iter_pos, ':');
19081
19082 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19083
19084 salt_pos++;
19085
19086 char *hash_pos = strchr (salt_pos, ':');
19087
19088 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19089
19090 u32 salt_len = hash_pos - salt_pos;
19091
19092 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19093
19094 hash_pos++;
19095
19096 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19097
19098 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19099
19100 // decode salt
19101
19102 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
19103
19104 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19105
19106 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19107
19108 salt_buf_ptr[salt_len + 3] = 0x01;
19109 salt_buf_ptr[salt_len + 4] = 0x80;
19110
19111 salt->salt_len = salt_len;
19112 salt->salt_iter = iter - 1;
19113
19114 // decode hash
19115
19116 u8 tmp_buf[100] = { 0 };
19117
19118 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19119
19120 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19121
19122 memcpy (digest, tmp_buf, 16);
19123
19124 digest[0] = byte_swap_32 (digest[0]);
19125 digest[1] = byte_swap_32 (digest[1]);
19126 digest[2] = byte_swap_32 (digest[2]);
19127 digest[3] = byte_swap_32 (digest[3]);
19128
19129 // add some stuff to normal salt to make sorted happy
19130
19131 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
19132 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
19133 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
19134 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
19135 salt->salt_buf[4] = salt->salt_iter;
19136
19137 return (PARSER_OK);
19138 }
19139
19140 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19141 {
19142 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
19143
19144 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
19145
19146 u64 *digest = (u64 *) hash_buf->digest;
19147
19148 salt_t *salt = hash_buf->salt;
19149
19150 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
19151
19152 /**
19153 * parse line
19154 */
19155
19156 // iterations
19157
19158 char *iter_pos = input_buf + 7;
19159
19160 u32 iter = atoi (iter_pos);
19161
19162 if (iter < 1) return (PARSER_SALT_ITERATION);
19163 if (iter > 999999) return (PARSER_SALT_ITERATION);
19164
19165 // first is *raw* salt
19166
19167 char *salt_pos = strchr (iter_pos, ':');
19168
19169 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19170
19171 salt_pos++;
19172
19173 char *hash_pos = strchr (salt_pos, ':');
19174
19175 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19176
19177 u32 salt_len = hash_pos - salt_pos;
19178
19179 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19180
19181 hash_pos++;
19182
19183 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19184
19185 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19186
19187 // decode salt
19188
19189 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
19190
19191 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19192
19193 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19194
19195 salt_buf_ptr[salt_len + 3] = 0x01;
19196 salt_buf_ptr[salt_len + 4] = 0x80;
19197
19198 salt->salt_len = salt_len;
19199 salt->salt_iter = iter - 1;
19200
19201 // decode hash
19202
19203 u8 tmp_buf[100] = { 0 };
19204
19205 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19206
19207 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19208
19209 memcpy (digest, tmp_buf, 64);
19210
19211 digest[0] = byte_swap_64 (digest[0]);
19212 digest[1] = byte_swap_64 (digest[1]);
19213 digest[2] = byte_swap_64 (digest[2]);
19214 digest[3] = byte_swap_64 (digest[3]);
19215 digest[4] = byte_swap_64 (digest[4]);
19216 digest[5] = byte_swap_64 (digest[5]);
19217 digest[6] = byte_swap_64 (digest[6]);
19218 digest[7] = byte_swap_64 (digest[7]);
19219
19220 // add some stuff to normal salt to make sorted happy
19221
19222 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
19223 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
19224 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
19225 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
19226 salt->salt_buf[4] = salt->salt_iter;
19227
19228 return (PARSER_OK);
19229 }
19230
19231 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19232 {
19233 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
19234
19235 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
19236
19237 uint *digest = (uint *) hash_buf->digest;
19238
19239 salt_t *salt = hash_buf->salt;
19240
19241 /**
19242 * parse line
19243 */
19244
19245 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
19246
19247 char *hash_pos = strchr (salt_pos, '$');
19248
19249 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19250
19251 u32 salt_len = hash_pos - salt_pos;
19252
19253 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19254
19255 hash_pos++;
19256
19257 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
19258
19259 if (hash_len != 16) return (PARSER_HASH_LENGTH);
19260
19261 // decode hash
19262
19263 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
19264 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
19265 digest[ 2] = 0;
19266 digest[ 3] = 0;
19267 digest[ 4] = 0;
19268 digest[ 5] = 0;
19269 digest[ 6] = 0;
19270 digest[ 7] = 0;
19271 digest[ 8] = 0;
19272 digest[ 9] = 0;
19273 digest[10] = 0;
19274 digest[11] = 0;
19275 digest[12] = 0;
19276 digest[13] = 0;
19277 digest[14] = 0;
19278 digest[15] = 0;
19279
19280 // decode salt
19281
19282 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19283 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19284
19285 salt->salt_iter = ROUNDS_ECRYPTFS;
19286 salt->salt_len = 8;
19287
19288 return (PARSER_OK);
19289 }
19290
19291 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19292 {
19293 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
19294
19295 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
19296
19297 unsigned char c19 = itoa64_to_int (input_buf[19]);
19298
19299 if (c19 & 3) return (PARSER_HASH_VALUE);
19300
19301 salt_t *salt = hash_buf->salt;
19302
19303 u32 *digest = (u32 *) hash_buf->digest;
19304
19305 // iteration count
19306
19307 salt->salt_iter = itoa64_to_int (input_buf[1])
19308 | itoa64_to_int (input_buf[2]) << 6
19309 | itoa64_to_int (input_buf[3]) << 12
19310 | itoa64_to_int (input_buf[4]) << 18;
19311
19312 // set salt
19313
19314 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
19315 | itoa64_to_int (input_buf[6]) << 6
19316 | itoa64_to_int (input_buf[7]) << 12
19317 | itoa64_to_int (input_buf[8]) << 18;
19318
19319 salt->salt_len = 4;
19320
19321 u8 tmp_buf[100] = { 0 };
19322
19323 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
19324
19325 memcpy (digest, tmp_buf, 8);
19326
19327 uint tt;
19328
19329 IP (digest[0], digest[1], tt);
19330
19331 digest[0] = rotr32 (digest[0], 31);
19332 digest[1] = rotr32 (digest[1], 31);
19333 digest[2] = 0;
19334 digest[3] = 0;
19335
19336 return (PARSER_OK);
19337 }
19338
19339 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19340 {
19341 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
19342
19343 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
19344
19345 u32 *digest = (u32 *) hash_buf->digest;
19346
19347 salt_t *salt = hash_buf->salt;
19348
19349 /**
19350 * parse line
19351 */
19352
19353 char *type_pos = input_buf + 6 + 1;
19354
19355 char *salt_pos = strchr (type_pos, '*');
19356
19357 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19358
19359 u32 type_len = salt_pos - type_pos;
19360
19361 if (type_len != 1) return (PARSER_SALT_LENGTH);
19362
19363 salt_pos++;
19364
19365 char *crypted_pos = strchr (salt_pos, '*');
19366
19367 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19368
19369 u32 salt_len = crypted_pos - salt_pos;
19370
19371 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19372
19373 crypted_pos++;
19374
19375 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
19376
19377 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
19378
19379 /**
19380 * copy data
19381 */
19382
19383 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19384 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19385
19386 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19387 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19388
19389 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
19390 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
19391 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
19392 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
19393
19394 salt->salt_len = 24;
19395 salt->salt_iter = ROUNDS_RAR3;
19396
19397 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
19398 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
19399
19400 digest[0] = 0xc43d7b00;
19401 digest[1] = 0x40070000;
19402 digest[2] = 0;
19403 digest[3] = 0;
19404
19405 return (PARSER_OK);
19406 }
19407
19408 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19409 {
19410 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
19411
19412 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
19413
19414 u32 *digest = (u32 *) hash_buf->digest;
19415
19416 salt_t *salt = hash_buf->salt;
19417
19418 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
19419
19420 /**
19421 * parse line
19422 */
19423
19424 char *param0_pos = input_buf + 1 + 4 + 1;
19425
19426 char *param1_pos = strchr (param0_pos, '$');
19427
19428 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19429
19430 u32 param0_len = param1_pos - param0_pos;
19431
19432 param1_pos++;
19433
19434 char *param2_pos = strchr (param1_pos, '$');
19435
19436 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19437
19438 u32 param1_len = param2_pos - param1_pos;
19439
19440 param2_pos++;
19441
19442 char *param3_pos = strchr (param2_pos, '$');
19443
19444 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19445
19446 u32 param2_len = param3_pos - param2_pos;
19447
19448 param3_pos++;
19449
19450 char *param4_pos = strchr (param3_pos, '$');
19451
19452 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19453
19454 u32 param3_len = param4_pos - param3_pos;
19455
19456 param4_pos++;
19457
19458 char *param5_pos = strchr (param4_pos, '$');
19459
19460 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19461
19462 u32 param4_len = param5_pos - param4_pos;
19463
19464 param5_pos++;
19465
19466 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
19467
19468 char *salt_buf = param1_pos;
19469 char *iv = param3_pos;
19470 char *pswcheck = param5_pos;
19471
19472 const uint salt_len = atoi (param0_pos);
19473 const uint iterations = atoi (param2_pos);
19474 const uint pswcheck_len = atoi (param4_pos);
19475
19476 /**
19477 * verify some data
19478 */
19479
19480 if (param1_len != 32) return (PARSER_SALT_VALUE);
19481 if (param3_len != 32) return (PARSER_SALT_VALUE);
19482 if (param5_len != 16) return (PARSER_SALT_VALUE);
19483
19484 if (salt_len != 16) return (PARSER_SALT_VALUE);
19485 if (iterations == 0) return (PARSER_SALT_VALUE);
19486 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
19487
19488 /**
19489 * store data
19490 */
19491
19492 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
19493 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
19494 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
19495 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
19496
19497 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
19498 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
19499 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
19500 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
19501
19502 salt->salt_len = 16;
19503
19504 salt->salt_sign[0] = iterations;
19505
19506 salt->salt_iter = ((1 << iterations) + 32) - 1;
19507
19508 /**
19509 * digest buf
19510 */
19511
19512 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
19513 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
19514 digest[2] = 0;
19515 digest[3] = 0;
19516
19517 return (PARSER_OK);
19518 }
19519
19520 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19521 {
19522 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
19523
19524 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19525
19526 u32 *digest = (u32 *) hash_buf->digest;
19527
19528 salt_t *salt = hash_buf->salt;
19529
19530 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
19531
19532 /**
19533 * parse line
19534 */
19535
19536 /* Skip '$' */
19537 char *account_pos = input_buf + 11 + 1;
19538
19539 char *data_pos;
19540
19541 uint data_len;
19542
19543 if (account_pos[0] == '*')
19544 {
19545 account_pos++;
19546
19547 data_pos = strchr (account_pos, '*');
19548
19549 /* Skip '*' */
19550 data_pos++;
19551
19552 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19553
19554 uint account_len = data_pos - account_pos + 1;
19555
19556 if (account_len >= 512) return (PARSER_SALT_LENGTH);
19557
19558 /* Skip '$' */
19559 data_pos++;
19560
19561 data_len = input_len - 11 - 1 - account_len - 2;
19562
19563 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
19564 }
19565 else
19566 {
19567 /* assume $krb5tgs$23$checksum$edata2 */
19568 data_pos = account_pos;
19569
19570 memcpy (krb5tgs->account_info, "**", 3);
19571
19572 data_len = input_len - 11 - 1 - 1;
19573 }
19574
19575 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
19576
19577 char *checksum_ptr = (char *) krb5tgs->checksum;
19578
19579 for (uint i = 0; i < 16 * 2; i += 2)
19580 {
19581 const char p0 = data_pos[i + 0];
19582 const char p1 = data_pos[i + 1];
19583
19584 *checksum_ptr++ = hex_convert (p1) << 0
19585 | hex_convert (p0) << 4;
19586 }
19587
19588 char *edata_ptr = (char *) krb5tgs->edata2;
19589
19590 krb5tgs->edata2_len = (data_len - 32) / 2 ;
19591
19592 /* skip '$' */
19593 for (uint i = 16 * 2 + 1; i < (krb5tgs->edata2_len * 2) + (16 * 2 + 1); i += 2)
19594 {
19595 const char p0 = data_pos[i + 0];
19596 const char p1 = data_pos[i + 1];
19597 *edata_ptr++ = hex_convert (p1) << 0
19598 | hex_convert (p0) << 4;
19599 }
19600
19601 /* this is needed for hmac_md5 */
19602 *edata_ptr++ = 0x80;
19603
19604 salt->salt_buf[0] = krb5tgs->checksum[0];
19605 salt->salt_buf[1] = krb5tgs->checksum[1];
19606 salt->salt_buf[2] = krb5tgs->checksum[2];
19607 salt->salt_buf[3] = krb5tgs->checksum[3];
19608
19609 salt->salt_len = 32;
19610
19611 digest[0] = krb5tgs->checksum[0];
19612 digest[1] = krb5tgs->checksum[1];
19613 digest[2] = krb5tgs->checksum[2];
19614 digest[3] = krb5tgs->checksum[3];
19615
19616 return (PARSER_OK);
19617 }
19618
19619 int axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19620 {
19621 if ((input_len < DISPLAY_LEN_MIN_13200) || (input_len > DISPLAY_LEN_MAX_13200)) return (PARSER_GLOBAL_LENGTH);
19622
19623 if (memcmp (SIGNATURE_AXCRYPT, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19624
19625 u32 *digest = (u32 *) hash_buf->digest;
19626
19627 salt_t *salt = hash_buf->salt;
19628
19629 /**
19630 * parse line
19631 */
19632
19633 /* Skip '*' */
19634 char *wrapping_rounds_pos = input_buf + 11 + 1;
19635
19636 char *salt_pos;
19637
19638 char *wrapped_key_pos;
19639
19640 char *data_pos;
19641
19642 salt->salt_iter = atoi (wrapping_rounds_pos);
19643
19644 salt_pos = strchr (wrapping_rounds_pos, '*');
19645
19646 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19647
19648 uint wrapping_rounds_len = salt_pos - wrapping_rounds_pos;
19649
19650 /* Skip '*' */
19651 salt_pos++;
19652
19653 data_pos = salt_pos;
19654
19655 wrapped_key_pos = strchr (salt_pos, '*');
19656
19657 if (wrapped_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19658
19659 uint salt_len = wrapped_key_pos - salt_pos;
19660
19661 if (salt_len != 32) return (PARSER_SALT_LENGTH);
19662
19663 /* Skip '*' */
19664 wrapped_key_pos++;
19665
19666 uint wrapped_key_len = input_len - 11 - 1 - wrapping_rounds_len - 1 - salt_len - 1;
19667
19668 if (wrapped_key_len != 48) return (PARSER_SALT_LENGTH);
19669
19670 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19671 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19672 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &data_pos[16]);
19673 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &data_pos[24]);
19674
19675 data_pos += 33;
19676
19677 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19678 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19679 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &data_pos[16]);
19680 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &data_pos[24]);
19681 salt->salt_buf[8] = hex_to_u32 ((const u8 *) &data_pos[32]);
19682 salt->salt_buf[9] = hex_to_u32 ((const u8 *) &data_pos[40]);
19683
19684 salt->salt_len = 40;
19685
19686 digest[0] = salt->salt_buf[0];
19687 digest[1] = salt->salt_buf[1];
19688 digest[2] = salt->salt_buf[2];
19689 digest[3] = salt->salt_buf[3];
19690
19691 return (PARSER_OK);
19692 }
19693
19694 int keepass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19695 {
19696 if ((input_len < DISPLAY_LEN_MIN_13400) || (input_len > DISPLAY_LEN_MAX_13400)) return (PARSER_GLOBAL_LENGTH);
19697
19698 if (memcmp (SIGNATURE_KEEPASS, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
19699
19700 u32 *digest = (u32 *) hash_buf->digest;
19701
19702 salt_t *salt = hash_buf->salt;
19703
19704 keepass_t *keepass = (keepass_t *) hash_buf->esalt;
19705
19706 /**
19707 * parse line
19708 */
19709
19710 char *version_pos;
19711
19712 char *rounds_pos;
19713
19714 char *algorithm_pos;
19715
19716 char *final_random_seed_pos;
19717 u32 final_random_seed_len;
19718
19719 char *transf_random_seed_pos;
19720 u32 transf_random_seed_len;
19721
19722 char *enc_iv_pos;
19723 u32 enc_iv_len;
19724
19725 /* default is no keyfile provided */
19726 char *keyfile_len_pos;
19727 u32 keyfile_len = 0;
19728 u32 is_keyfile_present = 0;
19729 char *keyfile_inline_pos;
19730 char *keyfile_pos;
19731
19732 /* specific to version 1 */
19733 char *contents_len_pos;
19734 u32 contents_len;
19735 char *contents_pos;
19736
19737 /* specific to version 2 */
19738 char *expected_bytes_pos;
19739 u32 expected_bytes_len;
19740
19741 char *contents_hash_pos;
19742 u32 contents_hash_len;
19743
19744 version_pos = input_buf + 8 + 1 + 1;
19745
19746 keepass->version = atoi (version_pos);
19747
19748 rounds_pos = strchr (version_pos, '*');
19749
19750 if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19751
19752 rounds_pos++;
19753
19754 salt->salt_iter = (atoi (rounds_pos));
19755
19756 algorithm_pos = strchr (rounds_pos, '*');
19757
19758 if (algorithm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19759
19760 algorithm_pos++;
19761
19762 keepass->algorithm = atoi (algorithm_pos);
19763
19764 final_random_seed_pos = strchr (algorithm_pos, '*');
19765
19766 if (final_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19767
19768 final_random_seed_pos++;
19769
19770 keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]);
19771 keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]);
19772 keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]);
19773 keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]);
19774
19775 if (keepass->version == 2)
19776 {
19777 keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]);
19778 keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]);
19779 keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]);
19780 keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]);
19781 }
19782
19783 transf_random_seed_pos = strchr (final_random_seed_pos, '*');
19784
19785 if (transf_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19786
19787 final_random_seed_len = transf_random_seed_pos - final_random_seed_pos;
19788
19789 if (keepass->version == 1 && final_random_seed_len != 32) return (PARSER_SALT_LENGTH);
19790 if (keepass->version == 2 && final_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19791
19792 transf_random_seed_pos++;
19793
19794 keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]);
19795 keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]);
19796 keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]);
19797 keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]);
19798 keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]);
19799 keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]);
19800 keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]);
19801 keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]);
19802
19803 enc_iv_pos = strchr (transf_random_seed_pos, '*');
19804
19805 if (enc_iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19806
19807 transf_random_seed_len = enc_iv_pos - transf_random_seed_pos;
19808
19809 if (transf_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19810
19811 enc_iv_pos++;
19812
19813 keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]);
19814 keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]);
19815 keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]);
19816 keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]);
19817
19818 if (keepass->version == 1)
19819 {
19820 contents_hash_pos = strchr (enc_iv_pos, '*');
19821
19822 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19823
19824 enc_iv_len = contents_hash_pos - enc_iv_pos;
19825
19826 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19827
19828 contents_hash_pos++;
19829
19830 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19831 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19832 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19833 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19834 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19835 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19836 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19837 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19838
19839 /* get length of contents following */
19840 char *inline_flag_pos = strchr (contents_hash_pos, '*');
19841
19842 if (inline_flag_pos == NULL) return (PARSER_SALT_LENGTH);
19843
19844 contents_hash_len = inline_flag_pos - contents_hash_pos;
19845
19846 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19847
19848 inline_flag_pos++;
19849
19850 u32 inline_flag = atoi (inline_flag_pos);
19851
19852 if (inline_flag != 1) return (PARSER_SALT_LENGTH);
19853
19854 contents_len_pos = strchr (inline_flag_pos, '*');
19855
19856 if (contents_len_pos == NULL) return (PARSER_SALT_LENGTH);
19857
19858 contents_len_pos++;
19859
19860 contents_len = atoi (contents_len_pos);
19861
19862 if (contents_len > 50000) return (PARSER_SALT_LENGTH);
19863
19864 contents_pos = strchr (contents_len_pos, '*');
19865
19866 if (contents_pos == NULL) return (PARSER_SALT_LENGTH);
19867
19868 contents_pos++;
19869
19870 u32 i;
19871
19872 keepass->contents_len = contents_len;
19873
19874 contents_len = contents_len / 4;
19875
19876 keyfile_inline_pos = strchr (contents_pos, '*');
19877
19878 u32 real_contents_len;
19879
19880 if (keyfile_inline_pos == NULL)
19881 real_contents_len = input_len - (contents_pos - input_buf);
19882 else
19883 {
19884 real_contents_len = keyfile_inline_pos - contents_pos;
19885 keyfile_inline_pos++;
19886 is_keyfile_present = 1;
19887 }
19888
19889 if (real_contents_len != keepass->contents_len * 2) return (PARSER_SALT_LENGTH);
19890
19891 for (i = 0; i < contents_len; i++)
19892 keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]);
19893 }
19894 else if (keepass->version == 2)
19895 {
19896 expected_bytes_pos = strchr (enc_iv_pos, '*');
19897
19898 if (expected_bytes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19899
19900 enc_iv_len = expected_bytes_pos - enc_iv_pos;
19901
19902 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19903
19904 expected_bytes_pos++;
19905
19906 keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]);
19907 keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]);
19908 keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]);
19909 keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]);
19910 keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]);
19911 keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]);
19912 keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]);
19913 keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]);
19914
19915 contents_hash_pos = strchr (expected_bytes_pos, '*');
19916
19917 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19918
19919 expected_bytes_len = contents_hash_pos - expected_bytes_pos;
19920
19921 if (expected_bytes_len != 64) return (PARSER_SALT_LENGTH);
19922
19923 contents_hash_pos++;
19924
19925 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19926 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19927 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19928 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19929 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19930 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19931 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19932 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19933
19934 keyfile_inline_pos = strchr (contents_hash_pos, '*');
19935
19936 if (keyfile_inline_pos == NULL)
19937 contents_hash_len = input_len - (int) (contents_hash_pos - input_buf);
19938 else
19939 {
19940 contents_hash_len = keyfile_inline_pos - contents_hash_pos;
19941 keyfile_inline_pos++;
19942 is_keyfile_present = 1;
19943 }
19944 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19945 }
19946
19947 if (is_keyfile_present != 0)
19948 {
19949 keyfile_len_pos = strchr (keyfile_inline_pos, '*');
19950
19951 keyfile_len_pos++;
19952
19953 keyfile_len = atoi (keyfile_len_pos);
19954
19955 keepass->keyfile_len = keyfile_len;
19956
19957 if (keyfile_len != 64) return (PARSER_SALT_LENGTH);
19958
19959 keyfile_pos = strchr (keyfile_len_pos, '*');
19960
19961 if (keyfile_pos == NULL) return (PARSER_SALT_LENGTH);
19962
19963 keyfile_pos++;
19964
19965 u32 real_keyfile_len = input_len - (keyfile_pos - input_buf);
19966
19967 if (real_keyfile_len != 64) return (PARSER_SALT_LENGTH);
19968
19969 keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]);
19970 keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]);
19971 keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]);
19972 keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]);
19973 keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]);
19974 keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]);
19975 keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]);
19976 keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]);
19977 }
19978
19979 digest[0] = keepass->enc_iv[0];
19980 digest[1] = keepass->enc_iv[1];
19981 digest[2] = keepass->enc_iv[2];
19982 digest[3] = keepass->enc_iv[3];
19983
19984 salt->salt_buf[0] = keepass->transf_random_seed[0];
19985 salt->salt_buf[1] = keepass->transf_random_seed[1];
19986 salt->salt_buf[2] = keepass->transf_random_seed[2];
19987 salt->salt_buf[3] = keepass->transf_random_seed[3];
19988 salt->salt_buf[4] = keepass->transf_random_seed[4];
19989 salt->salt_buf[5] = keepass->transf_random_seed[5];
19990 salt->salt_buf[6] = keepass->transf_random_seed[6];
19991 salt->salt_buf[7] = keepass->transf_random_seed[7];
19992
19993 return (PARSER_OK);
19994 }
19995
19996 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19997 {
19998 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
19999
20000 u32 *digest = (u32 *) hash_buf->digest;
20001
20002 salt_t *salt = hash_buf->salt;
20003
20004 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
20005 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
20006 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
20007 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
20008 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
20009 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
20010 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
20011 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
20012
20013 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
20014
20015 uint salt_len = input_len - 64 - 1;
20016
20017 char *salt_buf = input_buf + 64 + 1;
20018
20019 char *salt_buf_ptr = (char *) salt->salt_buf;
20020
20021 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
20022
20023 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
20024
20025 salt->salt_len = salt_len;
20026
20027 /**
20028 * we can precompute the first sha256 transform
20029 */
20030
20031 uint w[16] = { 0 };
20032
20033 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
20034 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
20035 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
20036 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
20037 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
20038 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
20039 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
20040 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
20041 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
20042 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
20043 w[10] = byte_swap_32 (salt->salt_buf[10]);
20044 w[11] = byte_swap_32 (salt->salt_buf[11]);
20045 w[12] = byte_swap_32 (salt->salt_buf[12]);
20046 w[13] = byte_swap_32 (salt->salt_buf[13]);
20047 w[14] = byte_swap_32 (salt->salt_buf[14]);
20048 w[15] = byte_swap_32 (salt->salt_buf[15]);
20049
20050 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
20051
20052 sha256_64 (w, pc256);
20053
20054 salt->salt_buf_pc[0] = pc256[0];
20055 salt->salt_buf_pc[1] = pc256[1];
20056 salt->salt_buf_pc[2] = pc256[2];
20057 salt->salt_buf_pc[3] = pc256[3];
20058 salt->salt_buf_pc[4] = pc256[4];
20059 salt->salt_buf_pc[5] = pc256[5];
20060 salt->salt_buf_pc[6] = pc256[6];
20061 salt->salt_buf_pc[7] = pc256[7];
20062
20063 digest[0] -= pc256[0];
20064 digest[1] -= pc256[1];
20065 digest[2] -= pc256[2];
20066 digest[3] -= pc256[3];
20067 digest[4] -= pc256[4];
20068 digest[5] -= pc256[5];
20069 digest[6] -= pc256[6];
20070 digest[7] -= pc256[7];
20071
20072 return (PARSER_OK);
20073 }
20074
20075 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20076 {
20077 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
20078
20079 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
20080
20081 u32 *digest = (u32 *) hash_buf->digest;
20082
20083 salt_t *salt = hash_buf->salt;
20084
20085 /**
20086 * parse line
20087 */
20088
20089 char *data_len_pos = input_buf + 1 + 10 + 1;
20090
20091 char *data_buf_pos = strchr (data_len_pos, '$');
20092
20093 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20094
20095 u32 data_len_len = data_buf_pos - data_len_pos;
20096
20097 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
20098 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
20099
20100 data_buf_pos++;
20101
20102 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
20103
20104 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
20105
20106 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
20107
20108 u32 data_len = atoi (data_len_pos);
20109
20110 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
20111
20112 /**
20113 * salt
20114 */
20115
20116 char *salt_pos = data_buf_pos;
20117
20118 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20119 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20120 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
20121 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
20122
20123 // this is actually the CT, which is also the hash later (if matched)
20124
20125 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
20126 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
20127 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
20128 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
20129
20130 salt->salt_len = 32; // note we need to fix this to 16 in kernel
20131
20132 salt->salt_iter = 10 - 1;
20133
20134 /**
20135 * digest buf
20136 */
20137
20138 digest[0] = salt->salt_buf[4];
20139 digest[1] = salt->salt_buf[5];
20140 digest[2] = salt->salt_buf[6];
20141 digest[3] = salt->salt_buf[7];
20142
20143 return (PARSER_OK);
20144 }
20145
20146 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20147 {
20148 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
20149
20150 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
20151
20152 u32 *digest = (u32 *) hash_buf->digest;
20153
20154 salt_t *salt = hash_buf->salt;
20155
20156 /**
20157 * parse line
20158 */
20159
20160 char *salt_pos = input_buf + 11 + 1;
20161
20162 char *iter_pos = strchr (salt_pos, ',');
20163
20164 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20165
20166 u32 salt_len = iter_pos - salt_pos;
20167
20168 if (salt_len != 20) return (PARSER_SALT_LENGTH);
20169
20170 iter_pos++;
20171
20172 char *hash_pos = strchr (iter_pos, ',');
20173
20174 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20175
20176 u32 iter_len = hash_pos - iter_pos;
20177
20178 if (iter_len > 5) return (PARSER_SALT_LENGTH);
20179
20180 hash_pos++;
20181
20182 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
20183
20184 if (hash_len != 64) return (PARSER_HASH_LENGTH);
20185
20186 /**
20187 * salt
20188 */
20189
20190 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20191 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20192 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
20193 salt->salt_buf[3] = 0x00018000;
20194
20195 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
20196 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
20197 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
20198 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
20199
20200 salt->salt_len = salt_len / 2;
20201
20202 salt->salt_iter = atoi (iter_pos) - 1;
20203
20204 /**
20205 * digest buf
20206 */
20207
20208 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20209 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20210 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20211 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20212 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20213 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20214 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20215 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20216
20217 return (PARSER_OK);
20218 }
20219
20220 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20221 {
20222 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
20223
20224 u32 *digest = (u32 *) hash_buf->digest;
20225
20226 salt_t *salt = hash_buf->salt;
20227
20228 /**
20229 * parse line
20230 */
20231
20232 char *hash_pos = input_buf + 64;
20233 char *salt1_pos = input_buf + 128;
20234 char *salt2_pos = input_buf;
20235
20236 /**
20237 * salt
20238 */
20239
20240 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
20241 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
20242 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
20243 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
20244
20245 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
20246 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
20247 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
20248 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
20249
20250 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
20251 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
20252 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
20253 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
20254
20255 salt->salt_len = 48;
20256
20257 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
20258
20259 /**
20260 * digest buf
20261 */
20262
20263 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20264 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20265 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20266 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20267 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20268 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20269 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20270 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20271
20272 return (PARSER_OK);
20273 }
20274
20275 int zip2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20276 {
20277 if ((input_len < DISPLAY_LEN_MIN_13600) || (input_len > DISPLAY_LEN_MAX_13600)) return (PARSER_GLOBAL_LENGTH);
20278
20279 if (memcmp (SIGNATURE_ZIP2_START, input_buf , 6)) return (PARSER_SIGNATURE_UNMATCHED);
20280 if (memcmp (SIGNATURE_ZIP2_STOP , input_buf + input_len - 7, 7)) return (PARSER_SIGNATURE_UNMATCHED);
20281
20282 u32 *digest = (u32 *) hash_buf->digest;
20283
20284 salt_t *salt = hash_buf->salt;
20285
20286 zip2_t *zip2 = (zip2_t *) hash_buf->esalt;
20287
20288 /**
20289 * parse line
20290 */
20291
20292 char *param0_pos = input_buf + 6 + 1;
20293
20294 char *param1_pos = strchr (param0_pos, '*');
20295
20296 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20297
20298 u32 param0_len = param1_pos - param0_pos;
20299
20300 param1_pos++;
20301
20302 char *param2_pos = strchr (param1_pos, '*');
20303
20304 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20305
20306 u32 param1_len = param2_pos - param1_pos;
20307
20308 param2_pos++;
20309
20310 char *param3_pos = strchr (param2_pos, '*');
20311
20312 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20313
20314 u32 param2_len = param3_pos - param2_pos;
20315
20316 param3_pos++;
20317
20318 char *param4_pos = strchr (param3_pos, '*');
20319
20320 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20321
20322 u32 param3_len = param4_pos - param3_pos;
20323
20324 param4_pos++;
20325
20326 char *param5_pos = strchr (param4_pos, '*');
20327
20328 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20329
20330 u32 param4_len = param5_pos - param4_pos;
20331
20332 param5_pos++;
20333
20334 char *param6_pos = strchr (param5_pos, '*');
20335
20336 if (param6_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20337
20338 u32 param5_len = param6_pos - param5_pos;
20339
20340 param6_pos++;
20341
20342 char *param7_pos = strchr (param6_pos, '*');
20343
20344 if (param7_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20345
20346 u32 param6_len = param7_pos - param6_pos;
20347
20348 param7_pos++;
20349
20350 char *param8_pos = strchr (param7_pos, '*');
20351
20352 if (param8_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20353
20354 u32 param7_len = param8_pos - param7_pos;
20355
20356 param8_pos++;
20357
20358 const uint type = atoi (param0_pos);
20359 const uint mode = atoi (param1_pos);
20360 const uint magic = atoi (param2_pos);
20361
20362 char *salt_buf = param3_pos;
20363
20364 uint verify_bytes; sscanf (param4_pos, "%4x*", &verify_bytes);
20365
20366 const uint compress_length = atoi (param5_pos);
20367
20368 char *data_buf = param6_pos;
20369 char *auth = param7_pos;
20370
20371 /**
20372 * verify some data
20373 */
20374
20375 if (param0_len != 1) return (PARSER_SALT_VALUE);
20376
20377 if (param1_len != 1) return (PARSER_SALT_VALUE);
20378
20379 if (param2_len != 1) return (PARSER_SALT_VALUE);
20380
20381 if ((param3_len != 16) && (param3_len != 24) && (param3_len != 32)) return (PARSER_SALT_VALUE);
20382
20383 if (param4_len >= 5) return (PARSER_SALT_VALUE);
20384
20385 if (param5_len >= 5) return (PARSER_SALT_VALUE);
20386
20387 if (param6_len >= 8192) return (PARSER_SALT_VALUE);
20388
20389 if (param6_len & 1) return (PARSER_SALT_VALUE);
20390
20391 if (param7_len != 20) return (PARSER_SALT_VALUE);
20392
20393 if (type != 0) return (PARSER_SALT_VALUE);
20394
20395 if ((mode != 1) && (mode != 2) && (mode != 3)) return (PARSER_SALT_VALUE);
20396
20397 if (magic != 0) return (PARSER_SALT_VALUE);
20398
20399 if (verify_bytes >= 0x10000) return (PARSER_SALT_VALUE);
20400
20401 /**
20402 * store data
20403 */
20404
20405 zip2->type = type;
20406 zip2->mode = mode;
20407 zip2->magic = magic;
20408
20409 if (mode == 1)
20410 {
20411 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20412 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20413 zip2->salt_buf[2] = 0;
20414 zip2->salt_buf[3] = 0;
20415
20416 zip2->salt_len = 8;
20417 }
20418 else if (mode == 2)
20419 {
20420 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20421 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20422 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20423 zip2->salt_buf[3] = 0;
20424
20425 zip2->salt_len = 12;
20426 }
20427 else if (mode == 3)
20428 {
20429 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20430 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20431 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20432 zip2->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
20433
20434 zip2->salt_len = 16;
20435 }
20436
20437 zip2->salt_buf[0] = byte_swap_32 (zip2->salt_buf[0]);
20438 zip2->salt_buf[1] = byte_swap_32 (zip2->salt_buf[1]);
20439 zip2->salt_buf[2] = byte_swap_32 (zip2->salt_buf[2]);
20440 zip2->salt_buf[3] = byte_swap_32 (zip2->salt_buf[3]);
20441
20442 zip2->verify_bytes = verify_bytes;
20443
20444 zip2->compress_length = compress_length;
20445
20446 char *data_buf_ptr = (char *) zip2->data_buf;
20447
20448 for (uint i = 0; i < param6_len; i += 2)
20449 {
20450 const char p0 = data_buf[i + 0];
20451 const char p1 = data_buf[i + 1];
20452
20453 *data_buf_ptr++ = hex_convert (p1) << 0
20454 | hex_convert (p0) << 4;
20455
20456 zip2->data_len++;
20457 }
20458
20459 *data_buf_ptr = 0x80;
20460
20461 char *auth_ptr = (char *) zip2->auth_buf;
20462
20463 for (uint i = 0; i < param7_len; i += 2)
20464 {
20465 const char p0 = auth[i + 0];
20466 const char p1 = auth[i + 1];
20467
20468 *auth_ptr++ = hex_convert (p1) << 0
20469 | hex_convert (p0) << 4;
20470
20471 zip2->auth_len++;
20472 }
20473
20474 /**
20475 * salt buf (fake)
20476 */
20477
20478 salt->salt_buf[0] = zip2->salt_buf[0];
20479 salt->salt_buf[1] = zip2->salt_buf[1];
20480 salt->salt_buf[2] = zip2->salt_buf[2];
20481 salt->salt_buf[3] = zip2->salt_buf[3];
20482 salt->salt_buf[4] = zip2->data_buf[0];
20483 salt->salt_buf[5] = zip2->data_buf[1];
20484 salt->salt_buf[6] = zip2->data_buf[2];
20485 salt->salt_buf[7] = zip2->data_buf[3];
20486
20487 salt->salt_len = 32;
20488
20489 salt->salt_iter = ROUNDS_ZIP2 - 1;
20490
20491 /**
20492 * digest buf (fake)
20493 */
20494
20495 digest[0] = zip2->auth_buf[0];
20496 digest[1] = zip2->auth_buf[1];
20497 digest[2] = zip2->auth_buf[2];
20498 digest[3] = zip2->auth_buf[3];
20499
20500 return (PARSER_OK);
20501 }
20502
20503 /**
20504 * parallel running threads
20505 */
20506
20507 #ifdef WIN
20508
20509 BOOL WINAPI sigHandler_default (DWORD sig)
20510 {
20511 switch (sig)
20512 {
20513 case CTRL_CLOSE_EVENT:
20514
20515 /*
20516 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
20517 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
20518 * function otherwise it is too late (e.g. after returning from this function)
20519 */
20520
20521 myabort ();
20522
20523 SetConsoleCtrlHandler (NULL, TRUE);
20524
20525 hc_sleep (10);
20526
20527 return TRUE;
20528
20529 case CTRL_C_EVENT:
20530 case CTRL_LOGOFF_EVENT:
20531 case CTRL_SHUTDOWN_EVENT:
20532
20533 myabort ();
20534
20535 SetConsoleCtrlHandler (NULL, TRUE);
20536
20537 return TRUE;
20538 }
20539
20540 return FALSE;
20541 }
20542
20543 BOOL WINAPI sigHandler_benchmark (DWORD sig)
20544 {
20545 switch (sig)
20546 {
20547 case CTRL_CLOSE_EVENT:
20548
20549 myabort ();
20550
20551 SetConsoleCtrlHandler (NULL, TRUE);
20552
20553 hc_sleep (10);
20554
20555 return TRUE;
20556
20557 case CTRL_C_EVENT:
20558 case CTRL_LOGOFF_EVENT:
20559 case CTRL_SHUTDOWN_EVENT:
20560
20561 myquit ();
20562
20563 SetConsoleCtrlHandler (NULL, TRUE);
20564
20565 return TRUE;
20566 }
20567
20568 return FALSE;
20569 }
20570
20571 void hc_signal (BOOL WINAPI (callback) (DWORD))
20572 {
20573 if (callback == NULL)
20574 {
20575 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
20576 }
20577 else
20578 {
20579 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
20580 }
20581 }
20582
20583 #else
20584
20585 void sigHandler_default (int sig)
20586 {
20587 myabort ();
20588
20589 signal (sig, NULL);
20590 }
20591
20592 void sigHandler_benchmark (int sig)
20593 {
20594 myquit ();
20595
20596 signal (sig, NULL);
20597 }
20598
20599 void hc_signal (void (callback) (int))
20600 {
20601 if (callback == NULL) callback = SIG_DFL;
20602
20603 signal (SIGINT, callback);
20604 signal (SIGTERM, callback);
20605 signal (SIGABRT, callback);
20606 }
20607
20608 #endif
20609
20610 void status_display ();
20611
20612 void *thread_keypress (void *p)
20613 {
20614 int benchmark = *((int *) p);
20615
20616 uint quiet = data.quiet;
20617
20618 tty_break();
20619
20620 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
20621 {
20622 int ch = tty_getchar();
20623
20624 if (ch == -1) break;
20625
20626 if (ch == 0) continue;
20627
20628 //https://github.com/hashcat/hashcat/issues/302
20629 //#ifdef _POSIX
20630 //if (ch != '\n')
20631 //#endif
20632
20633 hc_thread_mutex_lock (mux_display);
20634
20635 log_info ("");
20636
20637 switch (ch)
20638 {
20639 case 's':
20640 case '\r':
20641 case '\n':
20642
20643 log_info ("");
20644
20645 status_display ();
20646
20647 log_info ("");
20648
20649 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20650 if (quiet == 0) fflush (stdout);
20651
20652 break;
20653
20654 case 'b':
20655
20656 log_info ("");
20657
20658 bypass ();
20659
20660 log_info ("");
20661
20662 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20663 if (quiet == 0) fflush (stdout);
20664
20665 break;
20666
20667 case 'p':
20668
20669 log_info ("");
20670
20671 SuspendThreads ();
20672
20673 log_info ("");
20674
20675 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20676 if (quiet == 0) fflush (stdout);
20677
20678 break;
20679
20680 case 'r':
20681
20682 log_info ("");
20683
20684 ResumeThreads ();
20685
20686 log_info ("");
20687
20688 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20689 if (quiet == 0) fflush (stdout);
20690
20691 break;
20692
20693 case 'c':
20694
20695 log_info ("");
20696
20697 if (benchmark == 1) break;
20698
20699 stop_at_checkpoint ();
20700
20701 log_info ("");
20702
20703 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20704 if (quiet == 0) fflush (stdout);
20705
20706 break;
20707
20708 case 'q':
20709
20710 log_info ("");
20711
20712 if (benchmark == 1)
20713 {
20714 myquit ();
20715 }
20716 else
20717 {
20718 myabort ();
20719 }
20720
20721 break;
20722 }
20723
20724 //https://github.com/hashcat/hashcat/issues/302
20725 //#ifdef _POSIX
20726 //if (ch != '\n')
20727 //#endif
20728
20729 hc_thread_mutex_unlock (mux_display);
20730 }
20731
20732 tty_fix();
20733
20734 return (p);
20735 }
20736
20737 /**
20738 * rules common
20739 */
20740
20741 bool class_num (const u8 c)
20742 {
20743 return ((c >= '0') && (c <= '9'));
20744 }
20745
20746 bool class_lower (const u8 c)
20747 {
20748 return ((c >= 'a') && (c <= 'z'));
20749 }
20750
20751 bool class_upper (const u8 c)
20752 {
20753 return ((c >= 'A') && (c <= 'Z'));
20754 }
20755
20756 bool class_alpha (const u8 c)
20757 {
20758 return (class_lower (c) || class_upper (c));
20759 }
20760
20761 int conv_ctoi (const u8 c)
20762 {
20763 if (class_num (c))
20764 {
20765 return c - '0';
20766 }
20767 else if (class_upper (c))
20768 {
20769 return c - 'A' + 10;
20770 }
20771
20772 return -1;
20773 }
20774
20775 int conv_itoc (const u8 c)
20776 {
20777 if (c < 10)
20778 {
20779 return c + '0';
20780 }
20781 else if (c < 37)
20782 {
20783 return c + 'A' - 10;
20784 }
20785
20786 return -1;
20787 }
20788
20789 /**
20790 * device rules
20791 */
20792
20793 #define INCR_POS if (++rule_pos == rule_len) return (-1)
20794 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
20795 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
20796 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
20797 #define MAX_KERNEL_RULES 255
20798 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
20799 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20800 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20801
20802 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
20803 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
20804 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20805 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20806
20807 int cpu_rule_to_kernel_rule (char *rule_buf, uint rule_len, kernel_rule_t *rule)
20808 {
20809 uint rule_pos;
20810 uint rule_cnt;
20811
20812 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
20813 {
20814 switch (rule_buf[rule_pos])
20815 {
20816 case ' ':
20817 rule_cnt--;
20818 break;
20819
20820 case RULE_OP_MANGLE_NOOP:
20821 SET_NAME (rule, rule_buf[rule_pos]);
20822 break;
20823
20824 case RULE_OP_MANGLE_LREST:
20825 SET_NAME (rule, rule_buf[rule_pos]);
20826 break;
20827
20828 case RULE_OP_MANGLE_UREST:
20829 SET_NAME (rule, rule_buf[rule_pos]);
20830 break;
20831
20832 case RULE_OP_MANGLE_LREST_UFIRST:
20833 SET_NAME (rule, rule_buf[rule_pos]);
20834 break;
20835
20836 case RULE_OP_MANGLE_UREST_LFIRST:
20837 SET_NAME (rule, rule_buf[rule_pos]);
20838 break;
20839
20840 case RULE_OP_MANGLE_TREST:
20841 SET_NAME (rule, rule_buf[rule_pos]);
20842 break;
20843
20844 case RULE_OP_MANGLE_TOGGLE_AT:
20845 SET_NAME (rule, rule_buf[rule_pos]);
20846 SET_P0_CONV (rule, rule_buf[rule_pos]);
20847 break;
20848
20849 case RULE_OP_MANGLE_REVERSE:
20850 SET_NAME (rule, rule_buf[rule_pos]);
20851 break;
20852
20853 case RULE_OP_MANGLE_DUPEWORD:
20854 SET_NAME (rule, rule_buf[rule_pos]);
20855 break;
20856
20857 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20858 SET_NAME (rule, rule_buf[rule_pos]);
20859 SET_P0_CONV (rule, rule_buf[rule_pos]);
20860 break;
20861
20862 case RULE_OP_MANGLE_REFLECT:
20863 SET_NAME (rule, rule_buf[rule_pos]);
20864 break;
20865
20866 case RULE_OP_MANGLE_ROTATE_LEFT:
20867 SET_NAME (rule, rule_buf[rule_pos]);
20868 break;
20869
20870 case RULE_OP_MANGLE_ROTATE_RIGHT:
20871 SET_NAME (rule, rule_buf[rule_pos]);
20872 break;
20873
20874 case RULE_OP_MANGLE_APPEND:
20875 SET_NAME (rule, rule_buf[rule_pos]);
20876 SET_P0 (rule, rule_buf[rule_pos]);
20877 break;
20878
20879 case RULE_OP_MANGLE_PREPEND:
20880 SET_NAME (rule, rule_buf[rule_pos]);
20881 SET_P0 (rule, rule_buf[rule_pos]);
20882 break;
20883
20884 case RULE_OP_MANGLE_DELETE_FIRST:
20885 SET_NAME (rule, rule_buf[rule_pos]);
20886 break;
20887
20888 case RULE_OP_MANGLE_DELETE_LAST:
20889 SET_NAME (rule, rule_buf[rule_pos]);
20890 break;
20891
20892 case RULE_OP_MANGLE_DELETE_AT:
20893 SET_NAME (rule, rule_buf[rule_pos]);
20894 SET_P0_CONV (rule, rule_buf[rule_pos]);
20895 break;
20896
20897 case RULE_OP_MANGLE_EXTRACT:
20898 SET_NAME (rule, rule_buf[rule_pos]);
20899 SET_P0_CONV (rule, rule_buf[rule_pos]);
20900 SET_P1_CONV (rule, rule_buf[rule_pos]);
20901 break;
20902
20903 case RULE_OP_MANGLE_OMIT:
20904 SET_NAME (rule, rule_buf[rule_pos]);
20905 SET_P0_CONV (rule, rule_buf[rule_pos]);
20906 SET_P1_CONV (rule, rule_buf[rule_pos]);
20907 break;
20908
20909 case RULE_OP_MANGLE_INSERT:
20910 SET_NAME (rule, rule_buf[rule_pos]);
20911 SET_P0_CONV (rule, rule_buf[rule_pos]);
20912 SET_P1 (rule, rule_buf[rule_pos]);
20913 break;
20914
20915 case RULE_OP_MANGLE_OVERSTRIKE:
20916 SET_NAME (rule, rule_buf[rule_pos]);
20917 SET_P0_CONV (rule, rule_buf[rule_pos]);
20918 SET_P1 (rule, rule_buf[rule_pos]);
20919 break;
20920
20921 case RULE_OP_MANGLE_TRUNCATE_AT:
20922 SET_NAME (rule, rule_buf[rule_pos]);
20923 SET_P0_CONV (rule, rule_buf[rule_pos]);
20924 break;
20925
20926 case RULE_OP_MANGLE_REPLACE:
20927 SET_NAME (rule, rule_buf[rule_pos]);
20928 SET_P0 (rule, rule_buf[rule_pos]);
20929 SET_P1 (rule, rule_buf[rule_pos]);
20930 break;
20931
20932 case RULE_OP_MANGLE_PURGECHAR:
20933 return (-1);
20934 break;
20935
20936 case RULE_OP_MANGLE_TOGGLECASE_REC:
20937 return (-1);
20938 break;
20939
20940 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20941 SET_NAME (rule, rule_buf[rule_pos]);
20942 SET_P0_CONV (rule, rule_buf[rule_pos]);
20943 break;
20944
20945 case RULE_OP_MANGLE_DUPECHAR_LAST:
20946 SET_NAME (rule, rule_buf[rule_pos]);
20947 SET_P0_CONV (rule, rule_buf[rule_pos]);
20948 break;
20949
20950 case RULE_OP_MANGLE_DUPECHAR_ALL:
20951 SET_NAME (rule, rule_buf[rule_pos]);
20952 break;
20953
20954 case RULE_OP_MANGLE_SWITCH_FIRST:
20955 SET_NAME (rule, rule_buf[rule_pos]);
20956 break;
20957
20958 case RULE_OP_MANGLE_SWITCH_LAST:
20959 SET_NAME (rule, rule_buf[rule_pos]);
20960 break;
20961
20962 case RULE_OP_MANGLE_SWITCH_AT:
20963 SET_NAME (rule, rule_buf[rule_pos]);
20964 SET_P0_CONV (rule, rule_buf[rule_pos]);
20965 SET_P1_CONV (rule, rule_buf[rule_pos]);
20966 break;
20967
20968 case RULE_OP_MANGLE_CHR_SHIFTL:
20969 SET_NAME (rule, rule_buf[rule_pos]);
20970 SET_P0_CONV (rule, rule_buf[rule_pos]);
20971 break;
20972
20973 case RULE_OP_MANGLE_CHR_SHIFTR:
20974 SET_NAME (rule, rule_buf[rule_pos]);
20975 SET_P0_CONV (rule, rule_buf[rule_pos]);
20976 break;
20977
20978 case RULE_OP_MANGLE_CHR_INCR:
20979 SET_NAME (rule, rule_buf[rule_pos]);
20980 SET_P0_CONV (rule, rule_buf[rule_pos]);
20981 break;
20982
20983 case RULE_OP_MANGLE_CHR_DECR:
20984 SET_NAME (rule, rule_buf[rule_pos]);
20985 SET_P0_CONV (rule, rule_buf[rule_pos]);
20986 break;
20987
20988 case RULE_OP_MANGLE_REPLACE_NP1:
20989 SET_NAME (rule, rule_buf[rule_pos]);
20990 SET_P0_CONV (rule, rule_buf[rule_pos]);
20991 break;
20992
20993 case RULE_OP_MANGLE_REPLACE_NM1:
20994 SET_NAME (rule, rule_buf[rule_pos]);
20995 SET_P0_CONV (rule, rule_buf[rule_pos]);
20996 break;
20997
20998 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20999 SET_NAME (rule, rule_buf[rule_pos]);
21000 SET_P0_CONV (rule, rule_buf[rule_pos]);
21001 break;
21002
21003 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21004 SET_NAME (rule, rule_buf[rule_pos]);
21005 SET_P0_CONV (rule, rule_buf[rule_pos]);
21006 break;
21007
21008 case RULE_OP_MANGLE_TITLE:
21009 SET_NAME (rule, rule_buf[rule_pos]);
21010 break;
21011
21012 default:
21013 return (-1);
21014 break;
21015 }
21016 }
21017
21018 if (rule_pos < rule_len) return (-1);
21019
21020 return (0);
21021 }
21022
21023 int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule)
21024 {
21025 uint rule_cnt;
21026 uint rule_pos;
21027 uint rule_len = HCBUFSIZ - 1; // maximum possible len
21028
21029 char rule_cmd;
21030
21031 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
21032 {
21033 GET_NAME (rule);
21034
21035 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
21036
21037 switch (rule_cmd)
21038 {
21039 case RULE_OP_MANGLE_NOOP:
21040 rule_buf[rule_pos] = rule_cmd;
21041 break;
21042
21043 case RULE_OP_MANGLE_LREST:
21044 rule_buf[rule_pos] = rule_cmd;
21045 break;
21046
21047 case RULE_OP_MANGLE_UREST:
21048 rule_buf[rule_pos] = rule_cmd;
21049 break;
21050
21051 case RULE_OP_MANGLE_LREST_UFIRST:
21052 rule_buf[rule_pos] = rule_cmd;
21053 break;
21054
21055 case RULE_OP_MANGLE_UREST_LFIRST:
21056 rule_buf[rule_pos] = rule_cmd;
21057 break;
21058
21059 case RULE_OP_MANGLE_TREST:
21060 rule_buf[rule_pos] = rule_cmd;
21061 break;
21062
21063 case RULE_OP_MANGLE_TOGGLE_AT:
21064 rule_buf[rule_pos] = rule_cmd;
21065 GET_P0_CONV (rule);
21066 break;
21067
21068 case RULE_OP_MANGLE_REVERSE:
21069 rule_buf[rule_pos] = rule_cmd;
21070 break;
21071
21072 case RULE_OP_MANGLE_DUPEWORD:
21073 rule_buf[rule_pos] = rule_cmd;
21074 break;
21075
21076 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21077 rule_buf[rule_pos] = rule_cmd;
21078 GET_P0_CONV (rule);
21079 break;
21080
21081 case RULE_OP_MANGLE_REFLECT:
21082 rule_buf[rule_pos] = rule_cmd;
21083 break;
21084
21085 case RULE_OP_MANGLE_ROTATE_LEFT:
21086 rule_buf[rule_pos] = rule_cmd;
21087 break;
21088
21089 case RULE_OP_MANGLE_ROTATE_RIGHT:
21090 rule_buf[rule_pos] = rule_cmd;
21091 break;
21092
21093 case RULE_OP_MANGLE_APPEND:
21094 rule_buf[rule_pos] = rule_cmd;
21095 GET_P0 (rule);
21096 break;
21097
21098 case RULE_OP_MANGLE_PREPEND:
21099 rule_buf[rule_pos] = rule_cmd;
21100 GET_P0 (rule);
21101 break;
21102
21103 case RULE_OP_MANGLE_DELETE_FIRST:
21104 rule_buf[rule_pos] = rule_cmd;
21105 break;
21106
21107 case RULE_OP_MANGLE_DELETE_LAST:
21108 rule_buf[rule_pos] = rule_cmd;
21109 break;
21110
21111 case RULE_OP_MANGLE_DELETE_AT:
21112 rule_buf[rule_pos] = rule_cmd;
21113 GET_P0_CONV (rule);
21114 break;
21115
21116 case RULE_OP_MANGLE_EXTRACT:
21117 rule_buf[rule_pos] = rule_cmd;
21118 GET_P0_CONV (rule);
21119 GET_P1_CONV (rule);
21120 break;
21121
21122 case RULE_OP_MANGLE_OMIT:
21123 rule_buf[rule_pos] = rule_cmd;
21124 GET_P0_CONV (rule);
21125 GET_P1_CONV (rule);
21126 break;
21127
21128 case RULE_OP_MANGLE_INSERT:
21129 rule_buf[rule_pos] = rule_cmd;
21130 GET_P0_CONV (rule);
21131 GET_P1 (rule);
21132 break;
21133
21134 case RULE_OP_MANGLE_OVERSTRIKE:
21135 rule_buf[rule_pos] = rule_cmd;
21136 GET_P0_CONV (rule);
21137 GET_P1 (rule);
21138 break;
21139
21140 case RULE_OP_MANGLE_TRUNCATE_AT:
21141 rule_buf[rule_pos] = rule_cmd;
21142 GET_P0_CONV (rule);
21143 break;
21144
21145 case RULE_OP_MANGLE_REPLACE:
21146 rule_buf[rule_pos] = rule_cmd;
21147 GET_P0 (rule);
21148 GET_P1 (rule);
21149 break;
21150
21151 case RULE_OP_MANGLE_PURGECHAR:
21152 return (-1);
21153 break;
21154
21155 case RULE_OP_MANGLE_TOGGLECASE_REC:
21156 return (-1);
21157 break;
21158
21159 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21160 rule_buf[rule_pos] = rule_cmd;
21161 GET_P0_CONV (rule);
21162 break;
21163
21164 case RULE_OP_MANGLE_DUPECHAR_LAST:
21165 rule_buf[rule_pos] = rule_cmd;
21166 GET_P0_CONV (rule);
21167 break;
21168
21169 case RULE_OP_MANGLE_DUPECHAR_ALL:
21170 rule_buf[rule_pos] = rule_cmd;
21171 break;
21172
21173 case RULE_OP_MANGLE_SWITCH_FIRST:
21174 rule_buf[rule_pos] = rule_cmd;
21175 break;
21176
21177 case RULE_OP_MANGLE_SWITCH_LAST:
21178 rule_buf[rule_pos] = rule_cmd;
21179 break;
21180
21181 case RULE_OP_MANGLE_SWITCH_AT:
21182 rule_buf[rule_pos] = rule_cmd;
21183 GET_P0_CONV (rule);
21184 GET_P1_CONV (rule);
21185 break;
21186
21187 case RULE_OP_MANGLE_CHR_SHIFTL:
21188 rule_buf[rule_pos] = rule_cmd;
21189 GET_P0_CONV (rule);
21190 break;
21191
21192 case RULE_OP_MANGLE_CHR_SHIFTR:
21193 rule_buf[rule_pos] = rule_cmd;
21194 GET_P0_CONV (rule);
21195 break;
21196
21197 case RULE_OP_MANGLE_CHR_INCR:
21198 rule_buf[rule_pos] = rule_cmd;
21199 GET_P0_CONV (rule);
21200 break;
21201
21202 case RULE_OP_MANGLE_CHR_DECR:
21203 rule_buf[rule_pos] = rule_cmd;
21204 GET_P0_CONV (rule);
21205 break;
21206
21207 case RULE_OP_MANGLE_REPLACE_NP1:
21208 rule_buf[rule_pos] = rule_cmd;
21209 GET_P0_CONV (rule);
21210 break;
21211
21212 case RULE_OP_MANGLE_REPLACE_NM1:
21213 rule_buf[rule_pos] = rule_cmd;
21214 GET_P0_CONV (rule);
21215 break;
21216
21217 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21218 rule_buf[rule_pos] = rule_cmd;
21219 GET_P0_CONV (rule);
21220 break;
21221
21222 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21223 rule_buf[rule_pos] = rule_cmd;
21224 GET_P0_CONV (rule);
21225 break;
21226
21227 case RULE_OP_MANGLE_TITLE:
21228 rule_buf[rule_pos] = rule_cmd;
21229 break;
21230
21231 case 0:
21232 return rule_pos - 1;
21233 break;
21234
21235 default:
21236 return (-1);
21237 break;
21238 }
21239 }
21240
21241 if (rule_cnt > 0)
21242 {
21243 return rule_pos;
21244 }
21245
21246 return (-1);
21247 }
21248
21249 /**
21250 * CPU rules : this is from hashcat sources, cpu based rules
21251 */
21252
21253 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
21254 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
21255
21256 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
21257 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
21258 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
21259
21260 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
21261 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
21262 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
21263
21264 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
21265 {
21266 int pos;
21267
21268 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
21269
21270 return (arr_len);
21271 }
21272
21273 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
21274 {
21275 int pos;
21276
21277 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
21278
21279 return (arr_len);
21280 }
21281
21282 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
21283 {
21284 int pos;
21285
21286 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
21287
21288 return (arr_len);
21289 }
21290
21291 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
21292 {
21293 int l;
21294 int r;
21295
21296 for (l = 0; l < arr_len; l++)
21297 {
21298 r = arr_len - 1 - l;
21299
21300 if (l >= r) break;
21301
21302 MANGLE_SWITCH (arr, l, r);
21303 }
21304
21305 return (arr_len);
21306 }
21307
21308 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
21309 {
21310 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21311
21312 memcpy (&arr[arr_len], arr, (size_t) arr_len);
21313
21314 return (arr_len * 2);
21315 }
21316
21317 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
21318 {
21319 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
21320
21321 int orig_len = arr_len;
21322
21323 int i;
21324
21325 for (i = 0; i < times; i++)
21326 {
21327 memcpy (&arr[arr_len], arr, orig_len);
21328
21329 arr_len += orig_len;
21330 }
21331
21332 return (arr_len);
21333 }
21334
21335 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
21336 {
21337 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21338
21339 mangle_double (arr, arr_len);
21340
21341 mangle_reverse (arr + arr_len, arr_len);
21342
21343 return (arr_len * 2);
21344 }
21345
21346 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
21347 {
21348 int l;
21349 int r;
21350
21351 for (l = 0, r = arr_len - 1; r > 0; r--)
21352 {
21353 MANGLE_SWITCH (arr, l, r);
21354 }
21355
21356 return (arr_len);
21357 }
21358
21359 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
21360 {
21361 int l;
21362 int r;
21363
21364 for (l = 0, r = arr_len - 1; l < r; l++)
21365 {
21366 MANGLE_SWITCH (arr, l, r);
21367 }
21368
21369 return (arr_len);
21370 }
21371
21372 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
21373 {
21374 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21375
21376 arr[arr_len] = c;
21377
21378 return (arr_len + 1);
21379 }
21380
21381 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
21382 {
21383 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21384
21385 int arr_pos;
21386
21387 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21388 {
21389 arr[arr_pos + 1] = arr[arr_pos];
21390 }
21391
21392 arr[0] = c;
21393
21394 return (arr_len + 1);
21395 }
21396
21397 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21398 {
21399 if (upos >= arr_len) return (arr_len);
21400
21401 int arr_pos;
21402
21403 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
21404 {
21405 arr[arr_pos] = arr[arr_pos + 1];
21406 }
21407
21408 return (arr_len - 1);
21409 }
21410
21411 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21412 {
21413 if (upos >= arr_len) return (arr_len);
21414
21415 if ((upos + ulen) > arr_len) return (arr_len);
21416
21417 int arr_pos;
21418
21419 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
21420 {
21421 arr[arr_pos] = arr[upos + arr_pos];
21422 }
21423
21424 return (ulen);
21425 }
21426
21427 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21428 {
21429 if (upos >= arr_len) return (arr_len);
21430
21431 if ((upos + ulen) >= arr_len) return (arr_len);
21432
21433 int arr_pos;
21434
21435 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
21436 {
21437 arr[arr_pos] = arr[arr_pos + ulen];
21438 }
21439
21440 return (arr_len - ulen);
21441 }
21442
21443 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21444 {
21445 if (upos >= arr_len) return (arr_len);
21446
21447 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21448
21449 int arr_pos;
21450
21451 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
21452 {
21453 arr[arr_pos + 1] = arr[arr_pos];
21454 }
21455
21456 arr[upos] = c;
21457
21458 return (arr_len + 1);
21459 }
21460
21461 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)
21462 {
21463 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21464
21465 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
21466
21467 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
21468
21469 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
21470
21471 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
21472
21473 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
21474
21475 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
21476
21477 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
21478
21479 return (arr_len + arr2_cpy);
21480 }
21481
21482 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21483 {
21484 if (upos >= arr_len) return (arr_len);
21485
21486 arr[upos] = c;
21487
21488 return (arr_len);
21489 }
21490
21491 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21492 {
21493 if (upos >= arr_len) return (arr_len);
21494
21495 memset (arr + upos, 0, arr_len - upos);
21496
21497 return (upos);
21498 }
21499
21500 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
21501 {
21502 int arr_pos;
21503
21504 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
21505 {
21506 if (arr[arr_pos] != oldc) continue;
21507
21508 arr[arr_pos] = newc;
21509 }
21510
21511 return (arr_len);
21512 }
21513
21514 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
21515 {
21516 int arr_pos;
21517
21518 int ret_len;
21519
21520 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
21521 {
21522 if (arr[arr_pos] == c) continue;
21523
21524 arr[ret_len] = arr[arr_pos];
21525
21526 ret_len++;
21527 }
21528
21529 return (ret_len);
21530 }
21531
21532 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
21533 {
21534 if (ulen > arr_len) return (arr_len);
21535
21536 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21537
21538 char cs[100] = { 0 };
21539
21540 memcpy (cs, arr, ulen);
21541
21542 int i;
21543
21544 for (i = 0; i < ulen; i++)
21545 {
21546 char c = cs[i];
21547
21548 arr_len = mangle_insert (arr, arr_len, i, c);
21549 }
21550
21551 return (arr_len);
21552 }
21553
21554 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
21555 {
21556 if (ulen > arr_len) return (arr_len);
21557
21558 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21559
21560 int upos = arr_len - ulen;
21561
21562 int i;
21563
21564 for (i = 0; i < ulen; i++)
21565 {
21566 char c = arr[upos + i];
21567
21568 arr_len = mangle_append (arr, arr_len, c);
21569 }
21570
21571 return (arr_len);
21572 }
21573
21574 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21575 {
21576 if ( arr_len == 0) return (arr_len);
21577 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21578
21579 char c = arr[upos];
21580
21581 int i;
21582
21583 for (i = 0; i < ulen; i++)
21584 {
21585 arr_len = mangle_insert (arr, arr_len, upos, c);
21586 }
21587
21588 return (arr_len);
21589 }
21590
21591 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
21592 {
21593 if ( arr_len == 0) return (arr_len);
21594 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
21595
21596 int arr_pos;
21597
21598 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21599 {
21600 int new_pos = arr_pos * 2;
21601
21602 arr[new_pos] = arr[arr_pos];
21603
21604 arr[new_pos + 1] = arr[arr_pos];
21605 }
21606
21607 return (arr_len * 2);
21608 }
21609
21610 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21611 {
21612 if (upos >= arr_len) return (arr_len);
21613 if (upos2 >= arr_len) return (arr_len);
21614
21615 MANGLE_SWITCH (arr, upos, upos2);
21616
21617 return (arr_len);
21618 }
21619
21620 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21621 {
21622 MANGLE_SWITCH (arr, upos, upos2);
21623
21624 return (arr_len);
21625 }
21626
21627 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
21628 {
21629 if (upos >= arr_len) return (arr_len);
21630
21631 arr[upos] <<= 1;
21632
21633 return (arr_len);
21634 }
21635
21636 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
21637 {
21638 if (upos >= arr_len) return (arr_len);
21639
21640 arr[upos] >>= 1;
21641
21642 return (arr_len);
21643 }
21644
21645 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
21646 {
21647 if (upos >= arr_len) return (arr_len);
21648
21649 arr[upos] += 1;
21650
21651 return (arr_len);
21652 }
21653
21654 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
21655 {
21656 if (upos >= arr_len) return (arr_len);
21657
21658 arr[upos] -= 1;
21659
21660 return (arr_len);
21661 }
21662
21663 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
21664 {
21665 int upper_next = 1;
21666
21667 int pos;
21668
21669 for (pos = 0; pos < arr_len; pos++)
21670 {
21671 if (arr[pos] == ' ')
21672 {
21673 upper_next = 1;
21674
21675 continue;
21676 }
21677
21678 if (upper_next)
21679 {
21680 upper_next = 0;
21681
21682 MANGLE_UPPER_AT (arr, pos);
21683 }
21684 else
21685 {
21686 MANGLE_LOWER_AT (arr, pos);
21687 }
21688 }
21689
21690 return (arr_len);
21691 }
21692
21693 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
21694 {
21695 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
21696
21697 u32 j;
21698
21699 u32 rule_pos = 0;
21700
21701 for (j = 0; j < rp_gen_num; j++)
21702 {
21703 u32 r = 0;
21704 u32 p1 = 0;
21705 u32 p2 = 0;
21706 u32 p3 = 0;
21707
21708 switch ((char) get_random_num (0, 9))
21709 {
21710 case 0:
21711 r = get_random_num (0, sizeof (grp_op_nop));
21712 rule_buf[rule_pos++] = grp_op_nop[r];
21713 break;
21714
21715 case 1:
21716 r = get_random_num (0, sizeof (grp_op_pos_p0));
21717 rule_buf[rule_pos++] = grp_op_pos_p0[r];
21718 p1 = get_random_num (0, sizeof (grp_pos));
21719 rule_buf[rule_pos++] = grp_pos[p1];
21720 break;
21721
21722 case 2:
21723 r = get_random_num (0, sizeof (grp_op_pos_p1));
21724 rule_buf[rule_pos++] = grp_op_pos_p1[r];
21725 p1 = get_random_num (1, 6);
21726 rule_buf[rule_pos++] = grp_pos[p1];
21727 break;
21728
21729 case 3:
21730 r = get_random_num (0, sizeof (grp_op_chr));
21731 rule_buf[rule_pos++] = grp_op_chr[r];
21732 p1 = get_random_num (0x20, 0x7e);
21733 rule_buf[rule_pos++] = (char) p1;
21734 break;
21735
21736 case 4:
21737 r = get_random_num (0, sizeof (grp_op_chr_chr));
21738 rule_buf[rule_pos++] = grp_op_chr_chr[r];
21739 p1 = get_random_num (0x20, 0x7e);
21740 rule_buf[rule_pos++] = (char) p1;
21741 p2 = get_random_num (0x20, 0x7e);
21742 while (p1 == p2)
21743 p2 = get_random_num (0x20, 0x7e);
21744 rule_buf[rule_pos++] = (char) p2;
21745 break;
21746
21747 case 5:
21748 r = get_random_num (0, sizeof (grp_op_pos_chr));
21749 rule_buf[rule_pos++] = grp_op_pos_chr[r];
21750 p1 = get_random_num (0, sizeof (grp_pos));
21751 rule_buf[rule_pos++] = grp_pos[p1];
21752 p2 = get_random_num (0x20, 0x7e);
21753 rule_buf[rule_pos++] = (char) p2;
21754 break;
21755
21756 case 6:
21757 r = get_random_num (0, sizeof (grp_op_pos_pos0));
21758 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
21759 p1 = get_random_num (0, sizeof (grp_pos));
21760 rule_buf[rule_pos++] = grp_pos[p1];
21761 p2 = get_random_num (0, sizeof (grp_pos));
21762 while (p1 == p2)
21763 p2 = get_random_num (0, sizeof (grp_pos));
21764 rule_buf[rule_pos++] = grp_pos[p2];
21765 break;
21766
21767 case 7:
21768 r = get_random_num (0, sizeof (grp_op_pos_pos1));
21769 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
21770 p1 = get_random_num (0, sizeof (grp_pos));
21771 rule_buf[rule_pos++] = grp_pos[p1];
21772 p2 = get_random_num (1, sizeof (grp_pos));
21773 while (p1 == p2)
21774 p2 = get_random_num (1, sizeof (grp_pos));
21775 rule_buf[rule_pos++] = grp_pos[p2];
21776 break;
21777
21778 case 8:
21779 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
21780 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
21781 p1 = get_random_num (0, sizeof (grp_pos));
21782 rule_buf[rule_pos++] = grp_pos[p1];
21783 p2 = get_random_num (1, sizeof (grp_pos));
21784 rule_buf[rule_pos++] = grp_pos[p1];
21785 p3 = get_random_num (0, sizeof (grp_pos));
21786 rule_buf[rule_pos++] = grp_pos[p3];
21787 break;
21788 }
21789 }
21790
21791 return (rule_pos);
21792 }
21793
21794 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
21795 {
21796 char mem[BLOCK_SIZE] = { 0 };
21797
21798 if (in == NULL) return (RULE_RC_REJECT_ERROR);
21799
21800 if (out == NULL) return (RULE_RC_REJECT_ERROR);
21801
21802 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21803
21804 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
21805
21806 int out_len = in_len;
21807 int mem_len = in_len;
21808
21809 memcpy (out, in, out_len);
21810
21811 int rule_pos;
21812
21813 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
21814 {
21815 int upos, upos2;
21816 int ulen;
21817
21818 switch (rule[rule_pos])
21819 {
21820 case ' ':
21821 break;
21822
21823 case RULE_OP_MANGLE_NOOP:
21824 break;
21825
21826 case RULE_OP_MANGLE_LREST:
21827 out_len = mangle_lrest (out, out_len);
21828 break;
21829
21830 case RULE_OP_MANGLE_UREST:
21831 out_len = mangle_urest (out, out_len);
21832 break;
21833
21834 case RULE_OP_MANGLE_LREST_UFIRST:
21835 out_len = mangle_lrest (out, out_len);
21836 if (out_len) MANGLE_UPPER_AT (out, 0);
21837 break;
21838
21839 case RULE_OP_MANGLE_UREST_LFIRST:
21840 out_len = mangle_urest (out, out_len);
21841 if (out_len) MANGLE_LOWER_AT (out, 0);
21842 break;
21843
21844 case RULE_OP_MANGLE_TREST:
21845 out_len = mangle_trest (out, out_len);
21846 break;
21847
21848 case RULE_OP_MANGLE_TOGGLE_AT:
21849 NEXT_RULEPOS (rule_pos);
21850 NEXT_RPTOI (rule, rule_pos, upos);
21851 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
21852 break;
21853
21854 case RULE_OP_MANGLE_REVERSE:
21855 out_len = mangle_reverse (out, out_len);
21856 break;
21857
21858 case RULE_OP_MANGLE_DUPEWORD:
21859 out_len = mangle_double (out, out_len);
21860 break;
21861
21862 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21863 NEXT_RULEPOS (rule_pos);
21864 NEXT_RPTOI (rule, rule_pos, ulen);
21865 out_len = mangle_double_times (out, out_len, ulen);
21866 break;
21867
21868 case RULE_OP_MANGLE_REFLECT:
21869 out_len = mangle_reflect (out, out_len);
21870 break;
21871
21872 case RULE_OP_MANGLE_ROTATE_LEFT:
21873 mangle_rotate_left (out, out_len);
21874 break;
21875
21876 case RULE_OP_MANGLE_ROTATE_RIGHT:
21877 mangle_rotate_right (out, out_len);
21878 break;
21879
21880 case RULE_OP_MANGLE_APPEND:
21881 NEXT_RULEPOS (rule_pos);
21882 out_len = mangle_append (out, out_len, rule[rule_pos]);
21883 break;
21884
21885 case RULE_OP_MANGLE_PREPEND:
21886 NEXT_RULEPOS (rule_pos);
21887 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
21888 break;
21889
21890 case RULE_OP_MANGLE_DELETE_FIRST:
21891 out_len = mangle_delete_at (out, out_len, 0);
21892 break;
21893
21894 case RULE_OP_MANGLE_DELETE_LAST:
21895 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
21896 break;
21897
21898 case RULE_OP_MANGLE_DELETE_AT:
21899 NEXT_RULEPOS (rule_pos);
21900 NEXT_RPTOI (rule, rule_pos, upos);
21901 out_len = mangle_delete_at (out, out_len, upos);
21902 break;
21903
21904 case RULE_OP_MANGLE_EXTRACT:
21905 NEXT_RULEPOS (rule_pos);
21906 NEXT_RPTOI (rule, rule_pos, upos);
21907 NEXT_RULEPOS (rule_pos);
21908 NEXT_RPTOI (rule, rule_pos, ulen);
21909 out_len = mangle_extract (out, out_len, upos, ulen);
21910 break;
21911
21912 case RULE_OP_MANGLE_OMIT:
21913 NEXT_RULEPOS (rule_pos);
21914 NEXT_RPTOI (rule, rule_pos, upos);
21915 NEXT_RULEPOS (rule_pos);
21916 NEXT_RPTOI (rule, rule_pos, ulen);
21917 out_len = mangle_omit (out, out_len, upos, ulen);
21918 break;
21919
21920 case RULE_OP_MANGLE_INSERT:
21921 NEXT_RULEPOS (rule_pos);
21922 NEXT_RPTOI (rule, rule_pos, upos);
21923 NEXT_RULEPOS (rule_pos);
21924 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
21925 break;
21926
21927 case RULE_OP_MANGLE_OVERSTRIKE:
21928 NEXT_RULEPOS (rule_pos);
21929 NEXT_RPTOI (rule, rule_pos, upos);
21930 NEXT_RULEPOS (rule_pos);
21931 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
21932 break;
21933
21934 case RULE_OP_MANGLE_TRUNCATE_AT:
21935 NEXT_RULEPOS (rule_pos);
21936 NEXT_RPTOI (rule, rule_pos, upos);
21937 out_len = mangle_truncate_at (out, out_len, upos);
21938 break;
21939
21940 case RULE_OP_MANGLE_REPLACE:
21941 NEXT_RULEPOS (rule_pos);
21942 NEXT_RULEPOS (rule_pos);
21943 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
21944 break;
21945
21946 case RULE_OP_MANGLE_PURGECHAR:
21947 NEXT_RULEPOS (rule_pos);
21948 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
21949 break;
21950
21951 case RULE_OP_MANGLE_TOGGLECASE_REC:
21952 /* todo */
21953 break;
21954
21955 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21956 NEXT_RULEPOS (rule_pos);
21957 NEXT_RPTOI (rule, rule_pos, ulen);
21958 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
21959 break;
21960
21961 case RULE_OP_MANGLE_DUPECHAR_LAST:
21962 NEXT_RULEPOS (rule_pos);
21963 NEXT_RPTOI (rule, rule_pos, ulen);
21964 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
21965 break;
21966
21967 case RULE_OP_MANGLE_DUPECHAR_ALL:
21968 out_len = mangle_dupechar (out, out_len);
21969 break;
21970
21971 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21972 NEXT_RULEPOS (rule_pos);
21973 NEXT_RPTOI (rule, rule_pos, ulen);
21974 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
21975 break;
21976
21977 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21978 NEXT_RULEPOS (rule_pos);
21979 NEXT_RPTOI (rule, rule_pos, ulen);
21980 out_len = mangle_dupeblock_append (out, out_len, ulen);
21981 break;
21982
21983 case RULE_OP_MANGLE_SWITCH_FIRST:
21984 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
21985 break;
21986
21987 case RULE_OP_MANGLE_SWITCH_LAST:
21988 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
21989 break;
21990
21991 case RULE_OP_MANGLE_SWITCH_AT:
21992 NEXT_RULEPOS (rule_pos);
21993 NEXT_RPTOI (rule, rule_pos, upos);
21994 NEXT_RULEPOS (rule_pos);
21995 NEXT_RPTOI (rule, rule_pos, upos2);
21996 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
21997 break;
21998
21999 case RULE_OP_MANGLE_CHR_SHIFTL:
22000 NEXT_RULEPOS (rule_pos);
22001 NEXT_RPTOI (rule, rule_pos, upos);
22002 mangle_chr_shiftl (out, out_len, upos);
22003 break;
22004
22005 case RULE_OP_MANGLE_CHR_SHIFTR:
22006 NEXT_RULEPOS (rule_pos);
22007 NEXT_RPTOI (rule, rule_pos, upos);
22008 mangle_chr_shiftr (out, out_len, upos);
22009 break;
22010
22011 case RULE_OP_MANGLE_CHR_INCR:
22012 NEXT_RULEPOS (rule_pos);
22013 NEXT_RPTOI (rule, rule_pos, upos);
22014 mangle_chr_incr (out, out_len, upos);
22015 break;
22016
22017 case RULE_OP_MANGLE_CHR_DECR:
22018 NEXT_RULEPOS (rule_pos);
22019 NEXT_RPTOI (rule, rule_pos, upos);
22020 mangle_chr_decr (out, out_len, upos);
22021 break;
22022
22023 case RULE_OP_MANGLE_REPLACE_NP1:
22024 NEXT_RULEPOS (rule_pos);
22025 NEXT_RPTOI (rule, rule_pos, upos);
22026 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
22027 break;
22028
22029 case RULE_OP_MANGLE_REPLACE_NM1:
22030 NEXT_RULEPOS (rule_pos);
22031 NEXT_RPTOI (rule, rule_pos, upos);
22032 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
22033 break;
22034
22035 case RULE_OP_MANGLE_TITLE:
22036 out_len = mangle_title (out, out_len);
22037 break;
22038
22039 case RULE_OP_MANGLE_EXTRACT_MEMORY:
22040 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22041 NEXT_RULEPOS (rule_pos);
22042 NEXT_RPTOI (rule, rule_pos, upos);
22043 NEXT_RULEPOS (rule_pos);
22044 NEXT_RPTOI (rule, rule_pos, ulen);
22045 NEXT_RULEPOS (rule_pos);
22046 NEXT_RPTOI (rule, rule_pos, upos2);
22047 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
22048 break;
22049
22050 case RULE_OP_MANGLE_APPEND_MEMORY:
22051 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22052 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22053 memcpy (out + out_len, mem, mem_len);
22054 out_len += mem_len;
22055 break;
22056
22057 case RULE_OP_MANGLE_PREPEND_MEMORY:
22058 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22059 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22060 memcpy (mem + mem_len, out, out_len);
22061 out_len += mem_len;
22062 memcpy (out, mem, out_len);
22063 break;
22064
22065 case RULE_OP_MEMORIZE_WORD:
22066 memcpy (mem, out, out_len);
22067 mem_len = out_len;
22068 break;
22069
22070 case RULE_OP_REJECT_LESS:
22071 NEXT_RULEPOS (rule_pos);
22072 NEXT_RPTOI (rule, rule_pos, upos);
22073 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
22074 break;
22075
22076 case RULE_OP_REJECT_GREATER:
22077 NEXT_RULEPOS (rule_pos);
22078 NEXT_RPTOI (rule, rule_pos, upos);
22079 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
22080 break;
22081
22082 case RULE_OP_REJECT_CONTAIN:
22083 NEXT_RULEPOS (rule_pos);
22084 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
22085 break;
22086
22087 case RULE_OP_REJECT_NOT_CONTAIN:
22088 NEXT_RULEPOS (rule_pos);
22089 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
22090 break;
22091
22092 case RULE_OP_REJECT_EQUAL_FIRST:
22093 NEXT_RULEPOS (rule_pos);
22094 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22095 break;
22096
22097 case RULE_OP_REJECT_EQUAL_LAST:
22098 NEXT_RULEPOS (rule_pos);
22099 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22100 break;
22101
22102 case RULE_OP_REJECT_EQUAL_AT:
22103 NEXT_RULEPOS (rule_pos);
22104 NEXT_RPTOI (rule, rule_pos, upos);
22105 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22106 NEXT_RULEPOS (rule_pos);
22107 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22108 break;
22109
22110 case RULE_OP_REJECT_CONTAINS:
22111 NEXT_RULEPOS (rule_pos);
22112 NEXT_RPTOI (rule, rule_pos, upos);
22113 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22114 NEXT_RULEPOS (rule_pos);
22115 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
22116 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
22117 break;
22118
22119 case RULE_OP_REJECT_MEMORY:
22120 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
22121 break;
22122
22123 default:
22124 return (RULE_RC_SYNTAX_ERROR);
22125 break;
22126 }
22127 }
22128
22129 memset (out + out_len, 0, BLOCK_SIZE - out_len);
22130
22131 return (out_len);
22132 }