First working version of -m 13500
[hashcat.git] / src / shared.c
1 /**
2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
4 * magnum <john.magnum@hushmail.com>
5 *
6 * License.....: MIT
7 */
8
9 #ifdef OSX
10 #include <stdio.h>
11 #endif
12
13 #include <shared.h>
14 #include <limits.h>
15
16 /**
17 * basic bit handling
18 */
19
20 u32 is_power_of_2(u32 v)
21 {
22 return (v && !(v & (v - 1)));
23 }
24
25 u32 rotl32 (const u32 a, const u32 n)
26 {
27 return ((a << n) | (a >> (32 - n)));
28 }
29
30 u32 rotr32 (const u32 a, const u32 n)
31 {
32 return ((a >> n) | (a << (32 - n)));
33 }
34
35 u64 rotl64 (const u64 a, const u64 n)
36 {
37 return ((a << n) | (a >> (64 - n)));
38 }
39
40 u64 rotr64 (const u64 a, const u64 n)
41 {
42 return ((a >> n) | (a << (64 - n)));
43 }
44
45 u32 byte_swap_32 (const u32 n)
46 {
47 return (n & 0xff000000) >> 24
48 | (n & 0x00ff0000) >> 8
49 | (n & 0x0000ff00) << 8
50 | (n & 0x000000ff) << 24;
51 }
52
53 u64 byte_swap_64 (const u64 n)
54 {
55 return (n & 0xff00000000000000ULL) >> 56
56 | (n & 0x00ff000000000000ULL) >> 40
57 | (n & 0x0000ff0000000000ULL) >> 24
58 | (n & 0x000000ff00000000ULL) >> 8
59 | (n & 0x00000000ff000000ULL) << 8
60 | (n & 0x0000000000ff0000ULL) << 24
61 | (n & 0x000000000000ff00ULL) << 40
62 | (n & 0x00000000000000ffULL) << 56;
63 }
64
65 /**
66 * ciphers for use on cpu
67 */
68
69 #include "cpu-des.c"
70 #include "cpu-aes.c"
71
72 /**
73 * hashes for use on cpu
74 */
75
76 #include "cpu-md5.c"
77 #include "cpu-sha1.c"
78 #include "cpu-sha256.c"
79
80 /**
81 * logging
82 */
83
84 int last_len = 0;
85
86 void log_final (FILE *fp, const char *fmt, va_list ap)
87 {
88 if (last_len)
89 {
90 fputc ('\r', fp);
91
92 for (int i = 0; i < last_len; i++)
93 {
94 fputc (' ', fp);
95 }
96
97 fputc ('\r', fp);
98 }
99
100 char s[4096] = { 0 };
101
102 int max_len = (int) sizeof (s);
103
104 int len = vsnprintf (s, max_len, fmt, ap);
105
106 if (len > max_len) len = max_len;
107
108 fwrite (s, len, 1, fp);
109
110 fflush (fp);
111
112 last_len = len;
113 }
114
115 void log_out_nn (FILE *fp, const char *fmt, ...)
116 {
117 if (SUPPRESS_OUTPUT) return;
118
119 va_list ap;
120
121 va_start (ap, fmt);
122
123 log_final (fp, fmt, ap);
124
125 va_end (ap);
126 }
127
128 void log_info_nn (const char *fmt, ...)
129 {
130 if (SUPPRESS_OUTPUT) return;
131
132 va_list ap;
133
134 va_start (ap, fmt);
135
136 log_final (stdout, fmt, ap);
137
138 va_end (ap);
139 }
140
141 void log_error_nn (const char *fmt, ...)
142 {
143 if (SUPPRESS_OUTPUT) return;
144
145 va_list ap;
146
147 va_start (ap, fmt);
148
149 log_final (stderr, fmt, ap);
150
151 va_end (ap);
152 }
153
154 void log_out (FILE *fp, const char *fmt, ...)
155 {
156 if (SUPPRESS_OUTPUT) return;
157
158 va_list ap;
159
160 va_start (ap, fmt);
161
162 log_final (fp, fmt, ap);
163
164 va_end (ap);
165
166 fputc ('\n', fp);
167
168 last_len = 0;
169 }
170
171 void log_info (const char *fmt, ...)
172 {
173 if (SUPPRESS_OUTPUT) return;
174
175 va_list ap;
176
177 va_start (ap, fmt);
178
179 log_final (stdout, fmt, ap);
180
181 va_end (ap);
182
183 fputc ('\n', stdout);
184
185 last_len = 0;
186 }
187
188 void log_error (const char *fmt, ...)
189 {
190 if (SUPPRESS_OUTPUT) return;
191
192 fputc ('\n', stderr);
193 fputc ('\n', stderr);
194
195 va_list ap;
196
197 va_start (ap, fmt);
198
199 log_final (stderr, fmt, ap);
200
201 va_end (ap);
202
203 fputc ('\n', stderr);
204 fputc ('\n', stderr);
205
206 last_len = 0;
207 }
208
209 /**
210 * converter
211 */
212
213 u8 int_to_base32 (const u8 c)
214 {
215 static const u8 tbl[0x20] =
216 {
217 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
218 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
219 };
220
221 return tbl[c];
222 }
223
224 u8 base32_to_int (const u8 c)
225 {
226 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
227 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
228
229 return 0;
230 }
231
232 u8 int_to_itoa32 (const u8 c)
233 {
234 static const u8 tbl[0x20] =
235 {
236 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
237 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
238 };
239
240 return tbl[c];
241 }
242
243 u8 itoa32_to_int (const u8 c)
244 {
245 if ((c >= '0') && (c <= '9')) return c - '0';
246 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
247
248 return 0;
249 }
250
251 u8 int_to_itoa64 (const u8 c)
252 {
253 static const u8 tbl[0x40] =
254 {
255 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
256 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
257 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
258 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
259 };
260
261 return tbl[c];
262 }
263
264 u8 itoa64_to_int (const u8 c)
265 {
266 static const u8 tbl[0x100] =
267 {
268 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
269 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
270 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
271 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
272 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
273 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
274 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
275 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
276 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
277 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
278 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
279 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
280 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
281 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
282 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
283 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
284 };
285
286 return tbl[c];
287 }
288
289 u8 int_to_base64 (const u8 c)
290 {
291 static const u8 tbl[0x40] =
292 {
293 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
294 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
295 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
296 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
297 };
298
299 return tbl[c];
300 }
301
302 u8 base64_to_int (const u8 c)
303 {
304 static const u8 tbl[0x100] =
305 {
306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
309 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
311 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
313 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 };
323
324 return tbl[c];
325 }
326
327 u8 int_to_bf64 (const u8 c)
328 {
329 static const u8 tbl[0x40] =
330 {
331 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
332 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
333 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
334 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
335 };
336
337 return tbl[c];
338 }
339
340 u8 bf64_to_int (const u8 c)
341 {
342 static const u8 tbl[0x100] =
343 {
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
347 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
349 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
351 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 };
361
362 return tbl[c];
363 }
364
365 u8 int_to_lotus64 (const u8 c)
366 {
367 if (c < 10) return '0' + c;
368 else if (c < 36) return 'A' + c - 10;
369 else if (c < 62) return 'a' + c - 36;
370 else if (c == 62) return '+';
371 else if (c == 63) return '/';
372
373 return 0;
374 }
375
376 u8 lotus64_to_int (const u8 c)
377 {
378 if ((c >= '0') && (c <= '9')) return c - '0';
379 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
380 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
381 else if (c == '+') return 62;
382 else if (c == '/') return 63;
383 else
384
385 return 0;
386 }
387
388 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
389 {
390 const u8 *in_ptr = in_buf;
391
392 u8 *out_ptr = out_buf;
393
394 for (int i = 0; i < in_len; i += 8)
395 {
396 const u8 out_val0 = f (in_ptr[0] & 0x7f);
397 const u8 out_val1 = f (in_ptr[1] & 0x7f);
398 const u8 out_val2 = f (in_ptr[2] & 0x7f);
399 const u8 out_val3 = f (in_ptr[3] & 0x7f);
400 const u8 out_val4 = f (in_ptr[4] & 0x7f);
401 const u8 out_val5 = f (in_ptr[5] & 0x7f);
402 const u8 out_val6 = f (in_ptr[6] & 0x7f);
403 const u8 out_val7 = f (in_ptr[7] & 0x7f);
404
405 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
406 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
407 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
408 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
409 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
410
411 in_ptr += 8;
412 out_ptr += 5;
413 }
414
415 for (int i = 0; i < in_len; i++)
416 {
417 if (in_buf[i] != '=') continue;
418
419 in_len = i;
420 }
421
422 int out_len = (in_len * 5) / 8;
423
424 return out_len;
425 }
426
427 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
428 {
429 const u8 *in_ptr = in_buf;
430
431 u8 *out_ptr = out_buf;
432
433 for (int i = 0; i < in_len; i += 5)
434 {
435 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
436 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
437 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
438 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
439 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
440 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
441 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
442 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
443
444 out_ptr[0] = out_val0 & 0x7f;
445 out_ptr[1] = out_val1 & 0x7f;
446 out_ptr[2] = out_val2 & 0x7f;
447 out_ptr[3] = out_val3 & 0x7f;
448 out_ptr[4] = out_val4 & 0x7f;
449 out_ptr[5] = out_val5 & 0x7f;
450 out_ptr[6] = out_val6 & 0x7f;
451 out_ptr[7] = out_val7 & 0x7f;
452
453 in_ptr += 5;
454 out_ptr += 8;
455 }
456
457 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
458
459 while (out_len % 8)
460 {
461 out_buf[out_len] = '=';
462
463 out_len++;
464 }
465
466 return out_len;
467 }
468
469 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
470 {
471 const u8 *in_ptr = in_buf;
472
473 u8 *out_ptr = out_buf;
474
475 for (int i = 0; i < in_len; i += 4)
476 {
477 const u8 out_val0 = f (in_ptr[0] & 0x7f);
478 const u8 out_val1 = f (in_ptr[1] & 0x7f);
479 const u8 out_val2 = f (in_ptr[2] & 0x7f);
480 const u8 out_val3 = f (in_ptr[3] & 0x7f);
481
482 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
483 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
484 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
485
486 in_ptr += 4;
487 out_ptr += 3;
488 }
489
490 for (int i = 0; i < in_len; i++)
491 {
492 if (in_buf[i] != '=') continue;
493
494 in_len = i;
495 }
496
497 int out_len = (in_len * 6) / 8;
498
499 return out_len;
500 }
501
502 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
503 {
504 const u8 *in_ptr = in_buf;
505
506 u8 *out_ptr = out_buf;
507
508 for (int i = 0; i < in_len; i += 3)
509 {
510 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
511 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
512 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
513 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
514
515 out_ptr[0] = out_val0 & 0x7f;
516 out_ptr[1] = out_val1 & 0x7f;
517 out_ptr[2] = out_val2 & 0x7f;
518 out_ptr[3] = out_val3 & 0x7f;
519
520 in_ptr += 3;
521 out_ptr += 4;
522 }
523
524 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
525
526 while (out_len % 4)
527 {
528 out_buf[out_len] = '=';
529
530 out_len++;
531 }
532
533 return out_len;
534 }
535
536 int is_valid_hex_char (const u8 c)
537 {
538 if ((c >= '0') && (c <= '9')) return 1;
539 if ((c >= 'A') && (c <= 'F')) return 1;
540 if ((c >= 'a') && (c <= 'f')) return 1;
541
542 return 0;
543 }
544
545 u8 hex_convert (const u8 c)
546 {
547 return (c & 15) + (c >> 6) * 9;
548 }
549
550 u8 hex_to_u8 (const u8 hex[2])
551 {
552 u8 v = 0;
553
554 v |= (hex_convert (hex[1]) << 0);
555 v |= (hex_convert (hex[0]) << 4);
556
557 return (v);
558 }
559
560 u32 hex_to_u32 (const u8 hex[8])
561 {
562 u32 v = 0;
563
564 v |= ((u32) hex_convert (hex[7])) << 0;
565 v |= ((u32) hex_convert (hex[6])) << 4;
566 v |= ((u32) hex_convert (hex[5])) << 8;
567 v |= ((u32) hex_convert (hex[4])) << 12;
568 v |= ((u32) hex_convert (hex[3])) << 16;
569 v |= ((u32) hex_convert (hex[2])) << 20;
570 v |= ((u32) hex_convert (hex[1])) << 24;
571 v |= ((u32) hex_convert (hex[0])) << 28;
572
573 return (v);
574 }
575
576 u64 hex_to_u64 (const u8 hex[16])
577 {
578 u64 v = 0;
579
580 v |= ((u64) hex_convert (hex[15]) << 0);
581 v |= ((u64) hex_convert (hex[14]) << 4);
582 v |= ((u64) hex_convert (hex[13]) << 8);
583 v |= ((u64) hex_convert (hex[12]) << 12);
584 v |= ((u64) hex_convert (hex[11]) << 16);
585 v |= ((u64) hex_convert (hex[10]) << 20);
586 v |= ((u64) hex_convert (hex[ 9]) << 24);
587 v |= ((u64) hex_convert (hex[ 8]) << 28);
588 v |= ((u64) hex_convert (hex[ 7]) << 32);
589 v |= ((u64) hex_convert (hex[ 6]) << 36);
590 v |= ((u64) hex_convert (hex[ 5]) << 40);
591 v |= ((u64) hex_convert (hex[ 4]) << 44);
592 v |= ((u64) hex_convert (hex[ 3]) << 48);
593 v |= ((u64) hex_convert (hex[ 2]) << 52);
594 v |= ((u64) hex_convert (hex[ 1]) << 56);
595 v |= ((u64) hex_convert (hex[ 0]) << 60);
596
597 return (v);
598 }
599
600 void bin_to_hex_lower (const u32 v, u8 hex[8])
601 {
602 hex[0] = v >> 28 & 15;
603 hex[1] = v >> 24 & 15;
604 hex[2] = v >> 20 & 15;
605 hex[3] = v >> 16 & 15;
606 hex[4] = v >> 12 & 15;
607 hex[5] = v >> 8 & 15;
608 hex[6] = v >> 4 & 15;
609 hex[7] = v >> 0 & 15;
610
611 u32 add;
612
613 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
614 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
615 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
616 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
617 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
618 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
619 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
620 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
621 }
622
623 /**
624 * decoder
625 */
626
627 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
628 {
629 AES_KEY skey;
630
631 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
632
633 u32 _iv[4] = { 0 };
634
635 _iv[0] = iv[0];
636 _iv[1] = iv[1];
637 _iv[2] = iv[2];
638 _iv[3] = iv[3];
639
640 for (int i = 0; i < 16; i += 4)
641 {
642 u32 _in[4] = { 0 };
643 u32 _out[4] = { 0 };
644
645 _in[0] = in[i + 0];
646 _in[1] = in[i + 1];
647 _in[2] = in[i + 2];
648 _in[3] = in[i + 3];
649
650 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
651
652 _out[0] ^= _iv[0];
653 _out[1] ^= _iv[1];
654 _out[2] ^= _iv[2];
655 _out[3] ^= _iv[3];
656
657 out[i + 0] = _out[0];
658 out[i + 1] = _out[1];
659 out[i + 2] = _out[2];
660 out[i + 3] = _out[3];
661
662 _iv[0] = _in[0];
663 _iv[1] = _in[1];
664 _iv[2] = _in[2];
665 _iv[3] = _in[3];
666 }
667 }
668
669 static void juniper_decrypt_hash (char *in, char *out)
670 {
671 // base64 decode
672
673 u8 base64_buf[100] = { 0 };
674
675 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
676
677 // iv stuff
678
679 u32 juniper_iv[4] = { 0 };
680
681 memcpy (juniper_iv, base64_buf, 12);
682
683 memcpy (out, juniper_iv, 12);
684
685 // reversed key
686
687 u32 juniper_key[4] = { 0 };
688
689 juniper_key[0] = byte_swap_32 (0xa6707a7e);
690 juniper_key[1] = byte_swap_32 (0x8df91059);
691 juniper_key[2] = byte_swap_32 (0xdea70ae5);
692 juniper_key[3] = byte_swap_32 (0x2f9c2442);
693
694 // AES decrypt
695
696 u32 *in_ptr = (u32 *) (base64_buf + 12);
697 u32 *out_ptr = (u32 *) (out + 12);
698
699 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
700 }
701
702 void phpass_decode (u8 digest[16], u8 buf[22])
703 {
704 int l;
705
706 l = itoa64_to_int (buf[ 0]) << 0;
707 l |= itoa64_to_int (buf[ 1]) << 6;
708 l |= itoa64_to_int (buf[ 2]) << 12;
709 l |= itoa64_to_int (buf[ 3]) << 18;
710
711 digest[ 0] = (l >> 0) & 0xff;
712 digest[ 1] = (l >> 8) & 0xff;
713 digest[ 2] = (l >> 16) & 0xff;
714
715 l = itoa64_to_int (buf[ 4]) << 0;
716 l |= itoa64_to_int (buf[ 5]) << 6;
717 l |= itoa64_to_int (buf[ 6]) << 12;
718 l |= itoa64_to_int (buf[ 7]) << 18;
719
720 digest[ 3] = (l >> 0) & 0xff;
721 digest[ 4] = (l >> 8) & 0xff;
722 digest[ 5] = (l >> 16) & 0xff;
723
724 l = itoa64_to_int (buf[ 8]) << 0;
725 l |= itoa64_to_int (buf[ 9]) << 6;
726 l |= itoa64_to_int (buf[10]) << 12;
727 l |= itoa64_to_int (buf[11]) << 18;
728
729 digest[ 6] = (l >> 0) & 0xff;
730 digest[ 7] = (l >> 8) & 0xff;
731 digest[ 8] = (l >> 16) & 0xff;
732
733 l = itoa64_to_int (buf[12]) << 0;
734 l |= itoa64_to_int (buf[13]) << 6;
735 l |= itoa64_to_int (buf[14]) << 12;
736 l |= itoa64_to_int (buf[15]) << 18;
737
738 digest[ 9] = (l >> 0) & 0xff;
739 digest[10] = (l >> 8) & 0xff;
740 digest[11] = (l >> 16) & 0xff;
741
742 l = itoa64_to_int (buf[16]) << 0;
743 l |= itoa64_to_int (buf[17]) << 6;
744 l |= itoa64_to_int (buf[18]) << 12;
745 l |= itoa64_to_int (buf[19]) << 18;
746
747 digest[12] = (l >> 0) & 0xff;
748 digest[13] = (l >> 8) & 0xff;
749 digest[14] = (l >> 16) & 0xff;
750
751 l = itoa64_to_int (buf[20]) << 0;
752 l |= itoa64_to_int (buf[21]) << 6;
753
754 digest[15] = (l >> 0) & 0xff;
755 }
756
757 void phpass_encode (u8 digest[16], u8 buf[22])
758 {
759 int l;
760
761 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
762
763 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
764 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
765 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
766 buf[ 3] = int_to_itoa64 (l & 0x3f);
767
768 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
769
770 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
771 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
772 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
773 buf[ 7] = int_to_itoa64 (l & 0x3f);
774
775 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
776
777 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
778 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
779 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[11] = int_to_itoa64 (l & 0x3f);
781
782 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
783
784 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
785 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
786 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[15] = int_to_itoa64 (l & 0x3f);
788
789 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
790
791 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
792 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
793 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
794 buf[19] = int_to_itoa64 (l & 0x3f);
795
796 l = (digest[15] << 0);
797
798 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
799 buf[21] = int_to_itoa64 (l & 0x3f);
800 }
801
802 void md5crypt_decode (u8 digest[16], u8 buf[22])
803 {
804 int l;
805
806 l = itoa64_to_int (buf[ 0]) << 0;
807 l |= itoa64_to_int (buf[ 1]) << 6;
808 l |= itoa64_to_int (buf[ 2]) << 12;
809 l |= itoa64_to_int (buf[ 3]) << 18;
810
811 digest[ 0] = (l >> 16) & 0xff;
812 digest[ 6] = (l >> 8) & 0xff;
813 digest[12] = (l >> 0) & 0xff;
814
815 l = itoa64_to_int (buf[ 4]) << 0;
816 l |= itoa64_to_int (buf[ 5]) << 6;
817 l |= itoa64_to_int (buf[ 6]) << 12;
818 l |= itoa64_to_int (buf[ 7]) << 18;
819
820 digest[ 1] = (l >> 16) & 0xff;
821 digest[ 7] = (l >> 8) & 0xff;
822 digest[13] = (l >> 0) & 0xff;
823
824 l = itoa64_to_int (buf[ 8]) << 0;
825 l |= itoa64_to_int (buf[ 9]) << 6;
826 l |= itoa64_to_int (buf[10]) << 12;
827 l |= itoa64_to_int (buf[11]) << 18;
828
829 digest[ 2] = (l >> 16) & 0xff;
830 digest[ 8] = (l >> 8) & 0xff;
831 digest[14] = (l >> 0) & 0xff;
832
833 l = itoa64_to_int (buf[12]) << 0;
834 l |= itoa64_to_int (buf[13]) << 6;
835 l |= itoa64_to_int (buf[14]) << 12;
836 l |= itoa64_to_int (buf[15]) << 18;
837
838 digest[ 3] = (l >> 16) & 0xff;
839 digest[ 9] = (l >> 8) & 0xff;
840 digest[15] = (l >> 0) & 0xff;
841
842 l = itoa64_to_int (buf[16]) << 0;
843 l |= itoa64_to_int (buf[17]) << 6;
844 l |= itoa64_to_int (buf[18]) << 12;
845 l |= itoa64_to_int (buf[19]) << 18;
846
847 digest[ 4] = (l >> 16) & 0xff;
848 digest[10] = (l >> 8) & 0xff;
849 digest[ 5] = (l >> 0) & 0xff;
850
851 l = itoa64_to_int (buf[20]) << 0;
852 l |= itoa64_to_int (buf[21]) << 6;
853
854 digest[11] = (l >> 0) & 0xff;
855 }
856
857 void md5crypt_encode (u8 digest[16], u8 buf[22])
858 {
859 int l;
860
861 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
862
863 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
864 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
865 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
866 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
867
868 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
869
870 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
871 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
872 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
873 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
874
875 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
876
877 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
878 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
879 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
881
882 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
883
884 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
885 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
886 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
888
889 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
890
891 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
892 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
893 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
894 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
895
896 l = (digest[11] << 0);
897
898 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
899 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
900 }
901
902 void sha512crypt_decode (u8 digest[64], u8 buf[86])
903 {
904 int l;
905
906 l = itoa64_to_int (buf[ 0]) << 0;
907 l |= itoa64_to_int (buf[ 1]) << 6;
908 l |= itoa64_to_int (buf[ 2]) << 12;
909 l |= itoa64_to_int (buf[ 3]) << 18;
910
911 digest[ 0] = (l >> 16) & 0xff;
912 digest[21] = (l >> 8) & 0xff;
913 digest[42] = (l >> 0) & 0xff;
914
915 l = itoa64_to_int (buf[ 4]) << 0;
916 l |= itoa64_to_int (buf[ 5]) << 6;
917 l |= itoa64_to_int (buf[ 6]) << 12;
918 l |= itoa64_to_int (buf[ 7]) << 18;
919
920 digest[22] = (l >> 16) & 0xff;
921 digest[43] = (l >> 8) & 0xff;
922 digest[ 1] = (l >> 0) & 0xff;
923
924 l = itoa64_to_int (buf[ 8]) << 0;
925 l |= itoa64_to_int (buf[ 9]) << 6;
926 l |= itoa64_to_int (buf[10]) << 12;
927 l |= itoa64_to_int (buf[11]) << 18;
928
929 digest[44] = (l >> 16) & 0xff;
930 digest[ 2] = (l >> 8) & 0xff;
931 digest[23] = (l >> 0) & 0xff;
932
933 l = itoa64_to_int (buf[12]) << 0;
934 l |= itoa64_to_int (buf[13]) << 6;
935 l |= itoa64_to_int (buf[14]) << 12;
936 l |= itoa64_to_int (buf[15]) << 18;
937
938 digest[ 3] = (l >> 16) & 0xff;
939 digest[24] = (l >> 8) & 0xff;
940 digest[45] = (l >> 0) & 0xff;
941
942 l = itoa64_to_int (buf[16]) << 0;
943 l |= itoa64_to_int (buf[17]) << 6;
944 l |= itoa64_to_int (buf[18]) << 12;
945 l |= itoa64_to_int (buf[19]) << 18;
946
947 digest[25] = (l >> 16) & 0xff;
948 digest[46] = (l >> 8) & 0xff;
949 digest[ 4] = (l >> 0) & 0xff;
950
951 l = itoa64_to_int (buf[20]) << 0;
952 l |= itoa64_to_int (buf[21]) << 6;
953 l |= itoa64_to_int (buf[22]) << 12;
954 l |= itoa64_to_int (buf[23]) << 18;
955
956 digest[47] = (l >> 16) & 0xff;
957 digest[ 5] = (l >> 8) & 0xff;
958 digest[26] = (l >> 0) & 0xff;
959
960 l = itoa64_to_int (buf[24]) << 0;
961 l |= itoa64_to_int (buf[25]) << 6;
962 l |= itoa64_to_int (buf[26]) << 12;
963 l |= itoa64_to_int (buf[27]) << 18;
964
965 digest[ 6] = (l >> 16) & 0xff;
966 digest[27] = (l >> 8) & 0xff;
967 digest[48] = (l >> 0) & 0xff;
968
969 l = itoa64_to_int (buf[28]) << 0;
970 l |= itoa64_to_int (buf[29]) << 6;
971 l |= itoa64_to_int (buf[30]) << 12;
972 l |= itoa64_to_int (buf[31]) << 18;
973
974 digest[28] = (l >> 16) & 0xff;
975 digest[49] = (l >> 8) & 0xff;
976 digest[ 7] = (l >> 0) & 0xff;
977
978 l = itoa64_to_int (buf[32]) << 0;
979 l |= itoa64_to_int (buf[33]) << 6;
980 l |= itoa64_to_int (buf[34]) << 12;
981 l |= itoa64_to_int (buf[35]) << 18;
982
983 digest[50] = (l >> 16) & 0xff;
984 digest[ 8] = (l >> 8) & 0xff;
985 digest[29] = (l >> 0) & 0xff;
986
987 l = itoa64_to_int (buf[36]) << 0;
988 l |= itoa64_to_int (buf[37]) << 6;
989 l |= itoa64_to_int (buf[38]) << 12;
990 l |= itoa64_to_int (buf[39]) << 18;
991
992 digest[ 9] = (l >> 16) & 0xff;
993 digest[30] = (l >> 8) & 0xff;
994 digest[51] = (l >> 0) & 0xff;
995
996 l = itoa64_to_int (buf[40]) << 0;
997 l |= itoa64_to_int (buf[41]) << 6;
998 l |= itoa64_to_int (buf[42]) << 12;
999 l |= itoa64_to_int (buf[43]) << 18;
1000
1001 digest[31] = (l >> 16) & 0xff;
1002 digest[52] = (l >> 8) & 0xff;
1003 digest[10] = (l >> 0) & 0xff;
1004
1005 l = itoa64_to_int (buf[44]) << 0;
1006 l |= itoa64_to_int (buf[45]) << 6;
1007 l |= itoa64_to_int (buf[46]) << 12;
1008 l |= itoa64_to_int (buf[47]) << 18;
1009
1010 digest[53] = (l >> 16) & 0xff;
1011 digest[11] = (l >> 8) & 0xff;
1012 digest[32] = (l >> 0) & 0xff;
1013
1014 l = itoa64_to_int (buf[48]) << 0;
1015 l |= itoa64_to_int (buf[49]) << 6;
1016 l |= itoa64_to_int (buf[50]) << 12;
1017 l |= itoa64_to_int (buf[51]) << 18;
1018
1019 digest[12] = (l >> 16) & 0xff;
1020 digest[33] = (l >> 8) & 0xff;
1021 digest[54] = (l >> 0) & 0xff;
1022
1023 l = itoa64_to_int (buf[52]) << 0;
1024 l |= itoa64_to_int (buf[53]) << 6;
1025 l |= itoa64_to_int (buf[54]) << 12;
1026 l |= itoa64_to_int (buf[55]) << 18;
1027
1028 digest[34] = (l >> 16) & 0xff;
1029 digest[55] = (l >> 8) & 0xff;
1030 digest[13] = (l >> 0) & 0xff;
1031
1032 l = itoa64_to_int (buf[56]) << 0;
1033 l |= itoa64_to_int (buf[57]) << 6;
1034 l |= itoa64_to_int (buf[58]) << 12;
1035 l |= itoa64_to_int (buf[59]) << 18;
1036
1037 digest[56] = (l >> 16) & 0xff;
1038 digest[14] = (l >> 8) & 0xff;
1039 digest[35] = (l >> 0) & 0xff;
1040
1041 l = itoa64_to_int (buf[60]) << 0;
1042 l |= itoa64_to_int (buf[61]) << 6;
1043 l |= itoa64_to_int (buf[62]) << 12;
1044 l |= itoa64_to_int (buf[63]) << 18;
1045
1046 digest[15] = (l >> 16) & 0xff;
1047 digest[36] = (l >> 8) & 0xff;
1048 digest[57] = (l >> 0) & 0xff;
1049
1050 l = itoa64_to_int (buf[64]) << 0;
1051 l |= itoa64_to_int (buf[65]) << 6;
1052 l |= itoa64_to_int (buf[66]) << 12;
1053 l |= itoa64_to_int (buf[67]) << 18;
1054
1055 digest[37] = (l >> 16) & 0xff;
1056 digest[58] = (l >> 8) & 0xff;
1057 digest[16] = (l >> 0) & 0xff;
1058
1059 l = itoa64_to_int (buf[68]) << 0;
1060 l |= itoa64_to_int (buf[69]) << 6;
1061 l |= itoa64_to_int (buf[70]) << 12;
1062 l |= itoa64_to_int (buf[71]) << 18;
1063
1064 digest[59] = (l >> 16) & 0xff;
1065 digest[17] = (l >> 8) & 0xff;
1066 digest[38] = (l >> 0) & 0xff;
1067
1068 l = itoa64_to_int (buf[72]) << 0;
1069 l |= itoa64_to_int (buf[73]) << 6;
1070 l |= itoa64_to_int (buf[74]) << 12;
1071 l |= itoa64_to_int (buf[75]) << 18;
1072
1073 digest[18] = (l >> 16) & 0xff;
1074 digest[39] = (l >> 8) & 0xff;
1075 digest[60] = (l >> 0) & 0xff;
1076
1077 l = itoa64_to_int (buf[76]) << 0;
1078 l |= itoa64_to_int (buf[77]) << 6;
1079 l |= itoa64_to_int (buf[78]) << 12;
1080 l |= itoa64_to_int (buf[79]) << 18;
1081
1082 digest[40] = (l >> 16) & 0xff;
1083 digest[61] = (l >> 8) & 0xff;
1084 digest[19] = (l >> 0) & 0xff;
1085
1086 l = itoa64_to_int (buf[80]) << 0;
1087 l |= itoa64_to_int (buf[81]) << 6;
1088 l |= itoa64_to_int (buf[82]) << 12;
1089 l |= itoa64_to_int (buf[83]) << 18;
1090
1091 digest[62] = (l >> 16) & 0xff;
1092 digest[20] = (l >> 8) & 0xff;
1093 digest[41] = (l >> 0) & 0xff;
1094
1095 l = itoa64_to_int (buf[84]) << 0;
1096 l |= itoa64_to_int (buf[85]) << 6;
1097
1098 digest[63] = (l >> 0) & 0xff;
1099 }
1100
1101 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1102 {
1103 int l;
1104
1105 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1106
1107 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1108 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1109 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111
1112 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1113
1114 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1115 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1116 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118
1119 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1120
1121 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1122 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1123 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125
1126 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1127
1128 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1129 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1130 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132
1133 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1134
1135 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1136 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1137 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139
1140 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1141
1142 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1143 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1144 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146
1147 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1148
1149 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1150 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1151 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153
1154 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1155
1156 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1157 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1158 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160
1161 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1162
1163 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1164 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1165 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167
1168 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1169
1170 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1171 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1172 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174
1175 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1176
1177 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1178 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1179 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181
1182 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1183
1184 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1185 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1186 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188
1189 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1190
1191 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1192 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1193 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195
1196 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1197
1198 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1199 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1200 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202
1203 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1204
1205 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1206 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1207 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209
1210 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1211
1212 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1213 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1214 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216
1217 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1218
1219 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1220 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1221 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223
1224 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1225
1226 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1227 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1228 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230
1231 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1232
1233 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1234 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1235 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237
1238 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1239
1240 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1241 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1242 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244
1245 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1246
1247 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1248 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1249 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1250 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251
1252 l = 0 | 0 | (digest[63] << 0);
1253
1254 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1255 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1256 }
1257
1258 void sha1aix_decode (u8 digest[20], u8 buf[27])
1259 {
1260 int l;
1261
1262 l = itoa64_to_int (buf[ 0]) << 0;
1263 l |= itoa64_to_int (buf[ 1]) << 6;
1264 l |= itoa64_to_int (buf[ 2]) << 12;
1265 l |= itoa64_to_int (buf[ 3]) << 18;
1266
1267 digest[ 2] = (l >> 0) & 0xff;
1268 digest[ 1] = (l >> 8) & 0xff;
1269 digest[ 0] = (l >> 16) & 0xff;
1270
1271 l = itoa64_to_int (buf[ 4]) << 0;
1272 l |= itoa64_to_int (buf[ 5]) << 6;
1273 l |= itoa64_to_int (buf[ 6]) << 12;
1274 l |= itoa64_to_int (buf[ 7]) << 18;
1275
1276 digest[ 5] = (l >> 0) & 0xff;
1277 digest[ 4] = (l >> 8) & 0xff;
1278 digest[ 3] = (l >> 16) & 0xff;
1279
1280 l = itoa64_to_int (buf[ 8]) << 0;
1281 l |= itoa64_to_int (buf[ 9]) << 6;
1282 l |= itoa64_to_int (buf[10]) << 12;
1283 l |= itoa64_to_int (buf[11]) << 18;
1284
1285 digest[ 8] = (l >> 0) & 0xff;
1286 digest[ 7] = (l >> 8) & 0xff;
1287 digest[ 6] = (l >> 16) & 0xff;
1288
1289 l = itoa64_to_int (buf[12]) << 0;
1290 l |= itoa64_to_int (buf[13]) << 6;
1291 l |= itoa64_to_int (buf[14]) << 12;
1292 l |= itoa64_to_int (buf[15]) << 18;
1293
1294 digest[11] = (l >> 0) & 0xff;
1295 digest[10] = (l >> 8) & 0xff;
1296 digest[ 9] = (l >> 16) & 0xff;
1297
1298 l = itoa64_to_int (buf[16]) << 0;
1299 l |= itoa64_to_int (buf[17]) << 6;
1300 l |= itoa64_to_int (buf[18]) << 12;
1301 l |= itoa64_to_int (buf[19]) << 18;
1302
1303 digest[14] = (l >> 0) & 0xff;
1304 digest[13] = (l >> 8) & 0xff;
1305 digest[12] = (l >> 16) & 0xff;
1306
1307 l = itoa64_to_int (buf[20]) << 0;
1308 l |= itoa64_to_int (buf[21]) << 6;
1309 l |= itoa64_to_int (buf[22]) << 12;
1310 l |= itoa64_to_int (buf[23]) << 18;
1311
1312 digest[17] = (l >> 0) & 0xff;
1313 digest[16] = (l >> 8) & 0xff;
1314 digest[15] = (l >> 16) & 0xff;
1315
1316 l = itoa64_to_int (buf[24]) << 0;
1317 l |= itoa64_to_int (buf[25]) << 6;
1318 l |= itoa64_to_int (buf[26]) << 12;
1319
1320 digest[19] = (l >> 8) & 0xff;
1321 digest[18] = (l >> 16) & 0xff;
1322 }
1323
1324 void sha1aix_encode (u8 digest[20], u8 buf[27])
1325 {
1326 int l;
1327
1328 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1329
1330 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1331 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1332 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1333 buf[ 3] = int_to_itoa64 (l & 0x3f);
1334
1335 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1336
1337 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1338 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1339 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1340 buf[ 7] = int_to_itoa64 (l & 0x3f);
1341
1342 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1343
1344 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1345 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1346 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[11] = int_to_itoa64 (l & 0x3f);
1348
1349 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1350
1351 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1352 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1353 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[15] = int_to_itoa64 (l & 0x3f);
1355
1356 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1357
1358 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1359 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1360 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[19] = int_to_itoa64 (l & 0x3f);
1362
1363 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1364
1365 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1366 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1367 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1368 buf[23] = int_to_itoa64 (l & 0x3f);
1369
1370 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1371
1372 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1373 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1374 buf[26] = int_to_itoa64 (l & 0x3f);
1375 }
1376
1377 void sha256aix_decode (u8 digest[32], u8 buf[43])
1378 {
1379 int l;
1380
1381 l = itoa64_to_int (buf[ 0]) << 0;
1382 l |= itoa64_to_int (buf[ 1]) << 6;
1383 l |= itoa64_to_int (buf[ 2]) << 12;
1384 l |= itoa64_to_int (buf[ 3]) << 18;
1385
1386 digest[ 2] = (l >> 0) & 0xff;
1387 digest[ 1] = (l >> 8) & 0xff;
1388 digest[ 0] = (l >> 16) & 0xff;
1389
1390 l = itoa64_to_int (buf[ 4]) << 0;
1391 l |= itoa64_to_int (buf[ 5]) << 6;
1392 l |= itoa64_to_int (buf[ 6]) << 12;
1393 l |= itoa64_to_int (buf[ 7]) << 18;
1394
1395 digest[ 5] = (l >> 0) & 0xff;
1396 digest[ 4] = (l >> 8) & 0xff;
1397 digest[ 3] = (l >> 16) & 0xff;
1398
1399 l = itoa64_to_int (buf[ 8]) << 0;
1400 l |= itoa64_to_int (buf[ 9]) << 6;
1401 l |= itoa64_to_int (buf[10]) << 12;
1402 l |= itoa64_to_int (buf[11]) << 18;
1403
1404 digest[ 8] = (l >> 0) & 0xff;
1405 digest[ 7] = (l >> 8) & 0xff;
1406 digest[ 6] = (l >> 16) & 0xff;
1407
1408 l = itoa64_to_int (buf[12]) << 0;
1409 l |= itoa64_to_int (buf[13]) << 6;
1410 l |= itoa64_to_int (buf[14]) << 12;
1411 l |= itoa64_to_int (buf[15]) << 18;
1412
1413 digest[11] = (l >> 0) & 0xff;
1414 digest[10] = (l >> 8) & 0xff;
1415 digest[ 9] = (l >> 16) & 0xff;
1416
1417 l = itoa64_to_int (buf[16]) << 0;
1418 l |= itoa64_to_int (buf[17]) << 6;
1419 l |= itoa64_to_int (buf[18]) << 12;
1420 l |= itoa64_to_int (buf[19]) << 18;
1421
1422 digest[14] = (l >> 0) & 0xff;
1423 digest[13] = (l >> 8) & 0xff;
1424 digest[12] = (l >> 16) & 0xff;
1425
1426 l = itoa64_to_int (buf[20]) << 0;
1427 l |= itoa64_to_int (buf[21]) << 6;
1428 l |= itoa64_to_int (buf[22]) << 12;
1429 l |= itoa64_to_int (buf[23]) << 18;
1430
1431 digest[17] = (l >> 0) & 0xff;
1432 digest[16] = (l >> 8) & 0xff;
1433 digest[15] = (l >> 16) & 0xff;
1434
1435 l = itoa64_to_int (buf[24]) << 0;
1436 l |= itoa64_to_int (buf[25]) << 6;
1437 l |= itoa64_to_int (buf[26]) << 12;
1438 l |= itoa64_to_int (buf[27]) << 18;
1439
1440 digest[20] = (l >> 0) & 0xff;
1441 digest[19] = (l >> 8) & 0xff;
1442 digest[18] = (l >> 16) & 0xff;
1443
1444 l = itoa64_to_int (buf[28]) << 0;
1445 l |= itoa64_to_int (buf[29]) << 6;
1446 l |= itoa64_to_int (buf[30]) << 12;
1447 l |= itoa64_to_int (buf[31]) << 18;
1448
1449 digest[23] = (l >> 0) & 0xff;
1450 digest[22] = (l >> 8) & 0xff;
1451 digest[21] = (l >> 16) & 0xff;
1452
1453 l = itoa64_to_int (buf[32]) << 0;
1454 l |= itoa64_to_int (buf[33]) << 6;
1455 l |= itoa64_to_int (buf[34]) << 12;
1456 l |= itoa64_to_int (buf[35]) << 18;
1457
1458 digest[26] = (l >> 0) & 0xff;
1459 digest[25] = (l >> 8) & 0xff;
1460 digest[24] = (l >> 16) & 0xff;
1461
1462 l = itoa64_to_int (buf[36]) << 0;
1463 l |= itoa64_to_int (buf[37]) << 6;
1464 l |= itoa64_to_int (buf[38]) << 12;
1465 l |= itoa64_to_int (buf[39]) << 18;
1466
1467 digest[29] = (l >> 0) & 0xff;
1468 digest[28] = (l >> 8) & 0xff;
1469 digest[27] = (l >> 16) & 0xff;
1470
1471 l = itoa64_to_int (buf[40]) << 0;
1472 l |= itoa64_to_int (buf[41]) << 6;
1473 l |= itoa64_to_int (buf[42]) << 12;
1474
1475 //digest[32] = (l >> 0) & 0xff;
1476 digest[31] = (l >> 8) & 0xff;
1477 digest[30] = (l >> 16) & 0xff;
1478 }
1479
1480 void sha256aix_encode (u8 digest[32], u8 buf[43])
1481 {
1482 int l;
1483
1484 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1485
1486 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1487 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1488 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1489 buf[ 3] = int_to_itoa64 (l & 0x3f);
1490
1491 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1492
1493 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1494 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1495 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1496 buf[ 7] = int_to_itoa64 (l & 0x3f);
1497
1498 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1499
1500 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1501 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1502 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[11] = int_to_itoa64 (l & 0x3f);
1504
1505 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1506
1507 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1508 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1509 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[15] = int_to_itoa64 (l & 0x3f);
1511
1512 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1513
1514 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1515 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1516 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[19] = int_to_itoa64 (l & 0x3f);
1518
1519 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1520
1521 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1522 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1523 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[23] = int_to_itoa64 (l & 0x3f);
1525
1526 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1527
1528 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1529 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1530 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[27] = int_to_itoa64 (l & 0x3f);
1532
1533 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1534
1535 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1536 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1537 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[31] = int_to_itoa64 (l & 0x3f);
1539
1540 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1541
1542 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1543 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1544 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[35] = int_to_itoa64 (l & 0x3f);
1546
1547 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1548
1549 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1550 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1551 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1552 buf[39] = int_to_itoa64 (l & 0x3f);
1553
1554 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1555
1556 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1557 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1558 buf[42] = int_to_itoa64 (l & 0x3f);
1559 }
1560
1561 void sha512aix_decode (u8 digest[64], u8 buf[86])
1562 {
1563 int l;
1564
1565 l = itoa64_to_int (buf[ 0]) << 0;
1566 l |= itoa64_to_int (buf[ 1]) << 6;
1567 l |= itoa64_to_int (buf[ 2]) << 12;
1568 l |= itoa64_to_int (buf[ 3]) << 18;
1569
1570 digest[ 2] = (l >> 0) & 0xff;
1571 digest[ 1] = (l >> 8) & 0xff;
1572 digest[ 0] = (l >> 16) & 0xff;
1573
1574 l = itoa64_to_int (buf[ 4]) << 0;
1575 l |= itoa64_to_int (buf[ 5]) << 6;
1576 l |= itoa64_to_int (buf[ 6]) << 12;
1577 l |= itoa64_to_int (buf[ 7]) << 18;
1578
1579 digest[ 5] = (l >> 0) & 0xff;
1580 digest[ 4] = (l >> 8) & 0xff;
1581 digest[ 3] = (l >> 16) & 0xff;
1582
1583 l = itoa64_to_int (buf[ 8]) << 0;
1584 l |= itoa64_to_int (buf[ 9]) << 6;
1585 l |= itoa64_to_int (buf[10]) << 12;
1586 l |= itoa64_to_int (buf[11]) << 18;
1587
1588 digest[ 8] = (l >> 0) & 0xff;
1589 digest[ 7] = (l >> 8) & 0xff;
1590 digest[ 6] = (l >> 16) & 0xff;
1591
1592 l = itoa64_to_int (buf[12]) << 0;
1593 l |= itoa64_to_int (buf[13]) << 6;
1594 l |= itoa64_to_int (buf[14]) << 12;
1595 l |= itoa64_to_int (buf[15]) << 18;
1596
1597 digest[11] = (l >> 0) & 0xff;
1598 digest[10] = (l >> 8) & 0xff;
1599 digest[ 9] = (l >> 16) & 0xff;
1600
1601 l = itoa64_to_int (buf[16]) << 0;
1602 l |= itoa64_to_int (buf[17]) << 6;
1603 l |= itoa64_to_int (buf[18]) << 12;
1604 l |= itoa64_to_int (buf[19]) << 18;
1605
1606 digest[14] = (l >> 0) & 0xff;
1607 digest[13] = (l >> 8) & 0xff;
1608 digest[12] = (l >> 16) & 0xff;
1609
1610 l = itoa64_to_int (buf[20]) << 0;
1611 l |= itoa64_to_int (buf[21]) << 6;
1612 l |= itoa64_to_int (buf[22]) << 12;
1613 l |= itoa64_to_int (buf[23]) << 18;
1614
1615 digest[17] = (l >> 0) & 0xff;
1616 digest[16] = (l >> 8) & 0xff;
1617 digest[15] = (l >> 16) & 0xff;
1618
1619 l = itoa64_to_int (buf[24]) << 0;
1620 l |= itoa64_to_int (buf[25]) << 6;
1621 l |= itoa64_to_int (buf[26]) << 12;
1622 l |= itoa64_to_int (buf[27]) << 18;
1623
1624 digest[20] = (l >> 0) & 0xff;
1625 digest[19] = (l >> 8) & 0xff;
1626 digest[18] = (l >> 16) & 0xff;
1627
1628 l = itoa64_to_int (buf[28]) << 0;
1629 l |= itoa64_to_int (buf[29]) << 6;
1630 l |= itoa64_to_int (buf[30]) << 12;
1631 l |= itoa64_to_int (buf[31]) << 18;
1632
1633 digest[23] = (l >> 0) & 0xff;
1634 digest[22] = (l >> 8) & 0xff;
1635 digest[21] = (l >> 16) & 0xff;
1636
1637 l = itoa64_to_int (buf[32]) << 0;
1638 l |= itoa64_to_int (buf[33]) << 6;
1639 l |= itoa64_to_int (buf[34]) << 12;
1640 l |= itoa64_to_int (buf[35]) << 18;
1641
1642 digest[26] = (l >> 0) & 0xff;
1643 digest[25] = (l >> 8) & 0xff;
1644 digest[24] = (l >> 16) & 0xff;
1645
1646 l = itoa64_to_int (buf[36]) << 0;
1647 l |= itoa64_to_int (buf[37]) << 6;
1648 l |= itoa64_to_int (buf[38]) << 12;
1649 l |= itoa64_to_int (buf[39]) << 18;
1650
1651 digest[29] = (l >> 0) & 0xff;
1652 digest[28] = (l >> 8) & 0xff;
1653 digest[27] = (l >> 16) & 0xff;
1654
1655 l = itoa64_to_int (buf[40]) << 0;
1656 l |= itoa64_to_int (buf[41]) << 6;
1657 l |= itoa64_to_int (buf[42]) << 12;
1658 l |= itoa64_to_int (buf[43]) << 18;
1659
1660 digest[32] = (l >> 0) & 0xff;
1661 digest[31] = (l >> 8) & 0xff;
1662 digest[30] = (l >> 16) & 0xff;
1663
1664 l = itoa64_to_int (buf[44]) << 0;
1665 l |= itoa64_to_int (buf[45]) << 6;
1666 l |= itoa64_to_int (buf[46]) << 12;
1667 l |= itoa64_to_int (buf[47]) << 18;
1668
1669 digest[35] = (l >> 0) & 0xff;
1670 digest[34] = (l >> 8) & 0xff;
1671 digest[33] = (l >> 16) & 0xff;
1672
1673 l = itoa64_to_int (buf[48]) << 0;
1674 l |= itoa64_to_int (buf[49]) << 6;
1675 l |= itoa64_to_int (buf[50]) << 12;
1676 l |= itoa64_to_int (buf[51]) << 18;
1677
1678 digest[38] = (l >> 0) & 0xff;
1679 digest[37] = (l >> 8) & 0xff;
1680 digest[36] = (l >> 16) & 0xff;
1681
1682 l = itoa64_to_int (buf[52]) << 0;
1683 l |= itoa64_to_int (buf[53]) << 6;
1684 l |= itoa64_to_int (buf[54]) << 12;
1685 l |= itoa64_to_int (buf[55]) << 18;
1686
1687 digest[41] = (l >> 0) & 0xff;
1688 digest[40] = (l >> 8) & 0xff;
1689 digest[39] = (l >> 16) & 0xff;
1690
1691 l = itoa64_to_int (buf[56]) << 0;
1692 l |= itoa64_to_int (buf[57]) << 6;
1693 l |= itoa64_to_int (buf[58]) << 12;
1694 l |= itoa64_to_int (buf[59]) << 18;
1695
1696 digest[44] = (l >> 0) & 0xff;
1697 digest[43] = (l >> 8) & 0xff;
1698 digest[42] = (l >> 16) & 0xff;
1699
1700 l = itoa64_to_int (buf[60]) << 0;
1701 l |= itoa64_to_int (buf[61]) << 6;
1702 l |= itoa64_to_int (buf[62]) << 12;
1703 l |= itoa64_to_int (buf[63]) << 18;
1704
1705 digest[47] = (l >> 0) & 0xff;
1706 digest[46] = (l >> 8) & 0xff;
1707 digest[45] = (l >> 16) & 0xff;
1708
1709 l = itoa64_to_int (buf[64]) << 0;
1710 l |= itoa64_to_int (buf[65]) << 6;
1711 l |= itoa64_to_int (buf[66]) << 12;
1712 l |= itoa64_to_int (buf[67]) << 18;
1713
1714 digest[50] = (l >> 0) & 0xff;
1715 digest[49] = (l >> 8) & 0xff;
1716 digest[48] = (l >> 16) & 0xff;
1717
1718 l = itoa64_to_int (buf[68]) << 0;
1719 l |= itoa64_to_int (buf[69]) << 6;
1720 l |= itoa64_to_int (buf[70]) << 12;
1721 l |= itoa64_to_int (buf[71]) << 18;
1722
1723 digest[53] = (l >> 0) & 0xff;
1724 digest[52] = (l >> 8) & 0xff;
1725 digest[51] = (l >> 16) & 0xff;
1726
1727 l = itoa64_to_int (buf[72]) << 0;
1728 l |= itoa64_to_int (buf[73]) << 6;
1729 l |= itoa64_to_int (buf[74]) << 12;
1730 l |= itoa64_to_int (buf[75]) << 18;
1731
1732 digest[56] = (l >> 0) & 0xff;
1733 digest[55] = (l >> 8) & 0xff;
1734 digest[54] = (l >> 16) & 0xff;
1735
1736 l = itoa64_to_int (buf[76]) << 0;
1737 l |= itoa64_to_int (buf[77]) << 6;
1738 l |= itoa64_to_int (buf[78]) << 12;
1739 l |= itoa64_to_int (buf[79]) << 18;
1740
1741 digest[59] = (l >> 0) & 0xff;
1742 digest[58] = (l >> 8) & 0xff;
1743 digest[57] = (l >> 16) & 0xff;
1744
1745 l = itoa64_to_int (buf[80]) << 0;
1746 l |= itoa64_to_int (buf[81]) << 6;
1747 l |= itoa64_to_int (buf[82]) << 12;
1748 l |= itoa64_to_int (buf[83]) << 18;
1749
1750 digest[62] = (l >> 0) & 0xff;
1751 digest[61] = (l >> 8) & 0xff;
1752 digest[60] = (l >> 16) & 0xff;
1753
1754 l = itoa64_to_int (buf[84]) << 0;
1755 l |= itoa64_to_int (buf[85]) << 6;
1756
1757 digest[63] = (l >> 16) & 0xff;
1758 }
1759
1760 void sha512aix_encode (u8 digest[64], u8 buf[86])
1761 {
1762 int l;
1763
1764 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1765
1766 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1767 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1768 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1769 buf[ 3] = int_to_itoa64 (l & 0x3f);
1770
1771 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1772
1773 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1774 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1775 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1776 buf[ 7] = int_to_itoa64 (l & 0x3f);
1777
1778 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1779
1780 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1781 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1782 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[11] = int_to_itoa64 (l & 0x3f);
1784
1785 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1786
1787 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1788 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1789 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[15] = int_to_itoa64 (l & 0x3f);
1791
1792 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1793
1794 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1795 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1796 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[19] = int_to_itoa64 (l & 0x3f);
1798
1799 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1800
1801 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1802 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1803 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[23] = int_to_itoa64 (l & 0x3f);
1805
1806 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1807
1808 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1809 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1810 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[27] = int_to_itoa64 (l & 0x3f);
1812
1813 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1814
1815 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1816 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1817 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[31] = int_to_itoa64 (l & 0x3f);
1819
1820 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1821
1822 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1823 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1824 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[35] = int_to_itoa64 (l & 0x3f);
1826
1827 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1828
1829 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1830 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1831 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[39] = int_to_itoa64 (l & 0x3f);
1833
1834 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1835
1836 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1837 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1838 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[43] = int_to_itoa64 (l & 0x3f);
1840
1841 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1842
1843 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1844 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1845 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[47] = int_to_itoa64 (l & 0x3f);
1847
1848 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1849
1850 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1851 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1852 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[51] = int_to_itoa64 (l & 0x3f);
1854
1855 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1856
1857 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1858 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1859 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[55] = int_to_itoa64 (l & 0x3f);
1861
1862 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1863
1864 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1865 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1866 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[59] = int_to_itoa64 (l & 0x3f);
1868
1869 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1870
1871 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1872 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1873 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[63] = int_to_itoa64 (l & 0x3f);
1875
1876 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1877
1878 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1879 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1880 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[67] = int_to_itoa64 (l & 0x3f);
1882
1883 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1884
1885 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1886 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1887 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[71] = int_to_itoa64 (l & 0x3f);
1889
1890 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1891
1892 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1893 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1894 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[75] = int_to_itoa64 (l & 0x3f);
1896
1897 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1898
1899 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1900 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1901 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[79] = int_to_itoa64 (l & 0x3f);
1903
1904 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1905
1906 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1907 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1908 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1909 buf[83] = int_to_itoa64 (l & 0x3f);
1910
1911 l = 0 | 0 | (digest[63] << 16);
1912
1913 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1914 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1915 }
1916
1917 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1918 {
1919 int l;
1920
1921 l = itoa64_to_int (buf[ 0]) << 0;
1922 l |= itoa64_to_int (buf[ 1]) << 6;
1923 l |= itoa64_to_int (buf[ 2]) << 12;
1924 l |= itoa64_to_int (buf[ 3]) << 18;
1925
1926 digest[ 0] = (l >> 16) & 0xff;
1927 digest[10] = (l >> 8) & 0xff;
1928 digest[20] = (l >> 0) & 0xff;
1929
1930 l = itoa64_to_int (buf[ 4]) << 0;
1931 l |= itoa64_to_int (buf[ 5]) << 6;
1932 l |= itoa64_to_int (buf[ 6]) << 12;
1933 l |= itoa64_to_int (buf[ 7]) << 18;
1934
1935 digest[21] = (l >> 16) & 0xff;
1936 digest[ 1] = (l >> 8) & 0xff;
1937 digest[11] = (l >> 0) & 0xff;
1938
1939 l = itoa64_to_int (buf[ 8]) << 0;
1940 l |= itoa64_to_int (buf[ 9]) << 6;
1941 l |= itoa64_to_int (buf[10]) << 12;
1942 l |= itoa64_to_int (buf[11]) << 18;
1943
1944 digest[12] = (l >> 16) & 0xff;
1945 digest[22] = (l >> 8) & 0xff;
1946 digest[ 2] = (l >> 0) & 0xff;
1947
1948 l = itoa64_to_int (buf[12]) << 0;
1949 l |= itoa64_to_int (buf[13]) << 6;
1950 l |= itoa64_to_int (buf[14]) << 12;
1951 l |= itoa64_to_int (buf[15]) << 18;
1952
1953 digest[ 3] = (l >> 16) & 0xff;
1954 digest[13] = (l >> 8) & 0xff;
1955 digest[23] = (l >> 0) & 0xff;
1956
1957 l = itoa64_to_int (buf[16]) << 0;
1958 l |= itoa64_to_int (buf[17]) << 6;
1959 l |= itoa64_to_int (buf[18]) << 12;
1960 l |= itoa64_to_int (buf[19]) << 18;
1961
1962 digest[24] = (l >> 16) & 0xff;
1963 digest[ 4] = (l >> 8) & 0xff;
1964 digest[14] = (l >> 0) & 0xff;
1965
1966 l = itoa64_to_int (buf[20]) << 0;
1967 l |= itoa64_to_int (buf[21]) << 6;
1968 l |= itoa64_to_int (buf[22]) << 12;
1969 l |= itoa64_to_int (buf[23]) << 18;
1970
1971 digest[15] = (l >> 16) & 0xff;
1972 digest[25] = (l >> 8) & 0xff;
1973 digest[ 5] = (l >> 0) & 0xff;
1974
1975 l = itoa64_to_int (buf[24]) << 0;
1976 l |= itoa64_to_int (buf[25]) << 6;
1977 l |= itoa64_to_int (buf[26]) << 12;
1978 l |= itoa64_to_int (buf[27]) << 18;
1979
1980 digest[ 6] = (l >> 16) & 0xff;
1981 digest[16] = (l >> 8) & 0xff;
1982 digest[26] = (l >> 0) & 0xff;
1983
1984 l = itoa64_to_int (buf[28]) << 0;
1985 l |= itoa64_to_int (buf[29]) << 6;
1986 l |= itoa64_to_int (buf[30]) << 12;
1987 l |= itoa64_to_int (buf[31]) << 18;
1988
1989 digest[27] = (l >> 16) & 0xff;
1990 digest[ 7] = (l >> 8) & 0xff;
1991 digest[17] = (l >> 0) & 0xff;
1992
1993 l = itoa64_to_int (buf[32]) << 0;
1994 l |= itoa64_to_int (buf[33]) << 6;
1995 l |= itoa64_to_int (buf[34]) << 12;
1996 l |= itoa64_to_int (buf[35]) << 18;
1997
1998 digest[18] = (l >> 16) & 0xff;
1999 digest[28] = (l >> 8) & 0xff;
2000 digest[ 8] = (l >> 0) & 0xff;
2001
2002 l = itoa64_to_int (buf[36]) << 0;
2003 l |= itoa64_to_int (buf[37]) << 6;
2004 l |= itoa64_to_int (buf[38]) << 12;
2005 l |= itoa64_to_int (buf[39]) << 18;
2006
2007 digest[ 9] = (l >> 16) & 0xff;
2008 digest[19] = (l >> 8) & 0xff;
2009 digest[29] = (l >> 0) & 0xff;
2010
2011 l = itoa64_to_int (buf[40]) << 0;
2012 l |= itoa64_to_int (buf[41]) << 6;
2013 l |= itoa64_to_int (buf[42]) << 12;
2014
2015 digest[31] = (l >> 8) & 0xff;
2016 digest[30] = (l >> 0) & 0xff;
2017 }
2018
2019 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2020 {
2021 int l;
2022
2023 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2024
2025 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2026 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2027 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029
2030 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2031
2032 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2033 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2034 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036
2037 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2038
2039 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2040 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2041 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043
2044 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2045
2046 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2047 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2048 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050
2051 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2052
2053 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2054 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2055 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057
2058 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2059
2060 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2061 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2062 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064
2065 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2066
2067 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2068 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2069 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071
2072 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2073
2074 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2075 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2076 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078
2079 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2080
2081 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2082 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2083 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085
2086 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2087
2088 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2089 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2090 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2091 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092
2093 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2094
2095 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2096 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2097 buf[42] = int_to_itoa64 (l & 0x3f);
2098 }
2099
2100 void drupal7_decode (u8 digest[64], u8 buf[44])
2101 {
2102 int l;
2103
2104 l = itoa64_to_int (buf[ 0]) << 0;
2105 l |= itoa64_to_int (buf[ 1]) << 6;
2106 l |= itoa64_to_int (buf[ 2]) << 12;
2107 l |= itoa64_to_int (buf[ 3]) << 18;
2108
2109 digest[ 0] = (l >> 0) & 0xff;
2110 digest[ 1] = (l >> 8) & 0xff;
2111 digest[ 2] = (l >> 16) & 0xff;
2112
2113 l = itoa64_to_int (buf[ 4]) << 0;
2114 l |= itoa64_to_int (buf[ 5]) << 6;
2115 l |= itoa64_to_int (buf[ 6]) << 12;
2116 l |= itoa64_to_int (buf[ 7]) << 18;
2117
2118 digest[ 3] = (l >> 0) & 0xff;
2119 digest[ 4] = (l >> 8) & 0xff;
2120 digest[ 5] = (l >> 16) & 0xff;
2121
2122 l = itoa64_to_int (buf[ 8]) << 0;
2123 l |= itoa64_to_int (buf[ 9]) << 6;
2124 l |= itoa64_to_int (buf[10]) << 12;
2125 l |= itoa64_to_int (buf[11]) << 18;
2126
2127 digest[ 6] = (l >> 0) & 0xff;
2128 digest[ 7] = (l >> 8) & 0xff;
2129 digest[ 8] = (l >> 16) & 0xff;
2130
2131 l = itoa64_to_int (buf[12]) << 0;
2132 l |= itoa64_to_int (buf[13]) << 6;
2133 l |= itoa64_to_int (buf[14]) << 12;
2134 l |= itoa64_to_int (buf[15]) << 18;
2135
2136 digest[ 9] = (l >> 0) & 0xff;
2137 digest[10] = (l >> 8) & 0xff;
2138 digest[11] = (l >> 16) & 0xff;
2139
2140 l = itoa64_to_int (buf[16]) << 0;
2141 l |= itoa64_to_int (buf[17]) << 6;
2142 l |= itoa64_to_int (buf[18]) << 12;
2143 l |= itoa64_to_int (buf[19]) << 18;
2144
2145 digest[12] = (l >> 0) & 0xff;
2146 digest[13] = (l >> 8) & 0xff;
2147 digest[14] = (l >> 16) & 0xff;
2148
2149 l = itoa64_to_int (buf[20]) << 0;
2150 l |= itoa64_to_int (buf[21]) << 6;
2151 l |= itoa64_to_int (buf[22]) << 12;
2152 l |= itoa64_to_int (buf[23]) << 18;
2153
2154 digest[15] = (l >> 0) & 0xff;
2155 digest[16] = (l >> 8) & 0xff;
2156 digest[17] = (l >> 16) & 0xff;
2157
2158 l = itoa64_to_int (buf[24]) << 0;
2159 l |= itoa64_to_int (buf[25]) << 6;
2160 l |= itoa64_to_int (buf[26]) << 12;
2161 l |= itoa64_to_int (buf[27]) << 18;
2162
2163 digest[18] = (l >> 0) & 0xff;
2164 digest[19] = (l >> 8) & 0xff;
2165 digest[20] = (l >> 16) & 0xff;
2166
2167 l = itoa64_to_int (buf[28]) << 0;
2168 l |= itoa64_to_int (buf[29]) << 6;
2169 l |= itoa64_to_int (buf[30]) << 12;
2170 l |= itoa64_to_int (buf[31]) << 18;
2171
2172 digest[21] = (l >> 0) & 0xff;
2173 digest[22] = (l >> 8) & 0xff;
2174 digest[23] = (l >> 16) & 0xff;
2175
2176 l = itoa64_to_int (buf[32]) << 0;
2177 l |= itoa64_to_int (buf[33]) << 6;
2178 l |= itoa64_to_int (buf[34]) << 12;
2179 l |= itoa64_to_int (buf[35]) << 18;
2180
2181 digest[24] = (l >> 0) & 0xff;
2182 digest[25] = (l >> 8) & 0xff;
2183 digest[26] = (l >> 16) & 0xff;
2184
2185 l = itoa64_to_int (buf[36]) << 0;
2186 l |= itoa64_to_int (buf[37]) << 6;
2187 l |= itoa64_to_int (buf[38]) << 12;
2188 l |= itoa64_to_int (buf[39]) << 18;
2189
2190 digest[27] = (l >> 0) & 0xff;
2191 digest[28] = (l >> 8) & 0xff;
2192 digest[29] = (l >> 16) & 0xff;
2193
2194 l = itoa64_to_int (buf[40]) << 0;
2195 l |= itoa64_to_int (buf[41]) << 6;
2196 l |= itoa64_to_int (buf[42]) << 12;
2197 l |= itoa64_to_int (buf[43]) << 18;
2198
2199 digest[30] = (l >> 0) & 0xff;
2200 digest[31] = (l >> 8) & 0xff;
2201 digest[32] = (l >> 16) & 0xff;
2202
2203 digest[33] = 0;
2204 digest[34] = 0;
2205 digest[35] = 0;
2206 digest[36] = 0;
2207 digest[37] = 0;
2208 digest[38] = 0;
2209 digest[39] = 0;
2210 digest[40] = 0;
2211 digest[41] = 0;
2212 digest[42] = 0;
2213 digest[43] = 0;
2214 digest[44] = 0;
2215 digest[45] = 0;
2216 digest[46] = 0;
2217 digest[47] = 0;
2218 digest[48] = 0;
2219 digest[49] = 0;
2220 digest[50] = 0;
2221 digest[51] = 0;
2222 digest[52] = 0;
2223 digest[53] = 0;
2224 digest[54] = 0;
2225 digest[55] = 0;
2226 digest[56] = 0;
2227 digest[57] = 0;
2228 digest[58] = 0;
2229 digest[59] = 0;
2230 digest[60] = 0;
2231 digest[61] = 0;
2232 digest[62] = 0;
2233 digest[63] = 0;
2234 }
2235
2236 void drupal7_encode (u8 digest[64], u8 buf[43])
2237 {
2238 int l;
2239
2240 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2241
2242 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2243 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2244 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2245 buf[ 3] = int_to_itoa64 (l & 0x3f);
2246
2247 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2248
2249 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2250 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2251 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2252 buf[ 7] = int_to_itoa64 (l & 0x3f);
2253
2254 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2255
2256 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2257 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2258 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[11] = int_to_itoa64 (l & 0x3f);
2260
2261 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2262
2263 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2264 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2265 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[15] = int_to_itoa64 (l & 0x3f);
2267
2268 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2269
2270 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2271 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2272 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[19] = int_to_itoa64 (l & 0x3f);
2274
2275 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2276
2277 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2278 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2279 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[23] = int_to_itoa64 (l & 0x3f);
2281
2282 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2283
2284 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2285 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2286 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[27] = int_to_itoa64 (l & 0x3f);
2288
2289 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2290
2291 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2292 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2293 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[31] = int_to_itoa64 (l & 0x3f);
2295
2296 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2297
2298 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2299 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2300 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[35] = int_to_itoa64 (l & 0x3f);
2302
2303 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2304
2305 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2306 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2307 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 buf[39] = int_to_itoa64 (l & 0x3f);
2309
2310 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2311
2312 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2313 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2314 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2315 //buf[43] = int_to_itoa64 (l & 0x3f);
2316 }
2317
2318 /**
2319 * tty
2320 */
2321
2322 #ifdef LINUX
2323 static struct termio savemodes;
2324 static int havemodes = 0;
2325
2326 int tty_break()
2327 {
2328 struct termio modmodes;
2329
2330 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2331
2332 havemodes = 1;
2333
2334 modmodes = savemodes;
2335 modmodes.c_lflag &= ~ICANON;
2336 modmodes.c_cc[VMIN] = 1;
2337 modmodes.c_cc[VTIME] = 0;
2338
2339 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2340 }
2341
2342 int tty_getchar()
2343 {
2344 fd_set rfds;
2345
2346 FD_ZERO (&rfds);
2347
2348 FD_SET (fileno (stdin), &rfds);
2349
2350 struct timeval tv;
2351
2352 tv.tv_sec = 1;
2353 tv.tv_usec = 0;
2354
2355 int retval = select (1, &rfds, NULL, NULL, &tv);
2356
2357 if (retval == 0) return 0;
2358 if (retval == -1) return -1;
2359
2360 return getchar();
2361 }
2362
2363 int tty_fix()
2364 {
2365 if (!havemodes) return 0;
2366
2367 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2368 }
2369 #endif
2370
2371 #ifdef OSX
2372 static struct termios savemodes;
2373 static int havemodes = 0;
2374
2375 int tty_break()
2376 {
2377 struct termios modmodes;
2378
2379 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2380
2381 havemodes = 1;
2382
2383 modmodes = savemodes;
2384 modmodes.c_lflag &= ~ICANON;
2385 modmodes.c_cc[VMIN] = 1;
2386 modmodes.c_cc[VTIME] = 0;
2387
2388 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2389 }
2390
2391 int tty_getchar()
2392 {
2393 fd_set rfds;
2394
2395 FD_ZERO (&rfds);
2396
2397 FD_SET (fileno (stdin), &rfds);
2398
2399 struct timeval tv;
2400
2401 tv.tv_sec = 1;
2402 tv.tv_usec = 0;
2403
2404 int retval = select (1, &rfds, NULL, NULL, &tv);
2405
2406 if (retval == 0) return 0;
2407 if (retval == -1) return -1;
2408
2409 return getchar();
2410 }
2411
2412 int tty_fix()
2413 {
2414 if (!havemodes) return 0;
2415
2416 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2417 }
2418 #endif
2419
2420 #ifdef WIN
2421 static DWORD saveMode = 0;
2422
2423 int tty_break()
2424 {
2425 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2426
2427 GetConsoleMode (stdinHandle, &saveMode);
2428 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2429
2430 return 0;
2431 }
2432
2433 int tty_getchar()
2434 {
2435 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2436
2437 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2438
2439 if (rc == WAIT_TIMEOUT) return 0;
2440 if (rc == WAIT_ABANDONED) return -1;
2441 if (rc == WAIT_FAILED) return -1;
2442
2443 // The whole ReadConsoleInput () part is a workaround.
2444 // For some unknown reason, maybe a mingw bug, a random signal
2445 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2446 // Then it wants to read with getche () a keyboard input
2447 // which has never been made.
2448
2449 INPUT_RECORD buf[100];
2450
2451 DWORD num = 0;
2452
2453 memset (buf, 0, sizeof (buf));
2454
2455 ReadConsoleInput (stdinHandle, buf, 100, &num);
2456
2457 FlushConsoleInputBuffer (stdinHandle);
2458
2459 for (uint i = 0; i < num; i++)
2460 {
2461 if (buf[i].EventType != KEY_EVENT) continue;
2462
2463 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2464
2465 if (KeyEvent.bKeyDown != TRUE) continue;
2466
2467 return KeyEvent.uChar.AsciiChar;
2468 }
2469
2470 return 0;
2471 }
2472
2473 int tty_fix()
2474 {
2475 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2476
2477 SetConsoleMode (stdinHandle, saveMode);
2478
2479 return 0;
2480 }
2481 #endif
2482
2483 /**
2484 * mem alloc
2485 */
2486
2487 #define MSG_ENOMEM "Insufficient memory available"
2488
2489 void *mycalloc (size_t nmemb, size_t size)
2490 {
2491 void *p = calloc (nmemb, size);
2492
2493 if (p == NULL)
2494 {
2495 log_error ("ERROR: %s", MSG_ENOMEM);
2496
2497 exit (-1);
2498 }
2499
2500 return (p);
2501 }
2502
2503 void *mymalloc (size_t size)
2504 {
2505 void *p = malloc (size);
2506
2507 if (p == NULL)
2508 {
2509 log_error ("ERROR: %s", MSG_ENOMEM);
2510
2511 exit (-1);
2512 }
2513
2514 memset (p, 0, size);
2515
2516 return (p);
2517 }
2518
2519 void myfree (void *ptr)
2520 {
2521 if (ptr == NULL) return;
2522
2523 free (ptr);
2524 }
2525
2526 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2527 {
2528 void *p = realloc (ptr, oldsz + add);
2529
2530 if (p == NULL)
2531 {
2532 log_error ("ERROR: %s", MSG_ENOMEM);
2533
2534 exit (-1);
2535 }
2536
2537 memset ((char *) p + oldsz, 0, add);
2538
2539 return (p);
2540 }
2541
2542 char *mystrdup (const char *s)
2543 {
2544 const size_t len = strlen (s);
2545
2546 char *b = (char *) mymalloc (len + 1);
2547
2548 memcpy (b, s, len);
2549
2550 return (b);
2551 }
2552
2553 FILE *logfile_open (char *logfile)
2554 {
2555 FILE *fp = fopen (logfile, "ab");
2556
2557 if (fp == NULL)
2558 {
2559 fp = stdout;
2560 }
2561
2562 return fp;
2563 }
2564
2565 void logfile_close (FILE *fp)
2566 {
2567 if (fp == stdout) return;
2568
2569 fclose (fp);
2570 }
2571
2572 void logfile_append (const char *fmt, ...)
2573 {
2574 if (data.logfile_disable == 1) return;
2575
2576 FILE *fp = logfile_open (data.logfile);
2577
2578 va_list ap;
2579
2580 va_start (ap, fmt);
2581
2582 vfprintf (fp, fmt, ap);
2583
2584 va_end (ap);
2585
2586 fputc ('\n', fp);
2587
2588 fflush (fp);
2589
2590 logfile_close (fp);
2591 }
2592
2593 int logfile_generate_id ()
2594 {
2595 const int n = rand ();
2596
2597 time_t t;
2598
2599 time (&t);
2600
2601 return t + n;
2602 }
2603
2604 char *logfile_generate_topid ()
2605 {
2606 const int id = logfile_generate_id ();
2607
2608 char *topid = (char *) mymalloc (1 + 16 + 1);
2609
2610 snprintf (topid, 1 + 16, "TOP%08x", id);
2611
2612 return topid;
2613 }
2614
2615 char *logfile_generate_subid ()
2616 {
2617 const int id = logfile_generate_id ();
2618
2619 char *subid = (char *) mymalloc (1 + 16 + 1);
2620
2621 snprintf (subid, 1 + 16, "SUB%08x", id);
2622
2623 return subid;
2624 }
2625
2626 /**
2627 * system
2628 */
2629
2630 #if F_SETLKW
2631 void lock_file (FILE *fp)
2632 {
2633 struct flock lock;
2634
2635 memset (&lock, 0, sizeof (struct flock));
2636
2637 lock.l_type = F_WRLCK;
2638 while (fcntl(fileno(fp), F_SETLKW, &lock))
2639 {
2640 if (errno != EINTR)
2641 {
2642 log_error ("ERROR: failed acquiring write lock: %s", strerror (errno));
2643
2644 exit (-1);
2645 }
2646 }
2647 }
2648
2649 void unlock_file (FILE *fp)
2650 {
2651 struct flock lock;
2652
2653 memset (&lock, 0, sizeof (struct flock));
2654
2655 lock.l_type = F_UNLCK;
2656 fcntl(fileno(fp), F_SETLK, &lock);
2657 }
2658 #endif // F_SETLKW
2659
2660 #ifdef _WIN
2661 void fsync (int fd)
2662 {
2663 HANDLE h = (HANDLE) _get_osfhandle (fd);
2664
2665 FlushFileBuffers (h);
2666 }
2667 #endif
2668
2669 /**
2670 * thermal
2671 */
2672
2673 #ifdef HAVE_HWMON
2674 #if defined(_WIN) && defined(HAVE_NVAPI)
2675 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2676 {
2677 NvU32 pGpuCount;
2678
2679 if (hm_NvAPI_EnumPhysicalGPUs (data.hm_nv, nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2680
2681 if (pGpuCount == 0)
2682 {
2683 log_info ("WARN: No NvAPI adapters found");
2684
2685 return (0);
2686 }
2687
2688 return (pGpuCount);
2689 }
2690 #endif // _WIN && HAVE_NVAPI
2691
2692 #if defined(LINUX) && defined(HAVE_NVML)
2693 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2694 {
2695 int pGpuCount = 0;
2696
2697 for (uint i = 0; i < DEVICES_MAX; i++)
2698 {
2699 if (hm_NVML_nvmlDeviceGetHandleByIndex (data.hm_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2700
2701 // can be used to determine if the device by index matches the cuda device by index
2702 // char name[100]; memset (name, 0, sizeof (name));
2703 // hm_NVML_nvmlDeviceGetName (data.hm_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2704
2705 pGpuCount++;
2706 }
2707
2708 if (pGpuCount == 0)
2709 {
2710 log_info ("WARN: No NVML adapters found");
2711
2712 return (0);
2713 }
2714
2715 return (pGpuCount);
2716 }
2717 #endif // LINUX && HAVE_NVML
2718
2719 #ifdef HAVE_ADL
2720 int get_adapters_num_amd (void *adl, int *iNumberAdapters)
2721 {
2722 if (hm_ADL_Adapter_NumberOfAdapters_Get ((ADL_PTR *) adl, iNumberAdapters) != ADL_OK) return -1;
2723
2724 if (iNumberAdapters == 0)
2725 {
2726 log_info ("WARN: No ADL adapters found.");
2727
2728 return -1;
2729 }
2730
2731 return 0;
2732 }
2733
2734 /*
2735 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2736 {
2737 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2738 ADLODParameters lpOdParameters;
2739
2740 lpOdParameters.iSize = sizeof (ADLODParameters);
2741 size_t plevels_size = 0;
2742
2743 if (hm_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2744
2745 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2746 __func__, iAdapterIndex,
2747 lpOdParameters.iNumberOfPerformanceLevels,
2748 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2749 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2750
2751 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2752
2753 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2754
2755 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2756
2757 if (hm_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2758
2759 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2760 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2761 __func__, iAdapterIndex, j,
2762 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2763
2764 myfree (lpOdPerformanceLevels);
2765
2766 return 0;
2767 }
2768 */
2769
2770 LPAdapterInfo hm_get_adapter_info_amd (void *adl, int iNumberAdapters)
2771 {
2772 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2773
2774 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2775
2776 if (hm_ADL_Adapter_AdapterInfo_Get ((ADL_PTR *) adl, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2777
2778 return lpAdapterInfo;
2779 }
2780
2781 /*
2782 //
2783 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2784 //
2785
2786 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2787 {
2788 u32 idx = -1;
2789
2790 for (uint i = 0; i < num_adl_adapters; i++)
2791 {
2792 int opencl_bus_num = hm_device[i].busid;
2793 int opencl_dev_num = hm_device[i].devid;
2794
2795 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2796 {
2797 idx = i;
2798
2799 break;
2800 }
2801 }
2802
2803 if (idx >= DEVICES_MAX) return -1;
2804
2805 return idx;
2806 }
2807
2808 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2809 {
2810 for (uint i = 0; i < opencl_num_devices; i++)
2811 {
2812 cl_device_topology_amd device_topology;
2813
2814 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2815
2816 hm_device[i].busid = device_topology.pcie.bus;
2817 hm_device[i].devid = device_topology.pcie.device;
2818 }
2819 }
2820 */
2821
2822 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2823 {
2824 // basically bubble sort
2825
2826 for (int i = 0; i < num_adl_adapters; i++)
2827 {
2828 for (int j = 0; j < num_adl_adapters - 1; j++)
2829 {
2830 // get info of adapter [x]
2831
2832 u32 adapter_index_x = valid_adl_device_list[j];
2833 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2834
2835 u32 bus_num_x = info_x.iBusNumber;
2836 u32 dev_num_x = info_x.iDeviceNumber;
2837
2838 // get info of adapter [y]
2839
2840 u32 adapter_index_y = valid_adl_device_list[j + 1];
2841 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2842
2843 u32 bus_num_y = info_y.iBusNumber;
2844 u32 dev_num_y = info_y.iDeviceNumber;
2845
2846 uint need_swap = 0;
2847
2848 if (bus_num_y < bus_num_x)
2849 {
2850 need_swap = 1;
2851 }
2852 else if (bus_num_y == bus_num_x)
2853 {
2854 if (dev_num_y < dev_num_x)
2855 {
2856 need_swap = 1;
2857 }
2858 }
2859
2860 if (need_swap == 1)
2861 {
2862 u32 temp = valid_adl_device_list[j + 1];
2863
2864 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2865 valid_adl_device_list[j + 0] = temp;
2866 }
2867 }
2868 }
2869 }
2870
2871 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2872 {
2873 *num_adl_adapters = 0;
2874
2875 u32 *adl_adapters = NULL;
2876
2877 int *bus_numbers = NULL;
2878 int *device_numbers = NULL;
2879
2880 for (int i = 0; i < iNumberAdapters; i++)
2881 {
2882 AdapterInfo info = lpAdapterInfo[i];
2883
2884 if (strlen (info.strUDID) < 1) continue;
2885
2886 #ifdef WIN
2887 if (info.iVendorID != 1002) continue;
2888 #else
2889 if (info.iVendorID != 0x1002) continue;
2890 #endif
2891
2892 if (info.iBusNumber < 0) continue;
2893 if (info.iDeviceNumber < 0) continue;
2894
2895 int found = 0;
2896
2897 for (int pos = 0; pos < *num_adl_adapters; pos++)
2898 {
2899 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2900 {
2901 found = 1;
2902 break;
2903 }
2904 }
2905
2906 if (found) continue;
2907
2908 // add it to the list
2909
2910 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2911
2912 adl_adapters[*num_adl_adapters] = i;
2913
2914 // rest is just bookkeeping
2915
2916 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2917 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2918
2919 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2920 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2921
2922 (*num_adl_adapters)++;
2923 }
2924
2925 myfree (bus_numbers);
2926 myfree (device_numbers);
2927
2928 // sort the list by increasing bus id, device id number
2929
2930 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2931
2932 return adl_adapters;
2933 }
2934
2935 int hm_check_fanspeed_control (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2936 {
2937 // loop through all valid devices
2938
2939 for (int i = 0; i < num_adl_adapters; i++)
2940 {
2941 u32 adapter_index = valid_adl_device_list[i];
2942
2943 // get AdapterInfo
2944
2945 AdapterInfo info = lpAdapterInfo[adapter_index];
2946
2947 // unfortunately this doesn't work since bus id and dev id are not unique
2948 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2949 // if (opencl_device_index == -1) continue;
2950
2951 int opencl_device_index = i;
2952
2953 // if (hm_show_performance_level (adl, info.iAdapterIndex) != 0) return -1;
2954
2955 // get fanspeed info
2956
2957 if (hm_device[opencl_device_index].od_version == 5)
2958 {
2959 ADLFanSpeedInfo FanSpeedInfo;
2960
2961 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2962
2963 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2964
2965 if (hm_ADL_Overdrive5_FanSpeedInfo_Get (adl, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2966
2967 // check read and write capability in fanspeedinfo
2968
2969 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2970 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2971 {
2972 hm_device[opencl_device_index].fan_supported = 1;
2973 }
2974 else
2975 {
2976 hm_device[opencl_device_index].fan_supported = 0;
2977 }
2978 }
2979 else // od_version == 6
2980 {
2981 ADLOD6FanSpeedInfo faninfo;
2982
2983 memset (&faninfo, 0, sizeof (faninfo));
2984
2985 if (hm_ADL_Overdrive6_FanSpeed_Get (adl, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2986
2987 // check read capability in fanspeedinfo
2988
2989 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2990 {
2991 hm_device[opencl_device_index].fan_supported = 1;
2992 }
2993 else
2994 {
2995 hm_device[opencl_device_index].fan_supported = 0;
2996 }
2997 }
2998 }
2999
3000 return 0;
3001 }
3002
3003 int hm_get_overdrive_version (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3004 {
3005 for (int i = 0; i < num_adl_adapters; i++)
3006 {
3007 u32 adapter_index = valid_adl_device_list[i];
3008
3009 // get AdapterInfo
3010
3011 AdapterInfo info = lpAdapterInfo[adapter_index];
3012
3013 // get overdrive version
3014
3015 int od_supported = 0;
3016 int od_enabled = 0;
3017 int od_version = 0;
3018
3019 if (hm_ADL_Overdrive_Caps (adl, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3020
3021 // store the overdrive version in hm_device
3022
3023 // unfortunately this doesn't work since bus id and dev id are not unique
3024 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3025 // if (opencl_device_index == -1) continue;
3026
3027 int opencl_device_index = i;
3028
3029 hm_device[opencl_device_index].od_version = od_version;
3030 }
3031
3032 return 0;
3033 }
3034
3035 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3036 {
3037 for (int i = 0; i < num_adl_adapters; i++)
3038 {
3039 u32 adapter_index = valid_adl_device_list[i];
3040
3041 // get AdapterInfo
3042
3043 AdapterInfo info = lpAdapterInfo[adapter_index];
3044
3045 // store the iAdapterIndex in hm_device
3046
3047 // unfortunately this doesn't work since bus id and dev id are not unique
3048 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3049 // if (opencl_device_index == -1) continue;
3050
3051 int opencl_device_index = i;
3052
3053 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3054 }
3055
3056 return num_adl_adapters;
3057 }
3058 #endif // HAVE_ADL
3059
3060 int hm_get_temperature_with_device_id (const uint device_id)
3061 {
3062 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3063
3064 #ifdef HAVE_ADL
3065 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3066 {
3067 if (data.hm_amd)
3068 {
3069 if (data.hm_device[device_id].od_version == 5)
3070 {
3071 ADLTemperature Temperature;
3072
3073 Temperature.iSize = sizeof (ADLTemperature);
3074
3075 if (hm_ADL_Overdrive5_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3076
3077 return Temperature.iTemperature / 1000;
3078 }
3079 else if (data.hm_device[device_id].od_version == 6)
3080 {
3081 int Temperature = 0;
3082
3083 if (hm_ADL_Overdrive6_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3084
3085 return Temperature / 1000;
3086 }
3087 }
3088 }
3089 #endif
3090
3091 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3092 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3093 {
3094 #if defined(LINUX) && defined(HAVE_NVML)
3095 int temperature = 0;
3096
3097 hm_NVML_nvmlDeviceGetTemperature (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (uint *) &temperature);
3098
3099 return temperature;
3100 #endif
3101
3102 #if defined(WIN) && defined(HAVE_NVAPI)
3103 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3104
3105 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3106 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3107 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3108 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3109
3110 if (hm_NvAPI_GPU_GetThermalSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3111
3112 return pThermalSettings.sensor[0].currentTemp;
3113 #endif // WIN && HAVE_NVAPI
3114 }
3115 #endif // HAVE_NVML || HAVE_NVAPI
3116
3117 return -1;
3118 }
3119
3120 int hm_get_fanspeed_with_device_id (const uint device_id)
3121 {
3122 // we shouldn't really need this extra CL_DEVICE_TYPE_GPU check, because fan_supported should not be set w/ CPUs
3123 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3124
3125 if (data.hm_device[device_id].fan_supported == 1)
3126 {
3127 #ifdef HAVE_ADL
3128 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3129 {
3130 if (data.hm_amd)
3131 {
3132 if (data.hm_device[device_id].od_version == 5)
3133 {
3134 ADLFanSpeedValue lpFanSpeedValue;
3135
3136 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3137
3138 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3139 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3140 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3141
3142 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3143
3144 return lpFanSpeedValue.iFanSpeed;
3145 }
3146 else // od_version == 6
3147 {
3148 ADLOD6FanSpeedInfo faninfo;
3149
3150 memset (&faninfo, 0, sizeof (faninfo));
3151
3152 if (hm_ADL_Overdrive6_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3153
3154 return faninfo.iFanSpeedPercent;
3155 }
3156 }
3157 }
3158 #endif // HAVE_ADL
3159
3160 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3161 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3162 {
3163 #if defined(LINUX) && defined(HAVE_NVML)
3164 int speed = 0;
3165
3166 hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, (uint *) &speed);
3167
3168 return speed;
3169 #endif
3170
3171 #if defined(WIN) && defined(HAVE_NVAPI)
3172
3173 NV_GPU_COOLER_SETTINGS pCoolerSettings;
3174
3175 pCoolerSettings.Version = GPU_COOLER_SETTINGS_VER | sizeof (NV_GPU_COOLER_SETTINGS);
3176
3177 hm_NvAPI_GPU_GetCoolerSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pCoolerSettings);
3178
3179 return pCoolerSettings.Cooler[0].CurrentLevel;
3180 #endif
3181 }
3182 #endif // HAVE_NVML || HAVE_NVAPI
3183 }
3184
3185 return -1;
3186 }
3187
3188 int hm_get_utilization_with_device_id (const uint device_id)
3189 {
3190 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3191
3192 #ifdef HAVE_ADL
3193 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3194 {
3195 if (data.hm_amd)
3196 {
3197 ADLPMActivity PMActivity;
3198
3199 PMActivity.iSize = sizeof (ADLPMActivity);
3200
3201 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3202
3203 return PMActivity.iActivityPercent;
3204 }
3205 }
3206 #endif // HAVE_ADL
3207
3208 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3209 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3210 {
3211 #if defined(LINUX) && defined(HAVE_NVML)
3212 nvmlUtilization_t utilization;
3213
3214 hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3215
3216 return utilization.gpu;
3217 #endif
3218
3219 #if defined(WIN) && defined(HAVE_NVAPI)
3220 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3221
3222 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3223
3224 if (hm_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3225
3226 return pDynamicPstatesInfoEx.utilization[0].percentage;
3227 #endif
3228 }
3229 #endif // HAVE_NVML || HAVE_NVAPI
3230
3231 return -1;
3232 }
3233
3234 #ifdef HAVE_ADL
3235 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3236 {
3237 if (data.hm_device[device_id].fan_supported == 1)
3238 {
3239 if (data.hm_amd)
3240 {
3241 if (data.hm_device[device_id].od_version == 5)
3242 {
3243 ADLFanSpeedValue lpFanSpeedValue;
3244
3245 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3246
3247 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3248 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3249 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3250 lpFanSpeedValue.iFanSpeed = fanspeed;
3251
3252 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3253
3254 return 0;
3255 }
3256 else // od_version == 6
3257 {
3258 ADLOD6FanSpeedValue fan_speed_value;
3259
3260 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3261
3262 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3263 fan_speed_value.iFanSpeed = fanspeed;
3264
3265 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3266
3267 return 0;
3268 }
3269 }
3270 }
3271
3272 return -1;
3273 }
3274 #endif
3275
3276 // helper function for status display
3277
3278 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3279 {
3280 #define VALUE_NOT_AVAILABLE "N/A"
3281
3282 if (value == -1)
3283 {
3284 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3285 }
3286 else
3287 {
3288 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3289 }
3290 }
3291 #endif // HAVE_HWMON
3292
3293 /**
3294 * maskprocessor
3295 */
3296
3297 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3298 {
3299 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3300
3301 if (css_cnt > SP_PW_MAX)
3302 {
3303 log_error ("ERROR: mask length is too long");
3304
3305 exit (-1);
3306 }
3307
3308 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3309 {
3310 uint *uniq_tbl = uniq_tbls[css_pos];
3311
3312 uint *cs_buf = css[css_pos].cs_buf;
3313 uint cs_len = css[css_pos].cs_len;
3314
3315 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3316 {
3317 uint c = cs_buf[cs_pos] & 0xff;
3318
3319 uniq_tbl[c] = 1;
3320 }
3321 }
3322 }
3323
3324 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3325 {
3326 cs_t *cs = &css[css_cnt];
3327
3328 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3329
3330 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3331
3332 size_t i;
3333
3334 for (i = 0; i < cs->cs_len; i++)
3335 {
3336 const uint u = cs->cs_buf[i];
3337
3338 css_uniq[u] = 1;
3339 }
3340
3341 for (i = 0; i < in_len; i++)
3342 {
3343 uint u = in_buf[i] & 0xff;
3344
3345 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3346
3347 if (css_uniq[u] == 1) continue;
3348
3349 css_uniq[u] = 1;
3350
3351 cs->cs_buf[cs->cs_len] = u;
3352
3353 cs->cs_len++;
3354 }
3355
3356 myfree (css_uniq);
3357 }
3358
3359 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3360 {
3361 size_t in_pos;
3362
3363 for (in_pos = 0; in_pos < in_len; in_pos++)
3364 {
3365 uint p0 = in_buf[in_pos] & 0xff;
3366
3367 if (interpret == 1 && p0 == '?')
3368 {
3369 in_pos++;
3370
3371 if (in_pos == in_len) break;
3372
3373 uint p1 = in_buf[in_pos] & 0xff;
3374
3375 switch (p1)
3376 {
3377 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3378 break;
3379 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3380 break;
3381 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3382 break;
3383 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3384 break;
3385 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3386 break;
3387 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3388 break;
3389 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3390 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3391 break;
3392 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3393 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3394 break;
3395 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3396 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3397 break;
3398 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3399 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3400 break;
3401 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3402 break;
3403 default: log_error ("Syntax error: %s", in_buf);
3404 exit (-1);
3405 }
3406 }
3407 else
3408 {
3409 if (data.hex_charset)
3410 {
3411 in_pos++;
3412
3413 if (in_pos == in_len)
3414 {
3415 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3416
3417 exit (-1);
3418 }
3419
3420 uint p1 = in_buf[in_pos] & 0xff;
3421
3422 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3423 {
3424 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3425
3426 exit (-1);
3427 }
3428
3429 uint chr = 0;
3430
3431 chr = hex_convert (p1) << 0;
3432 chr |= hex_convert (p0) << 4;
3433
3434 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3435 }
3436 else
3437 {
3438 uint chr = p0;
3439
3440 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3441 }
3442 }
3443 }
3444 }
3445
3446 u64 mp_get_sum (uint css_cnt, cs_t *css)
3447 {
3448 u64 sum = 1;
3449
3450 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3451 {
3452 sum *= css[css_pos].cs_len;
3453 }
3454
3455 return (sum);
3456 }
3457
3458 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3459 {
3460 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3461
3462 uint mask_pos;
3463 uint css_pos;
3464
3465 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3466 {
3467 char p0 = mask_buf[mask_pos];
3468
3469 if (p0 == '?')
3470 {
3471 mask_pos++;
3472
3473 if (mask_pos == mask_len) break;
3474
3475 char p1 = mask_buf[mask_pos];
3476
3477 uint chr = p1;
3478
3479 switch (p1)
3480 {
3481 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3482 break;
3483 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3484 break;
3485 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3486 break;
3487 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3488 break;
3489 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3490 break;
3491 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3492 break;
3493 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3494 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3495 break;
3496 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3497 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3498 break;
3499 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3500 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3501 break;
3502 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3503 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3504 break;
3505 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3506 break;
3507 default: log_error ("ERROR: syntax error: %s", mask_buf);
3508 exit (-1);
3509 }
3510 }
3511 else
3512 {
3513 if (data.hex_charset)
3514 {
3515 mask_pos++;
3516
3517 // if there is no 2nd hex character, show an error:
3518
3519 if (mask_pos == mask_len)
3520 {
3521 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3522
3523 exit (-1);
3524 }
3525
3526 char p1 = mask_buf[mask_pos];
3527
3528 // if they are not valid hex character, show an error:
3529
3530 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3531 {
3532 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3533
3534 exit (-1);
3535 }
3536
3537 uint chr = 0;
3538
3539 chr |= hex_convert (p1) << 0;
3540 chr |= hex_convert (p0) << 4;
3541
3542 mp_add_cs_buf (&chr, 1, css, css_pos);
3543 }
3544 else
3545 {
3546 uint chr = p0;
3547
3548 mp_add_cs_buf (&chr, 1, css, css_pos);
3549 }
3550 }
3551 }
3552
3553 if (css_pos == 0)
3554 {
3555 log_error ("ERROR: invalid mask length (0)");
3556
3557 exit (-1);
3558 }
3559
3560 *css_cnt = css_pos;
3561
3562 return (css);
3563 }
3564
3565 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3566 {
3567 for (int i = 0; i < css_cnt; i++)
3568 {
3569 uint len = css[i].cs_len;
3570 u64 next = val / len;
3571 uint pos = val % len;
3572 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3573 val = next;
3574 }
3575 }
3576
3577 void mp_cut_at (char *mask, uint max)
3578 {
3579 uint i;
3580 uint j;
3581 uint mask_len = strlen (mask);
3582
3583 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3584 {
3585 if (mask[i] == '?') i++;
3586 }
3587
3588 mask[i] = 0;
3589 }
3590
3591 void mp_setup_sys (cs_t *mp_sys)
3592 {
3593 uint pos;
3594 uint chr;
3595 uint donec[CHARSIZ] = { 0 };
3596
3597 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3598 mp_sys[0].cs_buf[pos++] = chr;
3599 mp_sys[0].cs_len = pos; }
3600
3601 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3602 mp_sys[1].cs_buf[pos++] = chr;
3603 mp_sys[1].cs_len = pos; }
3604
3605 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3606 mp_sys[2].cs_buf[pos++] = chr;
3607 mp_sys[2].cs_len = pos; }
3608
3609 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3610 mp_sys[3].cs_buf[pos++] = chr;
3611 mp_sys[3].cs_len = pos; }
3612
3613 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3614 mp_sys[4].cs_len = pos; }
3615
3616 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3617 mp_sys[5].cs_len = pos; }
3618 }
3619
3620 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3621 {
3622 FILE *fp = fopen (buf, "rb");
3623
3624 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3625 {
3626 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3627 }
3628 else
3629 {
3630 char mp_file[1024] = { 0 };
3631
3632 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3633
3634 fclose (fp);
3635
3636 len = in_superchop (mp_file);
3637
3638 if (len == 0)
3639 {
3640 log_info ("WARNING: charset file corrupted");
3641
3642 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3643 }
3644 else
3645 {
3646 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3647 }
3648 }
3649 }
3650
3651 void mp_reset_usr (cs_t *mp_usr, uint index)
3652 {
3653 mp_usr[index].cs_len = 0;
3654
3655 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3656 }
3657
3658 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3659 {
3660 char *new_mask_buf = (char *) mymalloc (256);
3661
3662 uint mask_pos;
3663
3664 uint css_pos;
3665
3666 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3667 {
3668 if (css_pos == len) break;
3669
3670 char p0 = mask_buf[mask_pos];
3671
3672 new_mask_buf[mask_pos] = p0;
3673
3674 if (p0 == '?')
3675 {
3676 mask_pos++;
3677
3678 if (mask_pos == mask_len) break;
3679
3680 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3681 }
3682 else
3683 {
3684 if (data.hex_charset)
3685 {
3686 mask_pos++;
3687
3688 if (mask_pos == mask_len)
3689 {
3690 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3691
3692 exit (-1);
3693 }
3694
3695 char p1 = mask_buf[mask_pos];
3696
3697 // if they are not valid hex character, show an error:
3698
3699 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3700 {
3701 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3702
3703 exit (-1);
3704 }
3705
3706 new_mask_buf[mask_pos] = p1;
3707 }
3708 }
3709 }
3710
3711 if (css_pos == len) return (new_mask_buf);
3712
3713 myfree (new_mask_buf);
3714
3715 return (NULL);
3716 }
3717
3718 /**
3719 * statprocessor
3720 */
3721
3722 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3723 {
3724 u64 sum = 1;
3725
3726 uint i;
3727
3728 for (i = start; i < stop; i++)
3729 {
3730 sum *= root_css_buf[i].cs_len;
3731 }
3732
3733 return (sum);
3734 }
3735
3736 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3737 {
3738 u64 v = ctx;
3739
3740 cs_t *cs = &root_css_buf[start];
3741
3742 uint i;
3743
3744 for (i = start; i < stop; i++)
3745 {
3746 const u64 m = v % cs->cs_len;
3747 const u64 d = v / cs->cs_len;
3748
3749 v = d;
3750
3751 const uint k = cs->cs_buf[m];
3752
3753 pw_buf[i - start] = (char) k;
3754
3755 cs = &markov_css_buf[(i * CHARSIZ) + k];
3756 }
3757 }
3758
3759 int sp_comp_val (const void *p1, const void *p2)
3760 {
3761 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3762 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3763
3764 return b2->val - b1->val;
3765 }
3766
3767 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)
3768 {
3769 uint i;
3770 uint j;
3771 uint k;
3772
3773 /**
3774 * Initialize hcstats
3775 */
3776
3777 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3778
3779 u64 *root_stats_ptr = root_stats_buf;
3780
3781 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3782
3783 for (i = 0; i < SP_PW_MAX; i++)
3784 {
3785 root_stats_buf_by_pos[i] = root_stats_ptr;
3786
3787 root_stats_ptr += CHARSIZ;
3788 }
3789
3790 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3791
3792 u64 *markov_stats_ptr = markov_stats_buf;
3793
3794 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3795
3796 for (i = 0; i < SP_PW_MAX; i++)
3797 {
3798 for (j = 0; j < CHARSIZ; j++)
3799 {
3800 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3801
3802 markov_stats_ptr += CHARSIZ;
3803 }
3804 }
3805
3806 /**
3807 * Load hcstats File
3808 */
3809
3810 if (hcstat == NULL)
3811 {
3812 char hcstat_tmp[256] = { 0 };
3813
3814 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3815
3816 hcstat = hcstat_tmp;
3817 }
3818
3819 FILE *fd = fopen (hcstat, "rb");
3820
3821 if (fd == NULL)
3822 {
3823 log_error ("%s: %s", hcstat, strerror (errno));
3824
3825 exit (-1);
3826 }
3827
3828 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3829 {
3830 log_error ("%s: Could not load data", hcstat);
3831
3832 fclose (fd);
3833
3834 exit (-1);
3835 }
3836
3837 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3838 {
3839 log_error ("%s: Could not load data", hcstat);
3840
3841 fclose (fd);
3842
3843 exit (-1);
3844 }
3845
3846 fclose (fd);
3847
3848 /**
3849 * Markov modifier of hcstat_table on user request
3850 */
3851
3852 if (disable)
3853 {
3854 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3855 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3856 }
3857
3858 if (classic)
3859 {
3860 /* Add all stats to first position */
3861
3862 for (i = 1; i < SP_PW_MAX; i++)
3863 {
3864 u64 *out = root_stats_buf_by_pos[0];
3865 u64 *in = root_stats_buf_by_pos[i];
3866
3867 for (j = 0; j < CHARSIZ; j++)
3868 {
3869 *out++ += *in++;
3870 }
3871 }
3872
3873 for (i = 1; i < SP_PW_MAX; i++)
3874 {
3875 u64 *out = markov_stats_buf_by_key[0][0];
3876 u64 *in = markov_stats_buf_by_key[i][0];
3877
3878 for (j = 0; j < CHARSIZ; j++)
3879 {
3880 for (k = 0; k < CHARSIZ; k++)
3881 {
3882 *out++ += *in++;
3883 }
3884 }
3885 }
3886
3887 /* copy them to all pw_positions */
3888
3889 for (i = 1; i < SP_PW_MAX; i++)
3890 {
3891 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
3892 }
3893
3894 for (i = 1; i < SP_PW_MAX; i++)
3895 {
3896 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
3897 }
3898 }
3899
3900 /**
3901 * Initialize tables
3902 */
3903
3904 hcstat_table_t *root_table_ptr = root_table_buf;
3905
3906 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3907
3908 for (i = 0; i < SP_PW_MAX; i++)
3909 {
3910 root_table_buf_by_pos[i] = root_table_ptr;
3911
3912 root_table_ptr += CHARSIZ;
3913 }
3914
3915 hcstat_table_t *markov_table_ptr = markov_table_buf;
3916
3917 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3918
3919 for (i = 0; i < SP_PW_MAX; i++)
3920 {
3921 for (j = 0; j < CHARSIZ; j++)
3922 {
3923 markov_table_buf_by_key[i][j] = markov_table_ptr;
3924
3925 markov_table_ptr += CHARSIZ;
3926 }
3927 }
3928
3929 /**
3930 * Convert hcstat to tables
3931 */
3932
3933 for (i = 0; i < SP_ROOT_CNT; i++)
3934 {
3935 uint key = i % CHARSIZ;
3936
3937 root_table_buf[i].key = key;
3938 root_table_buf[i].val = root_stats_buf[i];
3939 }
3940
3941 for (i = 0; i < SP_MARKOV_CNT; i++)
3942 {
3943 uint key = i % CHARSIZ;
3944
3945 markov_table_buf[i].key = key;
3946 markov_table_buf[i].val = markov_stats_buf[i];
3947 }
3948
3949 myfree (root_stats_buf);
3950 myfree (markov_stats_buf);
3951
3952 /**
3953 * Finally sort them
3954 */
3955
3956 for (i = 0; i < SP_PW_MAX; i++)
3957 {
3958 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3959 }
3960
3961 for (i = 0; i < SP_PW_MAX; i++)
3962 {
3963 for (j = 0; j < CHARSIZ; j++)
3964 {
3965 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3966 }
3967 }
3968 }
3969
3970 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])
3971 {
3972 /**
3973 * Convert tables to css
3974 */
3975
3976 for (uint i = 0; i < SP_ROOT_CNT; i++)
3977 {
3978 uint pw_pos = i / CHARSIZ;
3979
3980 cs_t *cs = &root_css_buf[pw_pos];
3981
3982 if (cs->cs_len == threshold) continue;
3983
3984 uint key = root_table_buf[i].key;
3985
3986 if (uniq_tbls[pw_pos][key] == 0) continue;
3987
3988 cs->cs_buf[cs->cs_len] = key;
3989
3990 cs->cs_len++;
3991 }
3992
3993 /**
3994 * Convert table to css
3995 */
3996
3997 for (uint i = 0; i < SP_MARKOV_CNT; i++)
3998 {
3999 uint c = i / CHARSIZ;
4000
4001 cs_t *cs = &markov_css_buf[c];
4002
4003 if (cs->cs_len == threshold) continue;
4004
4005 uint pw_pos = c / CHARSIZ;
4006
4007 uint key = markov_table_buf[i].key;
4008
4009 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4010
4011 cs->cs_buf[cs->cs_len] = key;
4012
4013 cs->cs_len++;
4014 }
4015
4016 /*
4017 for (uint i = 0; i < 8; i++)
4018 {
4019 for (uint j = 0x20; j < 0x80; j++)
4020 {
4021 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4022
4023 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4024
4025 for (uint k = 0; k < 10; k++)
4026 {
4027 printf (" %u\n", ptr->cs_buf[k]);
4028 }
4029 }
4030 }
4031 */
4032 }
4033
4034 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4035 {
4036 for (uint i = 0; i < SP_PW_MAX; i += 2)
4037 {
4038 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4039
4040 out += CHARSIZ;
4041 in += CHARSIZ;
4042
4043 out->key = 0;
4044 out->val = 1;
4045
4046 out++;
4047
4048 for (uint j = 1; j < CHARSIZ; j++)
4049 {
4050 out->key = j;
4051 out->val = 0;
4052
4053 out++;
4054 }
4055 }
4056 }
4057
4058 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4059 {
4060 for (uint i = 0; i < SP_PW_MAX; i += 2)
4061 {
4062 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4063
4064 out += CHARSIZ * CHARSIZ;
4065 in += CHARSIZ * CHARSIZ;
4066
4067 for (uint j = 0; j < CHARSIZ; j++)
4068 {
4069 out->key = 0;
4070 out->val = 1;
4071
4072 out++;
4073
4074 for (uint k = 1; k < CHARSIZ; k++)
4075 {
4076 out->key = k;
4077 out->val = 0;
4078
4079 out++;
4080 }
4081 }
4082 }
4083 }
4084
4085 /**
4086 * mixed shared functions
4087 */
4088
4089 void dump_hex (const u8 *s, const int sz)
4090 {
4091 for (int i = 0; i < sz; i++)
4092 {
4093 log_info_nn ("%02x ", s[i]);
4094 }
4095
4096 log_info ("");
4097 }
4098
4099 void usage_mini_print (const char *progname)
4100 {
4101 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4102 }
4103
4104 void usage_big_print (const char *progname)
4105 {
4106 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4107 }
4108
4109 char *get_exec_path ()
4110 {
4111 int exec_path_len = 1024;
4112
4113 char *exec_path = (char *) mymalloc (exec_path_len);
4114
4115 #ifdef LINUX
4116
4117 char tmp[32] = { 0 };
4118
4119 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4120
4121 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4122
4123 #elif WIN
4124
4125 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4126
4127 #elif OSX
4128
4129 uint size = exec_path_len;
4130
4131 if (_NSGetExecutablePath (exec_path, &size) != 0)
4132 {
4133 log_error("! executable path buffer too small\n");
4134
4135 exit (-1);
4136 }
4137
4138 const int len = strlen (exec_path);
4139
4140 #else
4141 #error Your Operating System is not supported or detected
4142 #endif
4143
4144 exec_path[len] = 0;
4145
4146 return exec_path;
4147 }
4148
4149 char *get_install_dir (const char *progname)
4150 {
4151 char *install_dir = mystrdup (progname);
4152 char *last_slash = NULL;
4153
4154 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4155 {
4156 *last_slash = 0;
4157 }
4158 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4159 {
4160 *last_slash = 0;
4161 }
4162 else
4163 {
4164 install_dir[0] = '.';
4165 install_dir[1] = 0;
4166 }
4167
4168 return (install_dir);
4169 }
4170
4171 char *get_profile_dir (const char *homedir)
4172 {
4173 #define DOT_HASHCAT ".hashcat"
4174
4175 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4176
4177 char *profile_dir = (char *) mymalloc (len + 1);
4178
4179 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4180
4181 return profile_dir;
4182 }
4183
4184 char *get_session_dir (const char *profile_dir)
4185 {
4186 #define SESSIONS_FOLDER "sessions"
4187
4188 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4189
4190 char *session_dir = (char *) mymalloc (len + 1);
4191
4192 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4193
4194 return session_dir;
4195 }
4196
4197 uint count_lines (FILE *fd)
4198 {
4199 uint cnt = 0;
4200
4201 char *buf = (char *) mymalloc (HCBUFSIZ + 1);
4202
4203 char prev = '\n';
4204
4205 while (!feof (fd))
4206 {
4207 size_t nread = fread (buf, sizeof (char), HCBUFSIZ, fd);
4208
4209 if (nread < 1) continue;
4210
4211 size_t i;
4212
4213 for (i = 0; i < nread; i++)
4214 {
4215 if (prev == '\n') cnt++;
4216
4217 prev = buf[i];
4218 }
4219 }
4220
4221 myfree (buf);
4222
4223 return cnt;
4224 }
4225
4226 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4227 {
4228 uint crc = ~0;
4229
4230 FILE *fd = fopen (filename, "rb");
4231
4232 if (fd == NULL)
4233 {
4234 log_error ("%s: %s", filename, strerror (errno));
4235
4236 exit (-1);
4237 }
4238
4239 #define MAX_KEY_SIZE (1024 * 1024)
4240
4241 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4242
4243 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4244
4245 fclose (fd);
4246
4247 int kpos = 0;
4248
4249 for (int fpos = 0; fpos < nread; fpos++)
4250 {
4251 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4252
4253 keytab[kpos++] += (crc >> 24) & 0xff;
4254 keytab[kpos++] += (crc >> 16) & 0xff;
4255 keytab[kpos++] += (crc >> 8) & 0xff;
4256 keytab[kpos++] += (crc >> 0) & 0xff;
4257
4258 if (kpos >= 64) kpos = 0;
4259 }
4260
4261 myfree (buf);
4262 }
4263
4264 #ifdef OSX
4265 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4266 {
4267 int core;
4268
4269 for (core = 0; core < (8 * (int)cpu_size); core++)
4270 if (CPU_ISSET(core, cpu_set)) break;
4271
4272 thread_affinity_policy_data_t policy = { core };
4273
4274 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4275
4276 if (data.quiet == 0)
4277 {
4278 if (rc != KERN_SUCCESS)
4279 {
4280 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4281 }
4282 }
4283
4284 return rc;
4285 }
4286 #endif
4287
4288 void set_cpu_affinity (char *cpu_affinity)
4289 {
4290 #ifdef WIN
4291 DWORD_PTR aff_mask = 0;
4292 #elif _POSIX
4293 cpu_set_t cpuset;
4294 CPU_ZERO (&cpuset);
4295 #endif
4296
4297 if (cpu_affinity)
4298 {
4299 char *devices = strdup (cpu_affinity);
4300
4301 char *next = strtok (devices, ",");
4302
4303 do
4304 {
4305 uint cpu_id = atoi (next);
4306
4307 if (cpu_id == 0)
4308 {
4309 #ifdef WIN
4310 aff_mask = 0;
4311 #elif _POSIX
4312 CPU_ZERO (&cpuset);
4313 #endif
4314
4315 break;
4316 }
4317
4318 if (cpu_id > 32)
4319 {
4320 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4321
4322 exit (-1);
4323 }
4324
4325 #ifdef WIN
4326 aff_mask |= 1 << (cpu_id - 1);
4327 #elif _POSIX
4328 CPU_SET ((cpu_id - 1), &cpuset);
4329 #endif
4330
4331 } while ((next = strtok (NULL, ",")) != NULL);
4332
4333 free (devices);
4334 }
4335
4336 #ifdef WIN
4337 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4338 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4339 #elif _POSIX
4340 pthread_t thread = pthread_self ();
4341 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4342 #endif
4343 }
4344
4345 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4346 {
4347 char *element, *end;
4348
4349 end = (char *) base + nmemb * size;
4350
4351 for (element = (char *) base; element < end; element += size)
4352 if (!compar (element, key))
4353 return element;
4354
4355 return NULL;
4356 }
4357
4358 int sort_by_u32 (const void *v1, const void *v2)
4359 {
4360 const u32 *s1 = (const u32 *) v1;
4361 const u32 *s2 = (const u32 *) v2;
4362
4363 return *s1 - *s2;
4364 }
4365
4366 int sort_by_salt (const void *v1, const void *v2)
4367 {
4368 const salt_t *s1 = (const salt_t *) v1;
4369 const salt_t *s2 = (const salt_t *) v2;
4370
4371 const int res1 = s1->salt_len - s2->salt_len;
4372
4373 if (res1 != 0) return (res1);
4374
4375 const int res2 = s1->salt_iter - s2->salt_iter;
4376
4377 if (res2 != 0) return (res2);
4378
4379 uint n;
4380
4381 n = 16;
4382
4383 while (n--)
4384 {
4385 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4386 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4387 }
4388
4389 n = 8;
4390
4391 while (n--)
4392 {
4393 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4394 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4395 }
4396
4397 return (0);
4398 }
4399
4400 int sort_by_salt_buf (const void *v1, const void *v2)
4401 {
4402 const pot_t *p1 = (const pot_t *) v1;
4403 const pot_t *p2 = (const pot_t *) v2;
4404
4405 const hash_t *h1 = &p1->hash;
4406 const hash_t *h2 = &p2->hash;
4407
4408 const salt_t *s1 = h1->salt;
4409 const salt_t *s2 = h2->salt;
4410
4411 uint n = 16;
4412
4413 while (n--)
4414 {
4415 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4416 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4417 }
4418
4419 return 0;
4420 }
4421
4422 int sort_by_hash_t_salt (const void *v1, const void *v2)
4423 {
4424 const hash_t *h1 = (const hash_t *) v1;
4425 const hash_t *h2 = (const hash_t *) v2;
4426
4427 const salt_t *s1 = h1->salt;
4428 const salt_t *s2 = h2->salt;
4429
4430 // testphase: this should work
4431 uint n = 16;
4432
4433 while (n--)
4434 {
4435 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4436 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4437 }
4438
4439 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4440 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4441 if (s1->salt_len > s2->salt_len) return ( 1);
4442 if (s1->salt_len < s2->salt_len) return (-1);
4443
4444 uint n = s1->salt_len;
4445
4446 while (n--)
4447 {
4448 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4449 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4450 }
4451 */
4452
4453 return 0;
4454 }
4455
4456 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4457 {
4458 const hash_t *h1 = (const hash_t *) v1;
4459 const hash_t *h2 = (const hash_t *) v2;
4460
4461 const salt_t *s1 = h1->salt;
4462 const salt_t *s2 = h2->salt;
4463
4464 // 16 - 2 (since last 2 uints contain the digest)
4465 uint n = 14;
4466
4467 while (n--)
4468 {
4469 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4470 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4471 }
4472
4473 return 0;
4474 }
4475
4476 int sort_by_hash_no_salt (const void *v1, const void *v2)
4477 {
4478 const hash_t *h1 = (const hash_t *) v1;
4479 const hash_t *h2 = (const hash_t *) v2;
4480
4481 const void *d1 = h1->digest;
4482 const void *d2 = h2->digest;
4483
4484 return data.sort_by_digest (d1, d2);
4485 }
4486
4487 int sort_by_hash (const void *v1, const void *v2)
4488 {
4489 const hash_t *h1 = (const hash_t *) v1;
4490 const hash_t *h2 = (const hash_t *) v2;
4491
4492 if (data.isSalted)
4493 {
4494 const salt_t *s1 = h1->salt;
4495 const salt_t *s2 = h2->salt;
4496
4497 int res = sort_by_salt (s1, s2);
4498
4499 if (res != 0) return (res);
4500 }
4501
4502 const void *d1 = h1->digest;
4503 const void *d2 = h2->digest;
4504
4505 return data.sort_by_digest (d1, d2);
4506 }
4507
4508 int sort_by_pot (const void *v1, const void *v2)
4509 {
4510 const pot_t *p1 = (const pot_t *) v1;
4511 const pot_t *p2 = (const pot_t *) v2;
4512
4513 const hash_t *h1 = &p1->hash;
4514 const hash_t *h2 = &p2->hash;
4515
4516 return sort_by_hash (h1, h2);
4517 }
4518
4519 int sort_by_mtime (const void *p1, const void *p2)
4520 {
4521 const char **f1 = (const char **) p1;
4522 const char **f2 = (const char **) p2;
4523
4524 struct stat s1; stat (*f1, &s1);
4525 struct stat s2; stat (*f2, &s2);
4526
4527 return s2.st_mtime - s1.st_mtime;
4528 }
4529
4530 int sort_by_cpu_rule (const void *p1, const void *p2)
4531 {
4532 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4533 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4534
4535 return memcmp (r1, r2, sizeof (cpu_rule_t));
4536 }
4537
4538 int sort_by_kernel_rule (const void *p1, const void *p2)
4539 {
4540 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4541 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4542
4543 return memcmp (r1, r2, sizeof (kernel_rule_t));
4544 }
4545
4546 int sort_by_stringptr (const void *p1, const void *p2)
4547 {
4548 const char **s1 = (const char **) p1;
4549 const char **s2 = (const char **) p2;
4550
4551 return strcmp (*s1, *s2);
4552 }
4553
4554 int sort_by_dictstat (const void *s1, const void *s2)
4555 {
4556 dictstat_t *d1 = (dictstat_t *) s1;
4557 dictstat_t *d2 = (dictstat_t *) s2;
4558
4559 #ifdef LINUX
4560 d2->stat.st_atim = d1->stat.st_atim;
4561 #else
4562 d2->stat.st_atime = d1->stat.st_atime;
4563 #endif
4564
4565 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4566 }
4567
4568 int sort_by_bitmap (const void *p1, const void *p2)
4569 {
4570 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4571 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4572
4573 return b1->collisions - b2->collisions;
4574 }
4575
4576 int sort_by_digest_4_2 (const void *v1, const void *v2)
4577 {
4578 const u32 *d1 = (const u32 *) v1;
4579 const u32 *d2 = (const u32 *) v2;
4580
4581 uint n = 2;
4582
4583 while (n--)
4584 {
4585 if (d1[n] > d2[n]) return ( 1);
4586 if (d1[n] < d2[n]) return (-1);
4587 }
4588
4589 return (0);
4590 }
4591
4592 int sort_by_digest_4_4 (const void *v1, const void *v2)
4593 {
4594 const u32 *d1 = (const u32 *) v1;
4595 const u32 *d2 = (const u32 *) v2;
4596
4597 uint n = 4;
4598
4599 while (n--)
4600 {
4601 if (d1[n] > d2[n]) return ( 1);
4602 if (d1[n] < d2[n]) return (-1);
4603 }
4604
4605 return (0);
4606 }
4607
4608 int sort_by_digest_4_5 (const void *v1, const void *v2)
4609 {
4610 const u32 *d1 = (const u32 *) v1;
4611 const u32 *d2 = (const u32 *) v2;
4612
4613 uint n = 5;
4614
4615 while (n--)
4616 {
4617 if (d1[n] > d2[n]) return ( 1);
4618 if (d1[n] < d2[n]) return (-1);
4619 }
4620
4621 return (0);
4622 }
4623
4624 int sort_by_digest_4_6 (const void *v1, const void *v2)
4625 {
4626 const u32 *d1 = (const u32 *) v1;
4627 const u32 *d2 = (const u32 *) v2;
4628
4629 uint n = 6;
4630
4631 while (n--)
4632 {
4633 if (d1[n] > d2[n]) return ( 1);
4634 if (d1[n] < d2[n]) return (-1);
4635 }
4636
4637 return (0);
4638 }
4639
4640 int sort_by_digest_4_8 (const void *v1, const void *v2)
4641 {
4642 const u32 *d1 = (const u32 *) v1;
4643 const u32 *d2 = (const u32 *) v2;
4644
4645 uint n = 8;
4646
4647 while (n--)
4648 {
4649 if (d1[n] > d2[n]) return ( 1);
4650 if (d1[n] < d2[n]) return (-1);
4651 }
4652
4653 return (0);
4654 }
4655
4656 int sort_by_digest_4_16 (const void *v1, const void *v2)
4657 {
4658 const u32 *d1 = (const u32 *) v1;
4659 const u32 *d2 = (const u32 *) v2;
4660
4661 uint n = 16;
4662
4663 while (n--)
4664 {
4665 if (d1[n] > d2[n]) return ( 1);
4666 if (d1[n] < d2[n]) return (-1);
4667 }
4668
4669 return (0);
4670 }
4671
4672 int sort_by_digest_4_32 (const void *v1, const void *v2)
4673 {
4674 const u32 *d1 = (const u32 *) v1;
4675 const u32 *d2 = (const u32 *) v2;
4676
4677 uint n = 32;
4678
4679 while (n--)
4680 {
4681 if (d1[n] > d2[n]) return ( 1);
4682 if (d1[n] < d2[n]) return (-1);
4683 }
4684
4685 return (0);
4686 }
4687
4688 int sort_by_digest_4_64 (const void *v1, const void *v2)
4689 {
4690 const u32 *d1 = (const u32 *) v1;
4691 const u32 *d2 = (const u32 *) v2;
4692
4693 uint n = 64;
4694
4695 while (n--)
4696 {
4697 if (d1[n] > d2[n]) return ( 1);
4698 if (d1[n] < d2[n]) return (-1);
4699 }
4700
4701 return (0);
4702 }
4703
4704 int sort_by_digest_8_8 (const void *v1, const void *v2)
4705 {
4706 const u64 *d1 = (const u64 *) v1;
4707 const u64 *d2 = (const u64 *) v2;
4708
4709 uint n = 8;
4710
4711 while (n--)
4712 {
4713 if (d1[n] > d2[n]) return ( 1);
4714 if (d1[n] < d2[n]) return (-1);
4715 }
4716
4717 return (0);
4718 }
4719
4720 int sort_by_digest_8_16 (const void *v1, const void *v2)
4721 {
4722 const u64 *d1 = (const u64 *) v1;
4723 const u64 *d2 = (const u64 *) v2;
4724
4725 uint n = 16;
4726
4727 while (n--)
4728 {
4729 if (d1[n] > d2[n]) return ( 1);
4730 if (d1[n] < d2[n]) return (-1);
4731 }
4732
4733 return (0);
4734 }
4735
4736 int sort_by_digest_8_25 (const void *v1, const void *v2)
4737 {
4738 const u64 *d1 = (const u64 *) v1;
4739 const u64 *d2 = (const u64 *) v2;
4740
4741 uint n = 25;
4742
4743 while (n--)
4744 {
4745 if (d1[n] > d2[n]) return ( 1);
4746 if (d1[n] < d2[n]) return (-1);
4747 }
4748
4749 return (0);
4750 }
4751
4752 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4753 {
4754 const u32 *d1 = (const u32 *) v1;
4755 const u32 *d2 = (const u32 *) v2;
4756
4757 const uint dgst_pos0 = data.dgst_pos0;
4758 const uint dgst_pos1 = data.dgst_pos1;
4759 const uint dgst_pos2 = data.dgst_pos2;
4760 const uint dgst_pos3 = data.dgst_pos3;
4761
4762 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4763 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4764 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4765 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4766 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4767 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4768 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4769 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4770
4771 return (0);
4772 }
4773
4774 int sort_by_tuning_db_alias (const void *v1, const void *v2)
4775 {
4776 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
4777 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
4778
4779 const int res1 = strcmp (t1->device_name, t2->device_name);
4780
4781 if (res1 != 0) return (res1);
4782
4783 return 0;
4784 }
4785
4786 int sort_by_tuning_db_entry (const void *v1, const void *v2)
4787 {
4788 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
4789 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
4790
4791 const int res1 = strcmp (t1->device_name, t2->device_name);
4792
4793 if (res1 != 0) return (res1);
4794
4795 const int res2 = t1->attack_mode
4796 - t2->attack_mode;
4797
4798 if (res2 != 0) return (res2);
4799
4800 const int res3 = t1->hash_type
4801 - t2->hash_type;
4802
4803 if (res3 != 0) return (res3);
4804
4805 return 0;
4806 }
4807
4808 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)
4809 {
4810 uint outfile_autohex = data.outfile_autohex;
4811
4812 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4813
4814 FILE *debug_fp = NULL;
4815
4816 if (debug_file != NULL)
4817 {
4818 debug_fp = fopen (debug_file, "ab");
4819
4820 lock_file (debug_fp);
4821 }
4822 else
4823 {
4824 debug_fp = stderr;
4825 }
4826
4827 if (debug_fp == NULL)
4828 {
4829 log_info ("WARNING: Could not open debug-file for writing");
4830 }
4831 else
4832 {
4833 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4834 {
4835 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4836
4837 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4838 }
4839
4840 fwrite (rule_ptr, rule_len, 1, debug_fp);
4841
4842 if (debug_mode == 4)
4843 {
4844 fputc (':', debug_fp);
4845
4846 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4847 }
4848
4849 fputc ('\n', debug_fp);
4850
4851 if (debug_file != NULL) fclose (debug_fp);
4852 }
4853 }
4854
4855 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4856 {
4857 int needs_hexify = 0;
4858
4859 if (outfile_autohex == 1)
4860 {
4861 for (uint i = 0; i < plain_len; i++)
4862 {
4863 if (plain_ptr[i] < 0x20)
4864 {
4865 needs_hexify = 1;
4866
4867 break;
4868 }
4869
4870 if (plain_ptr[i] > 0x7f)
4871 {
4872 needs_hexify = 1;
4873
4874 break;
4875 }
4876 }
4877 }
4878
4879 if (needs_hexify == 1)
4880 {
4881 fprintf (fp, "$HEX[");
4882
4883 for (uint i = 0; i < plain_len; i++)
4884 {
4885 fprintf (fp, "%02x", plain_ptr[i]);
4886 }
4887
4888 fprintf (fp, "]");
4889 }
4890 else
4891 {
4892 fwrite (plain_ptr, plain_len, 1, fp);
4893 }
4894 }
4895
4896 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)
4897 {
4898 uint outfile_format = data.outfile_format;
4899
4900 char separator = data.separator;
4901
4902 if (outfile_format & OUTFILE_FMT_HASH)
4903 {
4904 fprintf (out_fp, "%s", out_buf);
4905
4906 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4907 {
4908 fputc (separator, out_fp);
4909 }
4910 }
4911 else if (data.username)
4912 {
4913 if (username != NULL)
4914 {
4915 for (uint i = 0; i < user_len; i++)
4916 {
4917 fprintf (out_fp, "%c", username[i]);
4918 }
4919
4920 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4921 {
4922 fputc (separator, out_fp);
4923 }
4924 }
4925 }
4926
4927 if (outfile_format & OUTFILE_FMT_PLAIN)
4928 {
4929 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4930
4931 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4932 {
4933 fputc (separator, out_fp);
4934 }
4935 }
4936
4937 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4938 {
4939 for (uint i = 0; i < plain_len; i++)
4940 {
4941 fprintf (out_fp, "%02x", plain_ptr[i]);
4942 }
4943
4944 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4945 {
4946 fputc (separator, out_fp);
4947 }
4948 }
4949
4950 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4951 {
4952 #ifdef _WIN
4953 __mingw_fprintf (out_fp, "%llu", crackpos);
4954 #endif
4955
4956 #ifdef _POSIX
4957 #ifdef __x86_64__
4958 fprintf (out_fp, "%lu", (unsigned long) crackpos);
4959 #else
4960 fprintf (out_fp, "%llu", crackpos);
4961 #endif
4962 #endif
4963 }
4964
4965 fputc ('\n', out_fp);
4966 }
4967
4968 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)
4969 {
4970 pot_t pot_key;
4971
4972 pot_key.hash.salt = hashes_buf->salt;
4973 pot_key.hash.digest = hashes_buf->digest;
4974
4975 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4976
4977 if (pot_ptr)
4978 {
4979 log_info_nn ("");
4980
4981 input_buf[input_len] = 0;
4982
4983 // user
4984 unsigned char *username = NULL;
4985 uint user_len = 0;
4986
4987 if (data.username)
4988 {
4989 user_t *user = hashes_buf->hash_info->user;
4990
4991 if (user)
4992 {
4993 username = (unsigned char *) (user->user_name);
4994
4995 user_len = user->user_len;
4996 }
4997 }
4998
4999 // do output the line
5000 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
5001 }
5002 }
5003
5004 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
5005 #define LM_MASKED_PLAIN "[notfound]"
5006
5007 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)
5008 {
5009 // left
5010
5011 pot_t pot_left_key;
5012
5013 pot_left_key.hash.salt = hash_left->salt;
5014 pot_left_key.hash.digest = hash_left->digest;
5015
5016 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5017
5018 // right
5019
5020 uint weak_hash_found = 0;
5021
5022 pot_t pot_right_key;
5023
5024 pot_right_key.hash.salt = hash_right->salt;
5025 pot_right_key.hash.digest = hash_right->digest;
5026
5027 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5028
5029 if (pot_right_ptr == NULL)
5030 {
5031 // special case, if "weak hash"
5032
5033 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5034 {
5035 weak_hash_found = 1;
5036
5037 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5038
5039 // in theory this is not needed, but we are paranoia:
5040
5041 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5042 pot_right_ptr->plain_len = 0;
5043 }
5044 }
5045
5046 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5047 {
5048 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
5049
5050 return;
5051 }
5052
5053 // at least one half was found:
5054
5055 log_info_nn ("");
5056
5057 input_buf[input_len] = 0;
5058
5059 // user
5060
5061 unsigned char *username = NULL;
5062 uint user_len = 0;
5063
5064 if (data.username)
5065 {
5066 user_t *user = hash_left->hash_info->user;
5067
5068 if (user)
5069 {
5070 username = (unsigned char *) (user->user_name);
5071
5072 user_len = user->user_len;
5073 }
5074 }
5075
5076 // mask the part which was not found
5077
5078 uint left_part_masked = 0;
5079 uint right_part_masked = 0;
5080
5081 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5082
5083 if (pot_left_ptr == NULL)
5084 {
5085 left_part_masked = 1;
5086
5087 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5088
5089 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5090
5091 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5092 pot_left_ptr->plain_len = mask_plain_len;
5093 }
5094
5095 if (pot_right_ptr == NULL)
5096 {
5097 right_part_masked = 1;
5098
5099 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5100
5101 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5102
5103 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5104 pot_right_ptr->plain_len = mask_plain_len;
5105 }
5106
5107 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5108
5109 pot_t pot_ptr;
5110
5111 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5112
5113 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5114
5115 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5116
5117 // do output the line
5118
5119 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5120
5121 if (weak_hash_found == 1) myfree (pot_right_ptr);
5122
5123 if (left_part_masked == 1) myfree (pot_left_ptr);
5124 if (right_part_masked == 1) myfree (pot_right_ptr);
5125 }
5126
5127 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)
5128 {
5129 pot_t pot_key;
5130
5131 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5132
5133 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5134
5135 if (pot_ptr == NULL)
5136 {
5137 log_info_nn ("");
5138
5139 input_buf[input_len] = 0;
5140
5141 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5142 }
5143 }
5144
5145 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)
5146 {
5147 // left
5148
5149 pot_t pot_left_key;
5150
5151 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5152
5153 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5154
5155 // right
5156
5157 pot_t pot_right_key;
5158
5159 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5160
5161 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5162
5163 uint weak_hash_found = 0;
5164
5165 if (pot_right_ptr == NULL)
5166 {
5167 // special case, if "weak hash"
5168
5169 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5170 {
5171 weak_hash_found = 1;
5172
5173 // we just need that pot_right_ptr is not a NULL pointer
5174
5175 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5176 }
5177 }
5178
5179 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5180 {
5181 if (weak_hash_found == 1) myfree (pot_right_ptr);
5182
5183 return;
5184 }
5185
5186 // ... at least one part was not cracked
5187
5188 log_info_nn ("");
5189
5190 input_buf[input_len] = 0;
5191
5192 // only show the hash part which is still not cracked
5193
5194 uint user_len = input_len - 32;
5195
5196 char *hash_output = (char *) mymalloc (33);
5197
5198 memcpy (hash_output, input_buf, input_len);
5199
5200 if (pot_left_ptr != NULL)
5201 {
5202 // only show right part (because left part was already found)
5203
5204 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5205
5206 hash_output[user_len + 16] = 0;
5207 }
5208
5209 if (pot_right_ptr != NULL)
5210 {
5211 // only show left part (because right part was already found)
5212
5213 memcpy (hash_output + user_len, input_buf + user_len, 16);
5214
5215 hash_output[user_len + 16] = 0;
5216 }
5217
5218 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5219
5220 myfree (hash_output);
5221
5222 if (weak_hash_found == 1) myfree (pot_right_ptr);
5223 }
5224
5225 uint setup_opencl_platforms_filter (char *opencl_platforms)
5226 {
5227 uint opencl_platforms_filter = 0;
5228
5229 if (opencl_platforms)
5230 {
5231 char *platforms = strdup (opencl_platforms);
5232
5233 char *next = strtok (platforms, ",");
5234
5235 do
5236 {
5237 int platform = atoi (next);
5238
5239 if (platform < 1 || platform > 32)
5240 {
5241 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5242
5243 exit (-1);
5244 }
5245
5246 opencl_platforms_filter |= 1 << (platform - 1);
5247
5248 } while ((next = strtok (NULL, ",")) != NULL);
5249
5250 free (platforms);
5251 }
5252 else
5253 {
5254 opencl_platforms_filter = -1;
5255 }
5256
5257 return opencl_platforms_filter;
5258 }
5259
5260 u32 setup_devices_filter (char *opencl_devices)
5261 {
5262 u32 devices_filter = 0;
5263
5264 if (opencl_devices)
5265 {
5266 char *devices = strdup (opencl_devices);
5267
5268 char *next = strtok (devices, ",");
5269
5270 do
5271 {
5272 int device_id = atoi (next);
5273
5274 if (device_id < 1 || device_id > 32)
5275 {
5276 log_error ("ERROR: invalid device_id %u specified", device_id);
5277
5278 exit (-1);
5279 }
5280
5281 devices_filter |= 1 << (device_id - 1);
5282
5283 } while ((next = strtok (NULL, ",")) != NULL);
5284
5285 free (devices);
5286 }
5287 else
5288 {
5289 devices_filter = -1;
5290 }
5291
5292 return devices_filter;
5293 }
5294
5295 cl_device_type setup_device_types_filter (char *opencl_device_types)
5296 {
5297 cl_device_type device_types_filter = 0;
5298
5299 if (opencl_device_types)
5300 {
5301 char *device_types = strdup (opencl_device_types);
5302
5303 char *next = strtok (device_types, ",");
5304
5305 do
5306 {
5307 int device_type = atoi (next);
5308
5309 if (device_type < 1 || device_type > 3)
5310 {
5311 log_error ("ERROR: invalid device_type %u specified", device_type);
5312
5313 exit (-1);
5314 }
5315
5316 device_types_filter |= 1 << device_type;
5317
5318 } while ((next = strtok (NULL, ",")) != NULL);
5319
5320 free (device_types);
5321 }
5322 else
5323 {
5324 // Do not use CPU by default, this often reduces GPU performance because
5325 // the CPU is too busy to handle GPU synchronization
5326
5327 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5328 }
5329
5330 return device_types_filter;
5331 }
5332
5333 u32 get_random_num (const u32 min, const u32 max)
5334 {
5335 if (min == max) return (min);
5336
5337 return ((rand () % (max - min)) + min);
5338 }
5339
5340 u32 mydivc32 (const u32 dividend, const u32 divisor)
5341 {
5342 u32 quotient = dividend / divisor;
5343
5344 if (dividend % divisor) quotient++;
5345
5346 return quotient;
5347 }
5348
5349 u64 mydivc64 (const u64 dividend, const u64 divisor)
5350 {
5351 u64 quotient = dividend / divisor;
5352
5353 if (dividend % divisor) quotient++;
5354
5355 return quotient;
5356 }
5357
5358 void format_timer_display (struct tm *tm, char *buf, size_t len)
5359 {
5360 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5361 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5362
5363 if (tm->tm_year - 70)
5364 {
5365 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5366 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5367
5368 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5369 }
5370 else if (tm->tm_yday)
5371 {
5372 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5373 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5374
5375 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5376 }
5377 else if (tm->tm_hour)
5378 {
5379 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5380 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5381
5382 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5383 }
5384 else if (tm->tm_min)
5385 {
5386 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5387 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5388
5389 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5390 }
5391 else
5392 {
5393 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5394
5395 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5396 }
5397 }
5398
5399 void format_speed_display (float val, char *buf, size_t len)
5400 {
5401 if (val <= 0)
5402 {
5403 buf[0] = '0';
5404 buf[1] = ' ';
5405 buf[2] = 0;
5406
5407 return;
5408 }
5409
5410 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5411
5412 uint level = 0;
5413
5414 while (val > 99999)
5415 {
5416 val /= 1000;
5417
5418 level++;
5419 }
5420
5421 /* generate output */
5422
5423 if (level == 0)
5424 {
5425 snprintf (buf, len - 1, "%.0f ", val);
5426 }
5427 else
5428 {
5429 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5430 }
5431 }
5432
5433 void lowercase (u8 *buf, int len)
5434 {
5435 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5436 }
5437
5438 void uppercase (u8 *buf, int len)
5439 {
5440 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5441 }
5442
5443 int fgetl (FILE *fp, char *line_buf)
5444 {
5445 int line_len = 0;
5446
5447 while (!feof (fp))
5448 {
5449 const int c = fgetc (fp);
5450
5451 if (c == EOF) break;
5452
5453 line_buf[line_len] = (char) c;
5454
5455 line_len++;
5456
5457 if (line_len == HCBUFSIZ) line_len--;
5458
5459 if (c == '\n') break;
5460 }
5461
5462 if (line_len == 0) return 0;
5463
5464 if (line_buf[line_len - 1] == '\n')
5465 {
5466 line_len--;
5467
5468 line_buf[line_len] = 0;
5469 }
5470
5471 if (line_len == 0) return 0;
5472
5473 if (line_buf[line_len - 1] == '\r')
5474 {
5475 line_len--;
5476
5477 line_buf[line_len] = 0;
5478 }
5479
5480 return (line_len);
5481 }
5482
5483 int in_superchop (char *buf)
5484 {
5485 int len = strlen (buf);
5486
5487 while (len)
5488 {
5489 if (buf[len - 1] == '\n')
5490 {
5491 len--;
5492
5493 continue;
5494 }
5495
5496 if (buf[len - 1] == '\r')
5497 {
5498 len--;
5499
5500 continue;
5501 }
5502
5503 break;
5504 }
5505
5506 buf[len] = 0;
5507
5508 return len;
5509 }
5510
5511 char **scan_directory (const char *path)
5512 {
5513 char *tmp_path = mystrdup (path);
5514
5515 size_t tmp_path_len = strlen (tmp_path);
5516
5517 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5518 {
5519 tmp_path[tmp_path_len - 1] = 0;
5520
5521 tmp_path_len = strlen (tmp_path);
5522 }
5523
5524 char **files = NULL;
5525
5526 int num_files = 0;
5527
5528 DIR *d = NULL;
5529
5530 if ((d = opendir (tmp_path)) != NULL)
5531 {
5532 #ifdef OSX
5533 struct dirent e;
5534
5535 for (;;) {
5536 memset (&e, 0, sizeof (e));
5537 struct dirent *de = NULL;
5538
5539 if (readdir_r (d, &e, &de) != 0)
5540 {
5541 log_error ("ERROR: readdir_r() failed");
5542
5543 break;
5544 }
5545
5546 if (de == NULL) break;
5547 #else
5548 struct dirent *de;
5549
5550 while ((de = readdir (d)) != NULL)
5551 {
5552 #endif
5553 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5554
5555 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5556
5557 char *path_file = (char *) mymalloc (path_size + 1);
5558
5559 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5560
5561 path_file[path_size] = 0;
5562
5563 DIR *d_test;
5564
5565 if ((d_test = opendir (path_file)) != NULL)
5566 {
5567 closedir (d_test);
5568
5569 myfree (path_file);
5570 }
5571 else
5572 {
5573 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5574
5575 num_files++;
5576
5577 files[num_files - 1] = path_file;
5578 }
5579 }
5580
5581 closedir (d);
5582 }
5583 else if (errno == ENOTDIR)
5584 {
5585 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5586
5587 num_files++;
5588
5589 files[num_files - 1] = mystrdup (path);
5590 }
5591
5592 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5593
5594 num_files++;
5595
5596 files[num_files - 1] = NULL;
5597
5598 myfree (tmp_path);
5599
5600 return (files);
5601 }
5602
5603 int count_dictionaries (char **dictionary_files)
5604 {
5605 if (dictionary_files == NULL) return 0;
5606
5607 int cnt = 0;
5608
5609 for (int d = 0; dictionary_files[d] != NULL; d++)
5610 {
5611 cnt++;
5612 }
5613
5614 return (cnt);
5615 }
5616
5617 char *stroptitype (const uint opti_type)
5618 {
5619 switch (opti_type)
5620 {
5621 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5622 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5623 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5624 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5625 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5626 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5627 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5628 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5629 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5630 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5631 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5632 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5633 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5634 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5635 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5636 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5637 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5638 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5639 }
5640
5641 return (NULL);
5642 }
5643
5644 char *strparser (const uint parser_status)
5645 {
5646 switch (parser_status)
5647 {
5648 case PARSER_OK: return ((char *) PA_000); break;
5649 case PARSER_COMMENT: return ((char *) PA_001); break;
5650 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5651 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5652 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5653 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5654 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5655 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5656 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5657 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5658 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5659 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5660 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5661 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5662 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5663 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5664 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5665 }
5666
5667 return ((char *) PA_255);
5668 }
5669
5670 char *strhashtype (const uint hash_mode)
5671 {
5672 switch (hash_mode)
5673 {
5674 case 0: return ((char *) HT_00000); break;
5675 case 10: return ((char *) HT_00010); break;
5676 case 11: return ((char *) HT_00011); break;
5677 case 12: return ((char *) HT_00012); break;
5678 case 20: return ((char *) HT_00020); break;
5679 case 21: return ((char *) HT_00021); break;
5680 case 22: return ((char *) HT_00022); break;
5681 case 23: return ((char *) HT_00023); break;
5682 case 30: return ((char *) HT_00030); break;
5683 case 40: return ((char *) HT_00040); break;
5684 case 50: return ((char *) HT_00050); break;
5685 case 60: return ((char *) HT_00060); break;
5686 case 100: return ((char *) HT_00100); break;
5687 case 101: return ((char *) HT_00101); break;
5688 case 110: return ((char *) HT_00110); break;
5689 case 111: return ((char *) HT_00111); break;
5690 case 112: return ((char *) HT_00112); break;
5691 case 120: return ((char *) HT_00120); break;
5692 case 121: return ((char *) HT_00121); break;
5693 case 122: return ((char *) HT_00122); break;
5694 case 124: return ((char *) HT_00124); break;
5695 case 125: return ((char *) HT_00125); break;
5696 case 130: return ((char *) HT_00130); break;
5697 case 131: return ((char *) HT_00131); break;
5698 case 132: return ((char *) HT_00132); break;
5699 case 133: return ((char *) HT_00133); break;
5700 case 140: return ((char *) HT_00140); break;
5701 case 141: return ((char *) HT_00141); break;
5702 case 150: return ((char *) HT_00150); break;
5703 case 160: return ((char *) HT_00160); break;
5704 case 190: return ((char *) HT_00190); break;
5705 case 200: return ((char *) HT_00200); break;
5706 case 300: return ((char *) HT_00300); break;
5707 case 400: return ((char *) HT_00400); break;
5708 case 500: return ((char *) HT_00500); break;
5709 case 501: return ((char *) HT_00501); break;
5710 case 900: return ((char *) HT_00900); break;
5711 case 910: return ((char *) HT_00910); break;
5712 case 1000: return ((char *) HT_01000); break;
5713 case 1100: return ((char *) HT_01100); break;
5714 case 1400: return ((char *) HT_01400); break;
5715 case 1410: return ((char *) HT_01410); break;
5716 case 1420: return ((char *) HT_01420); break;
5717 case 1421: return ((char *) HT_01421); break;
5718 case 1430: return ((char *) HT_01430); break;
5719 case 1440: return ((char *) HT_01440); break;
5720 case 1441: return ((char *) HT_01441); break;
5721 case 1450: return ((char *) HT_01450); break;
5722 case 1460: return ((char *) HT_01460); break;
5723 case 1500: return ((char *) HT_01500); break;
5724 case 1600: return ((char *) HT_01600); break;
5725 case 1700: return ((char *) HT_01700); break;
5726 case 1710: return ((char *) HT_01710); break;
5727 case 1711: return ((char *) HT_01711); break;
5728 case 1720: return ((char *) HT_01720); break;
5729 case 1722: return ((char *) HT_01722); break;
5730 case 1730: return ((char *) HT_01730); break;
5731 case 1731: return ((char *) HT_01731); break;
5732 case 1740: return ((char *) HT_01740); break;
5733 case 1750: return ((char *) HT_01750); break;
5734 case 1760: return ((char *) HT_01760); break;
5735 case 1800: return ((char *) HT_01800); break;
5736 case 2100: return ((char *) HT_02100); break;
5737 case 2400: return ((char *) HT_02400); break;
5738 case 2410: return ((char *) HT_02410); break;
5739 case 2500: return ((char *) HT_02500); break;
5740 case 2600: return ((char *) HT_02600); break;
5741 case 2611: return ((char *) HT_02611); break;
5742 case 2612: return ((char *) HT_02612); break;
5743 case 2711: return ((char *) HT_02711); break;
5744 case 2811: return ((char *) HT_02811); break;
5745 case 3000: return ((char *) HT_03000); break;
5746 case 3100: return ((char *) HT_03100); break;
5747 case 3200: return ((char *) HT_03200); break;
5748 case 3710: return ((char *) HT_03710); break;
5749 case 3711: return ((char *) HT_03711); break;
5750 case 3800: return ((char *) HT_03800); break;
5751 case 4300: return ((char *) HT_04300); break;
5752 case 4400: return ((char *) HT_04400); break;
5753 case 4500: return ((char *) HT_04500); break;
5754 case 4700: return ((char *) HT_04700); break;
5755 case 4800: return ((char *) HT_04800); break;
5756 case 4900: return ((char *) HT_04900); break;
5757 case 5000: return ((char *) HT_05000); break;
5758 case 5100: return ((char *) HT_05100); break;
5759 case 5200: return ((char *) HT_05200); break;
5760 case 5300: return ((char *) HT_05300); break;
5761 case 5400: return ((char *) HT_05400); break;
5762 case 5500: return ((char *) HT_05500); break;
5763 case 5600: return ((char *) HT_05600); break;
5764 case 5700: return ((char *) HT_05700); break;
5765 case 5800: return ((char *) HT_05800); break;
5766 case 6000: return ((char *) HT_06000); break;
5767 case 6100: return ((char *) HT_06100); break;
5768 case 6211: return ((char *) HT_06211); break;
5769 case 6212: return ((char *) HT_06212); break;
5770 case 6213: return ((char *) HT_06213); break;
5771 case 6221: return ((char *) HT_06221); break;
5772 case 6222: return ((char *) HT_06222); break;
5773 case 6223: return ((char *) HT_06223); break;
5774 case 6231: return ((char *) HT_06231); break;
5775 case 6232: return ((char *) HT_06232); break;
5776 case 6233: return ((char *) HT_06233); break;
5777 case 6241: return ((char *) HT_06241); break;
5778 case 6242: return ((char *) HT_06242); break;
5779 case 6243: return ((char *) HT_06243); break;
5780 case 6300: return ((char *) HT_06300); break;
5781 case 6400: return ((char *) HT_06400); break;
5782 case 6500: return ((char *) HT_06500); break;
5783 case 6600: return ((char *) HT_06600); break;
5784 case 6700: return ((char *) HT_06700); break;
5785 case 6800: return ((char *) HT_06800); break;
5786 case 6900: return ((char *) HT_06900); break;
5787 case 7100: return ((char *) HT_07100); break;
5788 case 7200: return ((char *) HT_07200); break;
5789 case 7300: return ((char *) HT_07300); break;
5790 case 7400: return ((char *) HT_07400); break;
5791 case 7500: return ((char *) HT_07500); break;
5792 case 7600: return ((char *) HT_07600); break;
5793 case 7700: return ((char *) HT_07700); break;
5794 case 7800: return ((char *) HT_07800); break;
5795 case 7900: return ((char *) HT_07900); break;
5796 case 8000: return ((char *) HT_08000); break;
5797 case 8100: return ((char *) HT_08100); break;
5798 case 8200: return ((char *) HT_08200); break;
5799 case 8300: return ((char *) HT_08300); break;
5800 case 8400: return ((char *) HT_08400); break;
5801 case 8500: return ((char *) HT_08500); break;
5802 case 8600: return ((char *) HT_08600); break;
5803 case 8700: return ((char *) HT_08700); break;
5804 case 8800: return ((char *) HT_08800); break;
5805 case 8900: return ((char *) HT_08900); break;
5806 case 9000: return ((char *) HT_09000); break;
5807 case 9100: return ((char *) HT_09100); break;
5808 case 9200: return ((char *) HT_09200); break;
5809 case 9300: return ((char *) HT_09300); break;
5810 case 9400: return ((char *) HT_09400); break;
5811 case 9500: return ((char *) HT_09500); break;
5812 case 9600: return ((char *) HT_09600); break;
5813 case 9700: return ((char *) HT_09700); break;
5814 case 9710: return ((char *) HT_09710); break;
5815 case 9720: return ((char *) HT_09720); break;
5816 case 9800: return ((char *) HT_09800); break;
5817 case 9810: return ((char *) HT_09810); break;
5818 case 9820: return ((char *) HT_09820); break;
5819 case 9900: return ((char *) HT_09900); break;
5820 case 10000: return ((char *) HT_10000); break;
5821 case 10100: return ((char *) HT_10100); break;
5822 case 10200: return ((char *) HT_10200); break;
5823 case 10300: return ((char *) HT_10300); break;
5824 case 10400: return ((char *) HT_10400); break;
5825 case 10410: return ((char *) HT_10410); break;
5826 case 10420: return ((char *) HT_10420); break;
5827 case 10500: return ((char *) HT_10500); break;
5828 case 10600: return ((char *) HT_10600); break;
5829 case 10700: return ((char *) HT_10700); break;
5830 case 10800: return ((char *) HT_10800); break;
5831 case 10900: return ((char *) HT_10900); break;
5832 case 11000: return ((char *) HT_11000); break;
5833 case 11100: return ((char *) HT_11100); break;
5834 case 11200: return ((char *) HT_11200); break;
5835 case 11300: return ((char *) HT_11300); break;
5836 case 11400: return ((char *) HT_11400); break;
5837 case 11500: return ((char *) HT_11500); break;
5838 case 11600: return ((char *) HT_11600); break;
5839 case 11700: return ((char *) HT_11700); break;
5840 case 11800: return ((char *) HT_11800); break;
5841 case 11900: return ((char *) HT_11900); break;
5842 case 12000: return ((char *) HT_12000); break;
5843 case 12100: return ((char *) HT_12100); break;
5844 case 12200: return ((char *) HT_12200); break;
5845 case 12300: return ((char *) HT_12300); break;
5846 case 12400: return ((char *) HT_12400); break;
5847 case 12500: return ((char *) HT_12500); break;
5848 case 12600: return ((char *) HT_12600); break;
5849 case 12700: return ((char *) HT_12700); break;
5850 case 12800: return ((char *) HT_12800); break;
5851 case 12900: return ((char *) HT_12900); break;
5852 case 13000: return ((char *) HT_13000); break;
5853 case 13100: return ((char *) HT_13100); break;
5854 case 13200: return ((char *) HT_13200); break;
5855 case 13300: return ((char *) HT_13300); break;
5856 case 13400: return ((char *) HT_13400); break;
5857 case 13500: return ((char *) HT_13500); break;
5858 }
5859
5860 return ((char *) "Unknown");
5861 }
5862
5863 char *strstatus (const uint devices_status)
5864 {
5865 switch (devices_status)
5866 {
5867 case STATUS_INIT: return ((char *) ST_0000); break;
5868 case STATUS_STARTING: return ((char *) ST_0001); break;
5869 case STATUS_RUNNING: return ((char *) ST_0002); break;
5870 case STATUS_PAUSED: return ((char *) ST_0003); break;
5871 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5872 case STATUS_CRACKED: return ((char *) ST_0005); break;
5873 case STATUS_ABORTED: return ((char *) ST_0006); break;
5874 case STATUS_QUIT: return ((char *) ST_0007); break;
5875 case STATUS_BYPASS: return ((char *) ST_0008); break;
5876 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5877 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
5878 }
5879
5880 return ((char *) "Unknown");
5881 }
5882
5883 void ascii_digest (char *out_buf, uint salt_pos, uint digest_pos)
5884 {
5885 uint hash_type = data.hash_type;
5886 uint hash_mode = data.hash_mode;
5887 uint salt_type = data.salt_type;
5888 uint opts_type = data.opts_type;
5889 uint opti_type = data.opti_type;
5890 uint dgst_size = data.dgst_size;
5891
5892 char *hashfile = data.hashfile;
5893
5894 uint len = 4096;
5895
5896 uint digest_buf[64] = { 0 };
5897
5898 u64 *digest_buf64 = (u64 *) digest_buf;
5899
5900 char *digests_buf_ptr = (char *) data.digests_buf;
5901
5902 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5903
5904 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5905 {
5906 uint tt;
5907
5908 switch (hash_type)
5909 {
5910 case HASH_TYPE_DESCRYPT:
5911 FP (digest_buf[1], digest_buf[0], tt);
5912 break;
5913
5914 case HASH_TYPE_DESRACF:
5915 digest_buf[0] = rotl32 (digest_buf[0], 29);
5916 digest_buf[1] = rotl32 (digest_buf[1], 29);
5917
5918 FP (digest_buf[1], digest_buf[0], tt);
5919 break;
5920
5921 case HASH_TYPE_LM:
5922 FP (digest_buf[1], digest_buf[0], tt);
5923 break;
5924
5925 case HASH_TYPE_NETNTLM:
5926 digest_buf[0] = rotl32 (digest_buf[0], 29);
5927 digest_buf[1] = rotl32 (digest_buf[1], 29);
5928 digest_buf[2] = rotl32 (digest_buf[2], 29);
5929 digest_buf[3] = rotl32 (digest_buf[3], 29);
5930
5931 FP (digest_buf[1], digest_buf[0], tt);
5932 FP (digest_buf[3], digest_buf[2], tt);
5933 break;
5934
5935 case HASH_TYPE_BSDICRYPT:
5936 digest_buf[0] = rotl32 (digest_buf[0], 31);
5937 digest_buf[1] = rotl32 (digest_buf[1], 31);
5938
5939 FP (digest_buf[1], digest_buf[0], tt);
5940 break;
5941 }
5942 }
5943
5944 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5945 {
5946 switch (hash_type)
5947 {
5948 case HASH_TYPE_MD4:
5949 digest_buf[0] += MD4M_A;
5950 digest_buf[1] += MD4M_B;
5951 digest_buf[2] += MD4M_C;
5952 digest_buf[3] += MD4M_D;
5953 break;
5954
5955 case HASH_TYPE_MD5:
5956 digest_buf[0] += MD5M_A;
5957 digest_buf[1] += MD5M_B;
5958 digest_buf[2] += MD5M_C;
5959 digest_buf[3] += MD5M_D;
5960 break;
5961
5962 case HASH_TYPE_SHA1:
5963 digest_buf[0] += SHA1M_A;
5964 digest_buf[1] += SHA1M_B;
5965 digest_buf[2] += SHA1M_C;
5966 digest_buf[3] += SHA1M_D;
5967 digest_buf[4] += SHA1M_E;
5968 break;
5969
5970 case HASH_TYPE_SHA256:
5971 digest_buf[0] += SHA256M_A;
5972 digest_buf[1] += SHA256M_B;
5973 digest_buf[2] += SHA256M_C;
5974 digest_buf[3] += SHA256M_D;
5975 digest_buf[4] += SHA256M_E;
5976 digest_buf[5] += SHA256M_F;
5977 digest_buf[6] += SHA256M_G;
5978 digest_buf[7] += SHA256M_H;
5979 break;
5980
5981 case HASH_TYPE_SHA384:
5982 digest_buf64[0] += SHA384M_A;
5983 digest_buf64[1] += SHA384M_B;
5984 digest_buf64[2] += SHA384M_C;
5985 digest_buf64[3] += SHA384M_D;
5986 digest_buf64[4] += SHA384M_E;
5987 digest_buf64[5] += SHA384M_F;
5988 digest_buf64[6] += 0;
5989 digest_buf64[7] += 0;
5990 break;
5991
5992 case HASH_TYPE_SHA512:
5993 digest_buf64[0] += SHA512M_A;
5994 digest_buf64[1] += SHA512M_B;
5995 digest_buf64[2] += SHA512M_C;
5996 digest_buf64[3] += SHA512M_D;
5997 digest_buf64[4] += SHA512M_E;
5998 digest_buf64[5] += SHA512M_F;
5999 digest_buf64[6] += SHA512M_G;
6000 digest_buf64[7] += SHA512M_H;
6001 break;
6002 }
6003 }
6004
6005 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
6006 {
6007 if (dgst_size == DGST_SIZE_4_2)
6008 {
6009 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6010 }
6011 else if (dgst_size == DGST_SIZE_4_4)
6012 {
6013 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6014 }
6015 else if (dgst_size == DGST_SIZE_4_5)
6016 {
6017 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6018 }
6019 else if (dgst_size == DGST_SIZE_4_6)
6020 {
6021 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6022 }
6023 else if (dgst_size == DGST_SIZE_4_8)
6024 {
6025 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6026 }
6027 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6028 {
6029 if (hash_type == HASH_TYPE_WHIRLPOOL)
6030 {
6031 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6032 }
6033 else if (hash_type == HASH_TYPE_SHA384)
6034 {
6035 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6036 }
6037 else if (hash_type == HASH_TYPE_SHA512)
6038 {
6039 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6040 }
6041 else if (hash_type == HASH_TYPE_GOST)
6042 {
6043 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6044 }
6045 }
6046 else if (dgst_size == DGST_SIZE_4_64)
6047 {
6048 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6049 }
6050 else if (dgst_size == DGST_SIZE_8_25)
6051 {
6052 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6053 }
6054 }
6055
6056 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6057 | (data.salt_type == SALT_TYPE_EXTERN)
6058 | (data.salt_type == SALT_TYPE_EMBEDDED));
6059
6060 salt_t salt;
6061
6062 if (isSalted)
6063 {
6064 memset (&salt, 0, sizeof (salt_t));
6065
6066 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6067
6068 char *ptr = (char *) salt.salt_buf;
6069
6070 uint len = salt.salt_len;
6071
6072 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6073 {
6074 uint tt;
6075
6076 switch (hash_type)
6077 {
6078 case HASH_TYPE_NETNTLM:
6079
6080 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6081 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6082
6083 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6084
6085 break;
6086 }
6087 }
6088
6089 if (opts_type & OPTS_TYPE_ST_UNICODE)
6090 {
6091 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6092 {
6093 ptr[i] = ptr[j];
6094 }
6095
6096 len = len / 2;
6097 }
6098
6099 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6100 {
6101 uint max = salt.salt_len / 4;
6102
6103 if (len % 4) max++;
6104
6105 for (uint i = 0; i < max; i++)
6106 {
6107 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6108 }
6109 }
6110
6111 if (opts_type & OPTS_TYPE_ST_HEX)
6112 {
6113 char tmp[64] = { 0 };
6114
6115 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6116 {
6117 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6118 }
6119
6120 len = len * 2;
6121
6122 memcpy (ptr, tmp, len);
6123 }
6124
6125 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6126
6127 memset (ptr + len, 0, memset_size);
6128
6129 salt.salt_len = len;
6130 }
6131
6132 //
6133 // some modes require special encoding
6134 //
6135
6136 uint out_buf_plain[256] = { 0 };
6137 uint out_buf_salt[256] = { 0 };
6138
6139 char tmp_buf[1024] = { 0 };
6140
6141 char *ptr_plain = (char *) out_buf_plain;
6142 char *ptr_salt = (char *) out_buf_salt;
6143
6144 if (hash_mode == 22)
6145 {
6146 char username[30] = { 0 };
6147
6148 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6149
6150 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6151
6152 u16 *ptr = (u16 *) digest_buf;
6153
6154 tmp_buf[ 0] = sig[0];
6155 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6156 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6157 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6158 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6159 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6160 tmp_buf[ 6] = sig[1];
6161 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6162 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6163 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6164 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6165 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6166 tmp_buf[12] = sig[2];
6167 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6168 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6169 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6170 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6171 tmp_buf[17] = sig[3];
6172 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6173 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6174 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6175 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6176 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6177 tmp_buf[23] = sig[4];
6178 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6179 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6180 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6181 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6182 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6183 tmp_buf[29] = sig[5];
6184
6185 snprintf (out_buf, len-1, "%s:%s",
6186 tmp_buf,
6187 username);
6188 }
6189 else if (hash_mode == 23)
6190 {
6191 // do not show the skyper part in output
6192
6193 char *salt_buf_ptr = (char *) salt.salt_buf;
6194
6195 salt_buf_ptr[salt.salt_len - 8] = 0;
6196
6197 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6198 digest_buf[0],
6199 digest_buf[1],
6200 digest_buf[2],
6201 digest_buf[3],
6202 salt_buf_ptr);
6203 }
6204 else if (hash_mode == 101)
6205 {
6206 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6207
6208 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6209 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6210 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6211 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6212 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6213
6214 memcpy (tmp_buf, digest_buf, 20);
6215
6216 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6217
6218 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6219 }
6220 else if (hash_mode == 111)
6221 {
6222 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6223
6224 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6225 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6226 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6227 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6228 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6229
6230 memcpy (tmp_buf, digest_buf, 20);
6231 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6232
6233 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6234
6235 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6236 }
6237 else if ((hash_mode == 122) || (hash_mode == 125))
6238 {
6239 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6240 (char *) salt.salt_buf,
6241 digest_buf[0],
6242 digest_buf[1],
6243 digest_buf[2],
6244 digest_buf[3],
6245 digest_buf[4]);
6246 }
6247 else if (hash_mode == 124)
6248 {
6249 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6250 (char *) salt.salt_buf,
6251 digest_buf[0],
6252 digest_buf[1],
6253 digest_buf[2],
6254 digest_buf[3],
6255 digest_buf[4]);
6256 }
6257 else if (hash_mode == 131)
6258 {
6259 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6260 (char *) salt.salt_buf,
6261 0, 0, 0, 0, 0,
6262 digest_buf[0],
6263 digest_buf[1],
6264 digest_buf[2],
6265 digest_buf[3],
6266 digest_buf[4]);
6267 }
6268 else if (hash_mode == 132)
6269 {
6270 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6271 (char *) salt.salt_buf,
6272 digest_buf[0],
6273 digest_buf[1],
6274 digest_buf[2],
6275 digest_buf[3],
6276 digest_buf[4]);
6277 }
6278 else if (hash_mode == 133)
6279 {
6280 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6281
6282 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6283 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6284 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6285 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6286 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6287
6288 memcpy (tmp_buf, digest_buf, 20);
6289
6290 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6291
6292 snprintf (out_buf, len-1, "%s", ptr_plain);
6293 }
6294 else if (hash_mode == 141)
6295 {
6296 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6297
6298 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6299
6300 memset (tmp_buf, 0, sizeof (tmp_buf));
6301
6302 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6303
6304 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6305 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6306 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6307 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6308 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6309
6310 memcpy (tmp_buf, digest_buf, 20);
6311
6312 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6313
6314 ptr_plain[27] = 0;
6315
6316 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6317 }
6318 else if (hash_mode == 400)
6319 {
6320 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6321
6322 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6323 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6324 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6325 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6326
6327 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6328
6329 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6330 }
6331 else if (hash_mode == 500)
6332 {
6333 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6334
6335 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6336 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6337 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6338 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6339
6340 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6341
6342 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6343 {
6344 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6345 }
6346 else
6347 {
6348 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6349 }
6350 }
6351 else if (hash_mode == 501)
6352 {
6353 uint digest_idx = salt.digests_offset + digest_pos;
6354
6355 hashinfo_t **hashinfo_ptr = data.hash_info;
6356 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6357
6358 snprintf (out_buf, len-1, "%s", hash_buf);
6359 }
6360 else if (hash_mode == 1421)
6361 {
6362 u8 *salt_ptr = (u8 *) salt.salt_buf;
6363
6364 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6365 salt_ptr[0],
6366 salt_ptr[1],
6367 salt_ptr[2],
6368 salt_ptr[3],
6369 salt_ptr[4],
6370 salt_ptr[5],
6371 digest_buf[0],
6372 digest_buf[1],
6373 digest_buf[2],
6374 digest_buf[3],
6375 digest_buf[4],
6376 digest_buf[5],
6377 digest_buf[6],
6378 digest_buf[7]);
6379 }
6380 else if (hash_mode == 1441)
6381 {
6382 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6383
6384 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6385
6386 memset (tmp_buf, 0, sizeof (tmp_buf));
6387
6388 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6389
6390 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6391 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6392 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6393 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6394 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6395 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6396 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6397 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6398
6399 memcpy (tmp_buf, digest_buf, 32);
6400
6401 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6402
6403 ptr_plain[43] = 0;
6404
6405 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6406 }
6407 else if (hash_mode == 1500)
6408 {
6409 out_buf[0] = salt.salt_sign[0] & 0xff;
6410 out_buf[1] = salt.salt_sign[1] & 0xff;
6411 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6412 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6413 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6414
6415 memset (tmp_buf, 0, sizeof (tmp_buf));
6416
6417 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6418
6419 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6420 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6421
6422 memcpy (tmp_buf, digest_buf, 8);
6423
6424 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6425
6426 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6427
6428 out_buf[13] = 0;
6429 }
6430 else if (hash_mode == 1600)
6431 {
6432 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6433
6434 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6435 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6436 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6437 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6438
6439 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6440
6441 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6442 {
6443 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6444 }
6445 else
6446 {
6447 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6448 }
6449 }
6450 else if (hash_mode == 1711)
6451 {
6452 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6453
6454 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6455 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6456 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6457 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6458 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6459 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6460 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6461 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6462
6463 memcpy (tmp_buf, digest_buf, 64);
6464 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6465
6466 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6467
6468 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6469 }
6470 else if (hash_mode == 1722)
6471 {
6472 uint *ptr = digest_buf;
6473
6474 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6475 (unsigned char *) salt.salt_buf,
6476 ptr[ 1], ptr[ 0],
6477 ptr[ 3], ptr[ 2],
6478 ptr[ 5], ptr[ 4],
6479 ptr[ 7], ptr[ 6],
6480 ptr[ 9], ptr[ 8],
6481 ptr[11], ptr[10],
6482 ptr[13], ptr[12],
6483 ptr[15], ptr[14]);
6484 }
6485 else if (hash_mode == 1731)
6486 {
6487 uint *ptr = digest_buf;
6488
6489 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6490 (unsigned char *) salt.salt_buf,
6491 ptr[ 1], ptr[ 0],
6492 ptr[ 3], ptr[ 2],
6493 ptr[ 5], ptr[ 4],
6494 ptr[ 7], ptr[ 6],
6495 ptr[ 9], ptr[ 8],
6496 ptr[11], ptr[10],
6497 ptr[13], ptr[12],
6498 ptr[15], ptr[14]);
6499 }
6500 else if (hash_mode == 1800)
6501 {
6502 // temp workaround
6503
6504 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6505 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6506 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6507 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6508 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6509 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6510 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6511 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6512
6513 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6514
6515 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6516 {
6517 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6518 }
6519 else
6520 {
6521 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6522 }
6523 }
6524 else if (hash_mode == 2100)
6525 {
6526 uint pos = 0;
6527
6528 snprintf (out_buf + pos, len-1, "%s%i#",
6529 SIGNATURE_DCC2,
6530 salt.salt_iter + 1);
6531
6532 uint signature_len = strlen (out_buf);
6533
6534 pos += signature_len;
6535 len -= signature_len;
6536
6537 char *salt_ptr = (char *) salt.salt_buf;
6538
6539 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6540
6541 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6542 byte_swap_32 (digest_buf[0]),
6543 byte_swap_32 (digest_buf[1]),
6544 byte_swap_32 (digest_buf[2]),
6545 byte_swap_32 (digest_buf[3]));
6546 }
6547 else if ((hash_mode == 2400) || (hash_mode == 2410))
6548 {
6549 memcpy (tmp_buf, digest_buf, 16);
6550
6551 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6552
6553 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6554 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6555 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6556 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6557
6558 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6559 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6560 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6561 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6562
6563 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6564 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6565 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6566 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6567
6568 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6569 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6570 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6571 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6572
6573 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6574 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6575 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6576 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6577
6578 out_buf[16] = 0;
6579 }
6580 else if (hash_mode == 2500)
6581 {
6582 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6583
6584 wpa_t *wpa = &wpas[salt_pos];
6585
6586 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6587 (char *) salt.salt_buf,
6588 wpa->orig_mac1[0],
6589 wpa->orig_mac1[1],
6590 wpa->orig_mac1[2],
6591 wpa->orig_mac1[3],
6592 wpa->orig_mac1[4],
6593 wpa->orig_mac1[5],
6594 wpa->orig_mac2[0],
6595 wpa->orig_mac2[1],
6596 wpa->orig_mac2[2],
6597 wpa->orig_mac2[3],
6598 wpa->orig_mac2[4],
6599 wpa->orig_mac2[5]);
6600 }
6601 else if (hash_mode == 4400)
6602 {
6603 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6604 byte_swap_32 (digest_buf[0]),
6605 byte_swap_32 (digest_buf[1]),
6606 byte_swap_32 (digest_buf[2]),
6607 byte_swap_32 (digest_buf[3]));
6608 }
6609 else if (hash_mode == 4700)
6610 {
6611 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6612 byte_swap_32 (digest_buf[0]),
6613 byte_swap_32 (digest_buf[1]),
6614 byte_swap_32 (digest_buf[2]),
6615 byte_swap_32 (digest_buf[3]),
6616 byte_swap_32 (digest_buf[4]));
6617 }
6618 else if (hash_mode == 4800)
6619 {
6620 u8 chap_id_byte = (u8) salt.salt_buf[4];
6621
6622 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6623 digest_buf[0],
6624 digest_buf[1],
6625 digest_buf[2],
6626 digest_buf[3],
6627 byte_swap_32 (salt.salt_buf[0]),
6628 byte_swap_32 (salt.salt_buf[1]),
6629 byte_swap_32 (salt.salt_buf[2]),
6630 byte_swap_32 (salt.salt_buf[3]),
6631 chap_id_byte);
6632 }
6633 else if (hash_mode == 4900)
6634 {
6635 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6636 byte_swap_32 (digest_buf[0]),
6637 byte_swap_32 (digest_buf[1]),
6638 byte_swap_32 (digest_buf[2]),
6639 byte_swap_32 (digest_buf[3]),
6640 byte_swap_32 (digest_buf[4]));
6641 }
6642 else if (hash_mode == 5100)
6643 {
6644 snprintf (out_buf, len-1, "%08x%08x",
6645 digest_buf[0],
6646 digest_buf[1]);
6647 }
6648 else if (hash_mode == 5200)
6649 {
6650 snprintf (out_buf, len-1, "%s", hashfile);
6651 }
6652 else if (hash_mode == 5300)
6653 {
6654 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6655
6656 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6657
6658 int buf_len = len -1;
6659
6660 // msg_buf
6661
6662 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6663
6664 for (uint i = 0; i < ikepsk_msg_len; i++)
6665 {
6666 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6667 {
6668 snprintf (out_buf, buf_len, ":");
6669
6670 buf_len--;
6671 out_buf++;
6672 }
6673
6674 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6675
6676 buf_len -= 8;
6677 out_buf += 8;
6678 }
6679
6680 // nr_buf
6681
6682 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6683
6684 for (uint i = 0; i < ikepsk_nr_len; i++)
6685 {
6686 if ((i == 0) || (i == 5))
6687 {
6688 snprintf (out_buf, buf_len, ":");
6689
6690 buf_len--;
6691 out_buf++;
6692 }
6693
6694 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6695
6696 buf_len -= 8;
6697 out_buf += 8;
6698 }
6699
6700 // digest_buf
6701
6702 for (uint i = 0; i < 4; i++)
6703 {
6704 if (i == 0)
6705 {
6706 snprintf (out_buf, buf_len, ":");
6707
6708 buf_len--;
6709 out_buf++;
6710 }
6711
6712 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6713
6714 buf_len -= 8;
6715 out_buf += 8;
6716 }
6717 }
6718 else if (hash_mode == 5400)
6719 {
6720 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6721
6722 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6723
6724 int buf_len = len -1;
6725
6726 // msg_buf
6727
6728 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6729
6730 for (uint i = 0; i < ikepsk_msg_len; i++)
6731 {
6732 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6733 {
6734 snprintf (out_buf, buf_len, ":");
6735
6736 buf_len--;
6737 out_buf++;
6738 }
6739
6740 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6741
6742 buf_len -= 8;
6743 out_buf += 8;
6744 }
6745
6746 // nr_buf
6747
6748 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6749
6750 for (uint i = 0; i < ikepsk_nr_len; i++)
6751 {
6752 if ((i == 0) || (i == 5))
6753 {
6754 snprintf (out_buf, buf_len, ":");
6755
6756 buf_len--;
6757 out_buf++;
6758 }
6759
6760 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6761
6762 buf_len -= 8;
6763 out_buf += 8;
6764 }
6765
6766 // digest_buf
6767
6768 for (uint i = 0; i < 5; i++)
6769 {
6770 if (i == 0)
6771 {
6772 snprintf (out_buf, buf_len, ":");
6773
6774 buf_len--;
6775 out_buf++;
6776 }
6777
6778 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6779
6780 buf_len -= 8;
6781 out_buf += 8;
6782 }
6783 }
6784 else if (hash_mode == 5500)
6785 {
6786 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6787
6788 netntlm_t *netntlm = &netntlms[salt_pos];
6789
6790 char user_buf[64] = { 0 };
6791 char domain_buf[64] = { 0 };
6792 char srvchall_buf[1024] = { 0 };
6793 char clichall_buf[1024] = { 0 };
6794
6795 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6796 {
6797 char *ptr = (char *) netntlm->userdomain_buf;
6798
6799 user_buf[i] = ptr[j];
6800 }
6801
6802 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6803 {
6804 char *ptr = (char *) netntlm->userdomain_buf;
6805
6806 domain_buf[i] = ptr[netntlm->user_len + j];
6807 }
6808
6809 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6810 {
6811 u8 *ptr = (u8 *) netntlm->chall_buf;
6812
6813 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6814 }
6815
6816 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6817 {
6818 u8 *ptr = (u8 *) netntlm->chall_buf;
6819
6820 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6821 }
6822
6823 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6824 user_buf,
6825 domain_buf,
6826 srvchall_buf,
6827 digest_buf[0],
6828 digest_buf[1],
6829 digest_buf[2],
6830 digest_buf[3],
6831 byte_swap_32 (salt.salt_buf_pc[0]),
6832 byte_swap_32 (salt.salt_buf_pc[1]),
6833 clichall_buf);
6834 }
6835 else if (hash_mode == 5600)
6836 {
6837 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6838
6839 netntlm_t *netntlm = &netntlms[salt_pos];
6840
6841 char user_buf[64] = { 0 };
6842 char domain_buf[64] = { 0 };
6843 char srvchall_buf[1024] = { 0 };
6844 char clichall_buf[1024] = { 0 };
6845
6846 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6847 {
6848 char *ptr = (char *) netntlm->userdomain_buf;
6849
6850 user_buf[i] = ptr[j];
6851 }
6852
6853 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6854 {
6855 char *ptr = (char *) netntlm->userdomain_buf;
6856
6857 domain_buf[i] = ptr[netntlm->user_len + j];
6858 }
6859
6860 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6861 {
6862 u8 *ptr = (u8 *) netntlm->chall_buf;
6863
6864 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6865 }
6866
6867 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6868 {
6869 u8 *ptr = (u8 *) netntlm->chall_buf;
6870
6871 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6872 }
6873
6874 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6875 user_buf,
6876 domain_buf,
6877 srvchall_buf,
6878 digest_buf[0],
6879 digest_buf[1],
6880 digest_buf[2],
6881 digest_buf[3],
6882 clichall_buf);
6883 }
6884 else if (hash_mode == 5700)
6885 {
6886 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6887
6888 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6889 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6890 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6891 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6892 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6893 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6894 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6895 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6896
6897 memcpy (tmp_buf, digest_buf, 32);
6898
6899 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6900
6901 ptr_plain[43] = 0;
6902
6903 snprintf (out_buf, len-1, "%s", ptr_plain);
6904 }
6905 else if (hash_mode == 5800)
6906 {
6907 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6908 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6909 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6910 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6911 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6912
6913 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6914 digest_buf[0],
6915 digest_buf[1],
6916 digest_buf[2],
6917 digest_buf[3],
6918 digest_buf[4]);
6919 }
6920 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6921 {
6922 snprintf (out_buf, len-1, "%s", hashfile);
6923 }
6924 else if (hash_mode == 6300)
6925 {
6926 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6927
6928 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6929 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6930 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6931 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6932
6933 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6934
6935 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6936 }
6937 else if (hash_mode == 6400)
6938 {
6939 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6940
6941 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6942 }
6943 else if (hash_mode == 6500)
6944 {
6945 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6946
6947 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6948 }
6949 else if (hash_mode == 6600)
6950 {
6951 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6952
6953 agilekey_t *agilekey = &agilekeys[salt_pos];
6954
6955 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6956 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6957
6958 uint buf_len = len - 1;
6959
6960 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6961 buf_len -= 22;
6962
6963 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6964 {
6965 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6966
6967 buf_len -= 2;
6968 }
6969 }
6970 else if (hash_mode == 6700)
6971 {
6972 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6973
6974 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6975 }
6976 else if (hash_mode == 6800)
6977 {
6978 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6979 }
6980 else if (hash_mode == 7100)
6981 {
6982 uint *ptr = digest_buf;
6983
6984 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6985
6986 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6987
6988 uint esalt[8] = { 0 };
6989
6990 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6991 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6992 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6993 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6994 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6995 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6996 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6997 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6998
6999 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",
7000 SIGNATURE_SHA512OSX,
7001 salt.salt_iter + 1,
7002 esalt[ 0], esalt[ 1],
7003 esalt[ 2], esalt[ 3],
7004 esalt[ 4], esalt[ 5],
7005 esalt[ 6], esalt[ 7],
7006 ptr [ 1], ptr [ 0],
7007 ptr [ 3], ptr [ 2],
7008 ptr [ 5], ptr [ 4],
7009 ptr [ 7], ptr [ 6],
7010 ptr [ 9], ptr [ 8],
7011 ptr [11], ptr [10],
7012 ptr [13], ptr [12],
7013 ptr [15], ptr [14]);
7014 }
7015 else if (hash_mode == 7200)
7016 {
7017 uint *ptr = digest_buf;
7018
7019 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7020
7021 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7022
7023 uint len_used = 0;
7024
7025 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7026
7027 len_used = strlen (out_buf);
7028
7029 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7030
7031 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7032 {
7033 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7034 }
7035
7036 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",
7037 ptr [ 1], ptr [ 0],
7038 ptr [ 3], ptr [ 2],
7039 ptr [ 5], ptr [ 4],
7040 ptr [ 7], ptr [ 6],
7041 ptr [ 9], ptr [ 8],
7042 ptr [11], ptr [10],
7043 ptr [13], ptr [12],
7044 ptr [15], ptr [14]);
7045 }
7046 else if (hash_mode == 7300)
7047 {
7048 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7049
7050 rakp_t *rakp = &rakps[salt_pos];
7051
7052 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7053 {
7054 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7055 }
7056
7057 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7058 digest_buf[0],
7059 digest_buf[1],
7060 digest_buf[2],
7061 digest_buf[3],
7062 digest_buf[4]);
7063 }
7064 else if (hash_mode == 7400)
7065 {
7066 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7067
7068 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7069 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7070 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7071 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7072 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7073 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7074 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7075 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7076
7077 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7078
7079 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7080 {
7081 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7082 }
7083 else
7084 {
7085 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7086 }
7087 }
7088 else if (hash_mode == 7500)
7089 {
7090 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7091
7092 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7093
7094 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7095 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7096
7097 char data[128] = { 0 };
7098
7099 char *ptr_data = data;
7100
7101 for (uint i = 0; i < 36; i++, ptr_data += 2)
7102 {
7103 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7104 }
7105
7106 for (uint i = 0; i < 16; i++, ptr_data += 2)
7107 {
7108 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7109 }
7110
7111 *ptr_data = 0;
7112
7113 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7114 SIGNATURE_KRB5PA,
7115 (char *) krb5pa->user,
7116 (char *) krb5pa->realm,
7117 (char *) krb5pa->salt,
7118 data);
7119 }
7120 else if (hash_mode == 7700)
7121 {
7122 snprintf (out_buf, len-1, "%s$%08X%08X",
7123 (char *) salt.salt_buf,
7124 digest_buf[0],
7125 digest_buf[1]);
7126 }
7127 else if (hash_mode == 7800)
7128 {
7129 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7130 (char *) salt.salt_buf,
7131 digest_buf[0],
7132 digest_buf[1],
7133 digest_buf[2],
7134 digest_buf[3],
7135 digest_buf[4]);
7136 }
7137 else if (hash_mode == 7900)
7138 {
7139 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7140
7141 // ugly hack start
7142
7143 char *tmp = (char *) salt.salt_buf_pc;
7144
7145 ptr_plain[42] = tmp[0];
7146
7147 // ugly hack end
7148
7149 ptr_plain[43] = 0;
7150
7151 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7152 }
7153 else if (hash_mode == 8000)
7154 {
7155 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7156 (unsigned char *) salt.salt_buf,
7157 digest_buf[0],
7158 digest_buf[1],
7159 digest_buf[2],
7160 digest_buf[3],
7161 digest_buf[4],
7162 digest_buf[5],
7163 digest_buf[6],
7164 digest_buf[7]);
7165 }
7166 else if (hash_mode == 8100)
7167 {
7168 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7169 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7170
7171 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7172 (unsigned char *) salt.salt_buf,
7173 digest_buf[0],
7174 digest_buf[1],
7175 digest_buf[2],
7176 digest_buf[3],
7177 digest_buf[4]);
7178 }
7179 else if (hash_mode == 8200)
7180 {
7181 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7182
7183 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7184
7185 char data_buf[4096] = { 0 };
7186
7187 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7188 {
7189 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7190 }
7191
7192 data_buf[cloudkey->data_len * 2] = 0;
7193
7194 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7195 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7196 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7197 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7198 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7199 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7200 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7201 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7202
7203 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7204 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7205 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7206 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7207
7208 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7209 digest_buf[0],
7210 digest_buf[1],
7211 digest_buf[2],
7212 digest_buf[3],
7213 digest_buf[4],
7214 digest_buf[5],
7215 digest_buf[6],
7216 digest_buf[7],
7217 salt.salt_buf[0],
7218 salt.salt_buf[1],
7219 salt.salt_buf[2],
7220 salt.salt_buf[3],
7221 salt.salt_iter + 1,
7222 data_buf);
7223 }
7224 else if (hash_mode == 8300)
7225 {
7226 char digest_buf_c[34] = { 0 };
7227
7228 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7229 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7230 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7231 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7232 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7233
7234 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7235
7236 digest_buf_c[32] = 0;
7237
7238 // domain
7239
7240 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7241
7242 char domain_buf_c[33] = { 0 };
7243
7244 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7245
7246 for (uint i = 0; i < salt_pc_len; i++)
7247 {
7248 const char next = domain_buf_c[i];
7249
7250 domain_buf_c[i] = '.';
7251
7252 i += next;
7253 }
7254
7255 domain_buf_c[salt_pc_len] = 0;
7256
7257 // final
7258
7259 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7260 }
7261 else if (hash_mode == 8500)
7262 {
7263 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7264 }
7265 else if (hash_mode == 2612)
7266 {
7267 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7268 SIGNATURE_PHPS,
7269 (char *) salt.salt_buf,
7270 digest_buf[0],
7271 digest_buf[1],
7272 digest_buf[2],
7273 digest_buf[3]);
7274 }
7275 else if (hash_mode == 3711)
7276 {
7277 char *salt_ptr = (char *) salt.salt_buf;
7278
7279 salt_ptr[salt.salt_len - 1] = 0;
7280
7281 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7282 SIGNATURE_MEDIAWIKI_B,
7283 salt_ptr,
7284 digest_buf[0],
7285 digest_buf[1],
7286 digest_buf[2],
7287 digest_buf[3]);
7288 }
7289 else if (hash_mode == 8800)
7290 {
7291 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7292
7293 androidfde_t *androidfde = &androidfdes[salt_pos];
7294
7295 char tmp[3073] = { 0 };
7296
7297 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7298 {
7299 sprintf (tmp + j, "%08x", androidfde->data[i]);
7300 }
7301
7302 tmp[3072] = 0;
7303
7304 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7305 SIGNATURE_ANDROIDFDE,
7306 byte_swap_32 (salt.salt_buf[0]),
7307 byte_swap_32 (salt.salt_buf[1]),
7308 byte_swap_32 (salt.salt_buf[2]),
7309 byte_swap_32 (salt.salt_buf[3]),
7310 byte_swap_32 (digest_buf[0]),
7311 byte_swap_32 (digest_buf[1]),
7312 byte_swap_32 (digest_buf[2]),
7313 byte_swap_32 (digest_buf[3]),
7314 tmp);
7315 }
7316 else if (hash_mode == 8900)
7317 {
7318 uint N = salt.scrypt_N;
7319 uint r = salt.scrypt_r;
7320 uint p = salt.scrypt_p;
7321
7322 char base64_salt[32] = { 0 };
7323
7324 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7325
7326 memset (tmp_buf, 0, 46);
7327
7328 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7329 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7330 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7331 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7332 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7333 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7334 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7335 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7336 digest_buf[8] = 0; // needed for base64_encode ()
7337
7338 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7339
7340 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7341 SIGNATURE_SCRYPT,
7342 N,
7343 r,
7344 p,
7345 base64_salt,
7346 tmp_buf);
7347 }
7348 else if (hash_mode == 9000)
7349 {
7350 snprintf (out_buf, len-1, "%s", hashfile);
7351 }
7352 else if (hash_mode == 9200)
7353 {
7354 // salt
7355
7356 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7357
7358 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7359
7360 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7361
7362 // hash
7363
7364 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7365 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7366 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7367 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7368 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7369 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7370 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7371 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7372 digest_buf[8] = 0; // needed for base64_encode ()
7373
7374 char tmp_buf[64] = { 0 };
7375
7376 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7377 tmp_buf[43] = 0; // cut it here
7378
7379 // output
7380
7381 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7382 }
7383 else if (hash_mode == 9300)
7384 {
7385 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7386 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7387 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7388 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7389 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7390 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7391 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7392 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7393 digest_buf[8] = 0; // needed for base64_encode ()
7394
7395 char tmp_buf[64] = { 0 };
7396
7397 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7398 tmp_buf[43] = 0; // cut it here
7399
7400 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7401
7402 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7403 }
7404 else if (hash_mode == 9400)
7405 {
7406 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7407
7408 office2007_t *office2007 = &office2007s[salt_pos];
7409
7410 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7411 SIGNATURE_OFFICE2007,
7412 2007,
7413 20,
7414 office2007->keySize,
7415 16,
7416 salt.salt_buf[0],
7417 salt.salt_buf[1],
7418 salt.salt_buf[2],
7419 salt.salt_buf[3],
7420 office2007->encryptedVerifier[0],
7421 office2007->encryptedVerifier[1],
7422 office2007->encryptedVerifier[2],
7423 office2007->encryptedVerifier[3],
7424 office2007->encryptedVerifierHash[0],
7425 office2007->encryptedVerifierHash[1],
7426 office2007->encryptedVerifierHash[2],
7427 office2007->encryptedVerifierHash[3],
7428 office2007->encryptedVerifierHash[4]);
7429 }
7430 else if (hash_mode == 9500)
7431 {
7432 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7433
7434 office2010_t *office2010 = &office2010s[salt_pos];
7435
7436 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,
7437
7438 salt.salt_buf[0],
7439 salt.salt_buf[1],
7440 salt.salt_buf[2],
7441 salt.salt_buf[3],
7442 office2010->encryptedVerifier[0],
7443 office2010->encryptedVerifier[1],
7444 office2010->encryptedVerifier[2],
7445 office2010->encryptedVerifier[3],
7446 office2010->encryptedVerifierHash[0],
7447 office2010->encryptedVerifierHash[1],
7448 office2010->encryptedVerifierHash[2],
7449 office2010->encryptedVerifierHash[3],
7450 office2010->encryptedVerifierHash[4],
7451 office2010->encryptedVerifierHash[5],
7452 office2010->encryptedVerifierHash[6],
7453 office2010->encryptedVerifierHash[7]);
7454 }
7455 else if (hash_mode == 9600)
7456 {
7457 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7458
7459 office2013_t *office2013 = &office2013s[salt_pos];
7460
7461 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,
7462
7463 salt.salt_buf[0],
7464 salt.salt_buf[1],
7465 salt.salt_buf[2],
7466 salt.salt_buf[3],
7467 office2013->encryptedVerifier[0],
7468 office2013->encryptedVerifier[1],
7469 office2013->encryptedVerifier[2],
7470 office2013->encryptedVerifier[3],
7471 office2013->encryptedVerifierHash[0],
7472 office2013->encryptedVerifierHash[1],
7473 office2013->encryptedVerifierHash[2],
7474 office2013->encryptedVerifierHash[3],
7475 office2013->encryptedVerifierHash[4],
7476 office2013->encryptedVerifierHash[5],
7477 office2013->encryptedVerifierHash[6],
7478 office2013->encryptedVerifierHash[7]);
7479 }
7480 else if (hash_mode == 9700)
7481 {
7482 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7483
7484 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7485
7486 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7487 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7488 byte_swap_32 (salt.salt_buf[0]),
7489 byte_swap_32 (salt.salt_buf[1]),
7490 byte_swap_32 (salt.salt_buf[2]),
7491 byte_swap_32 (salt.salt_buf[3]),
7492 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7493 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7494 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7495 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7496 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7497 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7498 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7499 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7500 }
7501 else if (hash_mode == 9710)
7502 {
7503 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7504
7505 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7506
7507 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7508 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7509 byte_swap_32 (salt.salt_buf[0]),
7510 byte_swap_32 (salt.salt_buf[1]),
7511 byte_swap_32 (salt.salt_buf[2]),
7512 byte_swap_32 (salt.salt_buf[3]),
7513 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7514 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7515 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7516 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7517 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7518 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7519 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7520 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7521 }
7522 else if (hash_mode == 9720)
7523 {
7524 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7525
7526 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7527
7528 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7529
7530 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7531 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7532 byte_swap_32 (salt.salt_buf[0]),
7533 byte_swap_32 (salt.salt_buf[1]),
7534 byte_swap_32 (salt.salt_buf[2]),
7535 byte_swap_32 (salt.salt_buf[3]),
7536 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7537 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7538 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7539 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7540 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7541 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7542 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7543 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7544 rc4key[0],
7545 rc4key[1],
7546 rc4key[2],
7547 rc4key[3],
7548 rc4key[4]);
7549 }
7550 else if (hash_mode == 9800)
7551 {
7552 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7553
7554 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7555
7556 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7557 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7558 salt.salt_buf[0],
7559 salt.salt_buf[1],
7560 salt.salt_buf[2],
7561 salt.salt_buf[3],
7562 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7563 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7564 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7565 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7566 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7567 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7568 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7569 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7570 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7571 }
7572 else if (hash_mode == 9810)
7573 {
7574 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7575
7576 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7577
7578 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7579 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7580 salt.salt_buf[0],
7581 salt.salt_buf[1],
7582 salt.salt_buf[2],
7583 salt.salt_buf[3],
7584 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7585 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7586 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7587 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7588 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7589 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7590 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7591 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7592 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7593 }
7594 else if (hash_mode == 9820)
7595 {
7596 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7597
7598 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7599
7600 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7601
7602 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7603 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7604 salt.salt_buf[0],
7605 salt.salt_buf[1],
7606 salt.salt_buf[2],
7607 salt.salt_buf[3],
7608 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7609 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7610 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7611 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7612 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7613 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7614 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7615 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7616 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7617 rc4key[0],
7618 rc4key[1],
7619 rc4key[2],
7620 rc4key[3],
7621 rc4key[4]);
7622 }
7623 else if (hash_mode == 10000)
7624 {
7625 // salt
7626
7627 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7628
7629 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7630
7631 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7632
7633 // hash
7634
7635 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7636 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7637 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7638 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7639 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7640 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7641 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7642 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7643 digest_buf[8] = 0; // needed for base64_encode ()
7644
7645 char tmp_buf[64] = { 0 };
7646
7647 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7648
7649 // output
7650
7651 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7652 }
7653 else if (hash_mode == 10100)
7654 {
7655 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7656 digest_buf[0],
7657 digest_buf[1],
7658 2,
7659 4,
7660 byte_swap_32 (salt.salt_buf[0]),
7661 byte_swap_32 (salt.salt_buf[1]),
7662 byte_swap_32 (salt.salt_buf[2]),
7663 byte_swap_32 (salt.salt_buf[3]));
7664 }
7665 else if (hash_mode == 10200)
7666 {
7667 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7668
7669 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7670
7671 // challenge
7672
7673 char challenge[100] = { 0 };
7674
7675 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7676
7677 // response
7678
7679 char tmp_buf[100] = { 0 };
7680
7681 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7682 (char *) cram_md5->user,
7683 digest_buf[0],
7684 digest_buf[1],
7685 digest_buf[2],
7686 digest_buf[3]);
7687
7688 char response[100] = { 0 };
7689
7690 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7691
7692 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7693 }
7694 else if (hash_mode == 10300)
7695 {
7696 char tmp_buf[100] = { 0 };
7697
7698 memcpy (tmp_buf + 0, digest_buf, 20);
7699 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7700
7701 uint tmp_len = 20 + salt.salt_len;
7702
7703 // base64 encode it
7704
7705 char base64_encoded[100] = { 0 };
7706
7707 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7708
7709 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7710 }
7711 else if (hash_mode == 10400)
7712 {
7713 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7714
7715 pdf_t *pdf = &pdfs[salt_pos];
7716
7717 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",
7718
7719 pdf->V,
7720 pdf->R,
7721 40,
7722 pdf->P,
7723 pdf->enc_md,
7724 pdf->id_len,
7725 byte_swap_32 (pdf->id_buf[0]),
7726 byte_swap_32 (pdf->id_buf[1]),
7727 byte_swap_32 (pdf->id_buf[2]),
7728 byte_swap_32 (pdf->id_buf[3]),
7729 pdf->u_len,
7730 byte_swap_32 (pdf->u_buf[0]),
7731 byte_swap_32 (pdf->u_buf[1]),
7732 byte_swap_32 (pdf->u_buf[2]),
7733 byte_swap_32 (pdf->u_buf[3]),
7734 byte_swap_32 (pdf->u_buf[4]),
7735 byte_swap_32 (pdf->u_buf[5]),
7736 byte_swap_32 (pdf->u_buf[6]),
7737 byte_swap_32 (pdf->u_buf[7]),
7738 pdf->o_len,
7739 byte_swap_32 (pdf->o_buf[0]),
7740 byte_swap_32 (pdf->o_buf[1]),
7741 byte_swap_32 (pdf->o_buf[2]),
7742 byte_swap_32 (pdf->o_buf[3]),
7743 byte_swap_32 (pdf->o_buf[4]),
7744 byte_swap_32 (pdf->o_buf[5]),
7745 byte_swap_32 (pdf->o_buf[6]),
7746 byte_swap_32 (pdf->o_buf[7])
7747 );
7748 }
7749 else if (hash_mode == 10410)
7750 {
7751 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7752
7753 pdf_t *pdf = &pdfs[salt_pos];
7754
7755 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",
7756
7757 pdf->V,
7758 pdf->R,
7759 40,
7760 pdf->P,
7761 pdf->enc_md,
7762 pdf->id_len,
7763 byte_swap_32 (pdf->id_buf[0]),
7764 byte_swap_32 (pdf->id_buf[1]),
7765 byte_swap_32 (pdf->id_buf[2]),
7766 byte_swap_32 (pdf->id_buf[3]),
7767 pdf->u_len,
7768 byte_swap_32 (pdf->u_buf[0]),
7769 byte_swap_32 (pdf->u_buf[1]),
7770 byte_swap_32 (pdf->u_buf[2]),
7771 byte_swap_32 (pdf->u_buf[3]),
7772 byte_swap_32 (pdf->u_buf[4]),
7773 byte_swap_32 (pdf->u_buf[5]),
7774 byte_swap_32 (pdf->u_buf[6]),
7775 byte_swap_32 (pdf->u_buf[7]),
7776 pdf->o_len,
7777 byte_swap_32 (pdf->o_buf[0]),
7778 byte_swap_32 (pdf->o_buf[1]),
7779 byte_swap_32 (pdf->o_buf[2]),
7780 byte_swap_32 (pdf->o_buf[3]),
7781 byte_swap_32 (pdf->o_buf[4]),
7782 byte_swap_32 (pdf->o_buf[5]),
7783 byte_swap_32 (pdf->o_buf[6]),
7784 byte_swap_32 (pdf->o_buf[7])
7785 );
7786 }
7787 else if (hash_mode == 10420)
7788 {
7789 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7790
7791 pdf_t *pdf = &pdfs[salt_pos];
7792
7793 u8 *rc4key = (u8 *) pdf->rc4key;
7794
7795 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",
7796
7797 pdf->V,
7798 pdf->R,
7799 40,
7800 pdf->P,
7801 pdf->enc_md,
7802 pdf->id_len,
7803 byte_swap_32 (pdf->id_buf[0]),
7804 byte_swap_32 (pdf->id_buf[1]),
7805 byte_swap_32 (pdf->id_buf[2]),
7806 byte_swap_32 (pdf->id_buf[3]),
7807 pdf->u_len,
7808 byte_swap_32 (pdf->u_buf[0]),
7809 byte_swap_32 (pdf->u_buf[1]),
7810 byte_swap_32 (pdf->u_buf[2]),
7811 byte_swap_32 (pdf->u_buf[3]),
7812 byte_swap_32 (pdf->u_buf[4]),
7813 byte_swap_32 (pdf->u_buf[5]),
7814 byte_swap_32 (pdf->u_buf[6]),
7815 byte_swap_32 (pdf->u_buf[7]),
7816 pdf->o_len,
7817 byte_swap_32 (pdf->o_buf[0]),
7818 byte_swap_32 (pdf->o_buf[1]),
7819 byte_swap_32 (pdf->o_buf[2]),
7820 byte_swap_32 (pdf->o_buf[3]),
7821 byte_swap_32 (pdf->o_buf[4]),
7822 byte_swap_32 (pdf->o_buf[5]),
7823 byte_swap_32 (pdf->o_buf[6]),
7824 byte_swap_32 (pdf->o_buf[7]),
7825 rc4key[0],
7826 rc4key[1],
7827 rc4key[2],
7828 rc4key[3],
7829 rc4key[4]
7830 );
7831 }
7832 else if (hash_mode == 10500)
7833 {
7834 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7835
7836 pdf_t *pdf = &pdfs[salt_pos];
7837
7838 if (pdf->id_len == 32)
7839 {
7840 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",
7841
7842 pdf->V,
7843 pdf->R,
7844 128,
7845 pdf->P,
7846 pdf->enc_md,
7847 pdf->id_len,
7848 byte_swap_32 (pdf->id_buf[0]),
7849 byte_swap_32 (pdf->id_buf[1]),
7850 byte_swap_32 (pdf->id_buf[2]),
7851 byte_swap_32 (pdf->id_buf[3]),
7852 byte_swap_32 (pdf->id_buf[4]),
7853 byte_swap_32 (pdf->id_buf[5]),
7854 byte_swap_32 (pdf->id_buf[6]),
7855 byte_swap_32 (pdf->id_buf[7]),
7856 pdf->u_len,
7857 byte_swap_32 (pdf->u_buf[0]),
7858 byte_swap_32 (pdf->u_buf[1]),
7859 byte_swap_32 (pdf->u_buf[2]),
7860 byte_swap_32 (pdf->u_buf[3]),
7861 byte_swap_32 (pdf->u_buf[4]),
7862 byte_swap_32 (pdf->u_buf[5]),
7863 byte_swap_32 (pdf->u_buf[6]),
7864 byte_swap_32 (pdf->u_buf[7]),
7865 pdf->o_len,
7866 byte_swap_32 (pdf->o_buf[0]),
7867 byte_swap_32 (pdf->o_buf[1]),
7868 byte_swap_32 (pdf->o_buf[2]),
7869 byte_swap_32 (pdf->o_buf[3]),
7870 byte_swap_32 (pdf->o_buf[4]),
7871 byte_swap_32 (pdf->o_buf[5]),
7872 byte_swap_32 (pdf->o_buf[6]),
7873 byte_swap_32 (pdf->o_buf[7])
7874 );
7875 }
7876 else
7877 {
7878 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",
7879
7880 pdf->V,
7881 pdf->R,
7882 128,
7883 pdf->P,
7884 pdf->enc_md,
7885 pdf->id_len,
7886 byte_swap_32 (pdf->id_buf[0]),
7887 byte_swap_32 (pdf->id_buf[1]),
7888 byte_swap_32 (pdf->id_buf[2]),
7889 byte_swap_32 (pdf->id_buf[3]),
7890 pdf->u_len,
7891 byte_swap_32 (pdf->u_buf[0]),
7892 byte_swap_32 (pdf->u_buf[1]),
7893 byte_swap_32 (pdf->u_buf[2]),
7894 byte_swap_32 (pdf->u_buf[3]),
7895 byte_swap_32 (pdf->u_buf[4]),
7896 byte_swap_32 (pdf->u_buf[5]),
7897 byte_swap_32 (pdf->u_buf[6]),
7898 byte_swap_32 (pdf->u_buf[7]),
7899 pdf->o_len,
7900 byte_swap_32 (pdf->o_buf[0]),
7901 byte_swap_32 (pdf->o_buf[1]),
7902 byte_swap_32 (pdf->o_buf[2]),
7903 byte_swap_32 (pdf->o_buf[3]),
7904 byte_swap_32 (pdf->o_buf[4]),
7905 byte_swap_32 (pdf->o_buf[5]),
7906 byte_swap_32 (pdf->o_buf[6]),
7907 byte_swap_32 (pdf->o_buf[7])
7908 );
7909 }
7910 }
7911 else if (hash_mode == 10600)
7912 {
7913 uint digest_idx = salt.digests_offset + digest_pos;
7914
7915 hashinfo_t **hashinfo_ptr = data.hash_info;
7916 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7917
7918 snprintf (out_buf, len-1, "%s", hash_buf);
7919 }
7920 else if (hash_mode == 10700)
7921 {
7922 uint digest_idx = salt.digests_offset + digest_pos;
7923
7924 hashinfo_t **hashinfo_ptr = data.hash_info;
7925 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7926
7927 snprintf (out_buf, len-1, "%s", hash_buf);
7928 }
7929 else if (hash_mode == 10900)
7930 {
7931 uint digest_idx = salt.digests_offset + digest_pos;
7932
7933 hashinfo_t **hashinfo_ptr = data.hash_info;
7934 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7935
7936 snprintf (out_buf, len-1, "%s", hash_buf);
7937 }
7938 else if (hash_mode == 11100)
7939 {
7940 u32 salt_challenge = salt.salt_buf[0];
7941
7942 salt_challenge = byte_swap_32 (salt_challenge);
7943
7944 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7945
7946 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7947 SIGNATURE_POSTGRESQL_AUTH,
7948 user_name,
7949 salt_challenge,
7950 digest_buf[0],
7951 digest_buf[1],
7952 digest_buf[2],
7953 digest_buf[3]);
7954 }
7955 else if (hash_mode == 11200)
7956 {
7957 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7958 SIGNATURE_MYSQL_AUTH,
7959 (unsigned char *) salt.salt_buf,
7960 digest_buf[0],
7961 digest_buf[1],
7962 digest_buf[2],
7963 digest_buf[3],
7964 digest_buf[4]);
7965 }
7966 else if (hash_mode == 11300)
7967 {
7968 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7969
7970 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7971
7972 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7973 const uint ckey_len = bitcoin_wallet->ckey_len;
7974 const uint public_key_len = bitcoin_wallet->public_key_len;
7975
7976 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7977 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7978 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7979
7980 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7981 {
7982 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7983
7984 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7985 }
7986
7987 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7988 {
7989 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7990
7991 sprintf (ckey_buf + j, "%02x", ptr[i]);
7992 }
7993
7994 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7995 {
7996 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
7997
7998 sprintf (public_key_buf + j, "%02x", ptr[i]);
7999 }
8000
8001 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
8002 SIGNATURE_BITCOIN_WALLET,
8003 cry_master_len * 2,
8004 cry_master_buf,
8005 salt.salt_len,
8006 (unsigned char *) salt.salt_buf,
8007 salt.salt_iter + 1,
8008 ckey_len * 2,
8009 ckey_buf,
8010 public_key_len * 2,
8011 public_key_buf
8012 );
8013
8014 free (cry_master_buf);
8015 free (ckey_buf);
8016 free (public_key_buf);
8017 }
8018 else if (hash_mode == 11400)
8019 {
8020 uint digest_idx = salt.digests_offset + digest_pos;
8021
8022 hashinfo_t **hashinfo_ptr = data.hash_info;
8023 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8024
8025 snprintf (out_buf, len-1, "%s", hash_buf);
8026 }
8027 else if (hash_mode == 11600)
8028 {
8029 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8030
8031 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8032
8033 const uint data_len = seven_zip->data_len;
8034
8035 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8036
8037 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8038 {
8039 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8040
8041 sprintf (data_buf + j, "%02x", ptr[i]);
8042 }
8043
8044 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8045 SIGNATURE_SEVEN_ZIP,
8046 0,
8047 salt.salt_sign[0],
8048 0,
8049 (char *) seven_zip->salt_buf,
8050 seven_zip->iv_len,
8051 seven_zip->iv_buf[0],
8052 seven_zip->iv_buf[1],
8053 seven_zip->iv_buf[2],
8054 seven_zip->iv_buf[3],
8055 seven_zip->crc,
8056 seven_zip->data_len,
8057 seven_zip->unpack_size,
8058 data_buf);
8059
8060 free (data_buf);
8061 }
8062 else if (hash_mode == 11700)
8063 {
8064 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8065 digest_buf[0],
8066 digest_buf[1],
8067 digest_buf[2],
8068 digest_buf[3],
8069 digest_buf[4],
8070 digest_buf[5],
8071 digest_buf[6],
8072 digest_buf[7]);
8073 }
8074 else if (hash_mode == 11800)
8075 {
8076 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8077 digest_buf[ 0],
8078 digest_buf[ 1],
8079 digest_buf[ 2],
8080 digest_buf[ 3],
8081 digest_buf[ 4],
8082 digest_buf[ 5],
8083 digest_buf[ 6],
8084 digest_buf[ 7],
8085 digest_buf[ 8],
8086 digest_buf[ 9],
8087 digest_buf[10],
8088 digest_buf[11],
8089 digest_buf[12],
8090 digest_buf[13],
8091 digest_buf[14],
8092 digest_buf[15]);
8093 }
8094 else if (hash_mode == 11900)
8095 {
8096 uint digest_idx = salt.digests_offset + digest_pos;
8097
8098 hashinfo_t **hashinfo_ptr = data.hash_info;
8099 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8100
8101 snprintf (out_buf, len-1, "%s", hash_buf);
8102 }
8103 else if (hash_mode == 12000)
8104 {
8105 uint digest_idx = salt.digests_offset + digest_pos;
8106
8107 hashinfo_t **hashinfo_ptr = data.hash_info;
8108 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8109
8110 snprintf (out_buf, len-1, "%s", hash_buf);
8111 }
8112 else if (hash_mode == 12100)
8113 {
8114 uint digest_idx = salt.digests_offset + digest_pos;
8115
8116 hashinfo_t **hashinfo_ptr = data.hash_info;
8117 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8118
8119 snprintf (out_buf, len-1, "%s", hash_buf);
8120 }
8121 else if (hash_mode == 12200)
8122 {
8123 uint *ptr_digest = digest_buf;
8124 uint *ptr_salt = salt.salt_buf;
8125
8126 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8127 SIGNATURE_ECRYPTFS,
8128 ptr_salt[0],
8129 ptr_salt[1],
8130 ptr_digest[0],
8131 ptr_digest[1]);
8132 }
8133 else if (hash_mode == 12300)
8134 {
8135 uint *ptr_digest = digest_buf;
8136 uint *ptr_salt = salt.salt_buf;
8137
8138 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",
8139 ptr_digest[ 0], ptr_digest[ 1],
8140 ptr_digest[ 2], ptr_digest[ 3],
8141 ptr_digest[ 4], ptr_digest[ 5],
8142 ptr_digest[ 6], ptr_digest[ 7],
8143 ptr_digest[ 8], ptr_digest[ 9],
8144 ptr_digest[10], ptr_digest[11],
8145 ptr_digest[12], ptr_digest[13],
8146 ptr_digest[14], ptr_digest[15],
8147 ptr_salt[0],
8148 ptr_salt[1],
8149 ptr_salt[2],
8150 ptr_salt[3]);
8151 }
8152 else if (hash_mode == 12400)
8153 {
8154 // encode iteration count
8155
8156 char salt_iter[5] = { 0 };
8157
8158 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8159 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8160 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8161 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8162 salt_iter[4] = 0;
8163
8164 // encode salt
8165
8166 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8167 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8168 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8169 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8170 ptr_salt[4] = 0;
8171
8172 // encode digest
8173
8174 memset (tmp_buf, 0, sizeof (tmp_buf));
8175
8176 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8177 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8178
8179 memcpy (tmp_buf, digest_buf, 8);
8180
8181 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8182
8183 ptr_plain[11] = 0;
8184
8185 // fill the resulting buffer
8186
8187 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8188 }
8189 else if (hash_mode == 12500)
8190 {
8191 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8192 SIGNATURE_RAR3,
8193 byte_swap_32 (salt.salt_buf[0]),
8194 byte_swap_32 (salt.salt_buf[1]),
8195 salt.salt_buf[2],
8196 salt.salt_buf[3],
8197 salt.salt_buf[4],
8198 salt.salt_buf[5]);
8199 }
8200 else if (hash_mode == 12600)
8201 {
8202 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8203 digest_buf[0] + salt.salt_buf_pc[0],
8204 digest_buf[1] + salt.salt_buf_pc[1],
8205 digest_buf[2] + salt.salt_buf_pc[2],
8206 digest_buf[3] + salt.salt_buf_pc[3],
8207 digest_buf[4] + salt.salt_buf_pc[4],
8208 digest_buf[5] + salt.salt_buf_pc[5],
8209 digest_buf[6] + salt.salt_buf_pc[6],
8210 digest_buf[7] + salt.salt_buf_pc[7]);
8211 }
8212 else if (hash_mode == 12700)
8213 {
8214 uint digest_idx = salt.digests_offset + digest_pos;
8215
8216 hashinfo_t **hashinfo_ptr = data.hash_info;
8217 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8218
8219 snprintf (out_buf, len-1, "%s", hash_buf);
8220 }
8221 else if (hash_mode == 12800)
8222 {
8223 const u8 *ptr = (const u8 *) salt.salt_buf;
8224
8225 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",
8226 SIGNATURE_MS_DRSR,
8227 ptr[0],
8228 ptr[1],
8229 ptr[2],
8230 ptr[3],
8231 ptr[4],
8232 ptr[5],
8233 ptr[6],
8234 ptr[7],
8235 ptr[8],
8236 ptr[9],
8237 salt.salt_iter + 1,
8238 byte_swap_32 (digest_buf[0]),
8239 byte_swap_32 (digest_buf[1]),
8240 byte_swap_32 (digest_buf[2]),
8241 byte_swap_32 (digest_buf[3]),
8242 byte_swap_32 (digest_buf[4]),
8243 byte_swap_32 (digest_buf[5]),
8244 byte_swap_32 (digest_buf[6]),
8245 byte_swap_32 (digest_buf[7])
8246 );
8247 }
8248 else if (hash_mode == 12900)
8249 {
8250 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",
8251 salt.salt_buf[ 4],
8252 salt.salt_buf[ 5],
8253 salt.salt_buf[ 6],
8254 salt.salt_buf[ 7],
8255 salt.salt_buf[ 8],
8256 salt.salt_buf[ 9],
8257 salt.salt_buf[10],
8258 salt.salt_buf[11],
8259 byte_swap_32 (digest_buf[0]),
8260 byte_swap_32 (digest_buf[1]),
8261 byte_swap_32 (digest_buf[2]),
8262 byte_swap_32 (digest_buf[3]),
8263 byte_swap_32 (digest_buf[4]),
8264 byte_swap_32 (digest_buf[5]),
8265 byte_swap_32 (digest_buf[6]),
8266 byte_swap_32 (digest_buf[7]),
8267 salt.salt_buf[ 0],
8268 salt.salt_buf[ 1],
8269 salt.salt_buf[ 2],
8270 salt.salt_buf[ 3]
8271 );
8272 }
8273 else if (hash_mode == 13000)
8274 {
8275 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8276
8277 rar5_t *rar5 = &rar5s[salt_pos];
8278
8279 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8280 salt.salt_buf[0],
8281 salt.salt_buf[1],
8282 salt.salt_buf[2],
8283 salt.salt_buf[3],
8284 salt.salt_sign[0],
8285 rar5->iv[0],
8286 rar5->iv[1],
8287 rar5->iv[2],
8288 rar5->iv[3],
8289 byte_swap_32 (digest_buf[0]),
8290 byte_swap_32 (digest_buf[1])
8291 );
8292 }
8293 else if (hash_mode == 13100)
8294 {
8295 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8296
8297 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8298
8299 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8300 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8301
8302 char data[2560 * 4 * 2] = { 0 };
8303
8304 char *ptr_data = data;
8305
8306 for (uint i = 0; i < 16; i++, ptr_data += 2)
8307 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8308
8309 /* skip '$' */
8310 ptr_data++;
8311
8312 for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
8313 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8314
8315 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8316 SIGNATURE_KRB5TGS,
8317 (char *) krb5tgs->account_info,
8318 data,
8319 data + 33);
8320 }
8321 else if (hash_mode == 13200)
8322 {
8323 snprintf (out_buf, len-1, "%s*%d*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x",
8324 SIGNATURE_AXCRYPT,
8325 salt.salt_iter,
8326 salt.salt_buf[0],
8327 salt.salt_buf[1],
8328 salt.salt_buf[2],
8329 salt.salt_buf[3],
8330 salt.salt_buf[4],
8331 salt.salt_buf[5],
8332 salt.salt_buf[6],
8333 salt.salt_buf[7],
8334 salt.salt_buf[8],
8335 salt.salt_buf[9]);
8336 }
8337 else if (hash_mode == 13300)
8338 {
8339 snprintf (out_buf, len-1, "%s$%08x%08x%08x%08x",
8340 SIGNATURE_AXCRYPT_SHA1,
8341 digest_buf[0],
8342 digest_buf[1],
8343 digest_buf[2],
8344 digest_buf[3]);
8345 }
8346 else if (hash_mode == 13400)
8347 {
8348 keepass_t *keepasss = (keepass_t *) data.esalts_buf;
8349
8350 keepass_t *keepass = &keepasss[salt_pos];
8351
8352 u32 version = (u32) keepass->version;
8353 u32 rounds = salt.salt_iter;
8354 u32 algorithm = (u32) keepass->algorithm;
8355 u32 keyfile_len = (u32) keepass->keyfile_len;
8356
8357 u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed ;
8358 u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed ;
8359 u32 *ptr_enc_iv = (u32 *) keepass->enc_iv ;
8360 u32 *ptr_contents_hash = (u32 *) keepass->contents_hash ;
8361 u32 *ptr_keyfile = (u32 *) keepass->keyfile ;
8362
8363 /* specific to version 1 */
8364 u32 contents_len;
8365 u32 *ptr_contents;
8366
8367 /* specific to version 2 */
8368 u32 expected_bytes_len;
8369 u32 *ptr_expected_bytes;
8370
8371 u32 final_random_seed_len;
8372 u32 transf_random_seed_len;
8373 u32 enc_iv_len;
8374 u32 contents_hash_len;
8375
8376 transf_random_seed_len = 8;
8377 enc_iv_len = 4;
8378 contents_hash_len = 8;
8379 final_random_seed_len = 8;
8380
8381 if (version == 1)
8382 final_random_seed_len = 4;
8383
8384 snprintf (out_buf, len-1, "%s*%d*%d*%d",
8385 SIGNATURE_KEEPASS,
8386 version,
8387 rounds,
8388 algorithm);
8389
8390 char *ptr_data = out_buf;
8391
8392 ptr_data += strlen(out_buf);
8393
8394 *ptr_data = '*';
8395 ptr_data++;
8396
8397 for (uint i = 0; i < final_random_seed_len; i++, ptr_data += 8)
8398 sprintf (ptr_data, "%08x", ptr_final_random_seed[i]);
8399
8400 *ptr_data = '*';
8401 ptr_data++;
8402
8403 for (uint i = 0; i < transf_random_seed_len; i++, ptr_data += 8)
8404 sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]);
8405
8406 *ptr_data = '*';
8407 ptr_data++;
8408
8409 for (uint i = 0; i < enc_iv_len; i++, ptr_data += 8)
8410 sprintf (ptr_data, "%08x", ptr_enc_iv[i]);
8411
8412 *ptr_data = '*';
8413 ptr_data++;
8414
8415 if (version == 1)
8416 {
8417 contents_len = (u32) keepass->contents_len;
8418 ptr_contents = (u32 *) keepass->contents;
8419
8420 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8421 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8422
8423 *ptr_data = '*';
8424 ptr_data++;
8425
8426 /* inline flag */
8427 *ptr_data = '1';
8428 ptr_data++;
8429
8430 *ptr_data = '*';
8431 ptr_data++;
8432
8433 char ptr_contents_len[10] = { 0 };
8434
8435 sprintf ((char*) ptr_contents_len, "%d", contents_len);
8436
8437 sprintf (ptr_data, "%d", contents_len);
8438
8439 ptr_data += strlen(ptr_contents_len);
8440
8441 *ptr_data = '*';
8442 ptr_data++;
8443
8444 for (uint i = 0; i < contents_len / 4; i++, ptr_data += 8)
8445 sprintf (ptr_data, "%08x", ptr_contents[i]);
8446 }
8447 else if (version == 2)
8448 {
8449 expected_bytes_len = 8;
8450 ptr_expected_bytes = (u32 *) keepass->expected_bytes ;
8451
8452 for (uint i = 0; i < expected_bytes_len; i++, ptr_data += 8)
8453 sprintf (ptr_data, "%08x", ptr_expected_bytes[i]);
8454
8455 *ptr_data = '*';
8456 ptr_data++;
8457
8458 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8459 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8460 }
8461 if (keyfile_len)
8462 {
8463 *ptr_data = '*';
8464 ptr_data++;
8465
8466 /* inline flag */
8467 *ptr_data = '1';
8468 ptr_data++;
8469
8470 *ptr_data = '*';
8471 ptr_data++;
8472
8473 sprintf (ptr_data, "%d", keyfile_len);
8474
8475 ptr_data += 2;
8476
8477 *ptr_data = '*';
8478 ptr_data++;
8479
8480 for (uint i = 0; i < 8; i++, ptr_data += 8)
8481 sprintf (ptr_data, "%08x", ptr_keyfile[i]);
8482 }
8483 }
8484 else if (hash_mode == 13500)
8485 {
8486 pstoken_t *pstokens = (pstoken_t *) data.esalts_buf;
8487
8488 pstoken_t *pstoken = &pstokens[salt_pos];
8489
8490 const u32 salt_len = (pstoken->salt_len > 512) ? 512 : pstoken->salt_len;
8491
8492 char pstoken_tmp[1024 + 1] = { 0 };
8493
8494 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8495 {
8496 const u8 *ptr = (const u8 *) pstoken->salt_buf;
8497
8498 sprintf (pstoken_tmp + j, "%02x", ptr[i]);
8499 }
8500
8501 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x:%s",
8502 digest_buf[0],
8503 digest_buf[1],
8504 digest_buf[2],
8505 digest_buf[3],
8506 digest_buf[4],
8507 pstoken_tmp);
8508 }
8509 else
8510 {
8511 if (hash_type == HASH_TYPE_MD4)
8512 {
8513 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8514 digest_buf[0],
8515 digest_buf[1],
8516 digest_buf[2],
8517 digest_buf[3]);
8518 }
8519 else if (hash_type == HASH_TYPE_MD5)
8520 {
8521 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8522 digest_buf[0],
8523 digest_buf[1],
8524 digest_buf[2],
8525 digest_buf[3]);
8526 }
8527 else if (hash_type == HASH_TYPE_SHA1)
8528 {
8529 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8530 digest_buf[0],
8531 digest_buf[1],
8532 digest_buf[2],
8533 digest_buf[3],
8534 digest_buf[4]);
8535 }
8536 else if (hash_type == HASH_TYPE_SHA256)
8537 {
8538 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8539 digest_buf[0],
8540 digest_buf[1],
8541 digest_buf[2],
8542 digest_buf[3],
8543 digest_buf[4],
8544 digest_buf[5],
8545 digest_buf[6],
8546 digest_buf[7]);
8547 }
8548 else if (hash_type == HASH_TYPE_SHA384)
8549 {
8550 uint *ptr = digest_buf;
8551
8552 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8553 ptr[ 1], ptr[ 0],
8554 ptr[ 3], ptr[ 2],
8555 ptr[ 5], ptr[ 4],
8556 ptr[ 7], ptr[ 6],
8557 ptr[ 9], ptr[ 8],
8558 ptr[11], ptr[10]);
8559 }
8560 else if (hash_type == HASH_TYPE_SHA512)
8561 {
8562 uint *ptr = digest_buf;
8563
8564 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8565 ptr[ 1], ptr[ 0],
8566 ptr[ 3], ptr[ 2],
8567 ptr[ 5], ptr[ 4],
8568 ptr[ 7], ptr[ 6],
8569 ptr[ 9], ptr[ 8],
8570 ptr[11], ptr[10],
8571 ptr[13], ptr[12],
8572 ptr[15], ptr[14]);
8573 }
8574 else if (hash_type == HASH_TYPE_LM)
8575 {
8576 snprintf (out_buf, len-1, "%08x%08x",
8577 digest_buf[0],
8578 digest_buf[1]);
8579 }
8580 else if (hash_type == HASH_TYPE_ORACLEH)
8581 {
8582 snprintf (out_buf, len-1, "%08X%08X",
8583 digest_buf[0],
8584 digest_buf[1]);
8585 }
8586 else if (hash_type == HASH_TYPE_BCRYPT)
8587 {
8588 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8589 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8590
8591 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8592
8593 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8594 }
8595 else if (hash_type == HASH_TYPE_KECCAK)
8596 {
8597 uint *ptr = digest_buf;
8598
8599 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",
8600 ptr[ 1], ptr[ 0],
8601 ptr[ 3], ptr[ 2],
8602 ptr[ 5], ptr[ 4],
8603 ptr[ 7], ptr[ 6],
8604 ptr[ 9], ptr[ 8],
8605 ptr[11], ptr[10],
8606 ptr[13], ptr[12],
8607 ptr[15], ptr[14],
8608 ptr[17], ptr[16],
8609 ptr[19], ptr[18],
8610 ptr[21], ptr[20],
8611 ptr[23], ptr[22],
8612 ptr[25], ptr[24],
8613 ptr[27], ptr[26],
8614 ptr[29], ptr[28],
8615 ptr[31], ptr[30],
8616 ptr[33], ptr[32],
8617 ptr[35], ptr[34],
8618 ptr[37], ptr[36],
8619 ptr[39], ptr[38],
8620 ptr[41], ptr[30],
8621 ptr[43], ptr[42],
8622 ptr[45], ptr[44],
8623 ptr[47], ptr[46],
8624 ptr[49], ptr[48]
8625 );
8626
8627 out_buf[salt.keccak_mdlen * 2] = 0;
8628 }
8629 else if (hash_type == HASH_TYPE_RIPEMD160)
8630 {
8631 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8632 digest_buf[0],
8633 digest_buf[1],
8634 digest_buf[2],
8635 digest_buf[3],
8636 digest_buf[4]);
8637 }
8638 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8639 {
8640 digest_buf[ 0] = digest_buf[ 0];
8641 digest_buf[ 1] = digest_buf[ 1];
8642 digest_buf[ 2] = digest_buf[ 2];
8643 digest_buf[ 3] = digest_buf[ 3];
8644 digest_buf[ 4] = digest_buf[ 4];
8645 digest_buf[ 5] = digest_buf[ 5];
8646 digest_buf[ 6] = digest_buf[ 6];
8647 digest_buf[ 7] = digest_buf[ 7];
8648 digest_buf[ 8] = digest_buf[ 8];
8649 digest_buf[ 9] = digest_buf[ 9];
8650 digest_buf[10] = digest_buf[10];
8651 digest_buf[11] = digest_buf[11];
8652 digest_buf[12] = digest_buf[12];
8653 digest_buf[13] = digest_buf[13];
8654 digest_buf[14] = digest_buf[14];
8655 digest_buf[15] = digest_buf[15];
8656
8657 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8658 digest_buf[ 0],
8659 digest_buf[ 1],
8660 digest_buf[ 2],
8661 digest_buf[ 3],
8662 digest_buf[ 4],
8663 digest_buf[ 5],
8664 digest_buf[ 6],
8665 digest_buf[ 7],
8666 digest_buf[ 8],
8667 digest_buf[ 9],
8668 digest_buf[10],
8669 digest_buf[11],
8670 digest_buf[12],
8671 digest_buf[13],
8672 digest_buf[14],
8673 digest_buf[15]);
8674 }
8675 else if (hash_type == HASH_TYPE_GOST)
8676 {
8677 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8678 digest_buf[0],
8679 digest_buf[1],
8680 digest_buf[2],
8681 digest_buf[3],
8682 digest_buf[4],
8683 digest_buf[5],
8684 digest_buf[6],
8685 digest_buf[7]);
8686 }
8687 else if (hash_type == HASH_TYPE_MYSQL)
8688 {
8689 snprintf (out_buf, len-1, "%08x%08x",
8690 digest_buf[0],
8691 digest_buf[1]);
8692 }
8693 else if (hash_type == HASH_TYPE_LOTUS5)
8694 {
8695 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8696 digest_buf[0],
8697 digest_buf[1],
8698 digest_buf[2],
8699 digest_buf[3]);
8700 }
8701 else if (hash_type == HASH_TYPE_LOTUS6)
8702 {
8703 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8704 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8705 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8706 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8707
8708 char buf[16] = { 0 };
8709
8710 memcpy (buf + 0, salt.salt_buf, 5);
8711 memcpy (buf + 5, digest_buf, 9);
8712
8713 buf[3] -= -4;
8714
8715 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8716
8717 tmp_buf[18] = salt.salt_buf_pc[7];
8718 tmp_buf[19] = 0;
8719
8720 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8721 }
8722 else if (hash_type == HASH_TYPE_LOTUS8)
8723 {
8724 char buf[52] = { 0 };
8725
8726 // salt
8727
8728 memcpy (buf + 0, salt.salt_buf, 16);
8729
8730 buf[3] -= -4;
8731
8732 // iteration
8733
8734 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8735
8736 // chars
8737
8738 buf[26] = salt.salt_buf_pc[0];
8739 buf[27] = salt.salt_buf_pc[1];
8740
8741 // digest
8742
8743 memcpy (buf + 28, digest_buf, 8);
8744
8745 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8746
8747 tmp_buf[49] = 0;
8748
8749 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8750 }
8751 else if (hash_type == HASH_TYPE_CRC32)
8752 {
8753 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8754 }
8755 }
8756
8757 if (salt_type == SALT_TYPE_INTERN)
8758 {
8759 size_t pos = strlen (out_buf);
8760
8761 out_buf[pos] = data.separator;
8762
8763 char *ptr = (char *) salt.salt_buf;
8764
8765 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8766
8767 out_buf[pos + 1 + salt.salt_len] = 0;
8768 }
8769 }
8770
8771 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8772 {
8773 memset (hccap, 0, sizeof (hccap_t));
8774
8775 salt_t *salt = &data.salts_buf[salt_pos];
8776
8777 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8778
8779 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8780 wpa_t *wpa = &wpas[salt_pos];
8781
8782 hccap->keyver = wpa->keyver;
8783
8784 hccap->eapol_size = wpa->eapol_size;
8785
8786 if (wpa->keyver != 1)
8787 {
8788 uint eapol_tmp[64] = { 0 };
8789
8790 for (uint i = 0; i < 64; i++)
8791 {
8792 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8793 }
8794
8795 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8796 }
8797 else
8798 {
8799 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8800 }
8801
8802 memcpy (hccap->mac1, wpa->orig_mac1, 6);
8803 memcpy (hccap->mac2, wpa->orig_mac2, 6);
8804 memcpy (hccap->nonce1, wpa->orig_nonce1, 32);
8805 memcpy (hccap->nonce2, wpa->orig_nonce2, 32);
8806
8807 char *digests_buf_ptr = (char *) data.digests_buf;
8808
8809 uint dgst_size = data.dgst_size;
8810
8811 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8812
8813 if (wpa->keyver != 1)
8814 {
8815 uint digest_tmp[4] = { 0 };
8816
8817 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8818 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8819 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8820 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8821
8822 memcpy (hccap->keymic, digest_tmp, 16);
8823 }
8824 else
8825 {
8826 memcpy (hccap->keymic, digest_ptr, 16);
8827 }
8828 }
8829
8830 void SuspendThreads ()
8831 {
8832 if (data.devices_status == STATUS_RUNNING)
8833 {
8834 hc_timer_set (&data.timer_paused);
8835
8836 data.devices_status = STATUS_PAUSED;
8837
8838 log_info ("Paused");
8839 }
8840 }
8841
8842 void ResumeThreads ()
8843 {
8844 if (data.devices_status == STATUS_PAUSED)
8845 {
8846 double ms_paused;
8847
8848 hc_timer_get (data.timer_paused, ms_paused);
8849
8850 data.ms_paused += ms_paused;
8851
8852 data.devices_status = STATUS_RUNNING;
8853
8854 log_info ("Resumed");
8855 }
8856 }
8857
8858 void bypass ()
8859 {
8860 if (data.devices_status != STATUS_RUNNING) return;
8861
8862 data.devices_status = STATUS_BYPASS;
8863
8864 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8865 }
8866
8867 void stop_at_checkpoint ()
8868 {
8869 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8870 {
8871 if (data.devices_status != STATUS_RUNNING) return;
8872 }
8873
8874 // this feature only makes sense if --restore-disable was not specified
8875
8876 if (data.restore_disable == 1)
8877 {
8878 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8879
8880 return;
8881 }
8882
8883 // check if monitoring of Restore Point updates should be enabled or disabled
8884
8885 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8886 {
8887 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8888
8889 // save the current restore point value
8890
8891 data.checkpoint_cur_words = get_lowest_words_done ();
8892
8893 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8894 }
8895 else
8896 {
8897 data.devices_status = STATUS_RUNNING;
8898
8899 // reset the global value for checkpoint checks
8900
8901 data.checkpoint_cur_words = 0;
8902
8903 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8904 }
8905 }
8906
8907 void myabort ()
8908 {
8909 if (data.devices_status == STATUS_INIT) return;
8910 if (data.devices_status == STATUS_STARTING) return;
8911
8912 data.devices_status = STATUS_ABORTED;
8913 }
8914
8915 void myquit ()
8916 {
8917 if (data.devices_status == STATUS_INIT) return;
8918 if (data.devices_status == STATUS_STARTING) return;
8919
8920 data.devices_status = STATUS_QUIT;
8921 }
8922
8923 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8924 {
8925 FILE *fp = fopen (kernel_file, "rb");
8926
8927 if (fp != NULL)
8928 {
8929 struct stat st;
8930
8931 memset (&st, 0, sizeof (st));
8932
8933 stat (kernel_file, &st);
8934
8935 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8936
8937 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8938
8939 if (num_read != (size_t) st.st_size)
8940 {
8941 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8942
8943 exit (-1);
8944 }
8945
8946 fclose (fp);
8947
8948 buf[st.st_size] = 0;
8949
8950 for (int i = 0; i < num_devices; i++)
8951 {
8952 kernel_lengths[i] = (size_t) st.st_size;
8953
8954 kernel_sources[i] = buf;
8955 }
8956 }
8957 else
8958 {
8959 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8960
8961 exit (-1);
8962 }
8963
8964 return;
8965 }
8966
8967 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8968 {
8969 if (binary_size > 0)
8970 {
8971 FILE *fp = fopen (dst, "wb");
8972
8973 lock_file (fp);
8974 fwrite (binary, sizeof (u8), binary_size, fp);
8975
8976 fflush (fp);
8977 fclose (fp);
8978 }
8979 }
8980
8981 /**
8982 * restore
8983 */
8984
8985 restore_data_t *init_restore (int argc, char **argv)
8986 {
8987 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8988
8989 if (data.restore_disable == 0)
8990 {
8991 FILE *fp = fopen (data.eff_restore_file, "rb");
8992
8993 if (fp)
8994 {
8995 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8996
8997 if (nread != 1)
8998 {
8999 log_error ("ERROR: cannot read %s", data.eff_restore_file);
9000
9001 exit (-1);
9002 }
9003
9004 fclose (fp);
9005
9006 if (rd->pid)
9007 {
9008 char *pidbin = (char *) mymalloc (HCBUFSIZ);
9009
9010 int pidbin_len = -1;
9011
9012 #ifdef _POSIX
9013 snprintf (pidbin, HCBUFSIZ - 1, "/proc/%d/cmdline", rd->pid);
9014
9015 FILE *fd = fopen (pidbin, "rb");
9016
9017 if (fd)
9018 {
9019 pidbin_len = fread (pidbin, 1, HCBUFSIZ, fd);
9020
9021 pidbin[pidbin_len] = 0;
9022
9023 fclose (fd);
9024
9025 char *argv0_r = strrchr (argv[0], '/');
9026
9027 char *pidbin_r = strrchr (pidbin, '/');
9028
9029 if (argv0_r == NULL) argv0_r = argv[0];
9030
9031 if (pidbin_r == NULL) pidbin_r = pidbin;
9032
9033 if (strcmp (argv0_r, pidbin_r) == 0)
9034 {
9035 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
9036
9037 exit (-1);
9038 }
9039 }
9040
9041 #elif _WIN
9042 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
9043
9044 char *pidbin2 = (char *) mymalloc (HCBUFSIZ);
9045
9046 int pidbin2_len = -1;
9047
9048 pidbin_len = GetModuleFileName (NULL, pidbin, HCBUFSIZ);
9049 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, HCBUFSIZ);
9050
9051 pidbin[pidbin_len] = 0;
9052 pidbin2[pidbin2_len] = 0;
9053
9054 if (pidbin2_len)
9055 {
9056 if (strcmp (pidbin, pidbin2) == 0)
9057 {
9058 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
9059
9060 exit (-1);
9061 }
9062 }
9063
9064 myfree (pidbin2);
9065
9066 #endif
9067
9068 myfree (pidbin);
9069 }
9070
9071 if (rd->version_bin < RESTORE_MIN)
9072 {
9073 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
9074
9075 exit (-1);
9076 }
9077 }
9078 }
9079
9080 memset (rd, 0, sizeof (restore_data_t));
9081
9082 rd->version_bin = VERSION_BIN;
9083
9084 #ifdef _POSIX
9085 rd->pid = getpid ();
9086 #elif _WIN
9087 rd->pid = GetCurrentProcessId ();
9088 #endif
9089
9090 if (getcwd (rd->cwd, 255) == NULL)
9091 {
9092 myfree (rd);
9093
9094 return (NULL);
9095 }
9096
9097 rd->argc = argc;
9098 rd->argv = argv;
9099
9100 return (rd);
9101 }
9102
9103 void read_restore (const char *eff_restore_file, restore_data_t *rd)
9104 {
9105 FILE *fp = fopen (eff_restore_file, "rb");
9106
9107 if (fp == NULL)
9108 {
9109 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
9110
9111 exit (-1);
9112 }
9113
9114 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
9115 {
9116 log_error ("ERROR: cannot read %s", eff_restore_file);
9117
9118 exit (-1);
9119 }
9120
9121 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
9122
9123 char *buf = (char *) mymalloc (HCBUFSIZ);
9124
9125 for (uint i = 0; i < rd->argc; i++)
9126 {
9127 if (fgets (buf, HCBUFSIZ - 1, fp) == NULL)
9128 {
9129 log_error ("ERROR: cannot read %s", eff_restore_file);
9130
9131 exit (-1);
9132 }
9133
9134 size_t len = strlen (buf);
9135
9136 if (len) buf[len - 1] = 0;
9137
9138 rd->argv[i] = mystrdup (buf);
9139 }
9140
9141 myfree (buf);
9142
9143 fclose (fp);
9144
9145 log_info ("INFO: Changing current working directory to the path found within the .restore file: '%s'", rd->cwd);
9146
9147 if (chdir (rd->cwd))
9148 {
9149 log_error ("ERROR: The directory '%s' does not exist. It is needed to restore (--restore) the session.\n"
9150 " You could either create this directory (or link it) or update the .restore file using e.g. the analyze_hc_restore.pl tool:\n"
9151 " https://github.com/philsmd/analyze_hc_restore\n"
9152 " The directory must be relative to (or contain) all files/folders mentioned within the command line.", rd->cwd);
9153
9154 exit (-1);
9155 }
9156 }
9157
9158 u64 get_lowest_words_done ()
9159 {
9160 u64 words_cur = -1;
9161
9162 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
9163 {
9164 hc_device_param_t *device_param = &data.devices_param[device_id];
9165
9166 if (device_param->skipped) continue;
9167
9168 const u64 words_done = device_param->words_done;
9169
9170 if (words_done < words_cur) words_cur = words_done;
9171 }
9172
9173 // It's possible that a device's workload isn't finished right after a restore-case.
9174 // In that case, this function would return 0 and overwrite the real restore point
9175 // There's also data.words_cur which is set to rd->words_cur but it changes while
9176 // the attack is running therefore we should stick to rd->words_cur.
9177 // Note that -s influences rd->words_cur we should keep a close look on that.
9178
9179 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9180
9181 return words_cur;
9182 }
9183
9184 void write_restore (const char *new_restore_file, restore_data_t *rd)
9185 {
9186 u64 words_cur = get_lowest_words_done ();
9187
9188 rd->words_cur = words_cur;
9189
9190 FILE *fp = fopen (new_restore_file, "wb");
9191
9192 if (fp == NULL)
9193 {
9194 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9195
9196 exit (-1);
9197 }
9198
9199 if (setvbuf (fp, NULL, _IONBF, 0))
9200 {
9201 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9202
9203 exit (-1);
9204 }
9205
9206 fwrite (rd, sizeof (restore_data_t), 1, fp);
9207
9208 for (uint i = 0; i < rd->argc; i++)
9209 {
9210 fprintf (fp, "%s", rd->argv[i]);
9211 fputc ('\n', fp);
9212 }
9213
9214 fflush (fp);
9215
9216 fsync (fileno (fp));
9217
9218 fclose (fp);
9219 }
9220
9221 void cycle_restore ()
9222 {
9223 const char *eff_restore_file = data.eff_restore_file;
9224 const char *new_restore_file = data.new_restore_file;
9225
9226 restore_data_t *rd = data.rd;
9227
9228 write_restore (new_restore_file, rd);
9229
9230 struct stat st;
9231
9232 memset (&st, 0, sizeof(st));
9233
9234 if (stat (eff_restore_file, &st) == 0)
9235 {
9236 if (unlink (eff_restore_file))
9237 {
9238 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
9239 }
9240 }
9241
9242 if (rename (new_restore_file, eff_restore_file))
9243 {
9244 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9245 }
9246 }
9247
9248 void check_checkpoint ()
9249 {
9250 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9251
9252 u64 words_cur = get_lowest_words_done ();
9253
9254 if (words_cur != data.checkpoint_cur_words)
9255 {
9256 myabort ();
9257 }
9258 }
9259
9260 /**
9261 * tuning db
9262 */
9263
9264 void tuning_db_destroy (tuning_db_t *tuning_db)
9265 {
9266 int i;
9267
9268 for (i = 0; i < tuning_db->alias_cnt; i++)
9269 {
9270 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9271
9272 myfree (alias->device_name);
9273 myfree (alias->alias_name);
9274 }
9275
9276 for (i = 0; i < tuning_db->entry_cnt; i++)
9277 {
9278 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9279
9280 myfree (entry->device_name);
9281 }
9282
9283 myfree (tuning_db->alias_buf);
9284 myfree (tuning_db->entry_buf);
9285
9286 myfree (tuning_db);
9287 }
9288
9289 tuning_db_t *tuning_db_alloc (FILE *fp)
9290 {
9291 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9292
9293 int num_lines = count_lines (fp);
9294
9295 // a bit over-allocated
9296
9297 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9298 tuning_db->alias_cnt = 0;
9299
9300 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9301 tuning_db->entry_cnt = 0;
9302
9303 return tuning_db;
9304 }
9305
9306 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9307 {
9308 FILE *fp = fopen (tuning_db_file, "rb");
9309
9310 if (fp == NULL)
9311 {
9312 log_error ("%s: %s", tuning_db_file, strerror (errno));
9313
9314 exit (-1);
9315 }
9316
9317 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9318
9319 rewind (fp);
9320
9321 int line_num = 0;
9322
9323 char *buf = (char *) mymalloc (HCBUFSIZ);
9324
9325 while (!feof (fp))
9326 {
9327 char *line_buf = fgets (buf, HCBUFSIZ - 1, fp);
9328
9329 if (line_buf == NULL) break;
9330
9331 line_num++;
9332
9333 const int line_len = in_superchop (line_buf);
9334
9335 if (line_len == 0) continue;
9336
9337 if (line_buf[0] == '#') continue;
9338
9339 // start processing
9340
9341 char *token_ptr[7] = { NULL };
9342
9343 int token_cnt = 0;
9344
9345 char *next = strtok (line_buf, "\t ");
9346
9347 token_ptr[token_cnt] = next;
9348
9349 token_cnt++;
9350
9351 while ((next = strtok (NULL, "\t ")) != NULL)
9352 {
9353 token_ptr[token_cnt] = next;
9354
9355 token_cnt++;
9356 }
9357
9358 if (token_cnt == 2)
9359 {
9360 char *device_name = token_ptr[0];
9361 char *alias_name = token_ptr[1];
9362
9363 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9364
9365 alias->device_name = mystrdup (device_name);
9366 alias->alias_name = mystrdup (alias_name);
9367
9368 tuning_db->alias_cnt++;
9369 }
9370 else if (token_cnt == 6)
9371 {
9372 if ((token_ptr[1][0] != '0') &&
9373 (token_ptr[1][0] != '1') &&
9374 (token_ptr[1][0] != '3') &&
9375 (token_ptr[1][0] != '*'))
9376 {
9377 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9378
9379 continue;
9380 }
9381
9382 if ((token_ptr[3][0] != '1') &&
9383 (token_ptr[3][0] != '2') &&
9384 (token_ptr[3][0] != '4') &&
9385 (token_ptr[3][0] != '8') &&
9386 (token_ptr[3][0] != 'N'))
9387 {
9388 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9389
9390 continue;
9391 }
9392
9393 char *device_name = token_ptr[0];
9394
9395 int attack_mode = -1;
9396 int hash_type = -1;
9397 int vector_width = -1;
9398 int kernel_accel = -1;
9399 int kernel_loops = -1;
9400
9401 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9402 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9403 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9404
9405 if (token_ptr[4][0] != 'A')
9406 {
9407 kernel_accel = atoi (token_ptr[4]);
9408
9409 if ((kernel_accel < 1) || (kernel_accel > 1024))
9410 {
9411 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9412
9413 continue;
9414 }
9415 }
9416 else
9417 {
9418 kernel_accel = 0;
9419 }
9420
9421 if (token_ptr[5][0] != 'A')
9422 {
9423 kernel_loops = atoi (token_ptr[5]);
9424
9425 if ((kernel_loops < 1) || (kernel_loops > 1024))
9426 {
9427 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9428
9429 continue;
9430 }
9431 }
9432 else
9433 {
9434 kernel_loops = 0;
9435 }
9436
9437 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9438
9439 entry->device_name = mystrdup (device_name);
9440 entry->attack_mode = attack_mode;
9441 entry->hash_type = hash_type;
9442 entry->vector_width = vector_width;
9443 entry->kernel_accel = kernel_accel;
9444 entry->kernel_loops = kernel_loops;
9445
9446 tuning_db->entry_cnt++;
9447 }
9448 else
9449 {
9450 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9451
9452 continue;
9453 }
9454 }
9455
9456 myfree (buf);
9457
9458 fclose (fp);
9459
9460 // todo: print loaded 'cnt' message
9461
9462 // sort the database
9463
9464 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9465 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9466
9467 return tuning_db;
9468 }
9469
9470 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, hc_device_param_t *device_param, int attack_mode, int hash_type)
9471 {
9472 static tuning_db_entry_t s;
9473
9474 // first we need to convert all spaces in the device_name to underscore
9475
9476 char *device_name_nospace = strdup (device_param->device_name);
9477
9478 int device_name_length = strlen (device_name_nospace);
9479
9480 int i;
9481
9482 for (i = 0; i < device_name_length; i++)
9483 {
9484 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9485 }
9486
9487 // find out if there's an alias configured
9488
9489 tuning_db_alias_t a;
9490
9491 a.device_name = device_name_nospace;
9492
9493 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);
9494
9495 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9496
9497 // attack-mode 6 and 7 are attack-mode 1 basically
9498
9499 if (attack_mode == 6) attack_mode = 1;
9500 if (attack_mode == 7) attack_mode = 1;
9501
9502 // bsearch is not ideal but fast enough
9503
9504 s.device_name = device_name_nospace;
9505 s.attack_mode = attack_mode;
9506 s.hash_type = hash_type;
9507
9508 tuning_db_entry_t *entry = NULL;
9509
9510 // this will produce all 2^3 combinations required
9511
9512 for (i = 0; i < 8; i++)
9513 {
9514 s.device_name = (i & 1) ? "*" : device_name_nospace;
9515 s.attack_mode = (i & 2) ? -1 : attack_mode;
9516 s.hash_type = (i & 4) ? -1 : hash_type;
9517
9518 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9519
9520 if (entry != NULL) break;
9521
9522 // in non-wildcard mode do some additional checks:
9523
9524 if ((i & 1) == 0)
9525 {
9526 // in case we have an alias-name
9527
9528 if (alias_name != NULL)
9529 {
9530 s.device_name = alias_name;
9531
9532 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9533
9534 if (entry != NULL) break;
9535 }
9536
9537 // or by device type
9538
9539 if (device_param->device_type & CL_DEVICE_TYPE_CPU)
9540 {
9541 s.device_name = "DEVICE_TYPE_CPU";
9542 }
9543 else if (device_param->device_type & CL_DEVICE_TYPE_GPU)
9544 {
9545 s.device_name = "DEVICE_TYPE_GPU";
9546 }
9547 else if (device_param->device_type & CL_DEVICE_TYPE_ACCELERATOR)
9548 {
9549 s.device_name = "DEVICE_TYPE_ACCELERATOR";
9550 }
9551
9552 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9553
9554 if (entry != NULL) break;
9555 }
9556 }
9557
9558 // free converted device_name
9559
9560 myfree (device_name_nospace);
9561
9562 return entry;
9563 }
9564
9565 /**
9566 * parser
9567 */
9568
9569 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9570 {
9571 u8 tmp[256] = { 0 };
9572
9573 if (salt_len > sizeof (tmp))
9574 {
9575 return UINT_MAX;
9576 }
9577
9578 memcpy (tmp, in, salt_len);
9579
9580 if (data.opts_type & OPTS_TYPE_ST_HEX)
9581 {
9582 if ((salt_len % 2) == 0)
9583 {
9584 u32 new_salt_len = salt_len / 2;
9585
9586 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9587 {
9588 u8 p0 = tmp[j + 0];
9589 u8 p1 = tmp[j + 1];
9590
9591 tmp[i] = hex_convert (p1) << 0;
9592 tmp[i] |= hex_convert (p0) << 4;
9593 }
9594
9595 salt_len = new_salt_len;
9596 }
9597 else
9598 {
9599 return UINT_MAX;
9600 }
9601 }
9602 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9603 {
9604 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9605 }
9606
9607 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9608
9609 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9610 {
9611 if (salt_len < 20)
9612 {
9613 u32 *tmp_uint = (u32 *) tmp;
9614
9615 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9616 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9617 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9618 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9619 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9620 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9621 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9622 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9623 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9624 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9625
9626 salt_len = salt_len * 2;
9627 }
9628 else
9629 {
9630 return UINT_MAX;
9631 }
9632 }
9633
9634 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9635 {
9636 lowercase (tmp, salt_len);
9637 }
9638
9639 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9640 {
9641 uppercase (tmp, salt_len);
9642 }
9643
9644 u32 len = salt_len;
9645
9646 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9647 {
9648 tmp[len++] = 0x80;
9649 }
9650
9651 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9652 {
9653 tmp[len++] = 0x01;
9654 }
9655
9656 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9657 {
9658 u32 *tmp_uint = (uint *) tmp;
9659
9660 u32 max = len / 4;
9661
9662 if (len % 4) max++;
9663
9664 for (u32 i = 0; i < max; i++)
9665 {
9666 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9667 }
9668
9669 // Important: we may need to increase the length of memcpy since
9670 // we don't want to "loose" some swapped bytes (could happen if
9671 // they do not perfectly fit in the 4-byte blocks)
9672 // Memcpy does always copy the bytes in the BE order, but since
9673 // we swapped them, some important bytes could be in positions
9674 // we normally skip with the original len
9675
9676 if (len % 4) len += 4 - (len % 4);
9677 }
9678
9679 memcpy (out, tmp, len);
9680
9681 return (salt_len);
9682 }
9683
9684 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9685 {
9686 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9687
9688 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9689
9690 u32 *digest = (u32 *) hash_buf->digest;
9691
9692 salt_t *salt = hash_buf->salt;
9693
9694 memcpy ((char *) salt->salt_sign, input_buf, 6);
9695
9696 char *iter_pos = input_buf + 4;
9697
9698 salt->salt_iter = 1 << atoi (iter_pos);
9699
9700 char *salt_pos = strchr (iter_pos, '$');
9701
9702 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9703
9704 salt_pos++;
9705
9706 uint salt_len = 16;
9707
9708 salt->salt_len = salt_len;
9709
9710 u8 tmp_buf[100] = { 0 };
9711
9712 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9713
9714 char *salt_buf_ptr = (char *) salt->salt_buf;
9715
9716 memcpy (salt_buf_ptr, tmp_buf, 16);
9717
9718 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9719 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9720 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9721 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9722
9723 char *hash_pos = salt_pos + 22;
9724
9725 memset (tmp_buf, 0, sizeof (tmp_buf));
9726
9727 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9728
9729 memcpy (digest, tmp_buf, 24);
9730
9731 digest[0] = byte_swap_32 (digest[0]);
9732 digest[1] = byte_swap_32 (digest[1]);
9733 digest[2] = byte_swap_32 (digest[2]);
9734 digest[3] = byte_swap_32 (digest[3]);
9735 digest[4] = byte_swap_32 (digest[4]);
9736 digest[5] = byte_swap_32 (digest[5]);
9737
9738 digest[5] &= ~0xff; // its just 23 not 24 !
9739
9740 return (PARSER_OK);
9741 }
9742
9743 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9744 {
9745 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9746
9747 u32 *digest = (u32 *) hash_buf->digest;
9748
9749 u8 tmp_buf[100] = { 0 };
9750
9751 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9752
9753 memcpy (digest, tmp_buf, 32);
9754
9755 digest[0] = byte_swap_32 (digest[0]);
9756 digest[1] = byte_swap_32 (digest[1]);
9757 digest[2] = byte_swap_32 (digest[2]);
9758 digest[3] = byte_swap_32 (digest[3]);
9759 digest[4] = byte_swap_32 (digest[4]);
9760 digest[5] = byte_swap_32 (digest[5]);
9761 digest[6] = byte_swap_32 (digest[6]);
9762 digest[7] = byte_swap_32 (digest[7]);
9763
9764 digest[0] -= SHA256M_A;
9765 digest[1] -= SHA256M_B;
9766 digest[2] -= SHA256M_C;
9767 digest[3] -= SHA256M_D;
9768 digest[4] -= SHA256M_E;
9769 digest[5] -= SHA256M_F;
9770 digest[6] -= SHA256M_G;
9771 digest[7] -= SHA256M_H;
9772
9773 return (PARSER_OK);
9774 }
9775
9776 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9777 {
9778 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9779
9780 u32 *digest = (u32 *) hash_buf->digest;
9781
9782 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9783 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9784
9785 digest[0] = byte_swap_32 (digest[0]);
9786 digest[1] = byte_swap_32 (digest[1]);
9787
9788 uint tt;
9789
9790 IP (digest[0], digest[1], tt);
9791
9792 digest[0] = digest[0];
9793 digest[1] = digest[1];
9794 digest[2] = 0;
9795 digest[3] = 0;
9796
9797 return (PARSER_OK);
9798 }
9799
9800 int arubaos_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9801 {
9802 if ((input_len < DISPLAY_LEN_MIN_125) || (input_len > DISPLAY_LEN_MAX_125)) return (PARSER_GLOBAL_LENGTH);
9803
9804 if ((input_buf[8] != '0') || (input_buf[9] != '1')) return (PARSER_SIGNATURE_UNMATCHED);
9805
9806 u32 *digest = (u32 *) hash_buf->digest;
9807
9808 salt_t *salt = hash_buf->salt;
9809
9810 char *hash_pos = input_buf + 10;
9811
9812 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9813 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9814 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9815 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9816 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9817
9818 digest[0] -= SHA1M_A;
9819 digest[1] -= SHA1M_B;
9820 digest[2] -= SHA1M_C;
9821 digest[3] -= SHA1M_D;
9822 digest[4] -= SHA1M_E;
9823
9824 uint salt_len = 10;
9825
9826 char *salt_buf_ptr = (char *) salt->salt_buf;
9827
9828 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9829
9830 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9831
9832 salt->salt_len = salt_len;
9833
9834 return (PARSER_OK);
9835 }
9836
9837 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9838 {
9839 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9840
9841 u32 *digest = (u32 *) hash_buf->digest;
9842
9843 salt_t *salt = hash_buf->salt;
9844
9845 char *hash_pos = input_buf + 8;
9846
9847 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9848 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9849 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9850 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9851 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9852
9853 digest[0] -= SHA1M_A;
9854 digest[1] -= SHA1M_B;
9855 digest[2] -= SHA1M_C;
9856 digest[3] -= SHA1M_D;
9857 digest[4] -= SHA1M_E;
9858
9859 uint salt_len = 8;
9860
9861 char *salt_buf_ptr = (char *) salt->salt_buf;
9862
9863 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9864
9865 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9866
9867 salt->salt_len = salt_len;
9868
9869 return (PARSER_OK);
9870 }
9871
9872 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9873 {
9874 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9875
9876 u64 *digest = (u64 *) hash_buf->digest;
9877
9878 salt_t *salt = hash_buf->salt;
9879
9880 char *hash_pos = input_buf + 8;
9881
9882 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9883 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9884 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9885 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9886 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9887 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9888 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9889 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9890
9891 digest[0] -= SHA512M_A;
9892 digest[1] -= SHA512M_B;
9893 digest[2] -= SHA512M_C;
9894 digest[3] -= SHA512M_D;
9895 digest[4] -= SHA512M_E;
9896 digest[5] -= SHA512M_F;
9897 digest[6] -= SHA512M_G;
9898 digest[7] -= SHA512M_H;
9899
9900 uint salt_len = 8;
9901
9902 char *salt_buf_ptr = (char *) salt->salt_buf;
9903
9904 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9905
9906 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9907
9908 salt->salt_len = salt_len;
9909
9910 return (PARSER_OK);
9911 }
9912
9913 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9914 {
9915 if (data.opts_type & OPTS_TYPE_ST_HEX)
9916 {
9917 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9918 }
9919 else
9920 {
9921 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9922 }
9923
9924 u32 *digest = (u32 *) hash_buf->digest;
9925
9926 salt_t *salt = hash_buf->salt;
9927
9928 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9929 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9930 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9931 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9932
9933 digest[0] = byte_swap_32 (digest[0]);
9934 digest[1] = byte_swap_32 (digest[1]);
9935 digest[2] = byte_swap_32 (digest[2]);
9936 digest[3] = byte_swap_32 (digest[3]);
9937
9938 digest[0] -= MD5M_A;
9939 digest[1] -= MD5M_B;
9940 digest[2] -= MD5M_C;
9941 digest[3] -= MD5M_D;
9942
9943 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9944
9945 uint salt_len = input_len - 32 - 1;
9946
9947 char *salt_buf = input_buf + 32 + 1;
9948
9949 char *salt_buf_ptr = (char *) salt->salt_buf;
9950
9951 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9952
9953 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9954
9955 salt->salt_len = salt_len;
9956
9957 return (PARSER_OK);
9958 }
9959
9960 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9961 {
9962 if (data.opts_type & OPTS_TYPE_ST_HEX)
9963 {
9964 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9965 }
9966 else
9967 {
9968 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9969 }
9970
9971 // unscramble
9972
9973 char clean_input_buf[32] = { 0 };
9974
9975 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9976 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9977
9978 for (int i = 0, j = 0, k = 0; i < 30; i++)
9979 {
9980 if (i == pos[j])
9981 {
9982 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9983
9984 j++;
9985 }
9986 else
9987 {
9988 clean_input_buf[k] = input_buf[i];
9989
9990 k++;
9991 }
9992 }
9993
9994 // base64 decode
9995
9996 u32 *digest = (u32 *) hash_buf->digest;
9997
9998 salt_t *salt = hash_buf->salt;
9999
10000 u32 a, b, c, d, e, f;
10001
10002 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
10003 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
10004 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
10005 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
10006 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
10007 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
10008
10009 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
10010 | (((d << 12) | (e << 6) | (f)) << 0);
10011
10012 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
10013 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
10014 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
10015 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
10016 e = base64_to_int (clean_input_buf[10] & 0x7f);
10017 f = base64_to_int (clean_input_buf[11] & 0x7f);
10018
10019 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
10020 | (((d << 12) | (e << 6) | (f)) << 0);
10021
10022 a = base64_to_int (clean_input_buf[12] & 0x7f);
10023 b = base64_to_int (clean_input_buf[13] & 0x7f);
10024 c = base64_to_int (clean_input_buf[14] & 0x7f);
10025 d = base64_to_int (clean_input_buf[15] & 0x7f);
10026 e = base64_to_int (clean_input_buf[16] & 0x7f);
10027 f = base64_to_int (clean_input_buf[17] & 0x7f);
10028
10029 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
10030 | (((d << 12) | (e << 6) | (f)) << 0);
10031
10032 a = base64_to_int (clean_input_buf[18] & 0x7f);
10033 b = base64_to_int (clean_input_buf[19] & 0x7f);
10034 c = base64_to_int (clean_input_buf[20] & 0x7f);
10035 d = base64_to_int (clean_input_buf[21] & 0x7f);
10036 e = base64_to_int (clean_input_buf[22] & 0x7f);
10037 f = base64_to_int (clean_input_buf[23] & 0x7f);
10038
10039 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10040 | (((d << 12) | (e << 6) | (f)) << 0);
10041
10042 digest[0] = byte_swap_32 (digest[0]);
10043 digest[1] = byte_swap_32 (digest[1]);
10044 digest[2] = byte_swap_32 (digest[2]);
10045 digest[3] = byte_swap_32 (digest[3]);
10046
10047 digest[0] -= MD5M_A;
10048 digest[1] -= MD5M_B;
10049 digest[2] -= MD5M_C;
10050 digest[3] -= MD5M_D;
10051
10052 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10053
10054 uint salt_len = input_len - 30 - 1;
10055
10056 char *salt_buf = input_buf + 30 + 1;
10057
10058 char *salt_buf_ptr = (char *) salt->salt_buf;
10059
10060 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10061
10062 // max. salt length: 55 (max for MD5) - 22 (":Administration Tools:") - 1 (0x80) = 32
10063 // 32 - 4 bytes (to fit w0lr for all attack modes) = 28
10064
10065 if (salt_len > 28) return (PARSER_SALT_LENGTH);
10066
10067 salt->salt_len = salt_len;
10068
10069 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10070
10071 salt->salt_len += 22;
10072
10073 return (PARSER_OK);
10074 }
10075
10076 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10077 {
10078 if (data.opts_type & OPTS_TYPE_ST_HEX)
10079 {
10080 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10081 }
10082 else
10083 {
10084 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10085 }
10086
10087 u32 *digest = (u32 *) hash_buf->digest;
10088
10089 salt_t *salt = hash_buf->salt;
10090
10091 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10092 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10093 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10094 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10095 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10096
10097 digest[0] -= SHA1M_A;
10098 digest[1] -= SHA1M_B;
10099 digest[2] -= SHA1M_C;
10100 digest[3] -= SHA1M_D;
10101 digest[4] -= SHA1M_E;
10102
10103 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10104
10105 uint salt_len = input_len - 40 - 1;
10106
10107 char *salt_buf = input_buf + 40 + 1;
10108
10109 char *salt_buf_ptr = (char *) salt->salt_buf;
10110
10111 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10112
10113 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10114
10115 salt->salt_len = salt_len;
10116
10117 return (PARSER_OK);
10118 }
10119
10120 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10121 {
10122 if (data.opts_type & OPTS_TYPE_ST_HEX)
10123 {
10124 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10125 }
10126 else
10127 {
10128 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10129 }
10130
10131 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10132
10133 char *iter_pos = input_buf + 6;
10134
10135 salt_t *salt = hash_buf->salt;
10136
10137 uint iter = atoi (iter_pos);
10138
10139 if (iter < 1)
10140 {
10141 iter = ROUNDS_DCC2;
10142 }
10143
10144 salt->salt_iter = iter - 1;
10145
10146 char *salt_pos = strchr (iter_pos, '#');
10147
10148 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10149
10150 salt_pos++;
10151
10152 char *digest_pos = strchr (salt_pos, '#');
10153
10154 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10155
10156 digest_pos++;
10157
10158 uint salt_len = digest_pos - salt_pos - 1;
10159
10160 u32 *digest = (u32 *) hash_buf->digest;
10161
10162 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10163 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10164 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10165 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10166
10167 char *salt_buf_ptr = (char *) salt->salt_buf;
10168
10169 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10170
10171 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10172
10173 salt->salt_len = salt_len;
10174
10175 return (PARSER_OK);
10176 }
10177
10178 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10179 {
10180 u32 *digest = (u32 *) hash_buf->digest;
10181
10182 salt_t *salt = hash_buf->salt;
10183
10184 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10185
10186 hccap_t in;
10187
10188 memcpy (&in, input_buf, input_len);
10189
10190 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10191
10192 memcpy (digest, in.keymic, 16);
10193
10194 /*
10195 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10196 The phrase "Pairwise key expansion"
10197 Access Point Address (referred to as Authenticator Address AA)
10198 Supplicant Address (referred to as Supplicant Address SA)
10199 Access Point Nonce (referred to as Authenticator Anonce)
10200 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10201 */
10202
10203 uint salt_len = strlen (in.essid);
10204
10205 if (salt_len > 36)
10206 {
10207 log_info ("WARNING: the length of the ESSID is too long. The hccap file may be invalid or corrupted");
10208
10209 return (PARSER_SALT_LENGTH);
10210 }
10211
10212 memcpy (salt->salt_buf, in.essid, salt_len);
10213
10214 salt->salt_len = salt_len;
10215
10216 salt->salt_iter = ROUNDS_WPA2 - 1;
10217
10218 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10219
10220 memcpy (pke_ptr, "Pairwise key expansion", 23);
10221
10222 if (memcmp (in.mac1, in.mac2, 6) < 0)
10223 {
10224 memcpy (pke_ptr + 23, in.mac1, 6);
10225 memcpy (pke_ptr + 29, in.mac2, 6);
10226 }
10227 else
10228 {
10229 memcpy (pke_ptr + 23, in.mac2, 6);
10230 memcpy (pke_ptr + 29, in.mac1, 6);
10231 }
10232
10233 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10234 {
10235 memcpy (pke_ptr + 35, in.nonce1, 32);
10236 memcpy (pke_ptr + 67, in.nonce2, 32);
10237 }
10238 else
10239 {
10240 memcpy (pke_ptr + 35, in.nonce2, 32);
10241 memcpy (pke_ptr + 67, in.nonce1, 32);
10242 }
10243
10244 for (int i = 0; i < 25; i++)
10245 {
10246 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10247 }
10248
10249 memcpy (wpa->orig_mac1, in.mac1, 6);
10250 memcpy (wpa->orig_mac2, in.mac2, 6);
10251 memcpy (wpa->orig_nonce1, in.nonce1, 32);
10252 memcpy (wpa->orig_nonce2, in.nonce2, 32);
10253
10254 wpa->keyver = in.keyver;
10255
10256 if (wpa->keyver > 255)
10257 {
10258 log_info ("ATTENTION!");
10259 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10260 log_info (" This could be due to a recent aircrack-ng bug.");
10261 log_info (" The key version was automatically reset to a reasonable value.");
10262 log_info ("");
10263
10264 wpa->keyver &= 0xff;
10265 }
10266
10267 wpa->eapol_size = in.eapol_size;
10268
10269 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10270
10271 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10272
10273 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10274
10275 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10276
10277 if (wpa->keyver == 1)
10278 {
10279 // nothing to do
10280 }
10281 else
10282 {
10283 digest[0] = byte_swap_32 (digest[0]);
10284 digest[1] = byte_swap_32 (digest[1]);
10285 digest[2] = byte_swap_32 (digest[2]);
10286 digest[3] = byte_swap_32 (digest[3]);
10287
10288 for (int i = 0; i < 64; i++)
10289 {
10290 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10291 }
10292 }
10293
10294 uint32_t *p0 = (uint32_t *) in.essid;
10295 uint32_t c0 = 0;
10296 uint32_t c1 = 0;
10297
10298 for (uint i = 0; i < sizeof (in.essid) / sizeof (uint32_t); i++) c0 ^= *p0++;
10299 for (uint i = 0; i < sizeof (wpa->pke) / sizeof (wpa->pke[0]); i++) c1 ^= wpa->pke[i];
10300
10301 salt->salt_buf[10] = c0;
10302 salt->salt_buf[11] = c1;
10303
10304 return (PARSER_OK);
10305 }
10306
10307 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10308 {
10309 u32 *digest = (u32 *) hash_buf->digest;
10310
10311 salt_t *salt = hash_buf->salt;
10312
10313 if (input_len == 0)
10314 {
10315 log_error ("Password Safe v2 container not specified");
10316
10317 exit (-1);
10318 }
10319
10320 FILE *fp = fopen (input_buf, "rb");
10321
10322 if (fp == NULL)
10323 {
10324 log_error ("%s: %s", input_buf, strerror (errno));
10325
10326 exit (-1);
10327 }
10328
10329 psafe2_hdr buf;
10330
10331 memset (&buf, 0, sizeof (psafe2_hdr));
10332
10333 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10334
10335 fclose (fp);
10336
10337 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10338
10339 salt->salt_buf[0] = buf.random[0];
10340 salt->salt_buf[1] = buf.random[1];
10341
10342 salt->salt_len = 8;
10343 salt->salt_iter = 1000;
10344
10345 digest[0] = byte_swap_32 (buf.hash[0]);
10346 digest[1] = byte_swap_32 (buf.hash[1]);
10347 digest[2] = byte_swap_32 (buf.hash[2]);
10348 digest[3] = byte_swap_32 (buf.hash[3]);
10349 digest[4] = byte_swap_32 (buf.hash[4]);
10350
10351 return (PARSER_OK);
10352 }
10353
10354 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10355 {
10356 u32 *digest = (u32 *) hash_buf->digest;
10357
10358 salt_t *salt = hash_buf->salt;
10359
10360 if (input_len == 0)
10361 {
10362 log_error (".psafe3 not specified");
10363
10364 exit (-1);
10365 }
10366
10367 FILE *fp = fopen (input_buf, "rb");
10368
10369 if (fp == NULL)
10370 {
10371 log_error ("%s: %s", input_buf, strerror (errno));
10372
10373 exit (-1);
10374 }
10375
10376 psafe3_t in;
10377
10378 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10379
10380 fclose (fp);
10381
10382 data.hashfile = input_buf; // we will need this in case it gets cracked
10383
10384 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10385
10386 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10387
10388 salt->salt_iter = in.iterations + 1;
10389
10390 salt->salt_buf[0] = in.salt_buf[0];
10391 salt->salt_buf[1] = in.salt_buf[1];
10392 salt->salt_buf[2] = in.salt_buf[2];
10393 salt->salt_buf[3] = in.salt_buf[3];
10394 salt->salt_buf[4] = in.salt_buf[4];
10395 salt->salt_buf[5] = in.salt_buf[5];
10396 salt->salt_buf[6] = in.salt_buf[6];
10397 salt->salt_buf[7] = in.salt_buf[7];
10398
10399 salt->salt_len = 32;
10400
10401 digest[0] = in.hash_buf[0];
10402 digest[1] = in.hash_buf[1];
10403 digest[2] = in.hash_buf[2];
10404 digest[3] = in.hash_buf[3];
10405 digest[4] = in.hash_buf[4];
10406 digest[5] = in.hash_buf[5];
10407 digest[6] = in.hash_buf[6];
10408 digest[7] = in.hash_buf[7];
10409
10410 digest[0] = byte_swap_32 (digest[0]);
10411 digest[1] = byte_swap_32 (digest[1]);
10412 digest[2] = byte_swap_32 (digest[2]);
10413 digest[3] = byte_swap_32 (digest[3]);
10414 digest[4] = byte_swap_32 (digest[4]);
10415 digest[5] = byte_swap_32 (digest[5]);
10416 digest[6] = byte_swap_32 (digest[6]);
10417 digest[7] = byte_swap_32 (digest[7]);
10418
10419 return (PARSER_OK);
10420 }
10421
10422 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10423 {
10424 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10425
10426 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10427
10428 u32 *digest = (u32 *) hash_buf->digest;
10429
10430 salt_t *salt = hash_buf->salt;
10431
10432 char *iter_pos = input_buf + 3;
10433
10434 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10435
10436 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10437
10438 memcpy ((char *) salt->salt_sign, input_buf, 4);
10439
10440 salt->salt_iter = salt_iter;
10441
10442 char *salt_pos = iter_pos + 1;
10443
10444 uint salt_len = 8;
10445
10446 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10447
10448 salt->salt_len = salt_len;
10449
10450 char *hash_pos = salt_pos + salt_len;
10451
10452 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10453
10454 return (PARSER_OK);
10455 }
10456
10457 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10458 {
10459 if (input_len < DISPLAY_LEN_MIN_500) return (PARSER_GLOBAL_LENGTH);
10460
10461 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10462
10463 u32 *digest = (u32 *) hash_buf->digest;
10464
10465 salt_t *salt = hash_buf->salt;
10466
10467 char *salt_pos = input_buf + 3;
10468
10469 uint iterations_len = 0;
10470
10471 if (memcmp (salt_pos, "rounds=", 7) == 0)
10472 {
10473 salt_pos += 7;
10474
10475 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10476
10477 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10478 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10479
10480 salt_pos[0] = 0x0;
10481
10482 salt->salt_iter = atoi (salt_pos - iterations_len);
10483
10484 salt_pos += 1;
10485
10486 iterations_len += 8;
10487 }
10488 else
10489 {
10490 salt->salt_iter = ROUNDS_MD5CRYPT;
10491 }
10492
10493 if (input_len > (DISPLAY_LEN_MAX_500 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10494
10495 char *hash_pos = strchr (salt_pos, '$');
10496
10497 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10498
10499 uint salt_len = hash_pos - salt_pos;
10500
10501 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10502
10503 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10504
10505 salt->salt_len = salt_len;
10506
10507 hash_pos++;
10508
10509 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10510
10511 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10512
10513 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10514
10515 return (PARSER_OK);
10516 }
10517
10518 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10519 {
10520 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10521
10522 u32 *digest = (u32 *) hash_buf->digest;
10523
10524 salt_t *salt = hash_buf->salt;
10525
10526 char *salt_pos = input_buf + 6;
10527
10528 uint iterations_len = 0;
10529
10530 if (memcmp (salt_pos, "rounds=", 7) == 0)
10531 {
10532 salt_pos += 7;
10533
10534 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10535
10536 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10537 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10538
10539 salt_pos[0] = 0x0;
10540
10541 salt->salt_iter = atoi (salt_pos - iterations_len);
10542
10543 salt_pos += 1;
10544
10545 iterations_len += 8;
10546 }
10547 else
10548 {
10549 salt->salt_iter = ROUNDS_MD5CRYPT;
10550 }
10551
10552 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10553
10554 char *hash_pos = strchr (salt_pos, '$');
10555
10556 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10557
10558 uint salt_len = hash_pos - salt_pos;
10559
10560 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10561
10562 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10563
10564 salt->salt_len = salt_len;
10565
10566 hash_pos++;
10567
10568 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10569
10570 return (PARSER_OK);
10571 }
10572
10573 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10574 {
10575 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10576
10577 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10578
10579 u32 *digest = (u32 *) hash_buf->digest;
10580
10581 salt_t *salt = hash_buf->salt;
10582
10583 char *salt_pos = input_buf + 14;
10584
10585 char *hash_pos = strchr (salt_pos, '*');
10586
10587 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10588
10589 hash_pos++;
10590
10591 uint salt_len = hash_pos - salt_pos - 1;
10592
10593 char *salt_buf_ptr = (char *) salt->salt_buf;
10594
10595 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10596
10597 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10598
10599 salt->salt_len = salt_len;
10600
10601 u8 tmp_buf[100] = { 0 };
10602
10603 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10604
10605 memcpy (digest, tmp_buf, 20);
10606
10607 digest[0] = byte_swap_32 (digest[0]);
10608 digest[1] = byte_swap_32 (digest[1]);
10609 digest[2] = byte_swap_32 (digest[2]);
10610 digest[3] = byte_swap_32 (digest[3]);
10611 digest[4] = byte_swap_32 (digest[4]);
10612
10613 digest[0] -= SHA1M_A;
10614 digest[1] -= SHA1M_B;
10615 digest[2] -= SHA1M_C;
10616 digest[3] -= SHA1M_D;
10617 digest[4] -= SHA1M_E;
10618
10619 return (PARSER_OK);
10620 }
10621
10622 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10623 {
10624 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10625
10626 unsigned char c12 = itoa64_to_int (input_buf[12]);
10627
10628 if (c12 & 3) return (PARSER_HASH_VALUE);
10629
10630 u32 *digest = (u32 *) hash_buf->digest;
10631
10632 salt_t *salt = hash_buf->salt;
10633
10634 // for ascii_digest
10635 salt->salt_sign[0] = input_buf[0];
10636 salt->salt_sign[1] = input_buf[1];
10637
10638 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10639 | itoa64_to_int (input_buf[1]) << 6;
10640
10641 salt->salt_len = 2;
10642
10643 u8 tmp_buf[100] = { 0 };
10644
10645 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10646
10647 memcpy (digest, tmp_buf, 8);
10648
10649 uint tt;
10650
10651 IP (digest[0], digest[1], tt);
10652
10653 digest[2] = 0;
10654 digest[3] = 0;
10655
10656 return (PARSER_OK);
10657 }
10658
10659 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10660 {
10661 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10662
10663 u32 *digest = (u32 *) hash_buf->digest;
10664
10665 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10666 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10667 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10668 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10669
10670 digest[0] = byte_swap_32 (digest[0]);
10671 digest[1] = byte_swap_32 (digest[1]);
10672 digest[2] = byte_swap_32 (digest[2]);
10673 digest[3] = byte_swap_32 (digest[3]);
10674
10675 digest[0] -= MD4M_A;
10676 digest[1] -= MD4M_B;
10677 digest[2] -= MD4M_C;
10678 digest[3] -= MD4M_D;
10679
10680 return (PARSER_OK);
10681 }
10682
10683 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10684 {
10685 if (data.opts_type & OPTS_TYPE_ST_HEX)
10686 {
10687 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10688 }
10689 else
10690 {
10691 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10692 }
10693
10694 u32 *digest = (u32 *) hash_buf->digest;
10695
10696 salt_t *salt = hash_buf->salt;
10697
10698 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10699 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10700 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10701 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10702
10703 digest[0] = byte_swap_32 (digest[0]);
10704 digest[1] = byte_swap_32 (digest[1]);
10705 digest[2] = byte_swap_32 (digest[2]);
10706 digest[3] = byte_swap_32 (digest[3]);
10707
10708 digest[0] -= MD4M_A;
10709 digest[1] -= MD4M_B;
10710 digest[2] -= MD4M_C;
10711 digest[3] -= MD4M_D;
10712
10713 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10714
10715 uint salt_len = input_len - 32 - 1;
10716
10717 char *salt_buf = input_buf + 32 + 1;
10718
10719 char *salt_buf_ptr = (char *) salt->salt_buf;
10720
10721 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10722
10723 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10724
10725 salt->salt_len = salt_len;
10726
10727 return (PARSER_OK);
10728 }
10729
10730 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10731 {
10732 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10733
10734 u32 *digest = (u32 *) hash_buf->digest;
10735
10736 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10737 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10738 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10739 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10740
10741 digest[0] = byte_swap_32 (digest[0]);
10742 digest[1] = byte_swap_32 (digest[1]);
10743 digest[2] = byte_swap_32 (digest[2]);
10744 digest[3] = byte_swap_32 (digest[3]);
10745
10746 digest[0] -= MD5M_A;
10747 digest[1] -= MD5M_B;
10748 digest[2] -= MD5M_C;
10749 digest[3] -= MD5M_D;
10750
10751 return (PARSER_OK);
10752 }
10753
10754 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10755 {
10756 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10757
10758 u32 *digest = (u32 *) hash_buf->digest;
10759
10760 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10761 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10762 digest[2] = 0;
10763 digest[3] = 0;
10764
10765 digest[0] = byte_swap_32 (digest[0]);
10766 digest[1] = byte_swap_32 (digest[1]);
10767
10768 return (PARSER_OK);
10769 }
10770
10771 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10772 {
10773 if (data.opts_type & OPTS_TYPE_ST_HEX)
10774 {
10775 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10776 }
10777 else
10778 {
10779 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10780 }
10781
10782 u32 *digest = (u32 *) hash_buf->digest;
10783
10784 salt_t *salt = hash_buf->salt;
10785
10786 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10787 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10788 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10789 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10790
10791 digest[0] = byte_swap_32 (digest[0]);
10792 digest[1] = byte_swap_32 (digest[1]);
10793 digest[2] = byte_swap_32 (digest[2]);
10794 digest[3] = byte_swap_32 (digest[3]);
10795
10796 digest[0] -= MD5M_A;
10797 digest[1] -= MD5M_B;
10798 digest[2] -= MD5M_C;
10799 digest[3] -= MD5M_D;
10800
10801 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10802
10803 uint salt_len = input_len - 32 - 1;
10804
10805 char *salt_buf = input_buf + 32 + 1;
10806
10807 char *salt_buf_ptr = (char *) salt->salt_buf;
10808
10809 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10810
10811 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10812
10813 salt->salt_len = salt_len;
10814
10815 return (PARSER_OK);
10816 }
10817
10818 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10819 {
10820 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10821
10822 u32 *digest = (u32 *) hash_buf->digest;
10823
10824 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10825 | itoa64_to_int (input_buf[ 1]) << 6
10826 | itoa64_to_int (input_buf[ 2]) << 12
10827 | itoa64_to_int (input_buf[ 3]) << 18;
10828 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10829 | itoa64_to_int (input_buf[ 5]) << 6
10830 | itoa64_to_int (input_buf[ 6]) << 12
10831 | itoa64_to_int (input_buf[ 7]) << 18;
10832 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10833 | itoa64_to_int (input_buf[ 9]) << 6
10834 | itoa64_to_int (input_buf[10]) << 12
10835 | itoa64_to_int (input_buf[11]) << 18;
10836 digest[3] = itoa64_to_int (input_buf[12]) << 0
10837 | itoa64_to_int (input_buf[13]) << 6
10838 | itoa64_to_int (input_buf[14]) << 12
10839 | itoa64_to_int (input_buf[15]) << 18;
10840
10841 digest[0] -= MD5M_A;
10842 digest[1] -= MD5M_B;
10843 digest[2] -= MD5M_C;
10844 digest[3] -= MD5M_D;
10845
10846 digest[0] &= 0x00ffffff;
10847 digest[1] &= 0x00ffffff;
10848 digest[2] &= 0x00ffffff;
10849 digest[3] &= 0x00ffffff;
10850
10851 return (PARSER_OK);
10852 }
10853
10854 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10855 {
10856 if (data.opts_type & OPTS_TYPE_ST_HEX)
10857 {
10858 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10859 }
10860 else
10861 {
10862 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10863 }
10864
10865 u32 *digest = (u32 *) hash_buf->digest;
10866
10867 salt_t *salt = hash_buf->salt;
10868
10869 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10870 | itoa64_to_int (input_buf[ 1]) << 6
10871 | itoa64_to_int (input_buf[ 2]) << 12
10872 | itoa64_to_int (input_buf[ 3]) << 18;
10873 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10874 | itoa64_to_int (input_buf[ 5]) << 6
10875 | itoa64_to_int (input_buf[ 6]) << 12
10876 | itoa64_to_int (input_buf[ 7]) << 18;
10877 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10878 | itoa64_to_int (input_buf[ 9]) << 6
10879 | itoa64_to_int (input_buf[10]) << 12
10880 | itoa64_to_int (input_buf[11]) << 18;
10881 digest[3] = itoa64_to_int (input_buf[12]) << 0
10882 | itoa64_to_int (input_buf[13]) << 6
10883 | itoa64_to_int (input_buf[14]) << 12
10884 | itoa64_to_int (input_buf[15]) << 18;
10885
10886 digest[0] -= MD5M_A;
10887 digest[1] -= MD5M_B;
10888 digest[2] -= MD5M_C;
10889 digest[3] -= MD5M_D;
10890
10891 digest[0] &= 0x00ffffff;
10892 digest[1] &= 0x00ffffff;
10893 digest[2] &= 0x00ffffff;
10894 digest[3] &= 0x00ffffff;
10895
10896 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10897
10898 uint salt_len = input_len - 16 - 1;
10899
10900 char *salt_buf = input_buf + 16 + 1;
10901
10902 char *salt_buf_ptr = (char *) salt->salt_buf;
10903
10904 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10905
10906 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10907
10908 salt->salt_len = salt_len;
10909
10910 return (PARSER_OK);
10911 }
10912
10913 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10914 {
10915 key[0] = (nthash[0] >> 0);
10916 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10917 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10918 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10919 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10920 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10921 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10922 key[7] = (nthash[6] << 1);
10923
10924 key[0] |= 0x01;
10925 key[1] |= 0x01;
10926 key[2] |= 0x01;
10927 key[3] |= 0x01;
10928 key[4] |= 0x01;
10929 key[5] |= 0x01;
10930 key[6] |= 0x01;
10931 key[7] |= 0x01;
10932 }
10933
10934 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10935 {
10936 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10937
10938 u32 *digest = (u32 *) hash_buf->digest;
10939
10940 salt_t *salt = hash_buf->salt;
10941
10942 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10943
10944 /**
10945 * parse line
10946 */
10947
10948 char *user_pos = input_buf;
10949
10950 char *unused_pos = strchr (user_pos, ':');
10951
10952 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10953
10954 uint user_len = unused_pos - user_pos;
10955
10956 if (user_len > 60) return (PARSER_SALT_LENGTH);
10957
10958 unused_pos++;
10959
10960 char *domain_pos = strchr (unused_pos, ':');
10961
10962 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10963
10964 uint unused_len = domain_pos - unused_pos;
10965
10966 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10967
10968 domain_pos++;
10969
10970 char *srvchall_pos = strchr (domain_pos, ':');
10971
10972 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10973
10974 uint domain_len = srvchall_pos - domain_pos;
10975
10976 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10977
10978 srvchall_pos++;
10979
10980 char *hash_pos = strchr (srvchall_pos, ':');
10981
10982 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10983
10984 uint srvchall_len = hash_pos - srvchall_pos;
10985
10986 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10987
10988 hash_pos++;
10989
10990 char *clichall_pos = strchr (hash_pos, ':');
10991
10992 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10993
10994 uint hash_len = clichall_pos - hash_pos;
10995
10996 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10997
10998 clichall_pos++;
10999
11000 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11001
11002 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
11003
11004 /**
11005 * store some data for later use
11006 */
11007
11008 netntlm->user_len = user_len * 2;
11009 netntlm->domain_len = domain_len * 2;
11010 netntlm->srvchall_len = srvchall_len / 2;
11011 netntlm->clichall_len = clichall_len / 2;
11012
11013 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11014 char *chall_ptr = (char *) netntlm->chall_buf;
11015
11016 /**
11017 * handle username and domainname
11018 */
11019
11020 for (uint i = 0; i < user_len; i++)
11021 {
11022 *userdomain_ptr++ = user_pos[i];
11023 *userdomain_ptr++ = 0;
11024 }
11025
11026 for (uint i = 0; i < domain_len; i++)
11027 {
11028 *userdomain_ptr++ = domain_pos[i];
11029 *userdomain_ptr++ = 0;
11030 }
11031
11032 /**
11033 * handle server challenge encoding
11034 */
11035
11036 for (uint i = 0; i < srvchall_len; i += 2)
11037 {
11038 const char p0 = srvchall_pos[i + 0];
11039 const char p1 = srvchall_pos[i + 1];
11040
11041 *chall_ptr++ = hex_convert (p1) << 0
11042 | hex_convert (p0) << 4;
11043 }
11044
11045 /**
11046 * handle client challenge encoding
11047 */
11048
11049 for (uint i = 0; i < clichall_len; i += 2)
11050 {
11051 const char p0 = clichall_pos[i + 0];
11052 const char p1 = clichall_pos[i + 1];
11053
11054 *chall_ptr++ = hex_convert (p1) << 0
11055 | hex_convert (p0) << 4;
11056 }
11057
11058 /**
11059 * store data
11060 */
11061
11062 char *salt_buf_ptr = (char *) salt->salt_buf;
11063
11064 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11065
11066 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11067
11068 salt->salt_len = salt_len;
11069
11070 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11071 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11072 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11073 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11074
11075 digest[0] = byte_swap_32 (digest[0]);
11076 digest[1] = byte_swap_32 (digest[1]);
11077 digest[2] = byte_swap_32 (digest[2]);
11078 digest[3] = byte_swap_32 (digest[3]);
11079
11080 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11081
11082 uint digest_tmp[2] = { 0 };
11083
11084 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11085 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11086
11087 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11088 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11089
11090 /* special case 2: ESS */
11091
11092 if (srvchall_len == 48)
11093 {
11094 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11095 {
11096 uint w[16] = { 0 };
11097
11098 w[ 0] = netntlm->chall_buf[6];
11099 w[ 1] = netntlm->chall_buf[7];
11100 w[ 2] = netntlm->chall_buf[0];
11101 w[ 3] = netntlm->chall_buf[1];
11102 w[ 4] = 0x80;
11103 w[14] = 16 * 8;
11104
11105 uint dgst[4] = { 0 };
11106
11107 dgst[0] = MAGIC_A;
11108 dgst[1] = MAGIC_B;
11109 dgst[2] = MAGIC_C;
11110 dgst[3] = MAGIC_D;
11111
11112 md5_64 (w, dgst);
11113
11114 salt->salt_buf[0] = dgst[0];
11115 salt->salt_buf[1] = dgst[1];
11116 }
11117 }
11118
11119 /* precompute netntlmv1 exploit start */
11120
11121 for (uint i = 0; i < 0x10000; i++)
11122 {
11123 uint key_md4[2] = { i, 0 };
11124 uint key_des[2] = { 0, 0 };
11125
11126 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11127
11128 uint Kc[16] = { 0 };
11129 uint Kd[16] = { 0 };
11130
11131 _des_keysetup (key_des, Kc, Kd, c_skb);
11132
11133 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11134
11135 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11136
11137 if (data3[0] != digest_tmp[0]) continue;
11138 if (data3[1] != digest_tmp[1]) continue;
11139
11140 salt->salt_buf[2] = i;
11141
11142 salt->salt_len = 24;
11143
11144 break;
11145 }
11146
11147 salt->salt_buf_pc[0] = digest_tmp[0];
11148 salt->salt_buf_pc[1] = digest_tmp[1];
11149
11150 /* precompute netntlmv1 exploit stop */
11151
11152 u32 tt;
11153
11154 IP (digest[0], digest[1], tt);
11155 IP (digest[2], digest[3], tt);
11156
11157 digest[0] = rotr32 (digest[0], 29);
11158 digest[1] = rotr32 (digest[1], 29);
11159 digest[2] = rotr32 (digest[2], 29);
11160 digest[3] = rotr32 (digest[3], 29);
11161
11162 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11163
11164 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11165 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11166
11167 return (PARSER_OK);
11168 }
11169
11170 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11171 {
11172 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11173
11174 u32 *digest = (u32 *) hash_buf->digest;
11175
11176 salt_t *salt = hash_buf->salt;
11177
11178 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11179
11180 /**
11181 * parse line
11182 */
11183
11184 char *user_pos = input_buf;
11185
11186 char *unused_pos = strchr (user_pos, ':');
11187
11188 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11189
11190 uint user_len = unused_pos - user_pos;
11191
11192 if (user_len > 60) return (PARSER_SALT_LENGTH);
11193
11194 unused_pos++;
11195
11196 char *domain_pos = strchr (unused_pos, ':');
11197
11198 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11199
11200 uint unused_len = domain_pos - unused_pos;
11201
11202 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11203
11204 domain_pos++;
11205
11206 char *srvchall_pos = strchr (domain_pos, ':');
11207
11208 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11209
11210 uint domain_len = srvchall_pos - domain_pos;
11211
11212 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11213
11214 srvchall_pos++;
11215
11216 char *hash_pos = strchr (srvchall_pos, ':');
11217
11218 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11219
11220 uint srvchall_len = hash_pos - srvchall_pos;
11221
11222 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11223
11224 hash_pos++;
11225
11226 char *clichall_pos = strchr (hash_pos, ':');
11227
11228 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11229
11230 uint hash_len = clichall_pos - hash_pos;
11231
11232 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11233
11234 clichall_pos++;
11235
11236 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11237
11238 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11239
11240 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11241
11242 /**
11243 * store some data for later use
11244 */
11245
11246 netntlm->user_len = user_len * 2;
11247 netntlm->domain_len = domain_len * 2;
11248 netntlm->srvchall_len = srvchall_len / 2;
11249 netntlm->clichall_len = clichall_len / 2;
11250
11251 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11252 char *chall_ptr = (char *) netntlm->chall_buf;
11253
11254 /**
11255 * handle username and domainname
11256 */
11257
11258 for (uint i = 0; i < user_len; i++)
11259 {
11260 *userdomain_ptr++ = toupper (user_pos[i]);
11261 *userdomain_ptr++ = 0;
11262 }
11263
11264 for (uint i = 0; i < domain_len; i++)
11265 {
11266 *userdomain_ptr++ = domain_pos[i];
11267 *userdomain_ptr++ = 0;
11268 }
11269
11270 *userdomain_ptr++ = 0x80;
11271
11272 /**
11273 * handle server challenge encoding
11274 */
11275
11276 for (uint i = 0; i < srvchall_len; i += 2)
11277 {
11278 const char p0 = srvchall_pos[i + 0];
11279 const char p1 = srvchall_pos[i + 1];
11280
11281 *chall_ptr++ = hex_convert (p1) << 0
11282 | hex_convert (p0) << 4;
11283 }
11284
11285 /**
11286 * handle client challenge encoding
11287 */
11288
11289 for (uint i = 0; i < clichall_len; i += 2)
11290 {
11291 const char p0 = clichall_pos[i + 0];
11292 const char p1 = clichall_pos[i + 1];
11293
11294 *chall_ptr++ = hex_convert (p1) << 0
11295 | hex_convert (p0) << 4;
11296 }
11297
11298 *chall_ptr++ = 0x80;
11299
11300 /**
11301 * handle hash itself
11302 */
11303
11304 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11305 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11306 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11307 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11308
11309 digest[0] = byte_swap_32 (digest[0]);
11310 digest[1] = byte_swap_32 (digest[1]);
11311 digest[2] = byte_swap_32 (digest[2]);
11312 digest[3] = byte_swap_32 (digest[3]);
11313
11314 /**
11315 * reuse challange data as salt_buf, its the buffer that is most likely unique
11316 */
11317
11318 salt->salt_buf[0] = 0;
11319 salt->salt_buf[1] = 0;
11320 salt->salt_buf[2] = 0;
11321 salt->salt_buf[3] = 0;
11322 salt->salt_buf[4] = 0;
11323 salt->salt_buf[5] = 0;
11324 salt->salt_buf[6] = 0;
11325 salt->salt_buf[7] = 0;
11326
11327 uint *uptr;
11328
11329 uptr = (uint *) netntlm->userdomain_buf;
11330
11331 for (uint i = 0; i < 16; i += 16)
11332 {
11333 md5_64 (uptr, salt->salt_buf);
11334 }
11335
11336 uptr = (uint *) netntlm->chall_buf;
11337
11338 for (uint i = 0; i < 256; i += 16)
11339 {
11340 md5_64 (uptr, salt->salt_buf);
11341 }
11342
11343 salt->salt_len = 16;
11344
11345 return (PARSER_OK);
11346 }
11347
11348 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11349 {
11350 if (data.opts_type & OPTS_TYPE_ST_HEX)
11351 {
11352 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11353 }
11354 else
11355 {
11356 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11357 }
11358
11359 u32 *digest = (u32 *) hash_buf->digest;
11360
11361 salt_t *salt = hash_buf->salt;
11362
11363 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11364 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11365 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11366 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11367
11368 digest[0] = byte_swap_32 (digest[0]);
11369 digest[1] = byte_swap_32 (digest[1]);
11370 digest[2] = byte_swap_32 (digest[2]);
11371 digest[3] = byte_swap_32 (digest[3]);
11372
11373 digest[0] -= MD5M_A;
11374 digest[1] -= MD5M_B;
11375 digest[2] -= MD5M_C;
11376 digest[3] -= MD5M_D;
11377
11378 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11379
11380 uint salt_len = input_len - 32 - 1;
11381
11382 char *salt_buf = input_buf + 32 + 1;
11383
11384 char *salt_buf_ptr = (char *) salt->salt_buf;
11385
11386 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11387
11388 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11389
11390 salt->salt_len = salt_len;
11391
11392 return (PARSER_OK);
11393 }
11394
11395 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11396 {
11397 if (data.opts_type & OPTS_TYPE_ST_HEX)
11398 {
11399 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11400 }
11401 else
11402 {
11403 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11404 }
11405
11406 u32 *digest = (u32 *) hash_buf->digest;
11407
11408 salt_t *salt = hash_buf->salt;
11409
11410 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11411 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11412 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11413 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11414
11415 digest[0] = byte_swap_32 (digest[0]);
11416 digest[1] = byte_swap_32 (digest[1]);
11417 digest[2] = byte_swap_32 (digest[2]);
11418 digest[3] = byte_swap_32 (digest[3]);
11419
11420 digest[0] -= MD5M_A;
11421 digest[1] -= MD5M_B;
11422 digest[2] -= MD5M_C;
11423 digest[3] -= MD5M_D;
11424
11425 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11426
11427 uint salt_len = input_len - 32 - 1;
11428
11429 char *salt_buf = input_buf + 32 + 1;
11430
11431 char *salt_buf_ptr = (char *) salt->salt_buf;
11432
11433 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11434
11435 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11436
11437 salt->salt_len = salt_len;
11438
11439 return (PARSER_OK);
11440 }
11441
11442 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11443 {
11444 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11445
11446 u32 *digest = (u32 *) hash_buf->digest;
11447
11448 salt_t *salt = hash_buf->salt;
11449
11450 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11451 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11452 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11453 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11454
11455 digest[0] = byte_swap_32 (digest[0]);
11456 digest[1] = byte_swap_32 (digest[1]);
11457 digest[2] = byte_swap_32 (digest[2]);
11458 digest[3] = byte_swap_32 (digest[3]);
11459
11460 digest[0] -= MD5M_A;
11461 digest[1] -= MD5M_B;
11462 digest[2] -= MD5M_C;
11463 digest[3] -= MD5M_D;
11464
11465 /**
11466 * This is a virtual salt. While the algorithm is basically not salted
11467 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11468 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11469 */
11470
11471 char *salt_buf_ptr = (char *) salt->salt_buf;
11472
11473 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11474
11475 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11476
11477 salt->salt_len = salt_len;
11478
11479 return (PARSER_OK);
11480 }
11481
11482 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11483 {
11484 if (data.opts_type & OPTS_TYPE_ST_HEX)
11485 {
11486 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11487 }
11488 else
11489 {
11490 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11491 }
11492
11493 u32 *digest = (u32 *) hash_buf->digest;
11494
11495 salt_t *salt = hash_buf->salt;
11496
11497 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11498 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11499 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11500 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11501
11502 digest[0] = byte_swap_32 (digest[0]);
11503 digest[1] = byte_swap_32 (digest[1]);
11504 digest[2] = byte_swap_32 (digest[2]);
11505 digest[3] = byte_swap_32 (digest[3]);
11506
11507 digest[0] -= MD5M_A;
11508 digest[1] -= MD5M_B;
11509 digest[2] -= MD5M_C;
11510 digest[3] -= MD5M_D;
11511
11512 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11513
11514 uint salt_len = input_len - 32 - 1;
11515
11516 char *salt_buf = input_buf + 32 + 1;
11517
11518 char *salt_buf_ptr = (char *) salt->salt_buf;
11519
11520 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11521
11522 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11523
11524 salt->salt_len = salt_len;
11525
11526 return (PARSER_OK);
11527 }
11528
11529 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11530 {
11531 if (data.opts_type & OPTS_TYPE_ST_HEX)
11532 {
11533 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11534 }
11535 else
11536 {
11537 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11538 }
11539
11540 u32 *digest = (u32 *) hash_buf->digest;
11541
11542 salt_t *salt = hash_buf->salt;
11543
11544 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11545 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11546 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11547 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11548
11549 digest[0] = byte_swap_32 (digest[0]);
11550 digest[1] = byte_swap_32 (digest[1]);
11551 digest[2] = byte_swap_32 (digest[2]);
11552 digest[3] = byte_swap_32 (digest[3]);
11553
11554 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11555
11556 uint salt_len = input_len - 32 - 1;
11557
11558 char *salt_buf = input_buf + 32 + 1;
11559
11560 char *salt_buf_ptr = (char *) salt->salt_buf;
11561
11562 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11563
11564 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11565
11566 salt->salt_len = salt_len;
11567
11568 return (PARSER_OK);
11569 }
11570
11571 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11572 {
11573 if (data.opts_type & OPTS_TYPE_ST_HEX)
11574 {
11575 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11576 }
11577 else
11578 {
11579 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11580 }
11581
11582 u32 *digest = (u32 *) hash_buf->digest;
11583
11584 salt_t *salt = hash_buf->salt;
11585
11586 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11587 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11588 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11589 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11590
11591 digest[0] = byte_swap_32 (digest[0]);
11592 digest[1] = byte_swap_32 (digest[1]);
11593 digest[2] = byte_swap_32 (digest[2]);
11594 digest[3] = byte_swap_32 (digest[3]);
11595
11596 digest[0] -= MD4M_A;
11597 digest[1] -= MD4M_B;
11598 digest[2] -= MD4M_C;
11599 digest[3] -= MD4M_D;
11600
11601 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11602
11603 uint salt_len = input_len - 32 - 1;
11604
11605 char *salt_buf = input_buf + 32 + 1;
11606
11607 char *salt_buf_ptr = (char *) salt->salt_buf;
11608
11609 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11610
11611 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11612
11613 salt->salt_len = salt_len;
11614
11615 return (PARSER_OK);
11616 }
11617
11618 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11619 {
11620 if (data.opts_type & OPTS_TYPE_ST_HEX)
11621 {
11622 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11623 }
11624 else
11625 {
11626 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11627 }
11628
11629 u32 *digest = (u32 *) hash_buf->digest;
11630
11631 salt_t *salt = hash_buf->salt;
11632
11633 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11634 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11635 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11636 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11637
11638 digest[0] = byte_swap_32 (digest[0]);
11639 digest[1] = byte_swap_32 (digest[1]);
11640 digest[2] = byte_swap_32 (digest[2]);
11641 digest[3] = byte_swap_32 (digest[3]);
11642
11643 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11644
11645 uint salt_len = input_len - 32 - 1;
11646
11647 char *salt_buf = input_buf + 32 + 1;
11648
11649 uint salt_pc_block[16] = { 0 };
11650
11651 char *salt_pc_block_ptr = (char *) salt_pc_block;
11652
11653 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11654
11655 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11656
11657 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11658
11659 salt_pc_block[14] = salt_len * 8;
11660
11661 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11662
11663 md5_64 (salt_pc_block, salt_pc_digest);
11664
11665 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11666 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11667 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11668 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11669
11670 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11671
11672 memcpy (salt_buf_ptr, salt_buf, salt_len);
11673
11674 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11675
11676 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11677 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11678 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11679 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11680
11681 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11682
11683 return (PARSER_OK);
11684 }
11685
11686 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11687 {
11688 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11689
11690 u32 *digest = (u32 *) hash_buf->digest;
11691
11692 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11693 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11694 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11695 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11696 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11697
11698 digest[0] -= SHA1M_A;
11699 digest[1] -= SHA1M_B;
11700 digest[2] -= SHA1M_C;
11701 digest[3] -= SHA1M_D;
11702 digest[4] -= SHA1M_E;
11703
11704 return (PARSER_OK);
11705 }
11706
11707 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11708 {
11709 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11710
11711 u32 *digest = (u32 *) hash_buf->digest;
11712
11713 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11714 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11715 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11716 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11717 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11718
11719 return (PARSER_OK);
11720 }
11721
11722 int sha1axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11723 {
11724 if ((input_len < DISPLAY_LEN_MIN_13300) || (input_len > DISPLAY_LEN_MAX_13300)) return (PARSER_GLOBAL_LENGTH);
11725
11726 if (memcmp (SIGNATURE_AXCRYPT_SHA1, input_buf, 13)) return (PARSER_SIGNATURE_UNMATCHED);
11727
11728 u32 *digest = (u32 *) hash_buf->digest;
11729
11730 input_buf +=14;
11731
11732 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11733 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11734 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11735 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11736 digest[4] = 0x00000000;
11737
11738 return (PARSER_OK);
11739 }
11740
11741 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11742 {
11743 if (data.opts_type & OPTS_TYPE_ST_HEX)
11744 {
11745 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11746 }
11747 else
11748 {
11749 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11750 }
11751
11752 u32 *digest = (u32 *) hash_buf->digest;
11753
11754 salt_t *salt = hash_buf->salt;
11755
11756 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11757 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11758 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11759 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11760 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11761
11762 digest[0] -= SHA1M_A;
11763 digest[1] -= SHA1M_B;
11764 digest[2] -= SHA1M_C;
11765 digest[3] -= SHA1M_D;
11766 digest[4] -= SHA1M_E;
11767
11768 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11769
11770 uint salt_len = input_len - 40 - 1;
11771
11772 char *salt_buf = input_buf + 40 + 1;
11773
11774 char *salt_buf_ptr = (char *) salt->salt_buf;
11775
11776 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11777
11778 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11779
11780 salt->salt_len = salt_len;
11781
11782 return (PARSER_OK);
11783 }
11784
11785 int pstoken_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11786 {
11787 if ((input_len < DISPLAY_LEN_MIN_13500) || (input_len > DISPLAY_LEN_MAX_13500)) return (PARSER_GLOBAL_LENGTH);
11788
11789 u32 *digest = (u32 *) hash_buf->digest;
11790
11791 salt_t *salt = hash_buf->salt;
11792
11793 pstoken_t *pstoken = (pstoken_t *) hash_buf->esalt;
11794
11795 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11796 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11797 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11798 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11799 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11800
11801 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11802
11803 uint salt_len = input_len - 40 - 1;
11804
11805 char *salt_buf = input_buf + 40 + 1;
11806
11807 if (salt_len == UINT_MAX || salt_len % 2 != 0) return (PARSER_SALT_LENGTH);
11808
11809 u8 *pstoken_ptr = (u8 *) pstoken->salt_buf;
11810
11811 for (uint i = 0, j = 0; i < salt_len; i += 2, j += 1)
11812 {
11813 pstoken_ptr[j] = hex_to_u8 ((const u8 *) &salt_buf[i]);
11814 }
11815
11816 pstoken->salt_len = salt_len / 2;
11817
11818 salt->salt_len = 32;
11819
11820 /* some fake salt for the sorting mechanisms */
11821
11822 salt->salt_buf[0] = pstoken->salt_buf[0];
11823 salt->salt_buf[1] = pstoken->salt_buf[1];
11824 salt->salt_buf[2] = pstoken->salt_buf[2];
11825 salt->salt_buf[3] = pstoken->salt_buf[3];
11826 salt->salt_buf[4] = pstoken->salt_buf[4];
11827 salt->salt_buf[5] = pstoken->salt_buf[5];
11828 salt->salt_buf[6] = pstoken->salt_buf[6];
11829 salt->salt_buf[7] = pstoken->salt_buf[7];
11830
11831 salt->salt_len = 32;
11832
11833 /* we need to check if we can precompute some of the data --
11834 this is possible since the scheme is badly designed */
11835
11836 pstoken->pc_digest[0] = SHA1M_A;
11837 pstoken->pc_digest[1] = SHA1M_B;
11838 pstoken->pc_digest[2] = SHA1M_C;
11839 pstoken->pc_digest[3] = SHA1M_D;
11840 pstoken->pc_digest[4] = SHA1M_E;
11841
11842 pstoken->pc_offset = 0;
11843
11844 for (uint i = 0; i < pstoken->salt_len - 64; i += 64)
11845 {
11846 uint w[16];
11847
11848 w[ 0] = byte_swap_32 (pstoken->salt_buf[i + 0]);
11849 w[ 1] = byte_swap_32 (pstoken->salt_buf[i + 1]);
11850 w[ 2] = byte_swap_32 (pstoken->salt_buf[i + 2]);
11851 w[ 3] = byte_swap_32 (pstoken->salt_buf[i + 3]);
11852 w[ 4] = byte_swap_32 (pstoken->salt_buf[i + 4]);
11853 w[ 5] = byte_swap_32 (pstoken->salt_buf[i + 5]);
11854 w[ 6] = byte_swap_32 (pstoken->salt_buf[i + 6]);
11855 w[ 7] = byte_swap_32 (pstoken->salt_buf[i + 7]);
11856 w[ 8] = byte_swap_32 (pstoken->salt_buf[i + 8]);
11857 w[ 9] = byte_swap_32 (pstoken->salt_buf[i + 9]);
11858 w[10] = byte_swap_32 (pstoken->salt_buf[i + 10]);
11859 w[11] = byte_swap_32 (pstoken->salt_buf[i + 11]);
11860 w[12] = byte_swap_32 (pstoken->salt_buf[i + 12]);
11861 w[13] = byte_swap_32 (pstoken->salt_buf[i + 13]);
11862 w[14] = byte_swap_32 (pstoken->salt_buf[i + 14]);
11863 w[15] = byte_swap_32 (pstoken->salt_buf[i + 15]);
11864
11865 sha1_64 (w, pstoken->pc_digest);
11866
11867 pstoken->pc_offset += 16;
11868 }
11869
11870 return (PARSER_OK);
11871 }
11872
11873
11874 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11875 {
11876 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11877
11878 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11879
11880 u32 *digest = (u32 *) hash_buf->digest;
11881
11882 u8 tmp_buf[100] = { 0 };
11883
11884 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11885
11886 memcpy (digest, tmp_buf, 20);
11887
11888 digest[0] = byte_swap_32 (digest[0]);
11889 digest[1] = byte_swap_32 (digest[1]);
11890 digest[2] = byte_swap_32 (digest[2]);
11891 digest[3] = byte_swap_32 (digest[3]);
11892 digest[4] = byte_swap_32 (digest[4]);
11893
11894 digest[0] -= SHA1M_A;
11895 digest[1] -= SHA1M_B;
11896 digest[2] -= SHA1M_C;
11897 digest[3] -= SHA1M_D;
11898 digest[4] -= SHA1M_E;
11899
11900 return (PARSER_OK);
11901 }
11902
11903 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11904 {
11905 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11906
11907 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11908
11909 u32 *digest = (u32 *) hash_buf->digest;
11910
11911 salt_t *salt = hash_buf->salt;
11912
11913 u8 tmp_buf[100] = { 0 };
11914
11915 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11916
11917 if (tmp_len < 20) return (PARSER_HASH_LENGTH);
11918
11919 memcpy (digest, tmp_buf, 20);
11920
11921 int salt_len = tmp_len - 20;
11922
11923 if (salt_len < 0) return (PARSER_SALT_LENGTH);
11924
11925 salt->salt_len = salt_len;
11926
11927 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11928
11929 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11930 {
11931 char *ptr = (char *) salt->salt_buf;
11932
11933 ptr[salt->salt_len] = 0x80;
11934 }
11935
11936 digest[0] = byte_swap_32 (digest[0]);
11937 digest[1] = byte_swap_32 (digest[1]);
11938 digest[2] = byte_swap_32 (digest[2]);
11939 digest[3] = byte_swap_32 (digest[3]);
11940 digest[4] = byte_swap_32 (digest[4]);
11941
11942 digest[0] -= SHA1M_A;
11943 digest[1] -= SHA1M_B;
11944 digest[2] -= SHA1M_C;
11945 digest[3] -= SHA1M_D;
11946 digest[4] -= SHA1M_E;
11947
11948 return (PARSER_OK);
11949 }
11950
11951 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11952 {
11953 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11954
11955 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11956
11957 u32 *digest = (u32 *) hash_buf->digest;
11958
11959 salt_t *salt = hash_buf->salt;
11960
11961 char *salt_buf = input_buf + 6;
11962
11963 uint salt_len = 8;
11964
11965 char *salt_buf_ptr = (char *) salt->salt_buf;
11966
11967 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11968
11969 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11970
11971 salt->salt_len = salt_len;
11972
11973 char *hash_pos = input_buf + 6 + 8 + 40;
11974
11975 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11976 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11977 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11978 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11979 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11980
11981 digest[0] -= SHA1M_A;
11982 digest[1] -= SHA1M_B;
11983 digest[2] -= SHA1M_C;
11984 digest[3] -= SHA1M_D;
11985 digest[4] -= SHA1M_E;
11986
11987 return (PARSER_OK);
11988 }
11989
11990 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11991 {
11992 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11993
11994 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11995
11996 u32 *digest = (u32 *) hash_buf->digest;
11997
11998 salt_t *salt = hash_buf->salt;
11999
12000 char *salt_buf = input_buf + 6;
12001
12002 uint salt_len = 8;
12003
12004 char *salt_buf_ptr = (char *) salt->salt_buf;
12005
12006 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12007
12008 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12009
12010 salt->salt_len = salt_len;
12011
12012 char *hash_pos = input_buf + 6 + 8;
12013
12014 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12015 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12016 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12017 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12018 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12019
12020 digest[0] -= SHA1M_A;
12021 digest[1] -= SHA1M_B;
12022 digest[2] -= SHA1M_C;
12023 digest[3] -= SHA1M_D;
12024 digest[4] -= SHA1M_E;
12025
12026 return (PARSER_OK);
12027 }
12028
12029 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12030 {
12031 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
12032
12033 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12034
12035 u64 *digest = (u64 *) hash_buf->digest;
12036
12037 salt_t *salt = hash_buf->salt;
12038
12039 char *salt_buf = input_buf + 6;
12040
12041 uint salt_len = 8;
12042
12043 char *salt_buf_ptr = (char *) salt->salt_buf;
12044
12045 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12046
12047 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12048
12049 salt->salt_len = salt_len;
12050
12051 char *hash_pos = input_buf + 6 + 8;
12052
12053 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12054 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12055 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12056 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12057 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12058 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12059 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12060 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12061
12062 digest[0] -= SHA512M_A;
12063 digest[1] -= SHA512M_B;
12064 digest[2] -= SHA512M_C;
12065 digest[3] -= SHA512M_D;
12066 digest[4] -= SHA512M_E;
12067 digest[5] -= SHA512M_F;
12068 digest[6] -= SHA512M_G;
12069 digest[7] -= SHA512M_H;
12070
12071 return (PARSER_OK);
12072 }
12073
12074 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12075 {
12076 if (data.opts_type & OPTS_TYPE_ST_HEX)
12077 {
12078 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
12079 }
12080 else
12081 {
12082 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
12083 }
12084
12085 u32 *digest = (u32 *) hash_buf->digest;
12086
12087 salt_t *salt = hash_buf->salt;
12088
12089 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12090 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12091 digest[2] = 0;
12092 digest[3] = 0;
12093
12094 digest[0] = byte_swap_32 (digest[0]);
12095 digest[1] = byte_swap_32 (digest[1]);
12096
12097 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12098
12099 uint salt_len = input_len - 16 - 1;
12100
12101 char *salt_buf = input_buf + 16 + 1;
12102
12103 char *salt_buf_ptr = (char *) salt->salt_buf;
12104
12105 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12106
12107 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12108
12109 salt->salt_len = salt_len;
12110
12111 return (PARSER_OK);
12112 }
12113
12114 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12115 {
12116 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
12117
12118 u32 *digest = (u32 *) hash_buf->digest;
12119
12120 salt_t *salt = hash_buf->salt;
12121
12122 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12123 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12124 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12125 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12126 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12127
12128 digest[0] -= SHA1M_A;
12129 digest[1] -= SHA1M_B;
12130 digest[2] -= SHA1M_C;
12131 digest[3] -= SHA1M_D;
12132 digest[4] -= SHA1M_E;
12133
12134 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12135
12136 uint salt_len = input_len - 40 - 1;
12137
12138 char *salt_buf = input_buf + 40 + 1;
12139
12140 char *salt_buf_ptr = (char *) salt->salt_buf;
12141
12142 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12143
12144 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12145
12146 salt->salt_len = salt_len;
12147
12148 return (PARSER_OK);
12149 }
12150
12151 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12152 {
12153 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
12154
12155 u32 *digest = (u32 *) hash_buf->digest;
12156
12157 salt_t *salt = hash_buf->salt;
12158
12159 char *hash_pos = input_buf;
12160
12161 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12162 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12163 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
12164 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
12165 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
12166 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
12167 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
12168 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
12169 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12170 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12171 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12172 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12173 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12174 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12175 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12176 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12177
12178 char *salt_pos = input_buf + 128;
12179
12180 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12181 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12182 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12183 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12184
12185 salt->salt_iter = ROUNDS_ORACLET - 1;
12186 salt->salt_len = 16;
12187
12188 return (PARSER_OK);
12189 }
12190
12191 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12192 {
12193 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12194
12195 u32 *digest = (u32 *) hash_buf->digest;
12196
12197 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12198 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12199 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12200 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12201 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12202 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12203 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12204 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12205
12206 digest[0] -= SHA256M_A;
12207 digest[1] -= SHA256M_B;
12208 digest[2] -= SHA256M_C;
12209 digest[3] -= SHA256M_D;
12210 digest[4] -= SHA256M_E;
12211 digest[5] -= SHA256M_F;
12212 digest[6] -= SHA256M_G;
12213 digest[7] -= SHA256M_H;
12214
12215 return (PARSER_OK);
12216 }
12217
12218 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12219 {
12220 if (data.opts_type & OPTS_TYPE_ST_HEX)
12221 {
12222 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12223 }
12224 else
12225 {
12226 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
12227 }
12228
12229 u32 *digest = (u32 *) hash_buf->digest;
12230
12231 salt_t *salt = hash_buf->salt;
12232
12233 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12234 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12235 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12236 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12237 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12238 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12239 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12240 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12241
12242 digest[0] -= SHA256M_A;
12243 digest[1] -= SHA256M_B;
12244 digest[2] -= SHA256M_C;
12245 digest[3] -= SHA256M_D;
12246 digest[4] -= SHA256M_E;
12247 digest[5] -= SHA256M_F;
12248 digest[6] -= SHA256M_G;
12249 digest[7] -= SHA256M_H;
12250
12251 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12252
12253 uint salt_len = input_len - 64 - 1;
12254
12255 char *salt_buf = input_buf + 64 + 1;
12256
12257 char *salt_buf_ptr = (char *) salt->salt_buf;
12258
12259 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12260
12261 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12262
12263 salt->salt_len = salt_len;
12264
12265 return (PARSER_OK);
12266 }
12267
12268 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12269 {
12270 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12271
12272 u64 *digest = (u64 *) hash_buf->digest;
12273
12274 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12275 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12276 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12277 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12278 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12279 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12280 digest[6] = 0;
12281 digest[7] = 0;
12282
12283 digest[0] -= SHA384M_A;
12284 digest[1] -= SHA384M_B;
12285 digest[2] -= SHA384M_C;
12286 digest[3] -= SHA384M_D;
12287 digest[4] -= SHA384M_E;
12288 digest[5] -= SHA384M_F;
12289 digest[6] -= 0;
12290 digest[7] -= 0;
12291
12292 return (PARSER_OK);
12293 }
12294
12295 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12296 {
12297 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12298
12299 u64 *digest = (u64 *) hash_buf->digest;
12300
12301 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12302 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12303 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12304 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12305 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12306 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12307 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12308 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12309
12310 digest[0] -= SHA512M_A;
12311 digest[1] -= SHA512M_B;
12312 digest[2] -= SHA512M_C;
12313 digest[3] -= SHA512M_D;
12314 digest[4] -= SHA512M_E;
12315 digest[5] -= SHA512M_F;
12316 digest[6] -= SHA512M_G;
12317 digest[7] -= SHA512M_H;
12318
12319 return (PARSER_OK);
12320 }
12321
12322 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12323 {
12324 if (data.opts_type & OPTS_TYPE_ST_HEX)
12325 {
12326 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12327 }
12328 else
12329 {
12330 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12331 }
12332
12333 u64 *digest = (u64 *) hash_buf->digest;
12334
12335 salt_t *salt = hash_buf->salt;
12336
12337 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12338 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12339 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12340 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12341 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12342 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12343 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12344 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12345
12346 digest[0] -= SHA512M_A;
12347 digest[1] -= SHA512M_B;
12348 digest[2] -= SHA512M_C;
12349 digest[3] -= SHA512M_D;
12350 digest[4] -= SHA512M_E;
12351 digest[5] -= SHA512M_F;
12352 digest[6] -= SHA512M_G;
12353 digest[7] -= SHA512M_H;
12354
12355 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12356
12357 uint salt_len = input_len - 128 - 1;
12358
12359 char *salt_buf = input_buf + 128 + 1;
12360
12361 char *salt_buf_ptr = (char *) salt->salt_buf;
12362
12363 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12364
12365 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12366
12367 salt->salt_len = salt_len;
12368
12369 return (PARSER_OK);
12370 }
12371
12372 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12373 {
12374 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12375
12376 u64 *digest = (u64 *) hash_buf->digest;
12377
12378 salt_t *salt = hash_buf->salt;
12379
12380 char *salt_pos = input_buf + 3;
12381
12382 uint iterations_len = 0;
12383
12384 if (memcmp (salt_pos, "rounds=", 7) == 0)
12385 {
12386 salt_pos += 7;
12387
12388 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12389
12390 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12391 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12392
12393 salt_pos[0] = 0x0;
12394
12395 salt->salt_iter = atoi (salt_pos - iterations_len);
12396
12397 salt_pos += 1;
12398
12399 iterations_len += 8;
12400 }
12401 else
12402 {
12403 salt->salt_iter = ROUNDS_SHA512CRYPT;
12404 }
12405
12406 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12407
12408 char *hash_pos = strchr (salt_pos, '$');
12409
12410 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12411
12412 uint salt_len = hash_pos - salt_pos;
12413
12414 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12415
12416 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12417
12418 salt->salt_len = salt_len;
12419
12420 hash_pos++;
12421
12422 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12423
12424 return (PARSER_OK);
12425 }
12426
12427 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12428 {
12429 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12430
12431 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12432
12433 u64 *digest = (u64 *) hash_buf->digest;
12434
12435 salt_t *salt = hash_buf->salt;
12436
12437 uint keccak_mdlen = input_len / 2;
12438
12439 for (uint i = 0; i < keccak_mdlen / 8; i++)
12440 {
12441 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12442
12443 digest[i] = byte_swap_64 (digest[i]);
12444 }
12445
12446 salt->keccak_mdlen = keccak_mdlen;
12447
12448 return (PARSER_OK);
12449 }
12450
12451 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12452 {
12453 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12454
12455 u32 *digest = (u32 *) hash_buf->digest;
12456
12457 salt_t *salt = hash_buf->salt;
12458
12459 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12460
12461 /**
12462 * Parse that strange long line
12463 */
12464
12465 char *in_off[9];
12466
12467 size_t in_len[9] = { 0 };
12468
12469 in_off[0] = strtok (input_buf, ":");
12470
12471 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12472
12473 in_len[0] = strlen (in_off[0]);
12474
12475 size_t i;
12476
12477 for (i = 1; i < 9; i++)
12478 {
12479 in_off[i] = strtok (NULL, ":");
12480
12481 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12482
12483 in_len[i] = strlen (in_off[i]);
12484 }
12485
12486 char *ptr = (char *) ikepsk->msg_buf;
12487
12488 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12489 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12490 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12491 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12492 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12493 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12494
12495 *ptr = 0x80;
12496
12497 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12498
12499 ptr = (char *) ikepsk->nr_buf;
12500
12501 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12502 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12503
12504 *ptr = 0x80;
12505
12506 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12507
12508 /**
12509 * Store to database
12510 */
12511
12512 ptr = in_off[8];
12513
12514 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12515 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12516 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12517 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12518
12519 digest[0] = byte_swap_32 (digest[0]);
12520 digest[1] = byte_swap_32 (digest[1]);
12521 digest[2] = byte_swap_32 (digest[2]);
12522 digest[3] = byte_swap_32 (digest[3]);
12523
12524 salt->salt_len = 32;
12525
12526 salt->salt_buf[0] = ikepsk->nr_buf[0];
12527 salt->salt_buf[1] = ikepsk->nr_buf[1];
12528 salt->salt_buf[2] = ikepsk->nr_buf[2];
12529 salt->salt_buf[3] = ikepsk->nr_buf[3];
12530 salt->salt_buf[4] = ikepsk->nr_buf[4];
12531 salt->salt_buf[5] = ikepsk->nr_buf[5];
12532 salt->salt_buf[6] = ikepsk->nr_buf[6];
12533 salt->salt_buf[7] = ikepsk->nr_buf[7];
12534
12535 return (PARSER_OK);
12536 }
12537
12538 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12539 {
12540 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12541
12542 u32 *digest = (u32 *) hash_buf->digest;
12543
12544 salt_t *salt = hash_buf->salt;
12545
12546 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12547
12548 /**
12549 * Parse that strange long line
12550 */
12551
12552 char *in_off[9];
12553
12554 size_t in_len[9] = { 0 };
12555
12556 in_off[0] = strtok (input_buf, ":");
12557
12558 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12559
12560 in_len[0] = strlen (in_off[0]);
12561
12562 size_t i;
12563
12564 for (i = 1; i < 9; i++)
12565 {
12566 in_off[i] = strtok (NULL, ":");
12567
12568 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12569
12570 in_len[i] = strlen (in_off[i]);
12571 }
12572
12573 char *ptr = (char *) ikepsk->msg_buf;
12574
12575 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12576 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12577 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12578 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12579 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12580 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12581
12582 *ptr = 0x80;
12583
12584 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12585
12586 ptr = (char *) ikepsk->nr_buf;
12587
12588 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12589 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12590
12591 *ptr = 0x80;
12592
12593 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12594
12595 /**
12596 * Store to database
12597 */
12598
12599 ptr = in_off[8];
12600
12601 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12602 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12603 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12604 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12605 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12606
12607 salt->salt_len = 32;
12608
12609 salt->salt_buf[0] = ikepsk->nr_buf[0];
12610 salt->salt_buf[1] = ikepsk->nr_buf[1];
12611 salt->salt_buf[2] = ikepsk->nr_buf[2];
12612 salt->salt_buf[3] = ikepsk->nr_buf[3];
12613 salt->salt_buf[4] = ikepsk->nr_buf[4];
12614 salt->salt_buf[5] = ikepsk->nr_buf[5];
12615 salt->salt_buf[6] = ikepsk->nr_buf[6];
12616 salt->salt_buf[7] = ikepsk->nr_buf[7];
12617
12618 return (PARSER_OK);
12619 }
12620
12621 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12622 {
12623 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12624
12625 u32 *digest = (u32 *) hash_buf->digest;
12626
12627 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12628 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12629 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12630 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12631 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12632
12633 digest[0] = byte_swap_32 (digest[0]);
12634 digest[1] = byte_swap_32 (digest[1]);
12635 digest[2] = byte_swap_32 (digest[2]);
12636 digest[3] = byte_swap_32 (digest[3]);
12637 digest[4] = byte_swap_32 (digest[4]);
12638
12639 return (PARSER_OK);
12640 }
12641
12642 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12643 {
12644 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12645
12646 u32 *digest = (u32 *) hash_buf->digest;
12647
12648 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12649 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12650 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12651 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12652 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12653 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12654 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12655 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12656 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12657 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12658 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12659 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12660 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12661 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12662 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12663 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12664
12665 return (PARSER_OK);
12666 }
12667
12668 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12669 {
12670 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12671
12672 u32 *digest = (u32 *) hash_buf->digest;
12673
12674 salt_t *salt = hash_buf->salt;
12675
12676 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12677 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12678 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12679 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12680 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12681
12682 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12683
12684 uint salt_len = input_len - 40 - 1;
12685
12686 char *salt_buf = input_buf + 40 + 1;
12687
12688 char *salt_buf_ptr = (char *) salt->salt_buf;
12689
12690 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12691
12692 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12693
12694 salt->salt_len = salt_len;
12695
12696 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12697
12698 return (PARSER_OK);
12699 }
12700
12701 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12702 {
12703 u32 *digest = (u32 *) hash_buf->digest;
12704
12705 salt_t *salt = hash_buf->salt;
12706
12707 tc_t *tc = (tc_t *) hash_buf->esalt;
12708
12709 if (input_len == 0)
12710 {
12711 log_error ("TrueCrypt container not specified");
12712
12713 exit (-1);
12714 }
12715
12716 FILE *fp = fopen (input_buf, "rb");
12717
12718 if (fp == NULL)
12719 {
12720 log_error ("%s: %s", input_buf, strerror (errno));
12721
12722 exit (-1);
12723 }
12724
12725 char buf[512] = { 0 };
12726
12727 int n = fread (buf, 1, sizeof (buf), fp);
12728
12729 fclose (fp);
12730
12731 if (n != 512) return (PARSER_TC_FILE_SIZE);
12732
12733 memcpy (tc->salt_buf, buf, 64);
12734
12735 memcpy (tc->data_buf, buf + 64, 512 - 64);
12736
12737 salt->salt_buf[0] = tc->salt_buf[0];
12738
12739 salt->salt_len = 4;
12740
12741 salt->salt_iter = 1000 - 1;
12742
12743 digest[0] = tc->data_buf[0];
12744
12745 return (PARSER_OK);
12746 }
12747
12748 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12749 {
12750 u32 *digest = (u32 *) hash_buf->digest;
12751
12752 salt_t *salt = hash_buf->salt;
12753
12754 tc_t *tc = (tc_t *) hash_buf->esalt;
12755
12756 if (input_len == 0)
12757 {
12758 log_error ("TrueCrypt container not specified");
12759
12760 exit (-1);
12761 }
12762
12763 FILE *fp = fopen (input_buf, "rb");
12764
12765 if (fp == NULL)
12766 {
12767 log_error ("%s: %s", input_buf, strerror (errno));
12768
12769 exit (-1);
12770 }
12771
12772 char buf[512] = { 0 };
12773
12774 int n = fread (buf, 1, sizeof (buf), fp);
12775
12776 fclose (fp);
12777
12778 if (n != 512) return (PARSER_TC_FILE_SIZE);
12779
12780 memcpy (tc->salt_buf, buf, 64);
12781
12782 memcpy (tc->data_buf, buf + 64, 512 - 64);
12783
12784 salt->salt_buf[0] = tc->salt_buf[0];
12785
12786 salt->salt_len = 4;
12787
12788 salt->salt_iter = 2000 - 1;
12789
12790 digest[0] = tc->data_buf[0];
12791
12792 return (PARSER_OK);
12793 }
12794
12795 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12796 {
12797 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12798
12799 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12800
12801 u32 *digest = (u32 *) hash_buf->digest;
12802
12803 salt_t *salt = hash_buf->salt;
12804
12805 char *salt_pos = input_buf + 6;
12806
12807 char *hash_pos = strchr (salt_pos, '$');
12808
12809 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12810
12811 uint salt_len = hash_pos - salt_pos;
12812
12813 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12814
12815 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12816
12817 salt->salt_len = salt_len;
12818
12819 salt->salt_iter = 1000;
12820
12821 hash_pos++;
12822
12823 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12824
12825 return (PARSER_OK);
12826 }
12827
12828 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12829 {
12830 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12831
12832 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12833
12834 u32 *digest = (u32 *) hash_buf->digest;
12835
12836 salt_t *salt = hash_buf->salt;
12837
12838 char *iter_pos = input_buf + 7;
12839
12840 char *salt_pos = strchr (iter_pos, '$');
12841
12842 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12843
12844 salt_pos++;
12845
12846 char *hash_pos = strchr (salt_pos, '$');
12847
12848 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12849
12850 uint salt_len = hash_pos - salt_pos;
12851
12852 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12853
12854 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12855
12856 salt->salt_len = salt_len;
12857
12858 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12859
12860 salt->salt_sign[0] = atoi (salt_iter);
12861
12862 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12863
12864 hash_pos++;
12865
12866 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12867
12868 digest[0] = byte_swap_32 (digest[0]);
12869 digest[1] = byte_swap_32 (digest[1]);
12870 digest[2] = byte_swap_32 (digest[2]);
12871 digest[3] = byte_swap_32 (digest[3]);
12872 digest[4] = byte_swap_32 (digest[4]);
12873
12874 return (PARSER_OK);
12875 }
12876
12877 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12878 {
12879 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12880
12881 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12882
12883 u32 *digest = (u32 *) hash_buf->digest;
12884
12885 salt_t *salt = hash_buf->salt;
12886
12887 char *iter_pos = input_buf + 9;
12888
12889 char *salt_pos = strchr (iter_pos, '$');
12890
12891 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12892
12893 salt_pos++;
12894
12895 char *hash_pos = strchr (salt_pos, '$');
12896
12897 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12898
12899 uint salt_len = hash_pos - salt_pos;
12900
12901 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12902
12903 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12904
12905 salt->salt_len = salt_len;
12906
12907 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12908
12909 salt->salt_sign[0] = atoi (salt_iter);
12910
12911 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12912
12913 hash_pos++;
12914
12915 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12916
12917 digest[0] = byte_swap_32 (digest[0]);
12918 digest[1] = byte_swap_32 (digest[1]);
12919 digest[2] = byte_swap_32 (digest[2]);
12920 digest[3] = byte_swap_32 (digest[3]);
12921 digest[4] = byte_swap_32 (digest[4]);
12922 digest[5] = byte_swap_32 (digest[5]);
12923 digest[6] = byte_swap_32 (digest[6]);
12924 digest[7] = byte_swap_32 (digest[7]);
12925
12926 return (PARSER_OK);
12927 }
12928
12929 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12930 {
12931 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12932
12933 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12934
12935 u64 *digest = (u64 *) hash_buf->digest;
12936
12937 salt_t *salt = hash_buf->salt;
12938
12939 char *iter_pos = input_buf + 9;
12940
12941 char *salt_pos = strchr (iter_pos, '$');
12942
12943 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12944
12945 salt_pos++;
12946
12947 char *hash_pos = strchr (salt_pos, '$');
12948
12949 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12950
12951 uint salt_len = hash_pos - salt_pos;
12952
12953 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12954
12955 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12956
12957 salt->salt_len = salt_len;
12958
12959 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12960
12961 salt->salt_sign[0] = atoi (salt_iter);
12962
12963 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12964
12965 hash_pos++;
12966
12967 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12968
12969 digest[0] = byte_swap_64 (digest[0]);
12970 digest[1] = byte_swap_64 (digest[1]);
12971 digest[2] = byte_swap_64 (digest[2]);
12972 digest[3] = byte_swap_64 (digest[3]);
12973 digest[4] = byte_swap_64 (digest[4]);
12974 digest[5] = byte_swap_64 (digest[5]);
12975 digest[6] = byte_swap_64 (digest[6]);
12976 digest[7] = byte_swap_64 (digest[7]);
12977
12978 return (PARSER_OK);
12979 }
12980
12981 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12982 {
12983 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12984
12985 u32 *digest = (u32 *) hash_buf->digest;
12986
12987 salt_t *salt = hash_buf->salt;
12988
12989 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12990
12991 /**
12992 * parse line
12993 */
12994
12995 char *iterations_pos = input_buf;
12996
12997 char *saltbuf_pos = strchr (iterations_pos, ':');
12998
12999 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13000
13001 uint iterations_len = saltbuf_pos - iterations_pos;
13002
13003 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
13004
13005 saltbuf_pos++;
13006
13007 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
13008
13009 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13010
13011 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
13012
13013 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
13014
13015 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
13016
13017 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
13018
13019 cipherbuf_pos++;
13020
13021 /**
13022 * pbkdf2 iterations
13023 */
13024
13025 salt->salt_iter = atoi (iterations_pos) - 1;
13026
13027 /**
13028 * handle salt encoding
13029 */
13030
13031 char *saltbuf_ptr = (char *) salt->salt_buf;
13032
13033 for (uint i = 0; i < saltbuf_len; i += 2)
13034 {
13035 const char p0 = saltbuf_pos[i + 0];
13036 const char p1 = saltbuf_pos[i + 1];
13037
13038 *saltbuf_ptr++ = hex_convert (p1) << 0
13039 | hex_convert (p0) << 4;
13040 }
13041
13042 salt->salt_len = saltbuf_len / 2;
13043
13044 /**
13045 * handle cipher encoding
13046 */
13047
13048 uint *tmp = (uint *) mymalloc (32);
13049
13050 char *cipherbuf_ptr = (char *) tmp;
13051
13052 for (uint i = 2016; i < cipherbuf_len; i += 2)
13053 {
13054 const char p0 = cipherbuf_pos[i + 0];
13055 const char p1 = cipherbuf_pos[i + 1];
13056
13057 *cipherbuf_ptr++ = hex_convert (p1) << 0
13058 | hex_convert (p0) << 4;
13059 }
13060
13061 // iv is stored at salt_buf 4 (length 16)
13062 // data is stored at salt_buf 8 (length 16)
13063
13064 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
13065 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
13066 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
13067 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
13068
13069 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
13070 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
13071 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
13072 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
13073
13074 free (tmp);
13075
13076 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
13077 {
13078 const char p0 = cipherbuf_pos[j + 0];
13079 const char p1 = cipherbuf_pos[j + 1];
13080
13081 agilekey->cipher[i] = hex_convert (p1) << 0
13082 | hex_convert (p0) << 4;
13083 }
13084
13085 /**
13086 * digest buf
13087 */
13088
13089 digest[0] = 0x10101010;
13090 digest[1] = 0x10101010;
13091 digest[2] = 0x10101010;
13092 digest[3] = 0x10101010;
13093
13094 return (PARSER_OK);
13095 }
13096
13097 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13098 {
13099 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
13100
13101 u32 *digest = (u32 *) hash_buf->digest;
13102
13103 salt_t *salt = hash_buf->salt;
13104
13105 char *hashbuf_pos = input_buf;
13106
13107 char *iterations_pos = strchr (hashbuf_pos, ':');
13108
13109 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13110
13111 uint hash_len = iterations_pos - hashbuf_pos;
13112
13113 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
13114
13115 iterations_pos++;
13116
13117 char *saltbuf_pos = strchr (iterations_pos, ':');
13118
13119 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13120
13121 uint iterations_len = saltbuf_pos - iterations_pos;
13122
13123 saltbuf_pos++;
13124
13125 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
13126
13127 if (salt_len > 32) return (PARSER_SALT_LENGTH);
13128
13129 char *salt_buf_ptr = (char *) salt->salt_buf;
13130
13131 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
13132
13133 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13134
13135 salt->salt_len = salt_len;
13136
13137 salt->salt_iter = atoi (iterations_pos) - 1;
13138
13139 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13140 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13141 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13142 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13143
13144 return (PARSER_OK);
13145 }
13146
13147 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13148 {
13149 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
13150
13151 u32 *digest = (u32 *) hash_buf->digest;
13152
13153 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13154 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13155 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13156 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13157 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13158 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13159 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13160 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13161
13162 digest[0] = byte_swap_32 (digest[0]);
13163 digest[1] = byte_swap_32 (digest[1]);
13164 digest[2] = byte_swap_32 (digest[2]);
13165 digest[3] = byte_swap_32 (digest[3]);
13166 digest[4] = byte_swap_32 (digest[4]);
13167 digest[5] = byte_swap_32 (digest[5]);
13168 digest[6] = byte_swap_32 (digest[6]);
13169 digest[7] = byte_swap_32 (digest[7]);
13170
13171 return (PARSER_OK);
13172 }
13173
13174 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13175 {
13176 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13177
13178 u32 *digest = (u32 *) hash_buf->digest;
13179
13180 salt_t *salt = hash_buf->salt;
13181
13182 char *salt_pos = input_buf + 3;
13183
13184 uint iterations_len = 0;
13185
13186 if (memcmp (salt_pos, "rounds=", 7) == 0)
13187 {
13188 salt_pos += 7;
13189
13190 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13191
13192 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13193 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13194
13195 salt_pos[0] = 0x0;
13196
13197 salt->salt_iter = atoi (salt_pos - iterations_len);
13198
13199 salt_pos += 1;
13200
13201 iterations_len += 8;
13202 }
13203 else
13204 {
13205 salt->salt_iter = ROUNDS_SHA256CRYPT;
13206 }
13207
13208 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13209
13210 char *hash_pos = strchr (salt_pos, '$');
13211
13212 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13213
13214 uint salt_len = hash_pos - salt_pos;
13215
13216 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13217
13218 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13219
13220 salt->salt_len = salt_len;
13221
13222 hash_pos++;
13223
13224 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13225
13226 return (PARSER_OK);
13227 }
13228
13229 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13230 {
13231 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13232
13233 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13234
13235 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13236
13237 u64 *digest = (u64 *) hash_buf->digest;
13238
13239 salt_t *salt = hash_buf->salt;
13240
13241 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13242
13243 char *iter_pos = input_buf + 4;
13244
13245 char *salt_pos = strchr (iter_pos, '$');
13246
13247 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13248
13249 salt_pos++;
13250
13251 char *hash_pos = strchr (salt_pos, '$');
13252
13253 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13254
13255 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13256
13257 hash_pos++;
13258
13259 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13260 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13261 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13262 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13263 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13264 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13265 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13266 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13267
13268 uint salt_len = hash_pos - salt_pos - 1;
13269
13270 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13271
13272 salt->salt_len = salt_len / 2;
13273
13274 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13275 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13276 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13277 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13278 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13279 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13280 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13281 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13282
13283 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13284 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13285 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13286 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13287 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13288 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13289 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13290 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13291 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13292 pbkdf2_sha512->salt_buf[9] = 0x80;
13293
13294 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13295
13296 salt->salt_iter = atoi (iter_pos) - 1;
13297
13298 return (PARSER_OK);
13299 }
13300
13301 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13302 {
13303 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13304
13305 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13306
13307 u32 *digest = (u32 *) hash_buf->digest;
13308
13309 salt_t *salt = hash_buf->salt;
13310
13311 char *salt_pos = input_buf + 14;
13312
13313 char *hash_pos = strchr (salt_pos, '*');
13314
13315 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13316
13317 hash_pos++;
13318
13319 uint salt_len = hash_pos - salt_pos - 1;
13320
13321 char *salt_buf_ptr = (char *) salt->salt_buf;
13322
13323 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13324
13325 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13326
13327 salt->salt_len = salt_len;
13328
13329 u8 tmp_buf[100] = { 0 };
13330
13331 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13332
13333 memcpy (digest, tmp_buf, 32);
13334
13335 digest[0] = byte_swap_32 (digest[0]);
13336 digest[1] = byte_swap_32 (digest[1]);
13337 digest[2] = byte_swap_32 (digest[2]);
13338 digest[3] = byte_swap_32 (digest[3]);
13339 digest[4] = byte_swap_32 (digest[4]);
13340 digest[5] = byte_swap_32 (digest[5]);
13341 digest[6] = byte_swap_32 (digest[6]);
13342 digest[7] = byte_swap_32 (digest[7]);
13343
13344 digest[0] -= SHA256M_A;
13345 digest[1] -= SHA256M_B;
13346 digest[2] -= SHA256M_C;
13347 digest[3] -= SHA256M_D;
13348 digest[4] -= SHA256M_E;
13349 digest[5] -= SHA256M_F;
13350 digest[6] -= SHA256M_G;
13351 digest[7] -= SHA256M_H;
13352
13353 return (PARSER_OK);
13354 }
13355
13356 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13357 {
13358 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13359
13360 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13361
13362 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13363
13364 u64 *digest = (u64 *) hash_buf->digest;
13365
13366 salt_t *salt = hash_buf->salt;
13367
13368 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13369
13370 char *iter_pos = input_buf + 19;
13371
13372 char *salt_pos = strchr (iter_pos, '.');
13373
13374 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13375
13376 salt_pos++;
13377
13378 char *hash_pos = strchr (salt_pos, '.');
13379
13380 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13381
13382 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13383
13384 hash_pos++;
13385
13386 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13387 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13388 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13389 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13390 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13391 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13392 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13393 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13394
13395 uint salt_len = hash_pos - salt_pos - 1;
13396
13397 salt_len /= 2;
13398
13399 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13400
13401 uint i;
13402
13403 for (i = 0; i < salt_len; i++)
13404 {
13405 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13406 }
13407
13408 salt_buf_ptr[salt_len + 3] = 0x01;
13409 salt_buf_ptr[salt_len + 4] = 0x80;
13410
13411 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13412
13413 salt->salt_len = salt_len;
13414
13415 salt->salt_iter = atoi (iter_pos) - 1;
13416
13417 return (PARSER_OK);
13418 }
13419
13420 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13421 {
13422 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13423
13424 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13425
13426 u64 *digest = (u64 *) hash_buf->digest;
13427
13428 salt_t *salt = hash_buf->salt;
13429
13430 u8 tmp_buf[120] = { 0 };
13431
13432 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13433
13434 if (tmp_len < 64) return (PARSER_HASH_LENGTH);
13435
13436 memcpy (digest, tmp_buf, 64);
13437
13438 digest[0] = byte_swap_64 (digest[0]);
13439 digest[1] = byte_swap_64 (digest[1]);
13440 digest[2] = byte_swap_64 (digest[2]);
13441 digest[3] = byte_swap_64 (digest[3]);
13442 digest[4] = byte_swap_64 (digest[4]);
13443 digest[5] = byte_swap_64 (digest[5]);
13444 digest[6] = byte_swap_64 (digest[6]);
13445 digest[7] = byte_swap_64 (digest[7]);
13446
13447 digest[0] -= SHA512M_A;
13448 digest[1] -= SHA512M_B;
13449 digest[2] -= SHA512M_C;
13450 digest[3] -= SHA512M_D;
13451 digest[4] -= SHA512M_E;
13452 digest[5] -= SHA512M_F;
13453 digest[6] -= SHA512M_G;
13454 digest[7] -= SHA512M_H;
13455
13456 int salt_len = tmp_len - 64;
13457
13458 if (salt_len < 0) return (PARSER_SALT_LENGTH);
13459
13460 salt->salt_len = salt_len;
13461
13462 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13463
13464 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13465 {
13466 char *ptr = (char *) salt->salt_buf;
13467
13468 ptr[salt->salt_len] = 0x80;
13469 }
13470
13471 return (PARSER_OK);
13472 }
13473
13474 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13475 {
13476 if (data.opts_type & OPTS_TYPE_ST_HEX)
13477 {
13478 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13479 }
13480 else
13481 {
13482 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13483 }
13484
13485 u32 *digest = (u32 *) hash_buf->digest;
13486
13487 salt_t *salt = hash_buf->salt;
13488
13489 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13490 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13491 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13492 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13493
13494 digest[0] = byte_swap_32 (digest[0]);
13495 digest[1] = byte_swap_32 (digest[1]);
13496 digest[2] = byte_swap_32 (digest[2]);
13497 digest[3] = byte_swap_32 (digest[3]);
13498
13499 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13500
13501 uint salt_len = input_len - 32 - 1;
13502
13503 char *salt_buf = input_buf + 32 + 1;
13504
13505 char *salt_buf_ptr = (char *) salt->salt_buf;
13506
13507 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13508
13509 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13510
13511 salt->salt_len = salt_len;
13512
13513 return (PARSER_OK);
13514 }
13515
13516 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13517 {
13518 if (data.opts_type & OPTS_TYPE_ST_HEX)
13519 {
13520 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13521 }
13522 else
13523 {
13524 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13525 }
13526
13527 u32 *digest = (u32 *) hash_buf->digest;
13528
13529 salt_t *salt = hash_buf->salt;
13530
13531 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13532 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13533 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13534 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13535 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13536
13537 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13538
13539 uint salt_len = input_len - 40 - 1;
13540
13541 char *salt_buf = input_buf + 40 + 1;
13542
13543 char *salt_buf_ptr = (char *) salt->salt_buf;
13544
13545 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13546
13547 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13548
13549 salt->salt_len = salt_len;
13550
13551 return (PARSER_OK);
13552 }
13553
13554 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13555 {
13556 if (data.opts_type & OPTS_TYPE_ST_HEX)
13557 {
13558 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13559 }
13560 else
13561 {
13562 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13563 }
13564
13565 u32 *digest = (u32 *) hash_buf->digest;
13566
13567 salt_t *salt = hash_buf->salt;
13568
13569 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13570 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13571 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13572 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13573 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13574 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13575 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13576 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13577
13578 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13579
13580 uint salt_len = input_len - 64 - 1;
13581
13582 char *salt_buf = input_buf + 64 + 1;
13583
13584 char *salt_buf_ptr = (char *) salt->salt_buf;
13585
13586 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13587
13588 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13589
13590 salt->salt_len = salt_len;
13591
13592 return (PARSER_OK);
13593 }
13594
13595 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13596 {
13597 if (data.opts_type & OPTS_TYPE_ST_HEX)
13598 {
13599 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13600 }
13601 else
13602 {
13603 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13604 }
13605
13606 u64 *digest = (u64 *) hash_buf->digest;
13607
13608 salt_t *salt = hash_buf->salt;
13609
13610 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13611 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13612 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13613 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13614 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13615 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13616 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13617 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13618
13619 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13620
13621 uint salt_len = input_len - 128 - 1;
13622
13623 char *salt_buf = input_buf + 128 + 1;
13624
13625 char *salt_buf_ptr = (char *) salt->salt_buf;
13626
13627 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13628
13629 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13630
13631 salt->salt_len = salt_len;
13632
13633 return (PARSER_OK);
13634 }
13635
13636 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13637 {
13638 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13639
13640 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13641
13642 u32 *digest = (u32 *) hash_buf->digest;
13643
13644 salt_t *salt = hash_buf->salt;
13645
13646 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13647
13648 /**
13649 * parse line
13650 */
13651
13652 char *user_pos = input_buf + 10 + 1;
13653
13654 char *realm_pos = strchr (user_pos, '$');
13655
13656 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13657
13658 uint user_len = realm_pos - user_pos;
13659
13660 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13661
13662 realm_pos++;
13663
13664 char *salt_pos = strchr (realm_pos, '$');
13665
13666 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13667
13668 uint realm_len = salt_pos - realm_pos;
13669
13670 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13671
13672 salt_pos++;
13673
13674 char *data_pos = strchr (salt_pos, '$');
13675
13676 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13677
13678 uint salt_len = data_pos - salt_pos;
13679
13680 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13681
13682 data_pos++;
13683
13684 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13685
13686 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13687
13688 /**
13689 * copy data
13690 */
13691
13692 memcpy (krb5pa->user, user_pos, user_len);
13693 memcpy (krb5pa->realm, realm_pos, realm_len);
13694 memcpy (krb5pa->salt, salt_pos, salt_len);
13695
13696 char *timestamp_ptr = (char *) krb5pa->timestamp;
13697
13698 for (uint i = 0; i < (36 * 2); i += 2)
13699 {
13700 const char p0 = data_pos[i + 0];
13701 const char p1 = data_pos[i + 1];
13702
13703 *timestamp_ptr++ = hex_convert (p1) << 0
13704 | hex_convert (p0) << 4;
13705 }
13706
13707 char *checksum_ptr = (char *) krb5pa->checksum;
13708
13709 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13710 {
13711 const char p0 = data_pos[i + 0];
13712 const char p1 = data_pos[i + 1];
13713
13714 *checksum_ptr++ = hex_convert (p1) << 0
13715 | hex_convert (p0) << 4;
13716 }
13717
13718 /**
13719 * copy some data to generic buffers to make sorting happy
13720 */
13721
13722 salt->salt_buf[0] = krb5pa->timestamp[0];
13723 salt->salt_buf[1] = krb5pa->timestamp[1];
13724 salt->salt_buf[2] = krb5pa->timestamp[2];
13725 salt->salt_buf[3] = krb5pa->timestamp[3];
13726 salt->salt_buf[4] = krb5pa->timestamp[4];
13727 salt->salt_buf[5] = krb5pa->timestamp[5];
13728 salt->salt_buf[6] = krb5pa->timestamp[6];
13729 salt->salt_buf[7] = krb5pa->timestamp[7];
13730 salt->salt_buf[8] = krb5pa->timestamp[8];
13731
13732 salt->salt_len = 36;
13733
13734 digest[0] = krb5pa->checksum[0];
13735 digest[1] = krb5pa->checksum[1];
13736 digest[2] = krb5pa->checksum[2];
13737 digest[3] = krb5pa->checksum[3];
13738
13739 return (PARSER_OK);
13740 }
13741
13742 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13743 {
13744 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13745
13746 u32 *digest = (u32 *) hash_buf->digest;
13747
13748 salt_t *salt = hash_buf->salt;
13749
13750 /**
13751 * parse line
13752 */
13753
13754 char *salt_pos = input_buf;
13755
13756 char *hash_pos = strchr (salt_pos, '$');
13757
13758 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13759
13760 uint salt_len = hash_pos - salt_pos;
13761
13762 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13763
13764 hash_pos++;
13765
13766 uint hash_len = input_len - 1 - salt_len;
13767
13768 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13769
13770 /**
13771 * valid some data
13772 */
13773
13774 uint user_len = 0;
13775
13776 for (uint i = 0; i < salt_len; i++)
13777 {
13778 if (salt_pos[i] == ' ') continue;
13779
13780 user_len++;
13781 }
13782
13783 // SAP user names cannot be longer than 12 characters
13784 if (user_len > 12) return (PARSER_SALT_LENGTH);
13785
13786 // SAP user name cannot start with ! or ?
13787 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13788
13789 /**
13790 * copy data
13791 */
13792
13793 char *salt_buf_ptr = (char *) salt->salt_buf;
13794
13795 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13796
13797 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13798
13799 salt->salt_len = salt_len;
13800
13801 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13802 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13803 digest[2] = 0;
13804 digest[3] = 0;
13805
13806 digest[0] = byte_swap_32 (digest[0]);
13807 digest[1] = byte_swap_32 (digest[1]);
13808
13809 return (PARSER_OK);
13810 }
13811
13812 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13813 {
13814 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13815
13816 u32 *digest = (u32 *) hash_buf->digest;
13817
13818 salt_t *salt = hash_buf->salt;
13819
13820 /**
13821 * parse line
13822 */
13823
13824 char *salt_pos = input_buf;
13825
13826 char *hash_pos = strchr (salt_pos, '$');
13827
13828 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13829
13830 uint salt_len = hash_pos - salt_pos;
13831
13832 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13833
13834 hash_pos++;
13835
13836 uint hash_len = input_len - 1 - salt_len;
13837
13838 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13839
13840 /**
13841 * valid some data
13842 */
13843
13844 uint user_len = 0;
13845
13846 for (uint i = 0; i < salt_len; i++)
13847 {
13848 if (salt_pos[i] == ' ') continue;
13849
13850 user_len++;
13851 }
13852
13853 // SAP user names cannot be longer than 12 characters
13854 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13855 // so far nobody complained so we stay with this because it helps in optimization
13856 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13857
13858 if (user_len > 12) return (PARSER_SALT_LENGTH);
13859
13860 // SAP user name cannot start with ! or ?
13861 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13862
13863 /**
13864 * copy data
13865 */
13866
13867 char *salt_buf_ptr = (char *) salt->salt_buf;
13868
13869 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13870
13871 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13872
13873 salt->salt_len = salt_len;
13874
13875 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13876 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13877 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13878 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13879 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13880
13881 return (PARSER_OK);
13882 }
13883
13884 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13885 {
13886 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13887
13888 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13889
13890 u64 *digest = (u64 *) hash_buf->digest;
13891
13892 salt_t *salt = hash_buf->salt;
13893
13894 char *iter_pos = input_buf + 3;
13895
13896 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13897
13898 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13899
13900 memcpy ((char *) salt->salt_sign, input_buf, 4);
13901
13902 salt->salt_iter = salt_iter;
13903
13904 char *salt_pos = iter_pos + 1;
13905
13906 uint salt_len = 8;
13907
13908 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13909
13910 salt->salt_len = salt_len;
13911
13912 char *hash_pos = salt_pos + salt_len;
13913
13914 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13915
13916 // ugly hack start
13917
13918 char *tmp = (char *) salt->salt_buf_pc;
13919
13920 tmp[0] = hash_pos[42];
13921
13922 // ugly hack end
13923
13924 digest[ 0] = byte_swap_64 (digest[ 0]);
13925 digest[ 1] = byte_swap_64 (digest[ 1]);
13926 digest[ 2] = byte_swap_64 (digest[ 2]);
13927 digest[ 3] = byte_swap_64 (digest[ 3]);
13928 digest[ 4] = 0;
13929 digest[ 5] = 0;
13930 digest[ 6] = 0;
13931 digest[ 7] = 0;
13932
13933 return (PARSER_OK);
13934 }
13935
13936 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13937 {
13938 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13939
13940 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13941
13942 u32 *digest = (u32 *) hash_buf->digest;
13943
13944 salt_t *salt = hash_buf->salt;
13945
13946 char *salt_buf = input_buf + 6;
13947
13948 uint salt_len = 16;
13949
13950 char *salt_buf_ptr = (char *) salt->salt_buf;
13951
13952 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13953
13954 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13955
13956 salt->salt_len = salt_len;
13957
13958 char *hash_pos = input_buf + 6 + 16;
13959
13960 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13961 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13962 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13963 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13964 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13965 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13966 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13967 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13968
13969 return (PARSER_OK);
13970 }
13971
13972 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13973 {
13974 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13975
13976 u32 *digest = (u32 *) hash_buf->digest;
13977
13978 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13979 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13980 digest[2] = 0;
13981 digest[3] = 0;
13982
13983 return (PARSER_OK);
13984 }
13985
13986 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13987 {
13988 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13989
13990 u32 *digest = (u32 *) hash_buf->digest;
13991
13992 salt_t *salt = hash_buf->salt;
13993
13994 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13995
13996 char *saltbuf_pos = input_buf;
13997
13998 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13999
14000 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14001
14002 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
14003
14004 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
14005 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
14006
14007 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
14008
14009 hashbuf_pos++;
14010
14011 uint hashbuf_len = input_len - saltbuf_len - 1;
14012
14013 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
14014
14015 char *salt_ptr = (char *) saltbuf_pos;
14016 char *rakp_ptr = (char *) rakp->salt_buf;
14017
14018 uint i;
14019 uint j;
14020
14021 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
14022 {
14023 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
14024 }
14025
14026 rakp_ptr[j] = 0x80;
14027
14028 rakp->salt_len = j;
14029
14030 for (i = 0; i < 64; i++)
14031 {
14032 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
14033 }
14034
14035 salt->salt_buf[0] = rakp->salt_buf[0];
14036 salt->salt_buf[1] = rakp->salt_buf[1];
14037 salt->salt_buf[2] = rakp->salt_buf[2];
14038 salt->salt_buf[3] = rakp->salt_buf[3];
14039 salt->salt_buf[4] = rakp->salt_buf[4];
14040 salt->salt_buf[5] = rakp->salt_buf[5];
14041 salt->salt_buf[6] = rakp->salt_buf[6];
14042 salt->salt_buf[7] = rakp->salt_buf[7];
14043
14044 salt->salt_len = 32; // muss min. 32 haben
14045
14046 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14047 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14048 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14049 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14050 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14051
14052 return (PARSER_OK);
14053 }
14054
14055 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14056 {
14057 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
14058
14059 u32 *digest = (u32 *) hash_buf->digest;
14060
14061 salt_t *salt = hash_buf->salt;
14062
14063 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
14064
14065 char *salt_pos = input_buf + 1;
14066
14067 memcpy (salt->salt_buf, salt_pos, 8);
14068
14069 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14070 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14071
14072 salt->salt_len = 8;
14073
14074 char *hash_pos = salt_pos + 8;
14075
14076 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14077 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14078 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14079 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14080 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14081
14082 digest[0] -= SHA1M_A;
14083 digest[1] -= SHA1M_B;
14084 digest[2] -= SHA1M_C;
14085 digest[3] -= SHA1M_D;
14086 digest[4] -= SHA1M_E;
14087
14088 return (PARSER_OK);
14089 }
14090
14091 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14092 {
14093 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
14094
14095 u32 *digest = (u32 *) hash_buf->digest;
14096
14097 salt_t *salt = hash_buf->salt;
14098
14099 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14100 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14101 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14102 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14103
14104 digest[0] = byte_swap_32 (digest[0]);
14105 digest[1] = byte_swap_32 (digest[1]);
14106 digest[2] = byte_swap_32 (digest[2]);
14107 digest[3] = byte_swap_32 (digest[3]);
14108
14109 digest[0] -= MD5M_A;
14110 digest[1] -= MD5M_B;
14111 digest[2] -= MD5M_C;
14112 digest[3] -= MD5M_D;
14113
14114 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14115
14116 char *salt_buf_ptr = input_buf + 32 + 1;
14117
14118 u32 *salt_buf = salt->salt_buf;
14119
14120 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
14121 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
14122 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
14123 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
14124
14125 salt_buf[0] = byte_swap_32 (salt_buf[0]);
14126 salt_buf[1] = byte_swap_32 (salt_buf[1]);
14127 salt_buf[2] = byte_swap_32 (salt_buf[2]);
14128 salt_buf[3] = byte_swap_32 (salt_buf[3]);
14129
14130 salt->salt_len = 16 + 1;
14131
14132 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14133
14134 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
14135
14136 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
14137
14138 return (PARSER_OK);
14139 }
14140
14141 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14142 {
14143 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
14144
14145 u32 *digest = (u32 *) hash_buf->digest;
14146
14147 salt_t *salt = hash_buf->salt;
14148
14149 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
14150
14151 /**
14152 * parse line
14153 */
14154
14155 char *hashbuf_pos = input_buf;
14156
14157 char *saltbuf_pos = strchr (hashbuf_pos, ':');
14158
14159 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14160
14161 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
14162
14163 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
14164
14165 saltbuf_pos++;
14166
14167 char *iteration_pos = strchr (saltbuf_pos, ':');
14168
14169 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14170
14171 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14172
14173 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14174
14175 iteration_pos++;
14176
14177 char *databuf_pos = strchr (iteration_pos, ':');
14178
14179 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14180
14181 const uint iteration_len = databuf_pos - iteration_pos;
14182
14183 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14184 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14185
14186 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14187
14188 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14189 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14190
14191 databuf_pos++;
14192
14193 // digest
14194
14195 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14196 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14197 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14198 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14199 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14200 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14201 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14202 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14203
14204 // salt
14205
14206 char *saltbuf_ptr = (char *) salt->salt_buf;
14207
14208 for (uint i = 0; i < saltbuf_len; i += 2)
14209 {
14210 const char p0 = saltbuf_pos[i + 0];
14211 const char p1 = saltbuf_pos[i + 1];
14212
14213 *saltbuf_ptr++ = hex_convert (p1) << 0
14214 | hex_convert (p0) << 4;
14215 }
14216
14217 salt->salt_buf[4] = 0x01000000;
14218 salt->salt_buf[5] = 0x80;
14219
14220 salt->salt_len = saltbuf_len / 2;
14221
14222 // iteration
14223
14224 salt->salt_iter = atoi (iteration_pos) - 1;
14225
14226 // data
14227
14228 char *databuf_ptr = (char *) cloudkey->data_buf;
14229
14230 for (uint i = 0; i < databuf_len; i += 2)
14231 {
14232 const char p0 = databuf_pos[i + 0];
14233 const char p1 = databuf_pos[i + 1];
14234
14235 *databuf_ptr++ = hex_convert (p1) << 0
14236 | hex_convert (p0) << 4;
14237 }
14238
14239 *databuf_ptr++ = 0x80;
14240
14241 for (uint i = 0; i < 512; i++)
14242 {
14243 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14244 }
14245
14246 cloudkey->data_len = databuf_len / 2;
14247
14248 return (PARSER_OK);
14249 }
14250
14251 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14252 {
14253 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14254
14255 u32 *digest = (u32 *) hash_buf->digest;
14256
14257 salt_t *salt = hash_buf->salt;
14258
14259 /**
14260 * parse line
14261 */
14262
14263 char *hashbuf_pos = input_buf;
14264
14265 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14266
14267 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14268
14269 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14270
14271 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14272
14273 domainbuf_pos++;
14274
14275 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14276
14277 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14278
14279 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14280
14281 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14282
14283 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14284
14285 saltbuf_pos++;
14286
14287 char *iteration_pos = strchr (saltbuf_pos, ':');
14288
14289 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14290
14291 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14292
14293 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14294
14295 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14296
14297 iteration_pos++;
14298
14299 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14300
14301 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14302 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14303
14304 // ok, the plan for this algorithm is the following:
14305 // we have 2 salts here, the domain-name and a random salt
14306 // while both are used in the initial transformation,
14307 // only the random salt is used in the following iterations
14308 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14309 // and one that includes only the real salt (stored into salt_buf[]).
14310 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14311
14312 u8 tmp_buf[100] = { 0 };
14313
14314 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14315
14316 memcpy (digest, tmp_buf, 20);
14317
14318 digest[0] = byte_swap_32 (digest[0]);
14319 digest[1] = byte_swap_32 (digest[1]);
14320 digest[2] = byte_swap_32 (digest[2]);
14321 digest[3] = byte_swap_32 (digest[3]);
14322 digest[4] = byte_swap_32 (digest[4]);
14323
14324 // domain
14325
14326 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14327
14328 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14329
14330 char *len_ptr = NULL;
14331
14332 for (uint i = 0; i < domainbuf_len; i++)
14333 {
14334 if (salt_buf_pc_ptr[i] == '.')
14335 {
14336 len_ptr = &salt_buf_pc_ptr[i];
14337
14338 *len_ptr = 0;
14339 }
14340 else
14341 {
14342 *len_ptr += 1;
14343 }
14344 }
14345
14346 salt->salt_buf_pc[7] = domainbuf_len;
14347
14348 // "real" salt
14349
14350 char *salt_buf_ptr = (char *) salt->salt_buf;
14351
14352 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14353
14354 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14355
14356 salt->salt_len = salt_len;
14357
14358 // iteration
14359
14360 salt->salt_iter = atoi (iteration_pos);
14361
14362 return (PARSER_OK);
14363 }
14364
14365 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14366 {
14367 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14368
14369 u32 *digest = (u32 *) hash_buf->digest;
14370
14371 salt_t *salt = hash_buf->salt;
14372
14373 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14374 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14375 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14376 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14377 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14378
14379 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14380
14381 uint salt_len = input_len - 40 - 1;
14382
14383 char *salt_buf = input_buf + 40 + 1;
14384
14385 char *salt_buf_ptr = (char *) salt->salt_buf;
14386
14387 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14388
14389 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14390
14391 salt->salt_len = salt_len;
14392
14393 return (PARSER_OK);
14394 }
14395
14396 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14397 {
14398 const u8 ascii_to_ebcdic[] =
14399 {
14400 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14401 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14402 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14403 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14404 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14405 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14406 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14407 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14408 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14409 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14410 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14411 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14412 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14413 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14414 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14415 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14416 };
14417
14418 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14419
14420 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14421
14422 u32 *digest = (u32 *) hash_buf->digest;
14423
14424 salt_t *salt = hash_buf->salt;
14425
14426 char *salt_pos = input_buf + 6 + 1;
14427
14428 char *digest_pos = strchr (salt_pos, '*');
14429
14430 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14431
14432 uint salt_len = digest_pos - salt_pos;
14433
14434 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14435
14436 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14437
14438 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14439
14440 digest_pos++;
14441
14442 char *salt_buf_ptr = (char *) salt->salt_buf;
14443 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14444
14445 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14446
14447 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14448
14449 salt->salt_len = salt_len;
14450
14451 for (uint i = 0; i < salt_len; i++)
14452 {
14453 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14454 }
14455 for (uint i = salt_len; i < 8; i++)
14456 {
14457 salt_buf_pc_ptr[i] = 0x40;
14458 }
14459
14460 uint tt;
14461
14462 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14463
14464 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14465 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14466
14467 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14468 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14469
14470 digest[0] = byte_swap_32 (digest[0]);
14471 digest[1] = byte_swap_32 (digest[1]);
14472
14473 IP (digest[0], digest[1], tt);
14474
14475 digest[0] = rotr32 (digest[0], 29);
14476 digest[1] = rotr32 (digest[1], 29);
14477 digest[2] = 0;
14478 digest[3] = 0;
14479
14480 return (PARSER_OK);
14481 }
14482
14483 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14484 {
14485 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14486
14487 u32 *digest = (u32 *) hash_buf->digest;
14488
14489 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14490 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14491 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14492 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14493
14494 digest[0] = byte_swap_32 (digest[0]);
14495 digest[1] = byte_swap_32 (digest[1]);
14496 digest[2] = byte_swap_32 (digest[2]);
14497 digest[3] = byte_swap_32 (digest[3]);
14498
14499 return (PARSER_OK);
14500 }
14501
14502 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14503 {
14504 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14505
14506 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14507
14508 u32 *digest = (u32 *) hash_buf->digest;
14509
14510 salt_t *salt = hash_buf->salt;
14511
14512 u8 tmp_buf[120] = { 0 };
14513
14514 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14515
14516 tmp_buf[3] += -4; // dont ask!
14517
14518 memcpy (salt->salt_buf, tmp_buf, 5);
14519
14520 salt->salt_len = 5;
14521
14522 memcpy (digest, tmp_buf + 5, 9);
14523
14524 // yes, only 9 byte are needed to crack, but 10 to display
14525
14526 salt->salt_buf_pc[7] = input_buf[20];
14527
14528 return (PARSER_OK);
14529 }
14530
14531 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14532 {
14533 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14534
14535 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14536
14537 u32 *digest = (u32 *) hash_buf->digest;
14538
14539 salt_t *salt = hash_buf->salt;
14540
14541 u8 tmp_buf[120] = { 0 };
14542
14543 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14544
14545 tmp_buf[3] += -4; // dont ask!
14546
14547 // salt
14548
14549 memcpy (salt->salt_buf, tmp_buf, 16);
14550
14551 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)
14552
14553 // iteration
14554
14555 char tmp_iter_buf[11] = { 0 };
14556
14557 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14558
14559 tmp_iter_buf[10] = 0;
14560
14561 salt->salt_iter = atoi (tmp_iter_buf);
14562
14563 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14564 {
14565 return (PARSER_SALT_ITERATION);
14566 }
14567
14568 salt->salt_iter--; // first round in init
14569
14570 // 2 additional bytes for display only
14571
14572 salt->salt_buf_pc[0] = tmp_buf[26];
14573 salt->salt_buf_pc[1] = tmp_buf[27];
14574
14575 // digest
14576
14577 memcpy (digest, tmp_buf + 28, 8);
14578
14579 digest[0] = byte_swap_32 (digest[0]);
14580 digest[1] = byte_swap_32 (digest[1]);
14581 digest[2] = 0;
14582 digest[3] = 0;
14583
14584 return (PARSER_OK);
14585 }
14586
14587 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14588 {
14589 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14590
14591 u32 *digest = (u32 *) hash_buf->digest;
14592
14593 salt_t *salt = hash_buf->salt;
14594
14595 char *salt_buf_pos = input_buf;
14596
14597 char *hash_buf_pos = salt_buf_pos + 6;
14598
14599 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14600 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14601 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14602 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14603 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14604 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14605 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14606 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14607
14608 digest[0] -= SHA256M_A;
14609 digest[1] -= SHA256M_B;
14610 digest[2] -= SHA256M_C;
14611 digest[3] -= SHA256M_D;
14612 digest[4] -= SHA256M_E;
14613 digest[5] -= SHA256M_F;
14614 digest[6] -= SHA256M_G;
14615 digest[7] -= SHA256M_H;
14616
14617 char *salt_buf_ptr = (char *) salt->salt_buf;
14618
14619 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14620
14621 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14622
14623 salt->salt_len = salt_len;
14624
14625 return (PARSER_OK);
14626 }
14627
14628 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14629 {
14630 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14631
14632 u32 *digest = (u32 *) hash_buf->digest;
14633
14634 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14635
14636 salt_t *salt = hash_buf->salt;
14637
14638 char *salt_buf = input_buf + 6;
14639
14640 char *digest_buf = strchr (salt_buf, '$');
14641
14642 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14643
14644 uint salt_len = digest_buf - salt_buf;
14645
14646 digest_buf++; // skip the '$' symbol
14647
14648 char *salt_buf_ptr = (char *) salt->salt_buf;
14649
14650 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14651
14652 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14653
14654 salt->salt_len = salt_len;
14655
14656 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14657 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14658 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14659 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14660
14661 digest[0] = byte_swap_32 (digest[0]);
14662 digest[1] = byte_swap_32 (digest[1]);
14663 digest[2] = byte_swap_32 (digest[2]);
14664 digest[3] = byte_swap_32 (digest[3]);
14665
14666 digest[0] -= MD5M_A;
14667 digest[1] -= MD5M_B;
14668 digest[2] -= MD5M_C;
14669 digest[3] -= MD5M_D;
14670
14671 return (PARSER_OK);
14672 }
14673
14674 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14675 {
14676 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14677
14678 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14679
14680 u32 *digest = (u32 *) hash_buf->digest;
14681
14682 salt_t *salt = hash_buf->salt;
14683
14684 char *salt_buf = input_buf + 3;
14685
14686 char *digest_buf = strchr (salt_buf, '$');
14687
14688 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14689
14690 uint salt_len = digest_buf - salt_buf;
14691
14692 digest_buf++; // skip the '$' symbol
14693
14694 char *salt_buf_ptr = (char *) salt->salt_buf;
14695
14696 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14697
14698 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14699
14700 salt_buf_ptr[salt_len] = 0x2d;
14701
14702 salt->salt_len = salt_len + 1;
14703
14704 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14705 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14706 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14707 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14708
14709 digest[0] = byte_swap_32 (digest[0]);
14710 digest[1] = byte_swap_32 (digest[1]);
14711 digest[2] = byte_swap_32 (digest[2]);
14712 digest[3] = byte_swap_32 (digest[3]);
14713
14714 digest[0] -= MD5M_A;
14715 digest[1] -= MD5M_B;
14716 digest[2] -= MD5M_C;
14717 digest[3] -= MD5M_D;
14718
14719 return (PARSER_OK);
14720 }
14721
14722 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14723 {
14724 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14725
14726 u32 *digest = (u32 *) hash_buf->digest;
14727
14728 salt_t *salt = hash_buf->salt;
14729
14730 u8 tmp_buf[100] = { 0 };
14731
14732 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14733
14734 memcpy (digest, tmp_buf, 20);
14735
14736 digest[0] = byte_swap_32 (digest[0]);
14737 digest[1] = byte_swap_32 (digest[1]);
14738 digest[2] = byte_swap_32 (digest[2]);
14739 digest[3] = byte_swap_32 (digest[3]);
14740 digest[4] = byte_swap_32 (digest[4]);
14741
14742 digest[0] -= SHA1M_A;
14743 digest[1] -= SHA1M_B;
14744 digest[2] -= SHA1M_C;
14745 digest[3] -= SHA1M_D;
14746 digest[4] -= SHA1M_E;
14747
14748 salt->salt_buf[0] = 0x80;
14749
14750 salt->salt_len = 0;
14751
14752 return (PARSER_OK);
14753 }
14754
14755 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14756 {
14757 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14758
14759 u32 *digest = (u32 *) hash_buf->digest;
14760
14761 salt_t *salt = hash_buf->salt;
14762
14763 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14764 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14765 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14766 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14767
14768 digest[0] = byte_swap_32 (digest[0]);
14769 digest[1] = byte_swap_32 (digest[1]);
14770 digest[2] = byte_swap_32 (digest[2]);
14771 digest[3] = byte_swap_32 (digest[3]);
14772
14773 digest[0] -= MD5M_A;
14774 digest[1] -= MD5M_B;
14775 digest[2] -= MD5M_C;
14776 digest[3] -= MD5M_D;
14777
14778 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14779
14780 uint salt_len = input_len - 32 - 1;
14781
14782 char *salt_buf = input_buf + 32 + 1;
14783
14784 char *salt_buf_ptr = (char *) salt->salt_buf;
14785
14786 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14787
14788 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14789
14790 /*
14791 * add static "salt" part
14792 */
14793
14794 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14795
14796 salt_len += 8;
14797
14798 salt->salt_len = salt_len;
14799
14800 return (PARSER_OK);
14801 }
14802
14803 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14804 {
14805 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14806
14807 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14808
14809 u32 *digest = (u32 *) hash_buf->digest;
14810
14811 salt_t *salt = hash_buf->salt;
14812
14813 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14814
14815 /**
14816 * parse line
14817 */
14818
14819 char *saltlen_pos = input_buf + 1 + 3 + 1;
14820
14821 char *saltbuf_pos = strchr (saltlen_pos, '$');
14822
14823 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14824
14825 uint saltlen_len = saltbuf_pos - saltlen_pos;
14826
14827 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14828
14829 saltbuf_pos++;
14830
14831 char *keylen_pos = strchr (saltbuf_pos, '$');
14832
14833 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14834
14835 uint saltbuf_len = keylen_pos - saltbuf_pos;
14836
14837 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14838
14839 keylen_pos++;
14840
14841 char *keybuf_pos = strchr (keylen_pos, '$');
14842
14843 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14844
14845 uint keylen_len = keybuf_pos - keylen_pos;
14846
14847 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14848
14849 keybuf_pos++;
14850
14851 char *databuf_pos = strchr (keybuf_pos, '$');
14852
14853 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14854
14855 uint keybuf_len = databuf_pos - keybuf_pos;
14856
14857 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14858
14859 databuf_pos++;
14860
14861 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14862
14863 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14864
14865 /**
14866 * copy data
14867 */
14868
14869 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14870 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14871 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14872 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14873
14874 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14875 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14876 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14877 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14878
14879 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14880 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14881 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14882 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14883
14884 salt->salt_len = 16;
14885 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14886
14887 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14888 {
14889 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14890 }
14891
14892 return (PARSER_OK);
14893 }
14894
14895 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14896 {
14897 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14898
14899 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14900
14901 u32 *digest = (u32 *) hash_buf->digest;
14902
14903 salt_t *salt = hash_buf->salt;
14904
14905 /**
14906 * parse line
14907 */
14908
14909 // first is the N salt parameter
14910
14911 char *N_pos = input_buf + 6;
14912
14913 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14914
14915 N_pos++;
14916
14917 salt->scrypt_N = atoi (N_pos);
14918
14919 // r
14920
14921 char *r_pos = strchr (N_pos, ':');
14922
14923 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14924
14925 r_pos++;
14926
14927 salt->scrypt_r = atoi (r_pos);
14928
14929 // p
14930
14931 char *p_pos = strchr (r_pos, ':');
14932
14933 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14934
14935 p_pos++;
14936
14937 salt->scrypt_p = atoi (p_pos);
14938
14939 // salt
14940
14941 char *saltbuf_pos = strchr (p_pos, ':');
14942
14943 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14944
14945 saltbuf_pos++;
14946
14947 char *hash_pos = strchr (saltbuf_pos, ':');
14948
14949 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14950
14951 hash_pos++;
14952
14953 // base64 decode
14954
14955 int salt_len_base64 = hash_pos - saltbuf_pos;
14956
14957 if (salt_len_base64 > 45) return (PARSER_SALT_LENGTH);
14958
14959 u8 tmp_buf[33] = { 0 };
14960
14961 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, salt_len_base64, tmp_buf);
14962
14963 char *salt_buf_ptr = (char *) salt->salt_buf;
14964
14965 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14966
14967 salt->salt_len = tmp_len;
14968 salt->salt_iter = 1;
14969
14970 // digest - base64 decode
14971
14972 memset (tmp_buf, 0, sizeof (tmp_buf));
14973
14974 tmp_len = input_len - (hash_pos - input_buf);
14975
14976 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14977
14978 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14979
14980 memcpy (digest, tmp_buf, 32);
14981
14982 return (PARSER_OK);
14983 }
14984
14985 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14986 {
14987 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14988
14989 u32 *digest = (u32 *) hash_buf->digest;
14990
14991 salt_t *salt = hash_buf->salt;
14992
14993 /**
14994 * parse line
14995 */
14996
14997 char decrypted[76] = { 0 }; // iv + hash
14998
14999 juniper_decrypt_hash (input_buf, decrypted);
15000
15001 char *md5crypt_hash = decrypted + 12;
15002
15003 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
15004
15005 salt->salt_iter = ROUNDS_MD5CRYPT;
15006
15007 char *salt_pos = md5crypt_hash + 3;
15008
15009 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
15010
15011 salt->salt_len = hash_pos - salt_pos; // should be 8
15012
15013 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
15014
15015 hash_pos++;
15016
15017 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
15018
15019 return (PARSER_OK);
15020 }
15021
15022 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15023 {
15024 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
15025
15026 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15027
15028 u32 *digest = (u32 *) hash_buf->digest;
15029
15030 salt_t *salt = hash_buf->salt;
15031
15032 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15033
15034 /**
15035 * parse line
15036 */
15037
15038 // first is *raw* salt
15039
15040 char *salt_pos = input_buf + 3;
15041
15042 char *hash_pos = strchr (salt_pos, '$');
15043
15044 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15045
15046 uint salt_len = hash_pos - salt_pos;
15047
15048 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15049
15050 hash_pos++;
15051
15052 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15053
15054 memcpy (salt_buf_ptr, salt_pos, 14);
15055
15056 salt_buf_ptr[17] = 0x01;
15057 salt_buf_ptr[18] = 0x80;
15058
15059 // add some stuff to normal salt to make sorted happy
15060
15061 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15062 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15063 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15064 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15065
15066 salt->salt_len = salt_len;
15067 salt->salt_iter = ROUNDS_CISCO8 - 1;
15068
15069 // base64 decode hash
15070
15071 u8 tmp_buf[100] = { 0 };
15072
15073 uint hash_len = input_len - 3 - salt_len - 1;
15074
15075 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15076
15077 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15078
15079 memcpy (digest, tmp_buf, 32);
15080
15081 digest[0] = byte_swap_32 (digest[0]);
15082 digest[1] = byte_swap_32 (digest[1]);
15083 digest[2] = byte_swap_32 (digest[2]);
15084 digest[3] = byte_swap_32 (digest[3]);
15085 digest[4] = byte_swap_32 (digest[4]);
15086 digest[5] = byte_swap_32 (digest[5]);
15087 digest[6] = byte_swap_32 (digest[6]);
15088 digest[7] = byte_swap_32 (digest[7]);
15089
15090 return (PARSER_OK);
15091 }
15092
15093 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15094 {
15095 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
15096
15097 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15098
15099 u32 *digest = (u32 *) hash_buf->digest;
15100
15101 salt_t *salt = hash_buf->salt;
15102
15103 /**
15104 * parse line
15105 */
15106
15107 // first is *raw* salt
15108
15109 char *salt_pos = input_buf + 3;
15110
15111 char *hash_pos = strchr (salt_pos, '$');
15112
15113 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15114
15115 uint salt_len = hash_pos - salt_pos;
15116
15117 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15118
15119 salt->salt_len = salt_len;
15120 hash_pos++;
15121
15122 char *salt_buf_ptr = (char *) salt->salt_buf;
15123
15124 memcpy (salt_buf_ptr, salt_pos, salt_len);
15125 salt_buf_ptr[salt_len] = 0;
15126
15127 // base64 decode hash
15128
15129 u8 tmp_buf[100] = { 0 };
15130
15131 uint hash_len = input_len - 3 - salt_len - 1;
15132
15133 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15134
15135 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15136
15137 memcpy (digest, tmp_buf, 32);
15138
15139 // fixed:
15140 salt->scrypt_N = 16384;
15141 salt->scrypt_r = 1;
15142 salt->scrypt_p = 1;
15143 salt->salt_iter = 1;
15144
15145 return (PARSER_OK);
15146 }
15147
15148 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15149 {
15150 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
15151
15152 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15153
15154 u32 *digest = (u32 *) hash_buf->digest;
15155
15156 salt_t *salt = hash_buf->salt;
15157
15158 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
15159
15160 /**
15161 * parse line
15162 */
15163
15164 char *version_pos = input_buf + 8 + 1;
15165
15166 char *verifierHashSize_pos = strchr (version_pos, '*');
15167
15168 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15169
15170 u32 version_len = verifierHashSize_pos - version_pos;
15171
15172 if (version_len != 4) return (PARSER_SALT_LENGTH);
15173
15174 verifierHashSize_pos++;
15175
15176 char *keySize_pos = strchr (verifierHashSize_pos, '*');
15177
15178 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15179
15180 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
15181
15182 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
15183
15184 keySize_pos++;
15185
15186 char *saltSize_pos = strchr (keySize_pos, '*');
15187
15188 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15189
15190 u32 keySize_len = saltSize_pos - keySize_pos;
15191
15192 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15193
15194 saltSize_pos++;
15195
15196 char *osalt_pos = strchr (saltSize_pos, '*');
15197
15198 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15199
15200 u32 saltSize_len = osalt_pos - saltSize_pos;
15201
15202 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15203
15204 osalt_pos++;
15205
15206 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15207
15208 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15209
15210 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15211
15212 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15213
15214 encryptedVerifier_pos++;
15215
15216 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15217
15218 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15219
15220 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15221
15222 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15223
15224 encryptedVerifierHash_pos++;
15225
15226 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;
15227
15228 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15229
15230 const uint version = atoi (version_pos);
15231
15232 if (version != 2007) return (PARSER_SALT_VALUE);
15233
15234 const uint verifierHashSize = atoi (verifierHashSize_pos);
15235
15236 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15237
15238 const uint keySize = atoi (keySize_pos);
15239
15240 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15241
15242 office2007->keySize = keySize;
15243
15244 const uint saltSize = atoi (saltSize_pos);
15245
15246 if (saltSize != 16) return (PARSER_SALT_VALUE);
15247
15248 /**
15249 * salt
15250 */
15251
15252 salt->salt_len = 16;
15253 salt->salt_iter = ROUNDS_OFFICE2007;
15254
15255 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15256 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15257 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15258 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15259
15260 /**
15261 * esalt
15262 */
15263
15264 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15265 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15266 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15267 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15268
15269 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15270 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15271 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15272 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15273 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15274
15275 /**
15276 * digest
15277 */
15278
15279 digest[0] = office2007->encryptedVerifierHash[0];
15280 digest[1] = office2007->encryptedVerifierHash[1];
15281 digest[2] = office2007->encryptedVerifierHash[2];
15282 digest[3] = office2007->encryptedVerifierHash[3];
15283
15284 return (PARSER_OK);
15285 }
15286
15287 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15288 {
15289 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15290
15291 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15292
15293 u32 *digest = (u32 *) hash_buf->digest;
15294
15295 salt_t *salt = hash_buf->salt;
15296
15297 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15298
15299 /**
15300 * parse line
15301 */
15302
15303 char *version_pos = input_buf + 8 + 1;
15304
15305 char *spinCount_pos = strchr (version_pos, '*');
15306
15307 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15308
15309 u32 version_len = spinCount_pos - version_pos;
15310
15311 if (version_len != 4) return (PARSER_SALT_LENGTH);
15312
15313 spinCount_pos++;
15314
15315 char *keySize_pos = strchr (spinCount_pos, '*');
15316
15317 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15318
15319 u32 spinCount_len = keySize_pos - spinCount_pos;
15320
15321 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15322
15323 keySize_pos++;
15324
15325 char *saltSize_pos = strchr (keySize_pos, '*');
15326
15327 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15328
15329 u32 keySize_len = saltSize_pos - keySize_pos;
15330
15331 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15332
15333 saltSize_pos++;
15334
15335 char *osalt_pos = strchr (saltSize_pos, '*');
15336
15337 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15338
15339 u32 saltSize_len = osalt_pos - saltSize_pos;
15340
15341 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15342
15343 osalt_pos++;
15344
15345 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15346
15347 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15348
15349 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15350
15351 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15352
15353 encryptedVerifier_pos++;
15354
15355 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15356
15357 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15358
15359 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15360
15361 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15362
15363 encryptedVerifierHash_pos++;
15364
15365 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;
15366
15367 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15368
15369 const uint version = atoi (version_pos);
15370
15371 if (version != 2010) return (PARSER_SALT_VALUE);
15372
15373 const uint spinCount = atoi (spinCount_pos);
15374
15375 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15376
15377 const uint keySize = atoi (keySize_pos);
15378
15379 if (keySize != 128) return (PARSER_SALT_VALUE);
15380
15381 const uint saltSize = atoi (saltSize_pos);
15382
15383 if (saltSize != 16) return (PARSER_SALT_VALUE);
15384
15385 /**
15386 * salt
15387 */
15388
15389 salt->salt_len = 16;
15390 salt->salt_iter = spinCount;
15391
15392 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15393 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15394 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15395 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15396
15397 /**
15398 * esalt
15399 */
15400
15401 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15402 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15403 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15404 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15405
15406 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15407 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15408 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15409 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15410 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15411 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15412 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15413 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15414
15415 /**
15416 * digest
15417 */
15418
15419 digest[0] = office2010->encryptedVerifierHash[0];
15420 digest[1] = office2010->encryptedVerifierHash[1];
15421 digest[2] = office2010->encryptedVerifierHash[2];
15422 digest[3] = office2010->encryptedVerifierHash[3];
15423
15424 return (PARSER_OK);
15425 }
15426
15427 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15428 {
15429 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15430
15431 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15432
15433 u32 *digest = (u32 *) hash_buf->digest;
15434
15435 salt_t *salt = hash_buf->salt;
15436
15437 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15438
15439 /**
15440 * parse line
15441 */
15442
15443 char *version_pos = input_buf + 8 + 1;
15444
15445 char *spinCount_pos = strchr (version_pos, '*');
15446
15447 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15448
15449 u32 version_len = spinCount_pos - version_pos;
15450
15451 if (version_len != 4) return (PARSER_SALT_LENGTH);
15452
15453 spinCount_pos++;
15454
15455 char *keySize_pos = strchr (spinCount_pos, '*');
15456
15457 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15458
15459 u32 spinCount_len = keySize_pos - spinCount_pos;
15460
15461 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15462
15463 keySize_pos++;
15464
15465 char *saltSize_pos = strchr (keySize_pos, '*');
15466
15467 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15468
15469 u32 keySize_len = saltSize_pos - keySize_pos;
15470
15471 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15472
15473 saltSize_pos++;
15474
15475 char *osalt_pos = strchr (saltSize_pos, '*');
15476
15477 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15478
15479 u32 saltSize_len = osalt_pos - saltSize_pos;
15480
15481 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15482
15483 osalt_pos++;
15484
15485 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15486
15487 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15488
15489 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15490
15491 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15492
15493 encryptedVerifier_pos++;
15494
15495 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15496
15497 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15498
15499 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15500
15501 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15502
15503 encryptedVerifierHash_pos++;
15504
15505 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;
15506
15507 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15508
15509 const uint version = atoi (version_pos);
15510
15511 if (version != 2013) return (PARSER_SALT_VALUE);
15512
15513 const uint spinCount = atoi (spinCount_pos);
15514
15515 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15516
15517 const uint keySize = atoi (keySize_pos);
15518
15519 if (keySize != 256) return (PARSER_SALT_VALUE);
15520
15521 const uint saltSize = atoi (saltSize_pos);
15522
15523 if (saltSize != 16) return (PARSER_SALT_VALUE);
15524
15525 /**
15526 * salt
15527 */
15528
15529 salt->salt_len = 16;
15530 salt->salt_iter = spinCount;
15531
15532 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15533 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15534 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15535 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15536
15537 /**
15538 * esalt
15539 */
15540
15541 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15542 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15543 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15544 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15545
15546 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15547 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15548 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15549 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15550 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15551 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15552 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15553 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15554
15555 /**
15556 * digest
15557 */
15558
15559 digest[0] = office2013->encryptedVerifierHash[0];
15560 digest[1] = office2013->encryptedVerifierHash[1];
15561 digest[2] = office2013->encryptedVerifierHash[2];
15562 digest[3] = office2013->encryptedVerifierHash[3];
15563
15564 return (PARSER_OK);
15565 }
15566
15567 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15568 {
15569 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15570
15571 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15572
15573 u32 *digest = (u32 *) hash_buf->digest;
15574
15575 salt_t *salt = hash_buf->salt;
15576
15577 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15578
15579 /**
15580 * parse line
15581 */
15582
15583 char *version_pos = input_buf + 11;
15584
15585 char *osalt_pos = strchr (version_pos, '*');
15586
15587 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15588
15589 u32 version_len = osalt_pos - version_pos;
15590
15591 if (version_len != 1) return (PARSER_SALT_LENGTH);
15592
15593 osalt_pos++;
15594
15595 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15596
15597 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15598
15599 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15600
15601 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15602
15603 encryptedVerifier_pos++;
15604
15605 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15606
15607 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15608
15609 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15610
15611 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15612
15613 encryptedVerifierHash_pos++;
15614
15615 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15616
15617 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15618
15619 const uint version = *version_pos - 0x30;
15620
15621 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15622
15623 /**
15624 * esalt
15625 */
15626
15627 oldoffice01->version = version;
15628
15629 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15630 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15631 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15632 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15633
15634 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15635 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15636 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15637 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15638
15639 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15640 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15641 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15642 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15643
15644 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15645 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15646 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15647 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15648
15649 /**
15650 * salt
15651 */
15652
15653 salt->salt_len = 16;
15654
15655 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15656 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15657 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15658 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15659
15660 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15661 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15662 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15663 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15664
15665 // this is a workaround as office produces multiple documents with the same salt
15666
15667 salt->salt_len += 32;
15668
15669 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15670 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15671 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15672 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15673 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15674 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15675 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15676 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15677
15678 /**
15679 * digest
15680 */
15681
15682 digest[0] = oldoffice01->encryptedVerifierHash[0];
15683 digest[1] = oldoffice01->encryptedVerifierHash[1];
15684 digest[2] = oldoffice01->encryptedVerifierHash[2];
15685 digest[3] = oldoffice01->encryptedVerifierHash[3];
15686
15687 return (PARSER_OK);
15688 }
15689
15690 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15691 {
15692 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15693 }
15694
15695 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15696 {
15697 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15698
15699 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15700
15701 u32 *digest = (u32 *) hash_buf->digest;
15702
15703 salt_t *salt = hash_buf->salt;
15704
15705 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15706
15707 /**
15708 * parse line
15709 */
15710
15711 char *version_pos = input_buf + 11;
15712
15713 char *osalt_pos = strchr (version_pos, '*');
15714
15715 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15716
15717 u32 version_len = osalt_pos - version_pos;
15718
15719 if (version_len != 1) return (PARSER_SALT_LENGTH);
15720
15721 osalt_pos++;
15722
15723 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15724
15725 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15726
15727 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15728
15729 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15730
15731 encryptedVerifier_pos++;
15732
15733 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15734
15735 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15736
15737 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15738
15739 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15740
15741 encryptedVerifierHash_pos++;
15742
15743 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15744
15745 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15746
15747 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15748
15749 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15750
15751 rc4key_pos++;
15752
15753 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15754
15755 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15756
15757 const uint version = *version_pos - 0x30;
15758
15759 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15760
15761 /**
15762 * esalt
15763 */
15764
15765 oldoffice01->version = version;
15766
15767 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15768 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15769 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15770 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15771
15772 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15773 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15774 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15775 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15776
15777 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15778 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15779 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15780 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15781
15782 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15783 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15784 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15785 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15786
15787 oldoffice01->rc4key[1] = 0;
15788 oldoffice01->rc4key[0] = 0;
15789
15790 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15791 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15792 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15793 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15794 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15795 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15796 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15797 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15798 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15799 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15800
15801 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15802 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15803
15804 /**
15805 * salt
15806 */
15807
15808 salt->salt_len = 16;
15809
15810 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15811 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15812 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15813 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15814
15815 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15816 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15817 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15818 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15819
15820 // this is a workaround as office produces multiple documents with the same salt
15821
15822 salt->salt_len += 32;
15823
15824 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15825 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15826 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15827 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15828 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15829 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15830 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15831 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15832
15833 /**
15834 * digest
15835 */
15836
15837 digest[0] = oldoffice01->rc4key[0];
15838 digest[1] = oldoffice01->rc4key[1];
15839 digest[2] = 0;
15840 digest[3] = 0;
15841
15842 return (PARSER_OK);
15843 }
15844
15845 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15846 {
15847 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15848
15849 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15850
15851 u32 *digest = (u32 *) hash_buf->digest;
15852
15853 salt_t *salt = hash_buf->salt;
15854
15855 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15856
15857 /**
15858 * parse line
15859 */
15860
15861 char *version_pos = input_buf + 11;
15862
15863 char *osalt_pos = strchr (version_pos, '*');
15864
15865 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15866
15867 u32 version_len = osalt_pos - version_pos;
15868
15869 if (version_len != 1) return (PARSER_SALT_LENGTH);
15870
15871 osalt_pos++;
15872
15873 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15874
15875 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15876
15877 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15878
15879 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15880
15881 encryptedVerifier_pos++;
15882
15883 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15884
15885 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15886
15887 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15888
15889 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15890
15891 encryptedVerifierHash_pos++;
15892
15893 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15894
15895 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15896
15897 const uint version = *version_pos - 0x30;
15898
15899 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15900
15901 /**
15902 * esalt
15903 */
15904
15905 oldoffice34->version = version;
15906
15907 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15908 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15909 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15910 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15911
15912 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15913 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15914 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15915 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15916
15917 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15918 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15919 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15920 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15921 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15922
15923 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15924 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15925 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15926 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15927 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15928
15929 /**
15930 * salt
15931 */
15932
15933 salt->salt_len = 16;
15934
15935 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15936 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15937 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15938 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15939
15940 // this is a workaround as office produces multiple documents with the same salt
15941
15942 salt->salt_len += 32;
15943
15944 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15945 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15946 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15947 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15948 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15949 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15950 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15951 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15952
15953 /**
15954 * digest
15955 */
15956
15957 digest[0] = oldoffice34->encryptedVerifierHash[0];
15958 digest[1] = oldoffice34->encryptedVerifierHash[1];
15959 digest[2] = oldoffice34->encryptedVerifierHash[2];
15960 digest[3] = oldoffice34->encryptedVerifierHash[3];
15961
15962 return (PARSER_OK);
15963 }
15964
15965 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15966 {
15967 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15968
15969 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15970 }
15971
15972 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15973 {
15974 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15975
15976 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15977
15978 u32 *digest = (u32 *) hash_buf->digest;
15979
15980 salt_t *salt = hash_buf->salt;
15981
15982 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15983
15984 /**
15985 * parse line
15986 */
15987
15988 char *version_pos = input_buf + 11;
15989
15990 char *osalt_pos = strchr (version_pos, '*');
15991
15992 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15993
15994 u32 version_len = osalt_pos - version_pos;
15995
15996 if (version_len != 1) return (PARSER_SALT_LENGTH);
15997
15998 osalt_pos++;
15999
16000 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16001
16002 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16003
16004 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16005
16006 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16007
16008 encryptedVerifier_pos++;
16009
16010 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16011
16012 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16013
16014 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16015
16016 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16017
16018 encryptedVerifierHash_pos++;
16019
16020 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16021
16022 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16023
16024 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16025
16026 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16027
16028 rc4key_pos++;
16029
16030 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16031
16032 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16033
16034 const uint version = *version_pos - 0x30;
16035
16036 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16037
16038 /**
16039 * esalt
16040 */
16041
16042 oldoffice34->version = version;
16043
16044 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16045 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16046 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16047 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16048
16049 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16050 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16051 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16052 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16053
16054 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16055 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16056 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16057 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16058 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16059
16060 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16061 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16062 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16063 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16064 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16065
16066 oldoffice34->rc4key[1] = 0;
16067 oldoffice34->rc4key[0] = 0;
16068
16069 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16070 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16071 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16072 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16073 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16074 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16075 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16076 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16077 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16078 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16079
16080 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
16081 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
16082
16083 /**
16084 * salt
16085 */
16086
16087 salt->salt_len = 16;
16088
16089 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16090 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16091 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16092 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16093
16094 // this is a workaround as office produces multiple documents with the same salt
16095
16096 salt->salt_len += 32;
16097
16098 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16099 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16100 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16101 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16102 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16103 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16104 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16105 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16106
16107 /**
16108 * digest
16109 */
16110
16111 digest[0] = oldoffice34->rc4key[0];
16112 digest[1] = oldoffice34->rc4key[1];
16113 digest[2] = 0;
16114 digest[3] = 0;
16115
16116 return (PARSER_OK);
16117 }
16118
16119 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16120 {
16121 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
16122
16123 u32 *digest = (u32 *) hash_buf->digest;
16124
16125 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16126 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16127 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16128 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16129
16130 digest[0] = byte_swap_32 (digest[0]);
16131 digest[1] = byte_swap_32 (digest[1]);
16132 digest[2] = byte_swap_32 (digest[2]);
16133 digest[3] = byte_swap_32 (digest[3]);
16134
16135 return (PARSER_OK);
16136 }
16137
16138 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16139 {
16140 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
16141
16142 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16143
16144 u32 *digest = (u32 *) hash_buf->digest;
16145
16146 salt_t *salt = hash_buf->salt;
16147
16148 char *signature_pos = input_buf;
16149
16150 char *salt_pos = strchr (signature_pos, '$');
16151
16152 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16153
16154 u32 signature_len = salt_pos - signature_pos;
16155
16156 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
16157
16158 salt_pos++;
16159
16160 char *hash_pos = strchr (salt_pos, '$');
16161
16162 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16163
16164 u32 salt_len = hash_pos - salt_pos;
16165
16166 if (salt_len > 32) return (PARSER_SALT_LENGTH);
16167
16168 hash_pos++;
16169
16170 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
16171
16172 if (hash_len != 40) return (PARSER_SALT_LENGTH);
16173
16174 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
16175 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
16176 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
16177 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
16178 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
16179
16180 digest[0] -= SHA1M_A;
16181 digest[1] -= SHA1M_B;
16182 digest[2] -= SHA1M_C;
16183 digest[3] -= SHA1M_D;
16184 digest[4] -= SHA1M_E;
16185
16186 char *salt_buf_ptr = (char *) salt->salt_buf;
16187
16188 memcpy (salt_buf_ptr, salt_pos, salt_len);
16189
16190 salt->salt_len = salt_len;
16191
16192 return (PARSER_OK);
16193 }
16194
16195 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16196 {
16197 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16198
16199 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16200
16201 u32 *digest = (u32 *) hash_buf->digest;
16202
16203 salt_t *salt = hash_buf->salt;
16204
16205 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16206
16207 /**
16208 * parse line
16209 */
16210
16211 char *iter_pos = input_buf + 14;
16212
16213 const int iter = atoi (iter_pos);
16214
16215 if (iter < 1) return (PARSER_SALT_ITERATION);
16216
16217 salt->salt_iter = iter - 1;
16218
16219 char *salt_pos = strchr (iter_pos, '$');
16220
16221 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16222
16223 salt_pos++;
16224
16225 char *hash_pos = strchr (salt_pos, '$');
16226
16227 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16228
16229 const uint salt_len = hash_pos - salt_pos;
16230
16231 hash_pos++;
16232
16233 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16234
16235 memcpy (salt_buf_ptr, salt_pos, salt_len);
16236
16237 salt->salt_len = salt_len;
16238
16239 salt_buf_ptr[salt_len + 3] = 0x01;
16240 salt_buf_ptr[salt_len + 4] = 0x80;
16241
16242 // add some stuff to normal salt to make sorted happy
16243
16244 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16245 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16246 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16247 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16248 salt->salt_buf[4] = salt->salt_iter;
16249
16250 // base64 decode hash
16251
16252 u8 tmp_buf[100] = { 0 };
16253
16254 uint hash_len = input_len - (hash_pos - input_buf);
16255
16256 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16257
16258 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16259
16260 memcpy (digest, tmp_buf, 32);
16261
16262 digest[0] = byte_swap_32 (digest[0]);
16263 digest[1] = byte_swap_32 (digest[1]);
16264 digest[2] = byte_swap_32 (digest[2]);
16265 digest[3] = byte_swap_32 (digest[3]);
16266 digest[4] = byte_swap_32 (digest[4]);
16267 digest[5] = byte_swap_32 (digest[5]);
16268 digest[6] = byte_swap_32 (digest[6]);
16269 digest[7] = byte_swap_32 (digest[7]);
16270
16271 return (PARSER_OK);
16272 }
16273
16274 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16275 {
16276 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16277
16278 u32 *digest = (u32 *) hash_buf->digest;
16279
16280 salt_t *salt = hash_buf->salt;
16281
16282 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16283 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16284 digest[2] = 0;
16285 digest[3] = 0;
16286
16287 digest[0] = byte_swap_32 (digest[0]);
16288 digest[1] = byte_swap_32 (digest[1]);
16289
16290 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16291 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16292 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16293
16294 char iter_c = input_buf[17];
16295 char iter_d = input_buf[19];
16296
16297 // atm only defaults, let's see if there's more request
16298 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16299 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16300
16301 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16302
16303 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16304 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16305 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16306 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16307
16308 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16309 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16310 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16311 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16312
16313 salt->salt_len = 16;
16314
16315 return (PARSER_OK);
16316 }
16317
16318 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16319 {
16320 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16321
16322 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16323
16324 u32 *digest = (u32 *) hash_buf->digest;
16325
16326 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16327
16328 salt_t *salt = hash_buf->salt;
16329
16330 char *salt_pos = input_buf + 10;
16331
16332 char *hash_pos = strchr (salt_pos, '$');
16333
16334 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16335
16336 uint salt_len = hash_pos - salt_pos;
16337
16338 hash_pos++;
16339
16340 uint hash_len = input_len - 10 - salt_len - 1;
16341
16342 // base64 decode salt
16343
16344 if (salt_len > 133) return (PARSER_SALT_LENGTH);
16345
16346 u8 tmp_buf[100] = { 0 };
16347
16348 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16349
16350 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16351
16352 tmp_buf[salt_len] = 0x80;
16353
16354 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16355
16356 salt->salt_len = salt_len;
16357
16358 // base64 decode hash
16359
16360 if (hash_len > 133) return (PARSER_HASH_LENGTH);
16361
16362 memset (tmp_buf, 0, sizeof (tmp_buf));
16363
16364 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16365
16366 if (hash_len < 32 + 1) return (PARSER_SALT_LENGTH);
16367
16368 uint user_len = hash_len - 32;
16369
16370 const u8 *tmp_hash = tmp_buf + user_len;
16371
16372 user_len--; // skip the trailing space
16373
16374 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16375 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16376 digest[2] = hex_to_u32 (&tmp_hash[16]);
16377 digest[3] = hex_to_u32 (&tmp_hash[24]);
16378
16379 digest[0] = byte_swap_32 (digest[0]);
16380 digest[1] = byte_swap_32 (digest[1]);
16381 digest[2] = byte_swap_32 (digest[2]);
16382 digest[3] = byte_swap_32 (digest[3]);
16383
16384 // store username for host only (output hash if cracked)
16385
16386 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16387 memcpy (cram_md5->user, tmp_buf, user_len);
16388
16389 return (PARSER_OK);
16390 }
16391
16392 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16393 {
16394 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16395
16396 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16397
16398 u32 *digest = (u32 *) hash_buf->digest;
16399
16400 salt_t *salt = hash_buf->salt;
16401
16402 char *iter_pos = input_buf + 10;
16403
16404 u32 iter = atoi (iter_pos);
16405
16406 if (iter < 1)
16407 {
16408 return (PARSER_SALT_ITERATION);
16409 }
16410
16411 iter--; // first iteration is special
16412
16413 salt->salt_iter = iter;
16414
16415 char *base64_pos = strchr (iter_pos, '}');
16416
16417 if (base64_pos == NULL)
16418 {
16419 return (PARSER_SIGNATURE_UNMATCHED);
16420 }
16421
16422 base64_pos++;
16423
16424 // base64 decode salt
16425
16426 u32 base64_len = input_len - (base64_pos - input_buf);
16427
16428 u8 tmp_buf[100] = { 0 };
16429
16430 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16431
16432 if (decoded_len < 24)
16433 {
16434 return (PARSER_SALT_LENGTH);
16435 }
16436
16437 // copy the salt
16438
16439 uint salt_len = decoded_len - 20;
16440
16441 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16442 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16443
16444 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16445
16446 salt->salt_len = salt_len;
16447
16448 // set digest
16449
16450 u32 *digest_ptr = (u32*) tmp_buf;
16451
16452 digest[0] = byte_swap_32 (digest_ptr[0]);
16453 digest[1] = byte_swap_32 (digest_ptr[1]);
16454 digest[2] = byte_swap_32 (digest_ptr[2]);
16455 digest[3] = byte_swap_32 (digest_ptr[3]);
16456 digest[4] = byte_swap_32 (digest_ptr[4]);
16457
16458 return (PARSER_OK);
16459 }
16460
16461 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16462 {
16463 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16464
16465 u32 *digest = (u32 *) hash_buf->digest;
16466
16467 salt_t *salt = hash_buf->salt;
16468
16469 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16470 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16471 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16472 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16473 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16474
16475 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16476
16477 uint salt_len = input_len - 40 - 1;
16478
16479 char *salt_buf = input_buf + 40 + 1;
16480
16481 char *salt_buf_ptr = (char *) salt->salt_buf;
16482
16483 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16484
16485 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16486
16487 salt->salt_len = salt_len;
16488
16489 return (PARSER_OK);
16490 }
16491
16492 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16493 {
16494 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16495
16496 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16497
16498 u32 *digest = (u32 *) hash_buf->digest;
16499
16500 salt_t *salt = hash_buf->salt;
16501
16502 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16503
16504 /**
16505 * parse line
16506 */
16507
16508 char *V_pos = input_buf + 5;
16509
16510 char *R_pos = strchr (V_pos, '*');
16511
16512 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16513
16514 u32 V_len = R_pos - V_pos;
16515
16516 R_pos++;
16517
16518 char *bits_pos = strchr (R_pos, '*');
16519
16520 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16521
16522 u32 R_len = bits_pos - R_pos;
16523
16524 bits_pos++;
16525
16526 char *P_pos = strchr (bits_pos, '*');
16527
16528 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16529
16530 u32 bits_len = P_pos - bits_pos;
16531
16532 P_pos++;
16533
16534 char *enc_md_pos = strchr (P_pos, '*');
16535
16536 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16537
16538 u32 P_len = enc_md_pos - P_pos;
16539
16540 enc_md_pos++;
16541
16542 char *id_len_pos = strchr (enc_md_pos, '*');
16543
16544 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16545
16546 u32 enc_md_len = id_len_pos - enc_md_pos;
16547
16548 id_len_pos++;
16549
16550 char *id_buf_pos = strchr (id_len_pos, '*');
16551
16552 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16553
16554 u32 id_len_len = id_buf_pos - id_len_pos;
16555
16556 id_buf_pos++;
16557
16558 char *u_len_pos = strchr (id_buf_pos, '*');
16559
16560 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16561
16562 u32 id_buf_len = u_len_pos - id_buf_pos;
16563
16564 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16565
16566 u_len_pos++;
16567
16568 char *u_buf_pos = strchr (u_len_pos, '*');
16569
16570 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16571
16572 u32 u_len_len = u_buf_pos - u_len_pos;
16573
16574 u_buf_pos++;
16575
16576 char *o_len_pos = strchr (u_buf_pos, '*');
16577
16578 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16579
16580 u32 u_buf_len = o_len_pos - u_buf_pos;
16581
16582 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16583
16584 o_len_pos++;
16585
16586 char *o_buf_pos = strchr (o_len_pos, '*');
16587
16588 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16589
16590 u32 o_len_len = o_buf_pos - o_len_pos;
16591
16592 o_buf_pos++;
16593
16594 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;
16595
16596 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16597
16598 // validate data
16599
16600 const int V = atoi (V_pos);
16601 const int R = atoi (R_pos);
16602 const int P = atoi (P_pos);
16603
16604 if (V != 1) return (PARSER_SALT_VALUE);
16605 if (R != 2) return (PARSER_SALT_VALUE);
16606
16607 const int enc_md = atoi (enc_md_pos);
16608
16609 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16610
16611 const int id_len = atoi (id_len_pos);
16612 const int u_len = atoi (u_len_pos);
16613 const int o_len = atoi (o_len_pos);
16614
16615 if (id_len != 16) return (PARSER_SALT_VALUE);
16616 if (u_len != 32) return (PARSER_SALT_VALUE);
16617 if (o_len != 32) return (PARSER_SALT_VALUE);
16618
16619 const int bits = atoi (bits_pos);
16620
16621 if (bits != 40) return (PARSER_SALT_VALUE);
16622
16623 // copy data to esalt
16624
16625 pdf->V = V;
16626 pdf->R = R;
16627 pdf->P = P;
16628
16629 pdf->enc_md = enc_md;
16630
16631 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16632 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16633 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16634 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16635 pdf->id_len = id_len;
16636
16637 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16638 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16639 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16640 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16641 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16642 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16643 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16644 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16645 pdf->u_len = u_len;
16646
16647 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16648 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16649 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16650 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16651 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16652 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16653 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16654 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16655 pdf->o_len = o_len;
16656
16657 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16658 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16659 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16660 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16661
16662 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16663 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16664 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16665 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16666 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16667 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16668 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16669 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16670
16671 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16672 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16673 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16674 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16675 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16676 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16677 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16678 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16679
16680 // we use ID for salt, maybe needs to change, we will see...
16681
16682 salt->salt_buf[0] = pdf->id_buf[0];
16683 salt->salt_buf[1] = pdf->id_buf[1];
16684 salt->salt_buf[2] = pdf->id_buf[2];
16685 salt->salt_buf[3] = pdf->id_buf[3];
16686 salt->salt_len = pdf->id_len;
16687
16688 digest[0] = pdf->u_buf[0];
16689 digest[1] = pdf->u_buf[1];
16690 digest[2] = pdf->u_buf[2];
16691 digest[3] = pdf->u_buf[3];
16692
16693 return (PARSER_OK);
16694 }
16695
16696 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16697 {
16698 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16699 }
16700
16701 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16702 {
16703 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16704
16705 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16706
16707 u32 *digest = (u32 *) hash_buf->digest;
16708
16709 salt_t *salt = hash_buf->salt;
16710
16711 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16712
16713 /**
16714 * parse line
16715 */
16716
16717 char *V_pos = input_buf + 5;
16718
16719 char *R_pos = strchr (V_pos, '*');
16720
16721 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16722
16723 u32 V_len = R_pos - V_pos;
16724
16725 R_pos++;
16726
16727 char *bits_pos = strchr (R_pos, '*');
16728
16729 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16730
16731 u32 R_len = bits_pos - R_pos;
16732
16733 bits_pos++;
16734
16735 char *P_pos = strchr (bits_pos, '*');
16736
16737 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16738
16739 u32 bits_len = P_pos - bits_pos;
16740
16741 P_pos++;
16742
16743 char *enc_md_pos = strchr (P_pos, '*');
16744
16745 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16746
16747 u32 P_len = enc_md_pos - P_pos;
16748
16749 enc_md_pos++;
16750
16751 char *id_len_pos = strchr (enc_md_pos, '*');
16752
16753 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16754
16755 u32 enc_md_len = id_len_pos - enc_md_pos;
16756
16757 id_len_pos++;
16758
16759 char *id_buf_pos = strchr (id_len_pos, '*');
16760
16761 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16762
16763 u32 id_len_len = id_buf_pos - id_len_pos;
16764
16765 id_buf_pos++;
16766
16767 char *u_len_pos = strchr (id_buf_pos, '*');
16768
16769 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16770
16771 u32 id_buf_len = u_len_pos - id_buf_pos;
16772
16773 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16774
16775 u_len_pos++;
16776
16777 char *u_buf_pos = strchr (u_len_pos, '*');
16778
16779 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16780
16781 u32 u_len_len = u_buf_pos - u_len_pos;
16782
16783 u_buf_pos++;
16784
16785 char *o_len_pos = strchr (u_buf_pos, '*');
16786
16787 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16788
16789 u32 u_buf_len = o_len_pos - u_buf_pos;
16790
16791 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16792
16793 o_len_pos++;
16794
16795 char *o_buf_pos = strchr (o_len_pos, '*');
16796
16797 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16798
16799 u32 o_len_len = o_buf_pos - o_len_pos;
16800
16801 o_buf_pos++;
16802
16803 char *rc4key_pos = strchr (o_buf_pos, ':');
16804
16805 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16806
16807 u32 o_buf_len = rc4key_pos - o_buf_pos;
16808
16809 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16810
16811 rc4key_pos++;
16812
16813 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;
16814
16815 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16816
16817 // validate data
16818
16819 const int V = atoi (V_pos);
16820 const int R = atoi (R_pos);
16821 const int P = atoi (P_pos);
16822
16823 if (V != 1) return (PARSER_SALT_VALUE);
16824 if (R != 2) return (PARSER_SALT_VALUE);
16825
16826 const int enc_md = atoi (enc_md_pos);
16827
16828 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16829
16830 const int id_len = atoi (id_len_pos);
16831 const int u_len = atoi (u_len_pos);
16832 const int o_len = atoi (o_len_pos);
16833
16834 if (id_len != 16) return (PARSER_SALT_VALUE);
16835 if (u_len != 32) return (PARSER_SALT_VALUE);
16836 if (o_len != 32) return (PARSER_SALT_VALUE);
16837
16838 const int bits = atoi (bits_pos);
16839
16840 if (bits != 40) return (PARSER_SALT_VALUE);
16841
16842 // copy data to esalt
16843
16844 pdf->V = V;
16845 pdf->R = R;
16846 pdf->P = P;
16847
16848 pdf->enc_md = enc_md;
16849
16850 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16851 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16852 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16853 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16854 pdf->id_len = id_len;
16855
16856 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16857 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16858 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16859 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16860 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16861 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16862 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16863 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16864 pdf->u_len = u_len;
16865
16866 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16867 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16868 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16869 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16870 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16871 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16872 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16873 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16874 pdf->o_len = o_len;
16875
16876 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16877 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16878 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16879 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16880
16881 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16882 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16883 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16884 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16885 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16886 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16887 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16888 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16889
16890 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16891 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16892 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16893 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16894 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16895 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16896 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16897 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16898
16899 pdf->rc4key[1] = 0;
16900 pdf->rc4key[0] = 0;
16901
16902 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16903 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16904 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16905 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16906 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16907 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16908 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16909 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16910 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16911 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16912
16913 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16914 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16915
16916 // we use ID for salt, maybe needs to change, we will see...
16917
16918 salt->salt_buf[0] = pdf->id_buf[0];
16919 salt->salt_buf[1] = pdf->id_buf[1];
16920 salt->salt_buf[2] = pdf->id_buf[2];
16921 salt->salt_buf[3] = pdf->id_buf[3];
16922 salt->salt_buf[4] = pdf->u_buf[0];
16923 salt->salt_buf[5] = pdf->u_buf[1];
16924 salt->salt_buf[6] = pdf->o_buf[0];
16925 salt->salt_buf[7] = pdf->o_buf[1];
16926 salt->salt_len = pdf->id_len + 16;
16927
16928 digest[0] = pdf->rc4key[0];
16929 digest[1] = pdf->rc4key[1];
16930 digest[2] = 0;
16931 digest[3] = 0;
16932
16933 return (PARSER_OK);
16934 }
16935
16936 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16937 {
16938 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16939
16940 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16941
16942 u32 *digest = (u32 *) hash_buf->digest;
16943
16944 salt_t *salt = hash_buf->salt;
16945
16946 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16947
16948 /**
16949 * parse line
16950 */
16951
16952 char *V_pos = input_buf + 5;
16953
16954 char *R_pos = strchr (V_pos, '*');
16955
16956 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16957
16958 u32 V_len = R_pos - V_pos;
16959
16960 R_pos++;
16961
16962 char *bits_pos = strchr (R_pos, '*');
16963
16964 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16965
16966 u32 R_len = bits_pos - R_pos;
16967
16968 bits_pos++;
16969
16970 char *P_pos = strchr (bits_pos, '*');
16971
16972 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16973
16974 u32 bits_len = P_pos - bits_pos;
16975
16976 P_pos++;
16977
16978 char *enc_md_pos = strchr (P_pos, '*');
16979
16980 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16981
16982 u32 P_len = enc_md_pos - P_pos;
16983
16984 enc_md_pos++;
16985
16986 char *id_len_pos = strchr (enc_md_pos, '*');
16987
16988 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16989
16990 u32 enc_md_len = id_len_pos - enc_md_pos;
16991
16992 id_len_pos++;
16993
16994 char *id_buf_pos = strchr (id_len_pos, '*');
16995
16996 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16997
16998 u32 id_len_len = id_buf_pos - id_len_pos;
16999
17000 id_buf_pos++;
17001
17002 char *u_len_pos = strchr (id_buf_pos, '*');
17003
17004 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17005
17006 u32 id_buf_len = u_len_pos - id_buf_pos;
17007
17008 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
17009
17010 u_len_pos++;
17011
17012 char *u_buf_pos = strchr (u_len_pos, '*');
17013
17014 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17015
17016 u32 u_len_len = u_buf_pos - u_len_pos;
17017
17018 u_buf_pos++;
17019
17020 char *o_len_pos = strchr (u_buf_pos, '*');
17021
17022 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17023
17024 u32 u_buf_len = o_len_pos - u_buf_pos;
17025
17026 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17027
17028 o_len_pos++;
17029
17030 char *o_buf_pos = strchr (o_len_pos, '*');
17031
17032 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17033
17034 u32 o_len_len = o_buf_pos - o_len_pos;
17035
17036 o_buf_pos++;
17037
17038 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;
17039
17040 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17041
17042 // validate data
17043
17044 const int V = atoi (V_pos);
17045 const int R = atoi (R_pos);
17046 const int P = atoi (P_pos);
17047
17048 int vr_ok = 0;
17049
17050 if ((V == 2) && (R == 3)) vr_ok = 1;
17051 if ((V == 4) && (R == 4)) vr_ok = 1;
17052
17053 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17054
17055 const int id_len = atoi (id_len_pos);
17056 const int u_len = atoi (u_len_pos);
17057 const int o_len = atoi (o_len_pos);
17058
17059 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
17060
17061 if (u_len != 32) return (PARSER_SALT_VALUE);
17062 if (o_len != 32) return (PARSER_SALT_VALUE);
17063
17064 const int bits = atoi (bits_pos);
17065
17066 if (bits != 128) return (PARSER_SALT_VALUE);
17067
17068 int enc_md = 1;
17069
17070 if (R >= 4)
17071 {
17072 enc_md = atoi (enc_md_pos);
17073 }
17074
17075 // copy data to esalt
17076
17077 pdf->V = V;
17078 pdf->R = R;
17079 pdf->P = P;
17080
17081 pdf->enc_md = enc_md;
17082
17083 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17084 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17085 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17086 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17087
17088 if (id_len == 32)
17089 {
17090 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
17091 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
17092 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
17093 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
17094 }
17095
17096 pdf->id_len = id_len;
17097
17098 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17099 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17100 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17101 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17102 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17103 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17104 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17105 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17106 pdf->u_len = u_len;
17107
17108 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17109 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17110 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17111 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17112 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17113 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17114 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17115 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17116 pdf->o_len = o_len;
17117
17118 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17119 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17120 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17121 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17122
17123 if (id_len == 32)
17124 {
17125 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
17126 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
17127 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
17128 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
17129 }
17130
17131 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17132 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17133 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17134 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17135 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17136 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17137 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17138 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17139
17140 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17141 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17142 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17143 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17144 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17145 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17146 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17147 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17148
17149 // precompute rc4 data for later use
17150
17151 uint padding[8] =
17152 {
17153 0x5e4ebf28,
17154 0x418a754e,
17155 0x564e0064,
17156 0x0801faff,
17157 0xb6002e2e,
17158 0x803e68d0,
17159 0xfea90c2f,
17160 0x7a695364
17161 };
17162
17163 // md5
17164
17165 uint salt_pc_block[32] = { 0 };
17166
17167 char *salt_pc_ptr = (char *) salt_pc_block;
17168
17169 memcpy (salt_pc_ptr, padding, 32);
17170 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
17171
17172 uint salt_pc_digest[4] = { 0 };
17173
17174 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
17175
17176 pdf->rc4data[0] = salt_pc_digest[0];
17177 pdf->rc4data[1] = salt_pc_digest[1];
17178
17179 // we use ID for salt, maybe needs to change, we will see...
17180
17181 salt->salt_buf[0] = pdf->id_buf[0];
17182 salt->salt_buf[1] = pdf->id_buf[1];
17183 salt->salt_buf[2] = pdf->id_buf[2];
17184 salt->salt_buf[3] = pdf->id_buf[3];
17185 salt->salt_buf[4] = pdf->u_buf[0];
17186 salt->salt_buf[5] = pdf->u_buf[1];
17187 salt->salt_buf[6] = pdf->o_buf[0];
17188 salt->salt_buf[7] = pdf->o_buf[1];
17189 salt->salt_len = pdf->id_len + 16;
17190
17191 salt->salt_iter = ROUNDS_PDF14;
17192
17193 digest[0] = pdf->u_buf[0];
17194 digest[1] = pdf->u_buf[1];
17195 digest[2] = 0;
17196 digest[3] = 0;
17197
17198 return (PARSER_OK);
17199 }
17200
17201 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17202 {
17203 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17204
17205 if (ret != PARSER_OK)
17206 {
17207 return ret;
17208 }
17209
17210 u32 *digest = (u32 *) hash_buf->digest;
17211
17212 salt_t *salt = hash_buf->salt;
17213
17214 digest[0] -= SHA256M_A;
17215 digest[1] -= SHA256M_B;
17216 digest[2] -= SHA256M_C;
17217 digest[3] -= SHA256M_D;
17218 digest[4] -= SHA256M_E;
17219 digest[5] -= SHA256M_F;
17220 digest[6] -= SHA256M_G;
17221 digest[7] -= SHA256M_H;
17222
17223 salt->salt_buf[2] = 0x80;
17224
17225 return (PARSER_OK);
17226 }
17227
17228 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17229 {
17230 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17231
17232 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17233
17234 u32 *digest = (u32 *) hash_buf->digest;
17235
17236 salt_t *salt = hash_buf->salt;
17237
17238 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17239
17240 /**
17241 * parse line
17242 */
17243
17244 char *V_pos = input_buf + 5;
17245
17246 char *R_pos = strchr (V_pos, '*');
17247
17248 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17249
17250 u32 V_len = R_pos - V_pos;
17251
17252 R_pos++;
17253
17254 char *bits_pos = strchr (R_pos, '*');
17255
17256 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17257
17258 u32 R_len = bits_pos - R_pos;
17259
17260 bits_pos++;
17261
17262 char *P_pos = strchr (bits_pos, '*');
17263
17264 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17265
17266 u32 bits_len = P_pos - bits_pos;
17267
17268 P_pos++;
17269
17270 char *enc_md_pos = strchr (P_pos, '*');
17271
17272 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17273
17274 u32 P_len = enc_md_pos - P_pos;
17275
17276 enc_md_pos++;
17277
17278 char *id_len_pos = strchr (enc_md_pos, '*');
17279
17280 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17281
17282 u32 enc_md_len = id_len_pos - enc_md_pos;
17283
17284 id_len_pos++;
17285
17286 char *id_buf_pos = strchr (id_len_pos, '*');
17287
17288 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17289
17290 u32 id_len_len = id_buf_pos - id_len_pos;
17291
17292 id_buf_pos++;
17293
17294 char *u_len_pos = strchr (id_buf_pos, '*');
17295
17296 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17297
17298 u32 id_buf_len = u_len_pos - id_buf_pos;
17299
17300 u_len_pos++;
17301
17302 char *u_buf_pos = strchr (u_len_pos, '*');
17303
17304 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17305
17306 u32 u_len_len = u_buf_pos - u_len_pos;
17307
17308 u_buf_pos++;
17309
17310 char *o_len_pos = strchr (u_buf_pos, '*');
17311
17312 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17313
17314 u32 u_buf_len = o_len_pos - u_buf_pos;
17315
17316 o_len_pos++;
17317
17318 char *o_buf_pos = strchr (o_len_pos, '*');
17319
17320 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17321
17322 u32 o_len_len = o_buf_pos - o_len_pos;
17323
17324 o_buf_pos++;
17325
17326 char *last = strchr (o_buf_pos, '*');
17327
17328 if (last == NULL) last = input_buf + input_len;
17329
17330 u32 o_buf_len = last - o_buf_pos;
17331
17332 // validate data
17333
17334 const int V = atoi (V_pos);
17335 const int R = atoi (R_pos);
17336
17337 int vr_ok = 0;
17338
17339 if ((V == 5) && (R == 5)) vr_ok = 1;
17340 if ((V == 5) && (R == 6)) vr_ok = 1;
17341
17342 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17343
17344 const int bits = atoi (bits_pos);
17345
17346 if (bits != 256) return (PARSER_SALT_VALUE);
17347
17348 int enc_md = atoi (enc_md_pos);
17349
17350 if (enc_md != 1) return (PARSER_SALT_VALUE);
17351
17352 const uint id_len = atoi (id_len_pos);
17353 const uint u_len = atoi (u_len_pos);
17354 const uint o_len = atoi (o_len_pos);
17355
17356 if (V_len > 6) return (PARSER_SALT_LENGTH);
17357 if (R_len > 6) return (PARSER_SALT_LENGTH);
17358 if (P_len > 6) return (PARSER_SALT_LENGTH);
17359 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17360 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17361 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17362 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17363 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17364
17365 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17366 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17367 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17368
17369 // copy data to esalt
17370
17371 if (u_len < 40) return (PARSER_SALT_VALUE);
17372
17373 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17374 {
17375 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17376 }
17377
17378 salt->salt_buf[0] = pdf->u_buf[8];
17379 salt->salt_buf[1] = pdf->u_buf[9];
17380
17381 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17382 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17383
17384 salt->salt_len = 8;
17385 salt->salt_iter = ROUNDS_PDF17L8;
17386
17387 digest[0] = pdf->u_buf[0];
17388 digest[1] = pdf->u_buf[1];
17389 digest[2] = pdf->u_buf[2];
17390 digest[3] = pdf->u_buf[3];
17391 digest[4] = pdf->u_buf[4];
17392 digest[5] = pdf->u_buf[5];
17393 digest[6] = pdf->u_buf[6];
17394 digest[7] = pdf->u_buf[7];
17395
17396 return (PARSER_OK);
17397 }
17398
17399 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17400 {
17401 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17402
17403 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17404
17405 u32 *digest = (u32 *) hash_buf->digest;
17406
17407 salt_t *salt = hash_buf->salt;
17408
17409 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17410
17411 /**
17412 * parse line
17413 */
17414
17415 // iterations
17416
17417 char *iter_pos = input_buf + 7;
17418
17419 u32 iter = atoi (iter_pos);
17420
17421 if (iter < 1) return (PARSER_SALT_ITERATION);
17422 if (iter > 999999) return (PARSER_SALT_ITERATION);
17423
17424 // first is *raw* salt
17425
17426 char *salt_pos = strchr (iter_pos, ':');
17427
17428 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17429
17430 salt_pos++;
17431
17432 char *hash_pos = strchr (salt_pos, ':');
17433
17434 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17435
17436 u32 salt_len = hash_pos - salt_pos;
17437
17438 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17439
17440 hash_pos++;
17441
17442 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17443
17444 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17445
17446 // decode salt
17447
17448 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17449
17450 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17451
17452 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17453
17454 salt_buf_ptr[salt_len + 3] = 0x01;
17455 salt_buf_ptr[salt_len + 4] = 0x80;
17456
17457 salt->salt_len = salt_len;
17458 salt->salt_iter = iter - 1;
17459
17460 // decode hash
17461
17462 u8 tmp_buf[100] = { 0 };
17463
17464 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17465
17466 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17467
17468 memcpy (digest, tmp_buf, 16);
17469
17470 digest[0] = byte_swap_32 (digest[0]);
17471 digest[1] = byte_swap_32 (digest[1]);
17472 digest[2] = byte_swap_32 (digest[2]);
17473 digest[3] = byte_swap_32 (digest[3]);
17474
17475 // add some stuff to normal salt to make sorted happy
17476
17477 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17478 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17479 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17480 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17481 salt->salt_buf[4] = salt->salt_iter;
17482
17483 return (PARSER_OK);
17484 }
17485
17486 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17487 {
17488 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17489
17490 u32 *digest = (u32 *) hash_buf->digest;
17491
17492 salt_t *salt = hash_buf->salt;
17493
17494 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17495 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17496 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17497 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17498
17499 digest[0] = byte_swap_32 (digest[0]);
17500 digest[1] = byte_swap_32 (digest[1]);
17501 digest[2] = byte_swap_32 (digest[2]);
17502 digest[3] = byte_swap_32 (digest[3]);
17503
17504 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17505
17506 uint salt_len = input_len - 32 - 1;
17507
17508 char *salt_buf = input_buf + 32 + 1;
17509
17510 char *salt_buf_ptr = (char *) salt->salt_buf;
17511
17512 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17513
17514 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17515
17516 salt->salt_len = salt_len;
17517
17518 return (PARSER_OK);
17519 }
17520
17521 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17522 {
17523 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17524
17525 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17526
17527 u32 *digest = (u32 *) hash_buf->digest;
17528
17529 salt_t *salt = hash_buf->salt;
17530
17531 char *user_pos = input_buf + 10;
17532
17533 char *salt_pos = strchr (user_pos, '*');
17534
17535 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17536
17537 salt_pos++;
17538
17539 char *hash_pos = strchr (salt_pos, '*');
17540
17541 hash_pos++;
17542
17543 uint hash_len = input_len - (hash_pos - input_buf);
17544
17545 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17546
17547 uint user_len = salt_pos - user_pos - 1;
17548
17549 uint salt_len = hash_pos - salt_pos - 1;
17550
17551 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17552
17553 /*
17554 * store digest
17555 */
17556
17557 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17558 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17559 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17560 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17561
17562 digest[0] = byte_swap_32 (digest[0]);
17563 digest[1] = byte_swap_32 (digest[1]);
17564 digest[2] = byte_swap_32 (digest[2]);
17565 digest[3] = byte_swap_32 (digest[3]);
17566
17567 digest[0] -= MD5M_A;
17568 digest[1] -= MD5M_B;
17569 digest[2] -= MD5M_C;
17570 digest[3] -= MD5M_D;
17571
17572 /*
17573 * store salt
17574 */
17575
17576 char *salt_buf_ptr = (char *) salt->salt_buf;
17577
17578 // first 4 bytes are the "challenge"
17579
17580 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17581 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17582 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17583 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17584
17585 // append the user name
17586
17587 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17588
17589 salt->salt_len = 4 + user_len;
17590
17591 return (PARSER_OK);
17592 }
17593
17594 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17595 {
17596 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17597
17598 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17599
17600 u32 *digest = (u32 *) hash_buf->digest;
17601
17602 salt_t *salt = hash_buf->salt;
17603
17604 char *salt_pos = input_buf + 9;
17605
17606 char *hash_pos = strchr (salt_pos, '*');
17607
17608 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17609
17610 hash_pos++;
17611
17612 uint hash_len = input_len - (hash_pos - input_buf);
17613
17614 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17615
17616 uint salt_len = hash_pos - salt_pos - 1;
17617
17618 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17619
17620 /*
17621 * store digest
17622 */
17623
17624 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17625 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17626 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17627 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17628 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17629
17630 /*
17631 * store salt
17632 */
17633
17634 char *salt_buf_ptr = (char *) salt->salt_buf;
17635
17636 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17637
17638 salt->salt_len = salt_len;
17639
17640 return (PARSER_OK);
17641 }
17642
17643 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17644 {
17645 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17646
17647 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17648
17649 u32 *digest = (u32 *) hash_buf->digest;
17650
17651 salt_t *salt = hash_buf->salt;
17652
17653 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17654
17655 /**
17656 * parse line
17657 */
17658
17659 char *cry_master_len_pos = input_buf + 9;
17660
17661 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17662
17663 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17664
17665 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17666
17667 cry_master_buf_pos++;
17668
17669 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17670
17671 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17672
17673 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17674
17675 cry_salt_len_pos++;
17676
17677 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17678
17679 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17680
17681 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17682
17683 cry_salt_buf_pos++;
17684
17685 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17686
17687 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17688
17689 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17690
17691 cry_rounds_pos++;
17692
17693 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17694
17695 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17696
17697 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17698
17699 ckey_len_pos++;
17700
17701 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17702
17703 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17704
17705 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17706
17707 ckey_buf_pos++;
17708
17709 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17710
17711 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17712
17713 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17714
17715 public_key_len_pos++;
17716
17717 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17718
17719 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17720
17721 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17722
17723 public_key_buf_pos++;
17724
17725 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;
17726
17727 const uint cry_master_len = atoi (cry_master_len_pos);
17728 const uint cry_salt_len = atoi (cry_salt_len_pos);
17729 const uint ckey_len = atoi (ckey_len_pos);
17730 const uint public_key_len = atoi (public_key_len_pos);
17731
17732 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17733 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17734 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17735 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17736
17737 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17738 {
17739 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17740
17741 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17742 }
17743
17744 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17745 {
17746 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17747
17748 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17749 }
17750
17751 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17752 {
17753 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17754
17755 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17756 }
17757
17758 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17759 bitcoin_wallet->ckey_len = ckey_len / 2;
17760 bitcoin_wallet->public_key_len = public_key_len / 2;
17761
17762 /*
17763 * store digest (should be unique enought, hopefully)
17764 */
17765
17766 digest[0] = bitcoin_wallet->cry_master_buf[0];
17767 digest[1] = bitcoin_wallet->cry_master_buf[1];
17768 digest[2] = bitcoin_wallet->cry_master_buf[2];
17769 digest[3] = bitcoin_wallet->cry_master_buf[3];
17770
17771 /*
17772 * store salt
17773 */
17774
17775 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17776
17777 const uint cry_rounds = atoi (cry_rounds_pos);
17778
17779 salt->salt_iter = cry_rounds - 1;
17780
17781 char *salt_buf_ptr = (char *) salt->salt_buf;
17782
17783 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17784
17785 salt->salt_len = salt_len;
17786
17787 return (PARSER_OK);
17788 }
17789
17790 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17791 {
17792 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17793
17794 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17795
17796 u32 *digest = (u32 *) hash_buf->digest;
17797
17798 salt_t *salt = hash_buf->salt;
17799
17800 sip_t *sip = (sip_t *) hash_buf->esalt;
17801
17802 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17803
17804 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17805
17806 memcpy (temp_input_buf, input_buf, input_len);
17807
17808 // URI_server:
17809
17810 char *URI_server_pos = temp_input_buf + 6;
17811
17812 char *URI_client_pos = strchr (URI_server_pos, '*');
17813
17814 if (URI_client_pos == NULL)
17815 {
17816 myfree (temp_input_buf);
17817
17818 return (PARSER_SEPARATOR_UNMATCHED);
17819 }
17820
17821 URI_client_pos[0] = 0;
17822 URI_client_pos++;
17823
17824 uint URI_server_len = strlen (URI_server_pos);
17825
17826 if (URI_server_len > 512)
17827 {
17828 myfree (temp_input_buf);
17829
17830 return (PARSER_SALT_LENGTH);
17831 }
17832
17833 // URI_client:
17834
17835 char *user_pos = strchr (URI_client_pos, '*');
17836
17837 if (user_pos == NULL)
17838 {
17839 myfree (temp_input_buf);
17840
17841 return (PARSER_SEPARATOR_UNMATCHED);
17842 }
17843
17844 user_pos[0] = 0;
17845 user_pos++;
17846
17847 uint URI_client_len = strlen (URI_client_pos);
17848
17849 if (URI_client_len > 512)
17850 {
17851 myfree (temp_input_buf);
17852
17853 return (PARSER_SALT_LENGTH);
17854 }
17855
17856 // user:
17857
17858 char *realm_pos = strchr (user_pos, '*');
17859
17860 if (realm_pos == NULL)
17861 {
17862 myfree (temp_input_buf);
17863
17864 return (PARSER_SEPARATOR_UNMATCHED);
17865 }
17866
17867 realm_pos[0] = 0;
17868 realm_pos++;
17869
17870 uint user_len = strlen (user_pos);
17871
17872 if (user_len > 116)
17873 {
17874 myfree (temp_input_buf);
17875
17876 return (PARSER_SALT_LENGTH);
17877 }
17878
17879 // realm:
17880
17881 char *method_pos = strchr (realm_pos, '*');
17882
17883 if (method_pos == NULL)
17884 {
17885 myfree (temp_input_buf);
17886
17887 return (PARSER_SEPARATOR_UNMATCHED);
17888 }
17889
17890 method_pos[0] = 0;
17891 method_pos++;
17892
17893 uint realm_len = strlen (realm_pos);
17894
17895 if (realm_len > 116)
17896 {
17897 myfree (temp_input_buf);
17898
17899 return (PARSER_SALT_LENGTH);
17900 }
17901
17902 // method:
17903
17904 char *URI_prefix_pos = strchr (method_pos, '*');
17905
17906 if (URI_prefix_pos == NULL)
17907 {
17908 myfree (temp_input_buf);
17909
17910 return (PARSER_SEPARATOR_UNMATCHED);
17911 }
17912
17913 URI_prefix_pos[0] = 0;
17914 URI_prefix_pos++;
17915
17916 uint method_len = strlen (method_pos);
17917
17918 if (method_len > 246)
17919 {
17920 myfree (temp_input_buf);
17921
17922 return (PARSER_SALT_LENGTH);
17923 }
17924
17925 // URI_prefix:
17926
17927 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17928
17929 if (URI_resource_pos == NULL)
17930 {
17931 myfree (temp_input_buf);
17932
17933 return (PARSER_SEPARATOR_UNMATCHED);
17934 }
17935
17936 URI_resource_pos[0] = 0;
17937 URI_resource_pos++;
17938
17939 uint URI_prefix_len = strlen (URI_prefix_pos);
17940
17941 if (URI_prefix_len > 245)
17942 {
17943 myfree (temp_input_buf);
17944
17945 return (PARSER_SALT_LENGTH);
17946 }
17947
17948 // URI_resource:
17949
17950 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17951
17952 if (URI_suffix_pos == NULL)
17953 {
17954 myfree (temp_input_buf);
17955
17956 return (PARSER_SEPARATOR_UNMATCHED);
17957 }
17958
17959 URI_suffix_pos[0] = 0;
17960 URI_suffix_pos++;
17961
17962 uint URI_resource_len = strlen (URI_resource_pos);
17963
17964 if (URI_resource_len < 1 || URI_resource_len > 246)
17965 {
17966 myfree (temp_input_buf);
17967
17968 return (PARSER_SALT_LENGTH);
17969 }
17970
17971 // URI_suffix:
17972
17973 char *nonce_pos = strchr (URI_suffix_pos, '*');
17974
17975 if (nonce_pos == NULL)
17976 {
17977 myfree (temp_input_buf);
17978
17979 return (PARSER_SEPARATOR_UNMATCHED);
17980 }
17981
17982 nonce_pos[0] = 0;
17983 nonce_pos++;
17984
17985 uint URI_suffix_len = strlen (URI_suffix_pos);
17986
17987 if (URI_suffix_len > 245)
17988 {
17989 myfree (temp_input_buf);
17990
17991 return (PARSER_SALT_LENGTH);
17992 }
17993
17994 // nonce:
17995
17996 char *nonce_client_pos = strchr (nonce_pos, '*');
17997
17998 if (nonce_client_pos == NULL)
17999 {
18000 myfree (temp_input_buf);
18001
18002 return (PARSER_SEPARATOR_UNMATCHED);
18003 }
18004
18005 nonce_client_pos[0] = 0;
18006 nonce_client_pos++;
18007
18008 uint nonce_len = strlen (nonce_pos);
18009
18010 if (nonce_len < 1 || nonce_len > 50)
18011 {
18012 myfree (temp_input_buf);
18013
18014 return (PARSER_SALT_LENGTH);
18015 }
18016
18017 // nonce_client:
18018
18019 char *nonce_count_pos = strchr (nonce_client_pos, '*');
18020
18021 if (nonce_count_pos == NULL)
18022 {
18023 myfree (temp_input_buf);
18024
18025 return (PARSER_SEPARATOR_UNMATCHED);
18026 }
18027
18028 nonce_count_pos[0] = 0;
18029 nonce_count_pos++;
18030
18031 uint nonce_client_len = strlen (nonce_client_pos);
18032
18033 if (nonce_client_len > 50)
18034 {
18035 myfree (temp_input_buf);
18036
18037 return (PARSER_SALT_LENGTH);
18038 }
18039
18040 // nonce_count:
18041
18042 char *qop_pos = strchr (nonce_count_pos, '*');
18043
18044 if (qop_pos == NULL)
18045 {
18046 myfree (temp_input_buf);
18047
18048 return (PARSER_SEPARATOR_UNMATCHED);
18049 }
18050
18051 qop_pos[0] = 0;
18052 qop_pos++;
18053
18054 uint nonce_count_len = strlen (nonce_count_pos);
18055
18056 if (nonce_count_len > 50)
18057 {
18058 myfree (temp_input_buf);
18059
18060 return (PARSER_SALT_LENGTH);
18061 }
18062
18063 // qop:
18064
18065 char *directive_pos = strchr (qop_pos, '*');
18066
18067 if (directive_pos == NULL)
18068 {
18069 myfree (temp_input_buf);
18070
18071 return (PARSER_SEPARATOR_UNMATCHED);
18072 }
18073
18074 directive_pos[0] = 0;
18075 directive_pos++;
18076
18077 uint qop_len = strlen (qop_pos);
18078
18079 if (qop_len > 50)
18080 {
18081 myfree (temp_input_buf);
18082
18083 return (PARSER_SALT_LENGTH);
18084 }
18085
18086 // directive
18087
18088 char *digest_pos = strchr (directive_pos, '*');
18089
18090 if (digest_pos == NULL)
18091 {
18092 myfree (temp_input_buf);
18093
18094 return (PARSER_SEPARATOR_UNMATCHED);
18095 }
18096
18097 digest_pos[0] = 0;
18098 digest_pos++;
18099
18100 uint directive_len = strlen (directive_pos);
18101
18102 if (directive_len != 3)
18103 {
18104 myfree (temp_input_buf);
18105
18106 return (PARSER_SALT_LENGTH);
18107 }
18108
18109 if (memcmp (directive_pos, "MD5", 3))
18110 {
18111 log_info ("ERROR: only the MD5 directive is currently supported\n");
18112
18113 myfree (temp_input_buf);
18114
18115 return (PARSER_SIP_AUTH_DIRECTIVE);
18116 }
18117
18118 /*
18119 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
18120 */
18121
18122 uint md5_len = 0;
18123
18124 uint md5_max_len = 4 * 64;
18125
18126 uint md5_remaining_len = md5_max_len;
18127
18128 uint tmp_md5_buf[64] = { 0 };
18129
18130 char *tmp_md5_ptr = (char *) tmp_md5_buf;
18131
18132 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
18133
18134 md5_len += method_len + 1;
18135 tmp_md5_ptr += method_len + 1;
18136
18137 if (URI_prefix_len > 0)
18138 {
18139 md5_remaining_len = md5_max_len - md5_len;
18140
18141 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
18142
18143 md5_len += URI_prefix_len + 1;
18144 tmp_md5_ptr += URI_prefix_len + 1;
18145 }
18146
18147 md5_remaining_len = md5_max_len - md5_len;
18148
18149 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
18150
18151 md5_len += URI_resource_len;
18152 tmp_md5_ptr += URI_resource_len;
18153
18154 if (URI_suffix_len > 0)
18155 {
18156 md5_remaining_len = md5_max_len - md5_len;
18157
18158 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
18159
18160 md5_len += 1 + URI_suffix_len;
18161 }
18162
18163 uint tmp_digest[4] = { 0 };
18164
18165 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
18166
18167 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
18168 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
18169 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
18170 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
18171
18172 /*
18173 * esalt
18174 */
18175
18176 char *esalt_buf_ptr = (char *) sip->esalt_buf;
18177
18178 uint esalt_len = 0;
18179
18180 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
18181
18182 // there are 2 possibilities for the esalt:
18183
18184 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
18185 {
18186 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
18187
18188 if (esalt_len > max_esalt_len)
18189 {
18190 myfree (temp_input_buf);
18191
18192 return (PARSER_SALT_LENGTH);
18193 }
18194
18195 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18196 nonce_pos,
18197 nonce_count_pos,
18198 nonce_client_pos,
18199 qop_pos,
18200 tmp_digest[0],
18201 tmp_digest[1],
18202 tmp_digest[2],
18203 tmp_digest[3]);
18204 }
18205 else
18206 {
18207 esalt_len = 1 + nonce_len + 1 + 32;
18208
18209 if (esalt_len > max_esalt_len)
18210 {
18211 myfree (temp_input_buf);
18212
18213 return (PARSER_SALT_LENGTH);
18214 }
18215
18216 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18217 nonce_pos,
18218 tmp_digest[0],
18219 tmp_digest[1],
18220 tmp_digest[2],
18221 tmp_digest[3]);
18222 }
18223
18224 // add 0x80 to esalt
18225
18226 esalt_buf_ptr[esalt_len] = 0x80;
18227
18228 sip->esalt_len = esalt_len;
18229
18230 /*
18231 * actual salt
18232 */
18233
18234 char *sip_salt_ptr = (char *) sip->salt_buf;
18235
18236 uint salt_len = user_len + 1 + realm_len + 1;
18237
18238 uint max_salt_len = 119;
18239
18240 if (salt_len > max_salt_len)
18241 {
18242 myfree (temp_input_buf);
18243
18244 return (PARSER_SALT_LENGTH);
18245 }
18246
18247 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18248
18249 sip->salt_len = salt_len;
18250
18251 /*
18252 * fake salt (for sorting)
18253 */
18254
18255 char *salt_buf_ptr = (char *) salt->salt_buf;
18256
18257 max_salt_len = 55;
18258
18259 uint fake_salt_len = salt_len;
18260
18261 if (fake_salt_len > max_salt_len)
18262 {
18263 fake_salt_len = max_salt_len;
18264 }
18265
18266 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18267
18268 salt->salt_len = fake_salt_len;
18269
18270 /*
18271 * digest
18272 */
18273
18274 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18275 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18276 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18277 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18278
18279 digest[0] = byte_swap_32 (digest[0]);
18280 digest[1] = byte_swap_32 (digest[1]);
18281 digest[2] = byte_swap_32 (digest[2]);
18282 digest[3] = byte_swap_32 (digest[3]);
18283
18284 myfree (temp_input_buf);
18285
18286 return (PARSER_OK);
18287 }
18288
18289 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18290 {
18291 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18292
18293 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18294
18295 u32 *digest = (u32 *) hash_buf->digest;
18296
18297 salt_t *salt = hash_buf->salt;
18298
18299 // digest
18300
18301 char *digest_pos = input_buf;
18302
18303 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18304 digest[1] = 0;
18305 digest[2] = 0;
18306 digest[3] = 0;
18307
18308 // salt
18309
18310 char *salt_buf = input_buf + 8 + 1;
18311
18312 uint salt_len = 8;
18313
18314 char *salt_buf_ptr = (char *) salt->salt_buf;
18315
18316 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18317
18318 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18319
18320 salt->salt_len = salt_len;
18321
18322 return (PARSER_OK);
18323 }
18324
18325 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18326 {
18327 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18328
18329 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18330
18331 u32 *digest = (u32 *) hash_buf->digest;
18332
18333 salt_t *salt = hash_buf->salt;
18334
18335 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18336
18337 /**
18338 * parse line
18339 */
18340
18341 char *p_buf_pos = input_buf + 4;
18342
18343 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18344
18345 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18346
18347 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18348
18349 NumCyclesPower_pos++;
18350
18351 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18352
18353 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18354
18355 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18356
18357 salt_len_pos++;
18358
18359 char *salt_buf_pos = strchr (salt_len_pos, '$');
18360
18361 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18362
18363 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18364
18365 salt_buf_pos++;
18366
18367 char *iv_len_pos = strchr (salt_buf_pos, '$');
18368
18369 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18370
18371 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18372
18373 iv_len_pos++;
18374
18375 char *iv_buf_pos = strchr (iv_len_pos, '$');
18376
18377 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18378
18379 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18380
18381 iv_buf_pos++;
18382
18383 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18384
18385 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18386
18387 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18388
18389 crc_buf_pos++;
18390
18391 char *data_len_pos = strchr (crc_buf_pos, '$');
18392
18393 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18394
18395 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18396
18397 data_len_pos++;
18398
18399 char *unpack_size_pos = strchr (data_len_pos, '$');
18400
18401 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18402
18403 u32 data_len_len = unpack_size_pos - data_len_pos;
18404
18405 unpack_size_pos++;
18406
18407 char *data_buf_pos = strchr (unpack_size_pos, '$');
18408
18409 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18410
18411 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18412
18413 data_buf_pos++;
18414
18415 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;
18416
18417 const uint iter = atoi (NumCyclesPower_pos);
18418 const uint crc = atoi (crc_buf_pos);
18419 const uint p_buf = atoi (p_buf_pos);
18420 const uint salt_len = atoi (salt_len_pos);
18421 const uint iv_len = atoi (iv_len_pos);
18422 const uint unpack_size = atoi (unpack_size_pos);
18423 const uint data_len = atoi (data_len_pos);
18424
18425 /**
18426 * verify some data
18427 */
18428
18429 if (p_buf != 0) return (PARSER_SALT_VALUE);
18430 if (salt_len != 0) return (PARSER_SALT_VALUE);
18431
18432 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18433
18434 if (data_len > 384) return (PARSER_SALT_VALUE);
18435
18436 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18437
18438 /**
18439 * store data
18440 */
18441
18442 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18443 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18444 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18445 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18446
18447 seven_zip->iv_len = iv_len;
18448
18449 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18450
18451 seven_zip->salt_len = 0;
18452
18453 seven_zip->crc = crc;
18454
18455 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18456 {
18457 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18458
18459 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18460 }
18461
18462 seven_zip->data_len = data_len;
18463
18464 seven_zip->unpack_size = unpack_size;
18465
18466 // real salt
18467
18468 salt->salt_buf[0] = seven_zip->data_buf[0];
18469 salt->salt_buf[1] = seven_zip->data_buf[1];
18470 salt->salt_buf[2] = seven_zip->data_buf[2];
18471 salt->salt_buf[3] = seven_zip->data_buf[3];
18472
18473 salt->salt_len = 16;
18474
18475 salt->salt_sign[0] = iter;
18476
18477 salt->salt_iter = 1 << iter;
18478
18479 /**
18480 * digest
18481 */
18482
18483 digest[0] = crc;
18484 digest[1] = 0;
18485 digest[2] = 0;
18486 digest[3] = 0;
18487
18488 return (PARSER_OK);
18489 }
18490
18491 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18492 {
18493 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18494
18495 u32 *digest = (u32 *) hash_buf->digest;
18496
18497 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18498 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18499 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18500 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18501 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18502 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18503 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18504 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18505
18506 digest[0] = byte_swap_32 (digest[0]);
18507 digest[1] = byte_swap_32 (digest[1]);
18508 digest[2] = byte_swap_32 (digest[2]);
18509 digest[3] = byte_swap_32 (digest[3]);
18510 digest[4] = byte_swap_32 (digest[4]);
18511 digest[5] = byte_swap_32 (digest[5]);
18512 digest[6] = byte_swap_32 (digest[6]);
18513 digest[7] = byte_swap_32 (digest[7]);
18514
18515 return (PARSER_OK);
18516 }
18517
18518 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18519 {
18520 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18521
18522 u32 *digest = (u32 *) hash_buf->digest;
18523
18524 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18525 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18526 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18527 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18528 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18529 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18530 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18531 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18532 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18533 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18534 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18535 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18536 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18537 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18538 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18539 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18540
18541 digest[ 0] = byte_swap_32 (digest[ 0]);
18542 digest[ 1] = byte_swap_32 (digest[ 1]);
18543 digest[ 2] = byte_swap_32 (digest[ 2]);
18544 digest[ 3] = byte_swap_32 (digest[ 3]);
18545 digest[ 4] = byte_swap_32 (digest[ 4]);
18546 digest[ 5] = byte_swap_32 (digest[ 5]);
18547 digest[ 6] = byte_swap_32 (digest[ 6]);
18548 digest[ 7] = byte_swap_32 (digest[ 7]);
18549 digest[ 8] = byte_swap_32 (digest[ 8]);
18550 digest[ 9] = byte_swap_32 (digest[ 9]);
18551 digest[10] = byte_swap_32 (digest[10]);
18552 digest[11] = byte_swap_32 (digest[11]);
18553 digest[12] = byte_swap_32 (digest[12]);
18554 digest[13] = byte_swap_32 (digest[13]);
18555 digest[14] = byte_swap_32 (digest[14]);
18556 digest[15] = byte_swap_32 (digest[15]);
18557
18558 return (PARSER_OK);
18559 }
18560
18561 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18562 {
18563 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18564
18565 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18566
18567 u32 *digest = (u32 *) hash_buf->digest;
18568
18569 salt_t *salt = hash_buf->salt;
18570
18571 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18572
18573 /**
18574 * parse line
18575 */
18576
18577 // iterations
18578
18579 char *iter_pos = input_buf + 4;
18580
18581 u32 iter = atoi (iter_pos);
18582
18583 if (iter < 1) return (PARSER_SALT_ITERATION);
18584 if (iter > 999999) return (PARSER_SALT_ITERATION);
18585
18586 // first is *raw* salt
18587
18588 char *salt_pos = strchr (iter_pos, ':');
18589
18590 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18591
18592 salt_pos++;
18593
18594 char *hash_pos = strchr (salt_pos, ':');
18595
18596 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18597
18598 u32 salt_len = hash_pos - salt_pos;
18599
18600 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18601
18602 hash_pos++;
18603
18604 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18605
18606 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18607
18608 // decode salt
18609
18610 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18611
18612 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18613
18614 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18615
18616 salt_buf_ptr[salt_len + 3] = 0x01;
18617 salt_buf_ptr[salt_len + 4] = 0x80;
18618
18619 salt->salt_len = salt_len;
18620 salt->salt_iter = iter - 1;
18621
18622 // decode hash
18623
18624 u8 tmp_buf[100] = { 0 };
18625
18626 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18627
18628 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18629
18630 memcpy (digest, tmp_buf, 16);
18631
18632 // add some stuff to normal salt to make sorted happy
18633
18634 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18635 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18636 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18637 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18638 salt->salt_buf[4] = salt->salt_iter;
18639
18640 return (PARSER_OK);
18641 }
18642
18643 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18644 {
18645 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18646
18647 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18648
18649 u32 *digest = (u32 *) hash_buf->digest;
18650
18651 salt_t *salt = hash_buf->salt;
18652
18653 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18654
18655 /**
18656 * parse line
18657 */
18658
18659 // iterations
18660
18661 char *iter_pos = input_buf + 5;
18662
18663 u32 iter = atoi (iter_pos);
18664
18665 if (iter < 1) return (PARSER_SALT_ITERATION);
18666 if (iter > 999999) return (PARSER_SALT_ITERATION);
18667
18668 // first is *raw* salt
18669
18670 char *salt_pos = strchr (iter_pos, ':');
18671
18672 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18673
18674 salt_pos++;
18675
18676 char *hash_pos = strchr (salt_pos, ':');
18677
18678 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18679
18680 u32 salt_len = hash_pos - salt_pos;
18681
18682 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18683
18684 hash_pos++;
18685
18686 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18687
18688 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18689
18690 // decode salt
18691
18692 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18693
18694 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18695
18696 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18697
18698 salt_buf_ptr[salt_len + 3] = 0x01;
18699 salt_buf_ptr[salt_len + 4] = 0x80;
18700
18701 salt->salt_len = salt_len;
18702 salt->salt_iter = iter - 1;
18703
18704 // decode hash
18705
18706 u8 tmp_buf[100] = { 0 };
18707
18708 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18709
18710 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18711
18712 memcpy (digest, tmp_buf, 16);
18713
18714 digest[0] = byte_swap_32 (digest[0]);
18715 digest[1] = byte_swap_32 (digest[1]);
18716 digest[2] = byte_swap_32 (digest[2]);
18717 digest[3] = byte_swap_32 (digest[3]);
18718
18719 // add some stuff to normal salt to make sorted happy
18720
18721 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18722 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18723 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18724 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18725 salt->salt_buf[4] = salt->salt_iter;
18726
18727 return (PARSER_OK);
18728 }
18729
18730 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18731 {
18732 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18733
18734 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18735
18736 u64 *digest = (u64 *) hash_buf->digest;
18737
18738 salt_t *salt = hash_buf->salt;
18739
18740 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18741
18742 /**
18743 * parse line
18744 */
18745
18746 // iterations
18747
18748 char *iter_pos = input_buf + 7;
18749
18750 u32 iter = atoi (iter_pos);
18751
18752 if (iter < 1) return (PARSER_SALT_ITERATION);
18753 if (iter > 999999) return (PARSER_SALT_ITERATION);
18754
18755 // first is *raw* salt
18756
18757 char *salt_pos = strchr (iter_pos, ':');
18758
18759 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18760
18761 salt_pos++;
18762
18763 char *hash_pos = strchr (salt_pos, ':');
18764
18765 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18766
18767 u32 salt_len = hash_pos - salt_pos;
18768
18769 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18770
18771 hash_pos++;
18772
18773 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18774
18775 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18776
18777 // decode salt
18778
18779 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18780
18781 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18782
18783 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18784
18785 salt_buf_ptr[salt_len + 3] = 0x01;
18786 salt_buf_ptr[salt_len + 4] = 0x80;
18787
18788 salt->salt_len = salt_len;
18789 salt->salt_iter = iter - 1;
18790
18791 // decode hash
18792
18793 u8 tmp_buf[100] = { 0 };
18794
18795 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18796
18797 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18798
18799 memcpy (digest, tmp_buf, 64);
18800
18801 digest[0] = byte_swap_64 (digest[0]);
18802 digest[1] = byte_swap_64 (digest[1]);
18803 digest[2] = byte_swap_64 (digest[2]);
18804 digest[3] = byte_swap_64 (digest[3]);
18805 digest[4] = byte_swap_64 (digest[4]);
18806 digest[5] = byte_swap_64 (digest[5]);
18807 digest[6] = byte_swap_64 (digest[6]);
18808 digest[7] = byte_swap_64 (digest[7]);
18809
18810 // add some stuff to normal salt to make sorted happy
18811
18812 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18813 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18814 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18815 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18816 salt->salt_buf[4] = salt->salt_iter;
18817
18818 return (PARSER_OK);
18819 }
18820
18821 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18822 {
18823 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18824
18825 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18826
18827 uint *digest = (uint *) hash_buf->digest;
18828
18829 salt_t *salt = hash_buf->salt;
18830
18831 /**
18832 * parse line
18833 */
18834
18835 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18836
18837 char *hash_pos = strchr (salt_pos, '$');
18838
18839 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18840
18841 u32 salt_len = hash_pos - salt_pos;
18842
18843 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18844
18845 hash_pos++;
18846
18847 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18848
18849 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18850
18851 // decode hash
18852
18853 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18854 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18855 digest[ 2] = 0;
18856 digest[ 3] = 0;
18857 digest[ 4] = 0;
18858 digest[ 5] = 0;
18859 digest[ 6] = 0;
18860 digest[ 7] = 0;
18861 digest[ 8] = 0;
18862 digest[ 9] = 0;
18863 digest[10] = 0;
18864 digest[11] = 0;
18865 digest[12] = 0;
18866 digest[13] = 0;
18867 digest[14] = 0;
18868 digest[15] = 0;
18869
18870 // decode salt
18871
18872 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18873 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18874
18875 salt->salt_iter = ROUNDS_ECRYPTFS;
18876 salt->salt_len = 8;
18877
18878 return (PARSER_OK);
18879 }
18880
18881 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18882 {
18883 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18884
18885 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18886
18887 unsigned char c19 = itoa64_to_int (input_buf[19]);
18888
18889 if (c19 & 3) return (PARSER_HASH_VALUE);
18890
18891 salt_t *salt = hash_buf->salt;
18892
18893 u32 *digest = (u32 *) hash_buf->digest;
18894
18895 // iteration count
18896
18897 salt->salt_iter = itoa64_to_int (input_buf[1])
18898 | itoa64_to_int (input_buf[2]) << 6
18899 | itoa64_to_int (input_buf[3]) << 12
18900 | itoa64_to_int (input_buf[4]) << 18;
18901
18902 // set salt
18903
18904 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18905 | itoa64_to_int (input_buf[6]) << 6
18906 | itoa64_to_int (input_buf[7]) << 12
18907 | itoa64_to_int (input_buf[8]) << 18;
18908
18909 salt->salt_len = 4;
18910
18911 u8 tmp_buf[100] = { 0 };
18912
18913 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18914
18915 memcpy (digest, tmp_buf, 8);
18916
18917 uint tt;
18918
18919 IP (digest[0], digest[1], tt);
18920
18921 digest[0] = rotr32 (digest[0], 31);
18922 digest[1] = rotr32 (digest[1], 31);
18923 digest[2] = 0;
18924 digest[3] = 0;
18925
18926 return (PARSER_OK);
18927 }
18928
18929 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18930 {
18931 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18932
18933 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18934
18935 u32 *digest = (u32 *) hash_buf->digest;
18936
18937 salt_t *salt = hash_buf->salt;
18938
18939 /**
18940 * parse line
18941 */
18942
18943 char *type_pos = input_buf + 6 + 1;
18944
18945 char *salt_pos = strchr (type_pos, '*');
18946
18947 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18948
18949 u32 type_len = salt_pos - type_pos;
18950
18951 if (type_len != 1) return (PARSER_SALT_LENGTH);
18952
18953 salt_pos++;
18954
18955 char *crypted_pos = strchr (salt_pos, '*');
18956
18957 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18958
18959 u32 salt_len = crypted_pos - salt_pos;
18960
18961 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18962
18963 crypted_pos++;
18964
18965 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18966
18967 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18968
18969 /**
18970 * copy data
18971 */
18972
18973 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18974 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18975
18976 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18977 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18978
18979 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18980 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18981 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18982 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18983
18984 salt->salt_len = 24;
18985 salt->salt_iter = ROUNDS_RAR3;
18986
18987 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18988 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18989
18990 digest[0] = 0xc43d7b00;
18991 digest[1] = 0x40070000;
18992 digest[2] = 0;
18993 digest[3] = 0;
18994
18995 return (PARSER_OK);
18996 }
18997
18998 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18999 {
19000 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
19001
19002 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
19003
19004 u32 *digest = (u32 *) hash_buf->digest;
19005
19006 salt_t *salt = hash_buf->salt;
19007
19008 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
19009
19010 /**
19011 * parse line
19012 */
19013
19014 char *param0_pos = input_buf + 1 + 4 + 1;
19015
19016 char *param1_pos = strchr (param0_pos, '$');
19017
19018 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19019
19020 u32 param0_len = param1_pos - param0_pos;
19021
19022 param1_pos++;
19023
19024 char *param2_pos = strchr (param1_pos, '$');
19025
19026 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19027
19028 u32 param1_len = param2_pos - param1_pos;
19029
19030 param2_pos++;
19031
19032 char *param3_pos = strchr (param2_pos, '$');
19033
19034 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19035
19036 u32 param2_len = param3_pos - param2_pos;
19037
19038 param3_pos++;
19039
19040 char *param4_pos = strchr (param3_pos, '$');
19041
19042 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19043
19044 u32 param3_len = param4_pos - param3_pos;
19045
19046 param4_pos++;
19047
19048 char *param5_pos = strchr (param4_pos, '$');
19049
19050 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19051
19052 u32 param4_len = param5_pos - param4_pos;
19053
19054 param5_pos++;
19055
19056 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
19057
19058 char *salt_buf = param1_pos;
19059 char *iv = param3_pos;
19060 char *pswcheck = param5_pos;
19061
19062 const uint salt_len = atoi (param0_pos);
19063 const uint iterations = atoi (param2_pos);
19064 const uint pswcheck_len = atoi (param4_pos);
19065
19066 /**
19067 * verify some data
19068 */
19069
19070 if (param1_len != 32) return (PARSER_SALT_VALUE);
19071 if (param3_len != 32) return (PARSER_SALT_VALUE);
19072 if (param5_len != 16) return (PARSER_SALT_VALUE);
19073
19074 if (salt_len != 16) return (PARSER_SALT_VALUE);
19075 if (iterations == 0) return (PARSER_SALT_VALUE);
19076 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
19077
19078 /**
19079 * store data
19080 */
19081
19082 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
19083 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
19084 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
19085 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
19086
19087 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
19088 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
19089 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
19090 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
19091
19092 salt->salt_len = 16;
19093
19094 salt->salt_sign[0] = iterations;
19095
19096 salt->salt_iter = ((1 << iterations) + 32) - 1;
19097
19098 /**
19099 * digest buf
19100 */
19101
19102 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
19103 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
19104 digest[2] = 0;
19105 digest[3] = 0;
19106
19107 return (PARSER_OK);
19108 }
19109
19110 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19111 {
19112 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
19113
19114 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19115
19116 u32 *digest = (u32 *) hash_buf->digest;
19117
19118 salt_t *salt = hash_buf->salt;
19119
19120 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
19121
19122 /**
19123 * parse line
19124 */
19125
19126 /* Skip '$' */
19127 char *account_pos = input_buf + 11 + 1;
19128
19129 char *data_pos;
19130
19131 uint data_len;
19132
19133 if (account_pos[0] == '*')
19134 {
19135 account_pos++;
19136
19137 data_pos = strchr (account_pos, '*');
19138
19139 /* Skip '*' */
19140 data_pos++;
19141
19142 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19143
19144 uint account_len = data_pos - account_pos + 1;
19145
19146 if (account_len >= 512) return (PARSER_SALT_LENGTH);
19147
19148 /* Skip '$' */
19149 data_pos++;
19150
19151 data_len = input_len - 11 - 1 - account_len - 2;
19152
19153 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
19154 }
19155 else
19156 {
19157 /* assume $krb5tgs$23$checksum$edata2 */
19158 data_pos = account_pos;
19159
19160 memcpy (krb5tgs->account_info, "**", 3);
19161
19162 data_len = input_len - 11 - 1 - 1;
19163 }
19164
19165 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
19166
19167 char *checksum_ptr = (char *) krb5tgs->checksum;
19168
19169 for (uint i = 0; i < 16 * 2; i += 2)
19170 {
19171 const char p0 = data_pos[i + 0];
19172 const char p1 = data_pos[i + 1];
19173
19174 *checksum_ptr++ = hex_convert (p1) << 0
19175 | hex_convert (p0) << 4;
19176 }
19177
19178 char *edata_ptr = (char *) krb5tgs->edata2;
19179
19180 krb5tgs->edata2_len = (data_len - 32) / 2 ;
19181
19182 /* skip '$' */
19183 for (uint i = 16 * 2 + 1; i < (krb5tgs->edata2_len * 2) + (16 * 2 + 1); i += 2)
19184 {
19185 const char p0 = data_pos[i + 0];
19186 const char p1 = data_pos[i + 1];
19187 *edata_ptr++ = hex_convert (p1) << 0
19188 | hex_convert (p0) << 4;
19189 }
19190
19191 /* this is needed for hmac_md5 */
19192 *edata_ptr++ = 0x80;
19193
19194 salt->salt_buf[0] = krb5tgs->checksum[0];
19195 salt->salt_buf[1] = krb5tgs->checksum[1];
19196 salt->salt_buf[2] = krb5tgs->checksum[2];
19197 salt->salt_buf[3] = krb5tgs->checksum[3];
19198
19199 salt->salt_len = 32;
19200
19201 digest[0] = krb5tgs->checksum[0];
19202 digest[1] = krb5tgs->checksum[1];
19203 digest[2] = krb5tgs->checksum[2];
19204 digest[3] = krb5tgs->checksum[3];
19205
19206 return (PARSER_OK);
19207 }
19208
19209 int axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19210 {
19211 if ((input_len < DISPLAY_LEN_MIN_13200) || (input_len > DISPLAY_LEN_MAX_13200)) return (PARSER_GLOBAL_LENGTH);
19212
19213 if (memcmp (SIGNATURE_AXCRYPT, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19214
19215 u32 *digest = (u32 *) hash_buf->digest;
19216
19217 salt_t *salt = hash_buf->salt;
19218
19219 /**
19220 * parse line
19221 */
19222
19223 /* Skip '*' */
19224 char *wrapping_rounds_pos = input_buf + 11 + 1;
19225
19226 char *salt_pos;
19227
19228 char *wrapped_key_pos;
19229
19230 char *data_pos;
19231
19232 salt->salt_iter = atoi (wrapping_rounds_pos);
19233
19234 salt_pos = strchr (wrapping_rounds_pos, '*');
19235
19236 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19237
19238 uint wrapping_rounds_len = salt_pos - wrapping_rounds_pos;
19239
19240 /* Skip '*' */
19241 salt_pos++;
19242
19243 data_pos = salt_pos;
19244
19245 wrapped_key_pos = strchr (salt_pos, '*');
19246
19247 if (wrapped_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19248
19249 uint salt_len = wrapped_key_pos - salt_pos;
19250
19251 if (salt_len != 32) return (PARSER_SALT_LENGTH);
19252
19253 /* Skip '*' */
19254 wrapped_key_pos++;
19255
19256 uint wrapped_key_len = input_len - 11 - 1 - wrapping_rounds_len - 1 - salt_len - 1;
19257
19258 if (wrapped_key_len != 48) return (PARSER_SALT_LENGTH);
19259
19260 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19261 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19262 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &data_pos[16]);
19263 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &data_pos[24]);
19264
19265 data_pos += 33;
19266
19267 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19268 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19269 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &data_pos[16]);
19270 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &data_pos[24]);
19271 salt->salt_buf[8] = hex_to_u32 ((const u8 *) &data_pos[32]);
19272 salt->salt_buf[9] = hex_to_u32 ((const u8 *) &data_pos[40]);
19273
19274 salt->salt_len = 40;
19275
19276 digest[0] = salt->salt_buf[0];
19277 digest[1] = salt->salt_buf[1];
19278 digest[2] = salt->salt_buf[2];
19279 digest[3] = salt->salt_buf[3];
19280
19281 return (PARSER_OK);
19282 }
19283
19284 int keepass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19285 {
19286 if ((input_len < DISPLAY_LEN_MIN_13400) || (input_len > DISPLAY_LEN_MAX_13400)) return (PARSER_GLOBAL_LENGTH);
19287
19288 if (memcmp (SIGNATURE_KEEPASS, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
19289
19290 u32 *digest = (u32 *) hash_buf->digest;
19291
19292 salt_t *salt = hash_buf->salt;
19293
19294 keepass_t *keepass = (keepass_t *) hash_buf->esalt;
19295
19296 /**
19297 * parse line
19298 */
19299
19300 char *version_pos;
19301
19302 char *rounds_pos;
19303
19304 char *algorithm_pos;
19305
19306 char *final_random_seed_pos;
19307 u32 final_random_seed_len;
19308
19309 char *transf_random_seed_pos;
19310 u32 transf_random_seed_len;
19311
19312 char *enc_iv_pos;
19313 u32 enc_iv_len;
19314
19315 /* default is no keyfile provided */
19316 char *keyfile_len_pos;
19317 u32 keyfile_len = 0;
19318 u32 is_keyfile_present = 0;
19319 char *keyfile_inline_pos;
19320 char *keyfile_pos;
19321
19322 /* specific to version 1 */
19323 char *contents_len_pos;
19324 u32 contents_len;
19325 char *contents_pos;
19326
19327 /* specific to version 2 */
19328 char *expected_bytes_pos;
19329 u32 expected_bytes_len;
19330
19331 char *contents_hash_pos;
19332 u32 contents_hash_len;
19333
19334 version_pos = input_buf + 8 + 1 + 1;
19335
19336 keepass->version = atoi (version_pos);
19337
19338 rounds_pos = strchr (version_pos, '*');
19339
19340 if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19341
19342 rounds_pos++;
19343
19344 salt->salt_iter = (atoi (rounds_pos));
19345
19346 algorithm_pos = strchr (rounds_pos, '*');
19347
19348 if (algorithm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19349
19350 algorithm_pos++;
19351
19352 keepass->algorithm = atoi (algorithm_pos);
19353
19354 final_random_seed_pos = strchr (algorithm_pos, '*');
19355
19356 if (final_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19357
19358 final_random_seed_pos++;
19359
19360 keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]);
19361 keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]);
19362 keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]);
19363 keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]);
19364
19365 if (keepass->version == 2)
19366 {
19367 keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]);
19368 keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]);
19369 keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]);
19370 keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]);
19371 }
19372
19373 transf_random_seed_pos = strchr (final_random_seed_pos, '*');
19374
19375 if (transf_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19376
19377 final_random_seed_len = transf_random_seed_pos - final_random_seed_pos;
19378
19379 if (keepass->version == 1 && final_random_seed_len != 32) return (PARSER_SALT_LENGTH);
19380 if (keepass->version == 2 && final_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19381
19382 transf_random_seed_pos++;
19383
19384 keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]);
19385 keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]);
19386 keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]);
19387 keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]);
19388 keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]);
19389 keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]);
19390 keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]);
19391 keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]);
19392
19393 enc_iv_pos = strchr (transf_random_seed_pos, '*');
19394
19395 if (enc_iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19396
19397 transf_random_seed_len = enc_iv_pos - transf_random_seed_pos;
19398
19399 if (transf_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19400
19401 enc_iv_pos++;
19402
19403 keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]);
19404 keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]);
19405 keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]);
19406 keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]);
19407
19408 if (keepass->version == 1)
19409 {
19410 contents_hash_pos = strchr (enc_iv_pos, '*');
19411
19412 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19413
19414 enc_iv_len = contents_hash_pos - enc_iv_pos;
19415
19416 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19417
19418 contents_hash_pos++;
19419
19420 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19421 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19422 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19423 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19424 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19425 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19426 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19427 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19428
19429 /* get length of contents following */
19430 char *inline_flag_pos = strchr (contents_hash_pos, '*');
19431
19432 if (inline_flag_pos == NULL) return (PARSER_SALT_LENGTH);
19433
19434 contents_hash_len = inline_flag_pos - contents_hash_pos;
19435
19436 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19437
19438 inline_flag_pos++;
19439
19440 u32 inline_flag = atoi (inline_flag_pos);
19441
19442 if (inline_flag != 1) return (PARSER_SALT_LENGTH);
19443
19444 contents_len_pos = strchr (inline_flag_pos, '*');
19445
19446 if (contents_len_pos == NULL) return (PARSER_SALT_LENGTH);
19447
19448 contents_len_pos++;
19449
19450 contents_len = atoi (contents_len_pos);
19451
19452 if (contents_len > 50000) return (PARSER_SALT_LENGTH);
19453
19454 contents_pos = strchr (contents_len_pos, '*');
19455
19456 if (contents_pos == NULL) return (PARSER_SALT_LENGTH);
19457
19458 contents_pos++;
19459
19460 u32 i;
19461
19462 keepass->contents_len = contents_len;
19463
19464 contents_len = contents_len / 4;
19465
19466 keyfile_inline_pos = strchr (contents_pos, '*');
19467
19468 u32 real_contents_len;
19469
19470 if (keyfile_inline_pos == NULL)
19471 real_contents_len = input_len - (contents_pos - input_buf);
19472 else
19473 {
19474 real_contents_len = keyfile_inline_pos - contents_pos;
19475 keyfile_inline_pos++;
19476 is_keyfile_present = 1;
19477 }
19478
19479 if (real_contents_len != keepass->contents_len * 2) return (PARSER_SALT_LENGTH);
19480
19481 for (i = 0; i < contents_len; i++)
19482 keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]);
19483 }
19484 else if (keepass->version == 2)
19485 {
19486 expected_bytes_pos = strchr (enc_iv_pos, '*');
19487
19488 if (expected_bytes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19489
19490 enc_iv_len = expected_bytes_pos - enc_iv_pos;
19491
19492 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19493
19494 expected_bytes_pos++;
19495
19496 keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]);
19497 keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]);
19498 keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]);
19499 keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]);
19500 keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]);
19501 keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]);
19502 keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]);
19503 keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]);
19504
19505 contents_hash_pos = strchr (expected_bytes_pos, '*');
19506
19507 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19508
19509 expected_bytes_len = contents_hash_pos - expected_bytes_pos;
19510
19511 if (expected_bytes_len != 64) return (PARSER_SALT_LENGTH);
19512
19513 contents_hash_pos++;
19514
19515 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19516 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19517 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19518 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19519 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19520 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19521 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19522 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19523
19524 keyfile_inline_pos = strchr (contents_hash_pos, '*');
19525
19526 if (keyfile_inline_pos == NULL)
19527 contents_hash_len = input_len - (int) (contents_hash_pos - input_buf);
19528 else
19529 {
19530 contents_hash_len = keyfile_inline_pos - contents_hash_pos;
19531 keyfile_inline_pos++;
19532 is_keyfile_present = 1;
19533 }
19534 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19535 }
19536
19537 if (is_keyfile_present != 0)
19538 {
19539 keyfile_len_pos = strchr (keyfile_inline_pos, '*');
19540
19541 keyfile_len_pos++;
19542
19543 keyfile_len = atoi (keyfile_len_pos);
19544
19545 keepass->keyfile_len = keyfile_len;
19546
19547 if (keyfile_len != 64) return (PARSER_SALT_LENGTH);
19548
19549 keyfile_pos = strchr (keyfile_len_pos, '*');
19550
19551 if (keyfile_pos == NULL) return (PARSER_SALT_LENGTH);
19552
19553 keyfile_pos++;
19554
19555 u32 real_keyfile_len = input_len - (keyfile_pos - input_buf);
19556
19557 if (real_keyfile_len != 64) return (PARSER_SALT_LENGTH);
19558
19559 keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]);
19560 keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]);
19561 keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]);
19562 keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]);
19563 keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]);
19564 keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]);
19565 keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]);
19566 keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]);
19567 }
19568
19569 digest[0] = keepass->enc_iv[0];
19570 digest[1] = keepass->enc_iv[1];
19571 digest[2] = keepass->enc_iv[2];
19572 digest[3] = keepass->enc_iv[3];
19573
19574 salt->salt_buf[0] = keepass->transf_random_seed[0];
19575 salt->salt_buf[1] = keepass->transf_random_seed[1];
19576 salt->salt_buf[2] = keepass->transf_random_seed[2];
19577 salt->salt_buf[3] = keepass->transf_random_seed[3];
19578 salt->salt_buf[4] = keepass->transf_random_seed[4];
19579 salt->salt_buf[5] = keepass->transf_random_seed[5];
19580 salt->salt_buf[6] = keepass->transf_random_seed[6];
19581 salt->salt_buf[7] = keepass->transf_random_seed[7];
19582
19583 return (PARSER_OK);
19584 }
19585
19586 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19587 {
19588 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
19589
19590 u32 *digest = (u32 *) hash_buf->digest;
19591
19592 salt_t *salt = hash_buf->salt;
19593
19594 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
19595 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
19596 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
19597 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
19598 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
19599 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
19600 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
19601 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
19602
19603 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
19604
19605 uint salt_len = input_len - 64 - 1;
19606
19607 char *salt_buf = input_buf + 64 + 1;
19608
19609 char *salt_buf_ptr = (char *) salt->salt_buf;
19610
19611 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
19612
19613 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19614
19615 salt->salt_len = salt_len;
19616
19617 /**
19618 * we can precompute the first sha256 transform
19619 */
19620
19621 uint w[16] = { 0 };
19622
19623 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
19624 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
19625 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
19626 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
19627 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
19628 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
19629 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
19630 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
19631 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
19632 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
19633 w[10] = byte_swap_32 (salt->salt_buf[10]);
19634 w[11] = byte_swap_32 (salt->salt_buf[11]);
19635 w[12] = byte_swap_32 (salt->salt_buf[12]);
19636 w[13] = byte_swap_32 (salt->salt_buf[13]);
19637 w[14] = byte_swap_32 (salt->salt_buf[14]);
19638 w[15] = byte_swap_32 (salt->salt_buf[15]);
19639
19640 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
19641
19642 sha256_64 (w, pc256);
19643
19644 salt->salt_buf_pc[0] = pc256[0];
19645 salt->salt_buf_pc[1] = pc256[1];
19646 salt->salt_buf_pc[2] = pc256[2];
19647 salt->salt_buf_pc[3] = pc256[3];
19648 salt->salt_buf_pc[4] = pc256[4];
19649 salt->salt_buf_pc[5] = pc256[5];
19650 salt->salt_buf_pc[6] = pc256[6];
19651 salt->salt_buf_pc[7] = pc256[7];
19652
19653 digest[0] -= pc256[0];
19654 digest[1] -= pc256[1];
19655 digest[2] -= pc256[2];
19656 digest[3] -= pc256[3];
19657 digest[4] -= pc256[4];
19658 digest[5] -= pc256[5];
19659 digest[6] -= pc256[6];
19660 digest[7] -= pc256[7];
19661
19662 return (PARSER_OK);
19663 }
19664
19665 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19666 {
19667 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
19668
19669 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
19670
19671 u32 *digest = (u32 *) hash_buf->digest;
19672
19673 salt_t *salt = hash_buf->salt;
19674
19675 /**
19676 * parse line
19677 */
19678
19679 char *data_len_pos = input_buf + 1 + 10 + 1;
19680
19681 char *data_buf_pos = strchr (data_len_pos, '$');
19682
19683 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19684
19685 u32 data_len_len = data_buf_pos - data_len_pos;
19686
19687 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
19688 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
19689
19690 data_buf_pos++;
19691
19692 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
19693
19694 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
19695
19696 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
19697
19698 u32 data_len = atoi (data_len_pos);
19699
19700 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
19701
19702 /**
19703 * salt
19704 */
19705
19706 char *salt_pos = data_buf_pos;
19707
19708 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
19709 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
19710 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
19711 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
19712
19713 // this is actually the CT, which is also the hash later (if matched)
19714
19715 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
19716 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
19717 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
19718 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
19719
19720 salt->salt_len = 32; // note we need to fix this to 16 in kernel
19721
19722 salt->salt_iter = 10 - 1;
19723
19724 /**
19725 * digest buf
19726 */
19727
19728 digest[0] = salt->salt_buf[4];
19729 digest[1] = salt->salt_buf[5];
19730 digest[2] = salt->salt_buf[6];
19731 digest[3] = salt->salt_buf[7];
19732
19733 return (PARSER_OK);
19734 }
19735
19736 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19737 {
19738 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
19739
19740 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19741
19742 u32 *digest = (u32 *) hash_buf->digest;
19743
19744 salt_t *salt = hash_buf->salt;
19745
19746 /**
19747 * parse line
19748 */
19749
19750 char *salt_pos = input_buf + 11 + 1;
19751
19752 char *iter_pos = strchr (salt_pos, ',');
19753
19754 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19755
19756 u32 salt_len = iter_pos - salt_pos;
19757
19758 if (salt_len != 20) return (PARSER_SALT_LENGTH);
19759
19760 iter_pos++;
19761
19762 char *hash_pos = strchr (iter_pos, ',');
19763
19764 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19765
19766 u32 iter_len = hash_pos - iter_pos;
19767
19768 if (iter_len > 5) return (PARSER_SALT_LENGTH);
19769
19770 hash_pos++;
19771
19772 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
19773
19774 if (hash_len != 64) return (PARSER_HASH_LENGTH);
19775
19776 /**
19777 * salt
19778 */
19779
19780 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
19781 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
19782 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
19783 salt->salt_buf[3] = 0x00018000;
19784
19785 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19786 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19787 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
19788 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
19789
19790 salt->salt_len = salt_len / 2;
19791
19792 salt->salt_iter = atoi (iter_pos) - 1;
19793
19794 /**
19795 * digest buf
19796 */
19797
19798 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19799 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19800 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19801 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19802 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19803 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19804 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19805 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19806
19807 return (PARSER_OK);
19808 }
19809
19810 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19811 {
19812 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
19813
19814 u32 *digest = (u32 *) hash_buf->digest;
19815
19816 salt_t *salt = hash_buf->salt;
19817
19818 /**
19819 * parse line
19820 */
19821
19822 char *hash_pos = input_buf + 64;
19823 char *salt1_pos = input_buf + 128;
19824 char *salt2_pos = input_buf;
19825
19826 /**
19827 * salt
19828 */
19829
19830 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
19831 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
19832 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
19833 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
19834
19835 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
19836 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
19837 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
19838 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
19839
19840 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
19841 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
19842 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
19843 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
19844
19845 salt->salt_len = 48;
19846
19847 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
19848
19849 /**
19850 * digest buf
19851 */
19852
19853 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19854 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19855 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19856 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19857 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19858 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19859 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19860 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19861
19862 return (PARSER_OK);
19863 }
19864
19865 /**
19866 * parallel running threads
19867 */
19868
19869 #ifdef WIN
19870
19871 BOOL WINAPI sigHandler_default (DWORD sig)
19872 {
19873 switch (sig)
19874 {
19875 case CTRL_CLOSE_EVENT:
19876
19877 /*
19878 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
19879 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
19880 * function otherwise it is too late (e.g. after returning from this function)
19881 */
19882
19883 myabort ();
19884
19885 SetConsoleCtrlHandler (NULL, TRUE);
19886
19887 hc_sleep (10);
19888
19889 return TRUE;
19890
19891 case CTRL_C_EVENT:
19892 case CTRL_LOGOFF_EVENT:
19893 case CTRL_SHUTDOWN_EVENT:
19894
19895 myabort ();
19896
19897 SetConsoleCtrlHandler (NULL, TRUE);
19898
19899 return TRUE;
19900 }
19901
19902 return FALSE;
19903 }
19904
19905 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19906 {
19907 switch (sig)
19908 {
19909 case CTRL_CLOSE_EVENT:
19910
19911 myabort ();
19912
19913 SetConsoleCtrlHandler (NULL, TRUE);
19914
19915 hc_sleep (10);
19916
19917 return TRUE;
19918
19919 case CTRL_C_EVENT:
19920 case CTRL_LOGOFF_EVENT:
19921 case CTRL_SHUTDOWN_EVENT:
19922
19923 myquit ();
19924
19925 SetConsoleCtrlHandler (NULL, TRUE);
19926
19927 return TRUE;
19928 }
19929
19930 return FALSE;
19931 }
19932
19933 void hc_signal (BOOL WINAPI (callback) (DWORD))
19934 {
19935 if (callback == NULL)
19936 {
19937 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19938 }
19939 else
19940 {
19941 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19942 }
19943 }
19944
19945 #else
19946
19947 void sigHandler_default (int sig)
19948 {
19949 myabort ();
19950
19951 signal (sig, NULL);
19952 }
19953
19954 void sigHandler_benchmark (int sig)
19955 {
19956 myquit ();
19957
19958 signal (sig, NULL);
19959 }
19960
19961 void hc_signal (void (callback) (int))
19962 {
19963 if (callback == NULL) callback = SIG_DFL;
19964
19965 signal (SIGINT, callback);
19966 signal (SIGTERM, callback);
19967 signal (SIGABRT, callback);
19968 }
19969
19970 #endif
19971
19972 void status_display ();
19973
19974 void *thread_keypress (void *p)
19975 {
19976 int benchmark = *((int *) p);
19977
19978 uint quiet = data.quiet;
19979
19980 tty_break();
19981
19982 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19983 {
19984 int ch = tty_getchar();
19985
19986 if (ch == -1) break;
19987
19988 if (ch == 0) continue;
19989
19990 //https://github.com/hashcat/oclHashcat/issues/302
19991 //#ifdef _POSIX
19992 //if (ch != '\n')
19993 //#endif
19994
19995 hc_thread_mutex_lock (mux_display);
19996
19997 log_info ("");
19998
19999 switch (ch)
20000 {
20001 case 's':
20002 case '\r':
20003 case '\n':
20004
20005 log_info ("");
20006
20007 status_display ();
20008
20009 log_info ("");
20010
20011 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20012 if (quiet == 0) fflush (stdout);
20013
20014 break;
20015
20016 case 'b':
20017
20018 log_info ("");
20019
20020 bypass ();
20021
20022 log_info ("");
20023
20024 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20025 if (quiet == 0) fflush (stdout);
20026
20027 break;
20028
20029 case 'p':
20030
20031 log_info ("");
20032
20033 SuspendThreads ();
20034
20035 log_info ("");
20036
20037 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20038 if (quiet == 0) fflush (stdout);
20039
20040 break;
20041
20042 case 'r':
20043
20044 log_info ("");
20045
20046 ResumeThreads ();
20047
20048 log_info ("");
20049
20050 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20051 if (quiet == 0) fflush (stdout);
20052
20053 break;
20054
20055 case 'c':
20056
20057 log_info ("");
20058
20059 if (benchmark == 1) break;
20060
20061 stop_at_checkpoint ();
20062
20063 log_info ("");
20064
20065 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20066 if (quiet == 0) fflush (stdout);
20067
20068 break;
20069
20070 case 'q':
20071
20072 log_info ("");
20073
20074 if (benchmark == 1)
20075 {
20076 myquit ();
20077 }
20078 else
20079 {
20080 myabort ();
20081 }
20082
20083 break;
20084 }
20085
20086 //https://github.com/hashcat/oclHashcat/issues/302
20087 //#ifdef _POSIX
20088 //if (ch != '\n')
20089 //#endif
20090
20091 hc_thread_mutex_unlock (mux_display);
20092 }
20093
20094 tty_fix();
20095
20096 return (p);
20097 }
20098
20099 /**
20100 * rules common
20101 */
20102
20103 bool class_num (const u8 c)
20104 {
20105 return ((c >= '0') && (c <= '9'));
20106 }
20107
20108 bool class_lower (const u8 c)
20109 {
20110 return ((c >= 'a') && (c <= 'z'));
20111 }
20112
20113 bool class_upper (const u8 c)
20114 {
20115 return ((c >= 'A') && (c <= 'Z'));
20116 }
20117
20118 bool class_alpha (const u8 c)
20119 {
20120 return (class_lower (c) || class_upper (c));
20121 }
20122
20123 int conv_ctoi (const u8 c)
20124 {
20125 if (class_num (c))
20126 {
20127 return c - '0';
20128 }
20129 else if (class_upper (c))
20130 {
20131 return c - 'A' + 10;
20132 }
20133
20134 return -1;
20135 }
20136
20137 int conv_itoc (const u8 c)
20138 {
20139 if (c < 10)
20140 {
20141 return c + '0';
20142 }
20143 else if (c < 37)
20144 {
20145 return c + 'A' - 10;
20146 }
20147
20148 return -1;
20149 }
20150
20151 /**
20152 * device rules
20153 */
20154
20155 #define INCR_POS if (++rule_pos == rule_len) return (-1)
20156 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
20157 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
20158 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
20159 #define MAX_KERNEL_RULES 255
20160 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
20161 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20162 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20163
20164 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
20165 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
20166 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20167 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20168
20169 int cpu_rule_to_kernel_rule (char *rule_buf, uint rule_len, kernel_rule_t *rule)
20170 {
20171 uint rule_pos;
20172 uint rule_cnt;
20173
20174 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
20175 {
20176 switch (rule_buf[rule_pos])
20177 {
20178 case ' ':
20179 rule_cnt--;
20180 break;
20181
20182 case RULE_OP_MANGLE_NOOP:
20183 SET_NAME (rule, rule_buf[rule_pos]);
20184 break;
20185
20186 case RULE_OP_MANGLE_LREST:
20187 SET_NAME (rule, rule_buf[rule_pos]);
20188 break;
20189
20190 case RULE_OP_MANGLE_UREST:
20191 SET_NAME (rule, rule_buf[rule_pos]);
20192 break;
20193
20194 case RULE_OP_MANGLE_LREST_UFIRST:
20195 SET_NAME (rule, rule_buf[rule_pos]);
20196 break;
20197
20198 case RULE_OP_MANGLE_UREST_LFIRST:
20199 SET_NAME (rule, rule_buf[rule_pos]);
20200 break;
20201
20202 case RULE_OP_MANGLE_TREST:
20203 SET_NAME (rule, rule_buf[rule_pos]);
20204 break;
20205
20206 case RULE_OP_MANGLE_TOGGLE_AT:
20207 SET_NAME (rule, rule_buf[rule_pos]);
20208 SET_P0_CONV (rule, rule_buf[rule_pos]);
20209 break;
20210
20211 case RULE_OP_MANGLE_REVERSE:
20212 SET_NAME (rule, rule_buf[rule_pos]);
20213 break;
20214
20215 case RULE_OP_MANGLE_DUPEWORD:
20216 SET_NAME (rule, rule_buf[rule_pos]);
20217 break;
20218
20219 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20220 SET_NAME (rule, rule_buf[rule_pos]);
20221 SET_P0_CONV (rule, rule_buf[rule_pos]);
20222 break;
20223
20224 case RULE_OP_MANGLE_REFLECT:
20225 SET_NAME (rule, rule_buf[rule_pos]);
20226 break;
20227
20228 case RULE_OP_MANGLE_ROTATE_LEFT:
20229 SET_NAME (rule, rule_buf[rule_pos]);
20230 break;
20231
20232 case RULE_OP_MANGLE_ROTATE_RIGHT:
20233 SET_NAME (rule, rule_buf[rule_pos]);
20234 break;
20235
20236 case RULE_OP_MANGLE_APPEND:
20237 SET_NAME (rule, rule_buf[rule_pos]);
20238 SET_P0 (rule, rule_buf[rule_pos]);
20239 break;
20240
20241 case RULE_OP_MANGLE_PREPEND:
20242 SET_NAME (rule, rule_buf[rule_pos]);
20243 SET_P0 (rule, rule_buf[rule_pos]);
20244 break;
20245
20246 case RULE_OP_MANGLE_DELETE_FIRST:
20247 SET_NAME (rule, rule_buf[rule_pos]);
20248 break;
20249
20250 case RULE_OP_MANGLE_DELETE_LAST:
20251 SET_NAME (rule, rule_buf[rule_pos]);
20252 break;
20253
20254 case RULE_OP_MANGLE_DELETE_AT:
20255 SET_NAME (rule, rule_buf[rule_pos]);
20256 SET_P0_CONV (rule, rule_buf[rule_pos]);
20257 break;
20258
20259 case RULE_OP_MANGLE_EXTRACT:
20260 SET_NAME (rule, rule_buf[rule_pos]);
20261 SET_P0_CONV (rule, rule_buf[rule_pos]);
20262 SET_P1_CONV (rule, rule_buf[rule_pos]);
20263 break;
20264
20265 case RULE_OP_MANGLE_OMIT:
20266 SET_NAME (rule, rule_buf[rule_pos]);
20267 SET_P0_CONV (rule, rule_buf[rule_pos]);
20268 SET_P1_CONV (rule, rule_buf[rule_pos]);
20269 break;
20270
20271 case RULE_OP_MANGLE_INSERT:
20272 SET_NAME (rule, rule_buf[rule_pos]);
20273 SET_P0_CONV (rule, rule_buf[rule_pos]);
20274 SET_P1 (rule, rule_buf[rule_pos]);
20275 break;
20276
20277 case RULE_OP_MANGLE_OVERSTRIKE:
20278 SET_NAME (rule, rule_buf[rule_pos]);
20279 SET_P0_CONV (rule, rule_buf[rule_pos]);
20280 SET_P1 (rule, rule_buf[rule_pos]);
20281 break;
20282
20283 case RULE_OP_MANGLE_TRUNCATE_AT:
20284 SET_NAME (rule, rule_buf[rule_pos]);
20285 SET_P0_CONV (rule, rule_buf[rule_pos]);
20286 break;
20287
20288 case RULE_OP_MANGLE_REPLACE:
20289 SET_NAME (rule, rule_buf[rule_pos]);
20290 SET_P0 (rule, rule_buf[rule_pos]);
20291 SET_P1 (rule, rule_buf[rule_pos]);
20292 break;
20293
20294 case RULE_OP_MANGLE_PURGECHAR:
20295 return (-1);
20296 break;
20297
20298 case RULE_OP_MANGLE_TOGGLECASE_REC:
20299 return (-1);
20300 break;
20301
20302 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20303 SET_NAME (rule, rule_buf[rule_pos]);
20304 SET_P0_CONV (rule, rule_buf[rule_pos]);
20305 break;
20306
20307 case RULE_OP_MANGLE_DUPECHAR_LAST:
20308 SET_NAME (rule, rule_buf[rule_pos]);
20309 SET_P0_CONV (rule, rule_buf[rule_pos]);
20310 break;
20311
20312 case RULE_OP_MANGLE_DUPECHAR_ALL:
20313 SET_NAME (rule, rule_buf[rule_pos]);
20314 break;
20315
20316 case RULE_OP_MANGLE_SWITCH_FIRST:
20317 SET_NAME (rule, rule_buf[rule_pos]);
20318 break;
20319
20320 case RULE_OP_MANGLE_SWITCH_LAST:
20321 SET_NAME (rule, rule_buf[rule_pos]);
20322 break;
20323
20324 case RULE_OP_MANGLE_SWITCH_AT:
20325 SET_NAME (rule, rule_buf[rule_pos]);
20326 SET_P0_CONV (rule, rule_buf[rule_pos]);
20327 SET_P1_CONV (rule, rule_buf[rule_pos]);
20328 break;
20329
20330 case RULE_OP_MANGLE_CHR_SHIFTL:
20331 SET_NAME (rule, rule_buf[rule_pos]);
20332 SET_P0_CONV (rule, rule_buf[rule_pos]);
20333 break;
20334
20335 case RULE_OP_MANGLE_CHR_SHIFTR:
20336 SET_NAME (rule, rule_buf[rule_pos]);
20337 SET_P0_CONV (rule, rule_buf[rule_pos]);
20338 break;
20339
20340 case RULE_OP_MANGLE_CHR_INCR:
20341 SET_NAME (rule, rule_buf[rule_pos]);
20342 SET_P0_CONV (rule, rule_buf[rule_pos]);
20343 break;
20344
20345 case RULE_OP_MANGLE_CHR_DECR:
20346 SET_NAME (rule, rule_buf[rule_pos]);
20347 SET_P0_CONV (rule, rule_buf[rule_pos]);
20348 break;
20349
20350 case RULE_OP_MANGLE_REPLACE_NP1:
20351 SET_NAME (rule, rule_buf[rule_pos]);
20352 SET_P0_CONV (rule, rule_buf[rule_pos]);
20353 break;
20354
20355 case RULE_OP_MANGLE_REPLACE_NM1:
20356 SET_NAME (rule, rule_buf[rule_pos]);
20357 SET_P0_CONV (rule, rule_buf[rule_pos]);
20358 break;
20359
20360 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20361 SET_NAME (rule, rule_buf[rule_pos]);
20362 SET_P0_CONV (rule, rule_buf[rule_pos]);
20363 break;
20364
20365 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20366 SET_NAME (rule, rule_buf[rule_pos]);
20367 SET_P0_CONV (rule, rule_buf[rule_pos]);
20368 break;
20369
20370 case RULE_OP_MANGLE_TITLE:
20371 SET_NAME (rule, rule_buf[rule_pos]);
20372 break;
20373
20374 default:
20375 return (-1);
20376 break;
20377 }
20378 }
20379
20380 if (rule_pos < rule_len) return (-1);
20381
20382 return (0);
20383 }
20384
20385 int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule)
20386 {
20387 uint rule_cnt;
20388 uint rule_pos;
20389 uint rule_len = HCBUFSIZ - 1; // maximum possible len
20390
20391 char rule_cmd;
20392
20393 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
20394 {
20395 GET_NAME (rule);
20396
20397 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
20398
20399 switch (rule_cmd)
20400 {
20401 case RULE_OP_MANGLE_NOOP:
20402 rule_buf[rule_pos] = rule_cmd;
20403 break;
20404
20405 case RULE_OP_MANGLE_LREST:
20406 rule_buf[rule_pos] = rule_cmd;
20407 break;
20408
20409 case RULE_OP_MANGLE_UREST:
20410 rule_buf[rule_pos] = rule_cmd;
20411 break;
20412
20413 case RULE_OP_MANGLE_LREST_UFIRST:
20414 rule_buf[rule_pos] = rule_cmd;
20415 break;
20416
20417 case RULE_OP_MANGLE_UREST_LFIRST:
20418 rule_buf[rule_pos] = rule_cmd;
20419 break;
20420
20421 case RULE_OP_MANGLE_TREST:
20422 rule_buf[rule_pos] = rule_cmd;
20423 break;
20424
20425 case RULE_OP_MANGLE_TOGGLE_AT:
20426 rule_buf[rule_pos] = rule_cmd;
20427 GET_P0_CONV (rule);
20428 break;
20429
20430 case RULE_OP_MANGLE_REVERSE:
20431 rule_buf[rule_pos] = rule_cmd;
20432 break;
20433
20434 case RULE_OP_MANGLE_DUPEWORD:
20435 rule_buf[rule_pos] = rule_cmd;
20436 break;
20437
20438 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20439 rule_buf[rule_pos] = rule_cmd;
20440 GET_P0_CONV (rule);
20441 break;
20442
20443 case RULE_OP_MANGLE_REFLECT:
20444 rule_buf[rule_pos] = rule_cmd;
20445 break;
20446
20447 case RULE_OP_MANGLE_ROTATE_LEFT:
20448 rule_buf[rule_pos] = rule_cmd;
20449 break;
20450
20451 case RULE_OP_MANGLE_ROTATE_RIGHT:
20452 rule_buf[rule_pos] = rule_cmd;
20453 break;
20454
20455 case RULE_OP_MANGLE_APPEND:
20456 rule_buf[rule_pos] = rule_cmd;
20457 GET_P0 (rule);
20458 break;
20459
20460 case RULE_OP_MANGLE_PREPEND:
20461 rule_buf[rule_pos] = rule_cmd;
20462 GET_P0 (rule);
20463 break;
20464
20465 case RULE_OP_MANGLE_DELETE_FIRST:
20466 rule_buf[rule_pos] = rule_cmd;
20467 break;
20468
20469 case RULE_OP_MANGLE_DELETE_LAST:
20470 rule_buf[rule_pos] = rule_cmd;
20471 break;
20472
20473 case RULE_OP_MANGLE_DELETE_AT:
20474 rule_buf[rule_pos] = rule_cmd;
20475 GET_P0_CONV (rule);
20476 break;
20477
20478 case RULE_OP_MANGLE_EXTRACT:
20479 rule_buf[rule_pos] = rule_cmd;
20480 GET_P0_CONV (rule);
20481 GET_P1_CONV (rule);
20482 break;
20483
20484 case RULE_OP_MANGLE_OMIT:
20485 rule_buf[rule_pos] = rule_cmd;
20486 GET_P0_CONV (rule);
20487 GET_P1_CONV (rule);
20488 break;
20489
20490 case RULE_OP_MANGLE_INSERT:
20491 rule_buf[rule_pos] = rule_cmd;
20492 GET_P0_CONV (rule);
20493 GET_P1 (rule);
20494 break;
20495
20496 case RULE_OP_MANGLE_OVERSTRIKE:
20497 rule_buf[rule_pos] = rule_cmd;
20498 GET_P0_CONV (rule);
20499 GET_P1 (rule);
20500 break;
20501
20502 case RULE_OP_MANGLE_TRUNCATE_AT:
20503 rule_buf[rule_pos] = rule_cmd;
20504 GET_P0_CONV (rule);
20505 break;
20506
20507 case RULE_OP_MANGLE_REPLACE:
20508 rule_buf[rule_pos] = rule_cmd;
20509 GET_P0 (rule);
20510 GET_P1 (rule);
20511 break;
20512
20513 case RULE_OP_MANGLE_PURGECHAR:
20514 return (-1);
20515 break;
20516
20517 case RULE_OP_MANGLE_TOGGLECASE_REC:
20518 return (-1);
20519 break;
20520
20521 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20522 rule_buf[rule_pos] = rule_cmd;
20523 GET_P0_CONV (rule);
20524 break;
20525
20526 case RULE_OP_MANGLE_DUPECHAR_LAST:
20527 rule_buf[rule_pos] = rule_cmd;
20528 GET_P0_CONV (rule);
20529 break;
20530
20531 case RULE_OP_MANGLE_DUPECHAR_ALL:
20532 rule_buf[rule_pos] = rule_cmd;
20533 break;
20534
20535 case RULE_OP_MANGLE_SWITCH_FIRST:
20536 rule_buf[rule_pos] = rule_cmd;
20537 break;
20538
20539 case RULE_OP_MANGLE_SWITCH_LAST:
20540 rule_buf[rule_pos] = rule_cmd;
20541 break;
20542
20543 case RULE_OP_MANGLE_SWITCH_AT:
20544 rule_buf[rule_pos] = rule_cmd;
20545 GET_P0_CONV (rule);
20546 GET_P1_CONV (rule);
20547 break;
20548
20549 case RULE_OP_MANGLE_CHR_SHIFTL:
20550 rule_buf[rule_pos] = rule_cmd;
20551 GET_P0_CONV (rule);
20552 break;
20553
20554 case RULE_OP_MANGLE_CHR_SHIFTR:
20555 rule_buf[rule_pos] = rule_cmd;
20556 GET_P0_CONV (rule);
20557 break;
20558
20559 case RULE_OP_MANGLE_CHR_INCR:
20560 rule_buf[rule_pos] = rule_cmd;
20561 GET_P0_CONV (rule);
20562 break;
20563
20564 case RULE_OP_MANGLE_CHR_DECR:
20565 rule_buf[rule_pos] = rule_cmd;
20566 GET_P0_CONV (rule);
20567 break;
20568
20569 case RULE_OP_MANGLE_REPLACE_NP1:
20570 rule_buf[rule_pos] = rule_cmd;
20571 GET_P0_CONV (rule);
20572 break;
20573
20574 case RULE_OP_MANGLE_REPLACE_NM1:
20575 rule_buf[rule_pos] = rule_cmd;
20576 GET_P0_CONV (rule);
20577 break;
20578
20579 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20580 rule_buf[rule_pos] = rule_cmd;
20581 GET_P0_CONV (rule);
20582 break;
20583
20584 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20585 rule_buf[rule_pos] = rule_cmd;
20586 GET_P0_CONV (rule);
20587 break;
20588
20589 case RULE_OP_MANGLE_TITLE:
20590 rule_buf[rule_pos] = rule_cmd;
20591 break;
20592
20593 case 0:
20594 return rule_pos - 1;
20595 break;
20596
20597 default:
20598 return (-1);
20599 break;
20600 }
20601 }
20602
20603 if (rule_cnt > 0)
20604 {
20605 return rule_pos;
20606 }
20607
20608 return (-1);
20609 }
20610
20611 /**
20612 * CPU rules : this is from hashcat sources, cpu based rules
20613 */
20614
20615 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
20616 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
20617
20618 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
20619 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
20620 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
20621
20622 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
20623 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
20624 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
20625
20626 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
20627 {
20628 int pos;
20629
20630 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
20631
20632 return (arr_len);
20633 }
20634
20635 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
20636 {
20637 int pos;
20638
20639 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
20640
20641 return (arr_len);
20642 }
20643
20644 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
20645 {
20646 int pos;
20647
20648 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
20649
20650 return (arr_len);
20651 }
20652
20653 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
20654 {
20655 int l;
20656 int r;
20657
20658 for (l = 0; l < arr_len; l++)
20659 {
20660 r = arr_len - 1 - l;
20661
20662 if (l >= r) break;
20663
20664 MANGLE_SWITCH (arr, l, r);
20665 }
20666
20667 return (arr_len);
20668 }
20669
20670 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
20671 {
20672 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
20673
20674 memcpy (&arr[arr_len], arr, (size_t) arr_len);
20675
20676 return (arr_len * 2);
20677 }
20678
20679 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
20680 {
20681 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
20682
20683 int orig_len = arr_len;
20684
20685 int i;
20686
20687 for (i = 0; i < times; i++)
20688 {
20689 memcpy (&arr[arr_len], arr, orig_len);
20690
20691 arr_len += orig_len;
20692 }
20693
20694 return (arr_len);
20695 }
20696
20697 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
20698 {
20699 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
20700
20701 mangle_double (arr, arr_len);
20702
20703 mangle_reverse (arr + arr_len, arr_len);
20704
20705 return (arr_len * 2);
20706 }
20707
20708 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
20709 {
20710 int l;
20711 int r;
20712
20713 for (l = 0, r = arr_len - 1; r > 0; r--)
20714 {
20715 MANGLE_SWITCH (arr, l, r);
20716 }
20717
20718 return (arr_len);
20719 }
20720
20721 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
20722 {
20723 int l;
20724 int r;
20725
20726 for (l = 0, r = arr_len - 1; l < r; l++)
20727 {
20728 MANGLE_SWITCH (arr, l, r);
20729 }
20730
20731 return (arr_len);
20732 }
20733
20734 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
20735 {
20736 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20737
20738 arr[arr_len] = c;
20739
20740 return (arr_len + 1);
20741 }
20742
20743 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
20744 {
20745 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20746
20747 int arr_pos;
20748
20749 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20750 {
20751 arr[arr_pos + 1] = arr[arr_pos];
20752 }
20753
20754 arr[0] = c;
20755
20756 return (arr_len + 1);
20757 }
20758
20759 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
20760 {
20761 if (upos >= arr_len) return (arr_len);
20762
20763 int arr_pos;
20764
20765 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
20766 {
20767 arr[arr_pos] = arr[arr_pos + 1];
20768 }
20769
20770 return (arr_len - 1);
20771 }
20772
20773 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20774 {
20775 if (upos >= arr_len) return (arr_len);
20776
20777 if ((upos + ulen) > arr_len) return (arr_len);
20778
20779 int arr_pos;
20780
20781 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
20782 {
20783 arr[arr_pos] = arr[upos + arr_pos];
20784 }
20785
20786 return (ulen);
20787 }
20788
20789 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20790 {
20791 if (upos >= arr_len) return (arr_len);
20792
20793 if ((upos + ulen) >= arr_len) return (arr_len);
20794
20795 int arr_pos;
20796
20797 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
20798 {
20799 arr[arr_pos] = arr[arr_pos + ulen];
20800 }
20801
20802 return (arr_len - ulen);
20803 }
20804
20805 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20806 {
20807 if (upos >= arr_len) return (arr_len);
20808
20809 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20810
20811 int arr_pos;
20812
20813 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
20814 {
20815 arr[arr_pos + 1] = arr[arr_pos];
20816 }
20817
20818 arr[upos] = c;
20819
20820 return (arr_len + 1);
20821 }
20822
20823 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)
20824 {
20825 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20826
20827 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
20828
20829 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
20830
20831 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
20832
20833 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
20834
20835 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
20836
20837 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
20838
20839 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
20840
20841 return (arr_len + arr2_cpy);
20842 }
20843
20844 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20845 {
20846 if (upos >= arr_len) return (arr_len);
20847
20848 arr[upos] = c;
20849
20850 return (arr_len);
20851 }
20852
20853 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
20854 {
20855 if (upos >= arr_len) return (arr_len);
20856
20857 memset (arr + upos, 0, arr_len - upos);
20858
20859 return (upos);
20860 }
20861
20862 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
20863 {
20864 int arr_pos;
20865
20866 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
20867 {
20868 if (arr[arr_pos] != oldc) continue;
20869
20870 arr[arr_pos] = newc;
20871 }
20872
20873 return (arr_len);
20874 }
20875
20876 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
20877 {
20878 int arr_pos;
20879
20880 int ret_len;
20881
20882 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
20883 {
20884 if (arr[arr_pos] == c) continue;
20885
20886 arr[ret_len] = arr[arr_pos];
20887
20888 ret_len++;
20889 }
20890
20891 return (ret_len);
20892 }
20893
20894 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
20895 {
20896 if (ulen > arr_len) return (arr_len);
20897
20898 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20899
20900 char cs[100] = { 0 };
20901
20902 memcpy (cs, arr, ulen);
20903
20904 int i;
20905
20906 for (i = 0; i < ulen; i++)
20907 {
20908 char c = cs[i];
20909
20910 arr_len = mangle_insert (arr, arr_len, i, c);
20911 }
20912
20913 return (arr_len);
20914 }
20915
20916 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20917 {
20918 if (ulen > arr_len) return (arr_len);
20919
20920 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20921
20922 int upos = arr_len - ulen;
20923
20924 int i;
20925
20926 for (i = 0; i < ulen; i++)
20927 {
20928 char c = arr[upos + i];
20929
20930 arr_len = mangle_append (arr, arr_len, c);
20931 }
20932
20933 return (arr_len);
20934 }
20935
20936 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20937 {
20938 if ( arr_len == 0) return (arr_len);
20939 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20940
20941 char c = arr[upos];
20942
20943 int i;
20944
20945 for (i = 0; i < ulen; i++)
20946 {
20947 arr_len = mangle_insert (arr, arr_len, upos, c);
20948 }
20949
20950 return (arr_len);
20951 }
20952
20953 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20954 {
20955 if ( arr_len == 0) return (arr_len);
20956 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20957
20958 int arr_pos;
20959
20960 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20961 {
20962 int new_pos = arr_pos * 2;
20963
20964 arr[new_pos] = arr[arr_pos];
20965
20966 arr[new_pos + 1] = arr[arr_pos];
20967 }
20968
20969 return (arr_len * 2);
20970 }
20971
20972 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20973 {
20974 if (upos >= arr_len) return (arr_len);
20975 if (upos2 >= arr_len) return (arr_len);
20976
20977 MANGLE_SWITCH (arr, upos, upos2);
20978
20979 return (arr_len);
20980 }
20981
20982 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20983 {
20984 MANGLE_SWITCH (arr, upos, upos2);
20985
20986 return (arr_len);
20987 }
20988
20989 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20990 {
20991 if (upos >= arr_len) return (arr_len);
20992
20993 arr[upos] <<= 1;
20994
20995 return (arr_len);
20996 }
20997
20998 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20999 {
21000 if (upos >= arr_len) return (arr_len);
21001
21002 arr[upos] >>= 1;
21003
21004 return (arr_len);
21005 }
21006
21007 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
21008 {
21009 if (upos >= arr_len) return (arr_len);
21010
21011 arr[upos] += 1;
21012
21013 return (arr_len);
21014 }
21015
21016 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
21017 {
21018 if (upos >= arr_len) return (arr_len);
21019
21020 arr[upos] -= 1;
21021
21022 return (arr_len);
21023 }
21024
21025 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
21026 {
21027 int upper_next = 1;
21028
21029 int pos;
21030
21031 for (pos = 0; pos < arr_len; pos++)
21032 {
21033 if (arr[pos] == ' ')
21034 {
21035 upper_next = 1;
21036
21037 continue;
21038 }
21039
21040 if (upper_next)
21041 {
21042 upper_next = 0;
21043
21044 MANGLE_UPPER_AT (arr, pos);
21045 }
21046 else
21047 {
21048 MANGLE_LOWER_AT (arr, pos);
21049 }
21050 }
21051
21052 return (arr_len);
21053 }
21054
21055 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
21056 {
21057 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
21058
21059 u32 j;
21060
21061 u32 rule_pos = 0;
21062
21063 for (j = 0; j < rp_gen_num; j++)
21064 {
21065 u32 r = 0;
21066 u32 p1 = 0;
21067 u32 p2 = 0;
21068 u32 p3 = 0;
21069
21070 switch ((char) get_random_num (0, 9))
21071 {
21072 case 0:
21073 r = get_random_num (0, sizeof (grp_op_nop));
21074 rule_buf[rule_pos++] = grp_op_nop[r];
21075 break;
21076
21077 case 1:
21078 r = get_random_num (0, sizeof (grp_op_pos_p0));
21079 rule_buf[rule_pos++] = grp_op_pos_p0[r];
21080 p1 = get_random_num (0, sizeof (grp_pos));
21081 rule_buf[rule_pos++] = grp_pos[p1];
21082 break;
21083
21084 case 2:
21085 r = get_random_num (0, sizeof (grp_op_pos_p1));
21086 rule_buf[rule_pos++] = grp_op_pos_p1[r];
21087 p1 = get_random_num (1, 6);
21088 rule_buf[rule_pos++] = grp_pos[p1];
21089 break;
21090
21091 case 3:
21092 r = get_random_num (0, sizeof (grp_op_chr));
21093 rule_buf[rule_pos++] = grp_op_chr[r];
21094 p1 = get_random_num (0x20, 0x7e);
21095 rule_buf[rule_pos++] = (char) p1;
21096 break;
21097
21098 case 4:
21099 r = get_random_num (0, sizeof (grp_op_chr_chr));
21100 rule_buf[rule_pos++] = grp_op_chr_chr[r];
21101 p1 = get_random_num (0x20, 0x7e);
21102 rule_buf[rule_pos++] = (char) p1;
21103 p2 = get_random_num (0x20, 0x7e);
21104 while (p1 == p2)
21105 p2 = get_random_num (0x20, 0x7e);
21106 rule_buf[rule_pos++] = (char) p2;
21107 break;
21108
21109 case 5:
21110 r = get_random_num (0, sizeof (grp_op_pos_chr));
21111 rule_buf[rule_pos++] = grp_op_pos_chr[r];
21112 p1 = get_random_num (0, sizeof (grp_pos));
21113 rule_buf[rule_pos++] = grp_pos[p1];
21114 p2 = get_random_num (0x20, 0x7e);
21115 rule_buf[rule_pos++] = (char) p2;
21116 break;
21117
21118 case 6:
21119 r = get_random_num (0, sizeof (grp_op_pos_pos0));
21120 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
21121 p1 = get_random_num (0, sizeof (grp_pos));
21122 rule_buf[rule_pos++] = grp_pos[p1];
21123 p2 = get_random_num (0, sizeof (grp_pos));
21124 while (p1 == p2)
21125 p2 = get_random_num (0, sizeof (grp_pos));
21126 rule_buf[rule_pos++] = grp_pos[p2];
21127 break;
21128
21129 case 7:
21130 r = get_random_num (0, sizeof (grp_op_pos_pos1));
21131 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
21132 p1 = get_random_num (0, sizeof (grp_pos));
21133 rule_buf[rule_pos++] = grp_pos[p1];
21134 p2 = get_random_num (1, sizeof (grp_pos));
21135 while (p1 == p2)
21136 p2 = get_random_num (1, sizeof (grp_pos));
21137 rule_buf[rule_pos++] = grp_pos[p2];
21138 break;
21139
21140 case 8:
21141 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
21142 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
21143 p1 = get_random_num (0, sizeof (grp_pos));
21144 rule_buf[rule_pos++] = grp_pos[p1];
21145 p2 = get_random_num (1, sizeof (grp_pos));
21146 rule_buf[rule_pos++] = grp_pos[p1];
21147 p3 = get_random_num (0, sizeof (grp_pos));
21148 rule_buf[rule_pos++] = grp_pos[p3];
21149 break;
21150 }
21151 }
21152
21153 return (rule_pos);
21154 }
21155
21156 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
21157 {
21158 char mem[BLOCK_SIZE] = { 0 };
21159
21160 if (in == NULL) return (RULE_RC_REJECT_ERROR);
21161
21162 if (out == NULL) return (RULE_RC_REJECT_ERROR);
21163
21164 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21165
21166 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
21167
21168 int out_len = in_len;
21169 int mem_len = in_len;
21170
21171 memcpy (out, in, out_len);
21172
21173 int rule_pos;
21174
21175 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
21176 {
21177 int upos, upos2;
21178 int ulen;
21179
21180 switch (rule[rule_pos])
21181 {
21182 case ' ':
21183 break;
21184
21185 case RULE_OP_MANGLE_NOOP:
21186 break;
21187
21188 case RULE_OP_MANGLE_LREST:
21189 out_len = mangle_lrest (out, out_len);
21190 break;
21191
21192 case RULE_OP_MANGLE_UREST:
21193 out_len = mangle_urest (out, out_len);
21194 break;
21195
21196 case RULE_OP_MANGLE_LREST_UFIRST:
21197 out_len = mangle_lrest (out, out_len);
21198 if (out_len) MANGLE_UPPER_AT (out, 0);
21199 break;
21200
21201 case RULE_OP_MANGLE_UREST_LFIRST:
21202 out_len = mangle_urest (out, out_len);
21203 if (out_len) MANGLE_LOWER_AT (out, 0);
21204 break;
21205
21206 case RULE_OP_MANGLE_TREST:
21207 out_len = mangle_trest (out, out_len);
21208 break;
21209
21210 case RULE_OP_MANGLE_TOGGLE_AT:
21211 NEXT_RULEPOS (rule_pos);
21212 NEXT_RPTOI (rule, rule_pos, upos);
21213 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
21214 break;
21215
21216 case RULE_OP_MANGLE_REVERSE:
21217 out_len = mangle_reverse (out, out_len);
21218 break;
21219
21220 case RULE_OP_MANGLE_DUPEWORD:
21221 out_len = mangle_double (out, out_len);
21222 break;
21223
21224 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21225 NEXT_RULEPOS (rule_pos);
21226 NEXT_RPTOI (rule, rule_pos, ulen);
21227 out_len = mangle_double_times (out, out_len, ulen);
21228 break;
21229
21230 case RULE_OP_MANGLE_REFLECT:
21231 out_len = mangle_reflect (out, out_len);
21232 break;
21233
21234 case RULE_OP_MANGLE_ROTATE_LEFT:
21235 mangle_rotate_left (out, out_len);
21236 break;
21237
21238 case RULE_OP_MANGLE_ROTATE_RIGHT:
21239 mangle_rotate_right (out, out_len);
21240 break;
21241
21242 case RULE_OP_MANGLE_APPEND:
21243 NEXT_RULEPOS (rule_pos);
21244 out_len = mangle_append (out, out_len, rule[rule_pos]);
21245 break;
21246
21247 case RULE_OP_MANGLE_PREPEND:
21248 NEXT_RULEPOS (rule_pos);
21249 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
21250 break;
21251
21252 case RULE_OP_MANGLE_DELETE_FIRST:
21253 out_len = mangle_delete_at (out, out_len, 0);
21254 break;
21255
21256 case RULE_OP_MANGLE_DELETE_LAST:
21257 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
21258 break;
21259
21260 case RULE_OP_MANGLE_DELETE_AT:
21261 NEXT_RULEPOS (rule_pos);
21262 NEXT_RPTOI (rule, rule_pos, upos);
21263 out_len = mangle_delete_at (out, out_len, upos);
21264 break;
21265
21266 case RULE_OP_MANGLE_EXTRACT:
21267 NEXT_RULEPOS (rule_pos);
21268 NEXT_RPTOI (rule, rule_pos, upos);
21269 NEXT_RULEPOS (rule_pos);
21270 NEXT_RPTOI (rule, rule_pos, ulen);
21271 out_len = mangle_extract (out, out_len, upos, ulen);
21272 break;
21273
21274 case RULE_OP_MANGLE_OMIT:
21275 NEXT_RULEPOS (rule_pos);
21276 NEXT_RPTOI (rule, rule_pos, upos);
21277 NEXT_RULEPOS (rule_pos);
21278 NEXT_RPTOI (rule, rule_pos, ulen);
21279 out_len = mangle_omit (out, out_len, upos, ulen);
21280 break;
21281
21282 case RULE_OP_MANGLE_INSERT:
21283 NEXT_RULEPOS (rule_pos);
21284 NEXT_RPTOI (rule, rule_pos, upos);
21285 NEXT_RULEPOS (rule_pos);
21286 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
21287 break;
21288
21289 case RULE_OP_MANGLE_OVERSTRIKE:
21290 NEXT_RULEPOS (rule_pos);
21291 NEXT_RPTOI (rule, rule_pos, upos);
21292 NEXT_RULEPOS (rule_pos);
21293 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
21294 break;
21295
21296 case RULE_OP_MANGLE_TRUNCATE_AT:
21297 NEXT_RULEPOS (rule_pos);
21298 NEXT_RPTOI (rule, rule_pos, upos);
21299 out_len = mangle_truncate_at (out, out_len, upos);
21300 break;
21301
21302 case RULE_OP_MANGLE_REPLACE:
21303 NEXT_RULEPOS (rule_pos);
21304 NEXT_RULEPOS (rule_pos);
21305 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
21306 break;
21307
21308 case RULE_OP_MANGLE_PURGECHAR:
21309 NEXT_RULEPOS (rule_pos);
21310 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
21311 break;
21312
21313 case RULE_OP_MANGLE_TOGGLECASE_REC:
21314 /* todo */
21315 break;
21316
21317 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21318 NEXT_RULEPOS (rule_pos);
21319 NEXT_RPTOI (rule, rule_pos, ulen);
21320 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
21321 break;
21322
21323 case RULE_OP_MANGLE_DUPECHAR_LAST:
21324 NEXT_RULEPOS (rule_pos);
21325 NEXT_RPTOI (rule, rule_pos, ulen);
21326 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
21327 break;
21328
21329 case RULE_OP_MANGLE_DUPECHAR_ALL:
21330 out_len = mangle_dupechar (out, out_len);
21331 break;
21332
21333 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21334 NEXT_RULEPOS (rule_pos);
21335 NEXT_RPTOI (rule, rule_pos, ulen);
21336 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
21337 break;
21338
21339 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21340 NEXT_RULEPOS (rule_pos);
21341 NEXT_RPTOI (rule, rule_pos, ulen);
21342 out_len = mangle_dupeblock_append (out, out_len, ulen);
21343 break;
21344
21345 case RULE_OP_MANGLE_SWITCH_FIRST:
21346 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
21347 break;
21348
21349 case RULE_OP_MANGLE_SWITCH_LAST:
21350 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
21351 break;
21352
21353 case RULE_OP_MANGLE_SWITCH_AT:
21354 NEXT_RULEPOS (rule_pos);
21355 NEXT_RPTOI (rule, rule_pos, upos);
21356 NEXT_RULEPOS (rule_pos);
21357 NEXT_RPTOI (rule, rule_pos, upos2);
21358 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
21359 break;
21360
21361 case RULE_OP_MANGLE_CHR_SHIFTL:
21362 NEXT_RULEPOS (rule_pos);
21363 NEXT_RPTOI (rule, rule_pos, upos);
21364 mangle_chr_shiftl (out, out_len, upos);
21365 break;
21366
21367 case RULE_OP_MANGLE_CHR_SHIFTR:
21368 NEXT_RULEPOS (rule_pos);
21369 NEXT_RPTOI (rule, rule_pos, upos);
21370 mangle_chr_shiftr (out, out_len, upos);
21371 break;
21372
21373 case RULE_OP_MANGLE_CHR_INCR:
21374 NEXT_RULEPOS (rule_pos);
21375 NEXT_RPTOI (rule, rule_pos, upos);
21376 mangle_chr_incr (out, out_len, upos);
21377 break;
21378
21379 case RULE_OP_MANGLE_CHR_DECR:
21380 NEXT_RULEPOS (rule_pos);
21381 NEXT_RPTOI (rule, rule_pos, upos);
21382 mangle_chr_decr (out, out_len, upos);
21383 break;
21384
21385 case RULE_OP_MANGLE_REPLACE_NP1:
21386 NEXT_RULEPOS (rule_pos);
21387 NEXT_RPTOI (rule, rule_pos, upos);
21388 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
21389 break;
21390
21391 case RULE_OP_MANGLE_REPLACE_NM1:
21392 NEXT_RULEPOS (rule_pos);
21393 NEXT_RPTOI (rule, rule_pos, upos);
21394 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
21395 break;
21396
21397 case RULE_OP_MANGLE_TITLE:
21398 out_len = mangle_title (out, out_len);
21399 break;
21400
21401 case RULE_OP_MANGLE_EXTRACT_MEMORY:
21402 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
21403 NEXT_RULEPOS (rule_pos);
21404 NEXT_RPTOI (rule, rule_pos, upos);
21405 NEXT_RULEPOS (rule_pos);
21406 NEXT_RPTOI (rule, rule_pos, ulen);
21407 NEXT_RULEPOS (rule_pos);
21408 NEXT_RPTOI (rule, rule_pos, upos2);
21409 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
21410 break;
21411
21412 case RULE_OP_MANGLE_APPEND_MEMORY:
21413 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
21414 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21415 memcpy (out + out_len, mem, mem_len);
21416 out_len += mem_len;
21417 break;
21418
21419 case RULE_OP_MANGLE_PREPEND_MEMORY:
21420 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
21421 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21422 memcpy (mem + mem_len, out, out_len);
21423 out_len += mem_len;
21424 memcpy (out, mem, out_len);
21425 break;
21426
21427 case RULE_OP_MEMORIZE_WORD:
21428 memcpy (mem, out, out_len);
21429 mem_len = out_len;
21430 break;
21431
21432 case RULE_OP_REJECT_LESS:
21433 NEXT_RULEPOS (rule_pos);
21434 NEXT_RPTOI (rule, rule_pos, upos);
21435 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
21436 break;
21437
21438 case RULE_OP_REJECT_GREATER:
21439 NEXT_RULEPOS (rule_pos);
21440 NEXT_RPTOI (rule, rule_pos, upos);
21441 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
21442 break;
21443
21444 case RULE_OP_REJECT_CONTAIN:
21445 NEXT_RULEPOS (rule_pos);
21446 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
21447 break;
21448
21449 case RULE_OP_REJECT_NOT_CONTAIN:
21450 NEXT_RULEPOS (rule_pos);
21451 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
21452 break;
21453
21454 case RULE_OP_REJECT_EQUAL_FIRST:
21455 NEXT_RULEPOS (rule_pos);
21456 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
21457 break;
21458
21459 case RULE_OP_REJECT_EQUAL_LAST:
21460 NEXT_RULEPOS (rule_pos);
21461 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
21462 break;
21463
21464 case RULE_OP_REJECT_EQUAL_AT:
21465 NEXT_RULEPOS (rule_pos);
21466 NEXT_RPTOI (rule, rule_pos, upos);
21467 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
21468 NEXT_RULEPOS (rule_pos);
21469 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
21470 break;
21471
21472 case RULE_OP_REJECT_CONTAINS:
21473 NEXT_RULEPOS (rule_pos);
21474 NEXT_RPTOI (rule, rule_pos, upos);
21475 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
21476 NEXT_RULEPOS (rule_pos);
21477 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
21478 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
21479 break;
21480
21481 case RULE_OP_REJECT_MEMORY:
21482 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
21483 break;
21484
21485 default:
21486 return (RULE_RC_SYNTAX_ERROR);
21487 break;
21488 }
21489 }
21490
21491 memset (out + out_len, 0, BLOCK_SIZE - out_len);
21492
21493 return (out_len);
21494 }