Merge pull request #165 from gm4tr1x/gcc-warnings
[hashcat.git] / src / shared.c
1 /**
2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
4 *
5 * License.....: MIT
6 */
7
8 #ifdef OSX
9 #include <stdio.h>
10 #endif
11
12 #include <shared.h>
13 #include <limits.h>
14
15 /**
16 * tuning tools
17 */
18
19 #define GET_ACCEL(x) KERNEL_ACCEL_ ## x
20 #define GET_LOOPS(x) KERNEL_LOOPS_ ## x
21
22 /**
23 * basic bit handling
24 */
25
26 u32 rotl32 (const u32 a, const u32 n)
27 {
28 return ((a << n) | (a >> (32 - n)));
29 }
30
31 u32 rotr32 (const u32 a, const u32 n)
32 {
33 return ((a >> n) | (a << (32 - n)));
34 }
35
36 u64 rotl64 (const u64 a, const u64 n)
37 {
38 return ((a << n) | (a >> (64 - n)));
39 }
40
41 u64 rotr64 (const u64 a, const u64 n)
42 {
43 return ((a >> n) | (a << (64 - n)));
44 }
45
46 u32 byte_swap_32 (const u32 n)
47 {
48 return (n & 0xff000000) >> 24
49 | (n & 0x00ff0000) >> 8
50 | (n & 0x0000ff00) << 8
51 | (n & 0x000000ff) << 24;
52 }
53
54 u64 byte_swap_64 (const u64 n)
55 {
56 return (n & 0xff00000000000000ULL) >> 56
57 | (n & 0x00ff000000000000ULL) >> 40
58 | (n & 0x0000ff0000000000ULL) >> 24
59 | (n & 0x000000ff00000000ULL) >> 8
60 | (n & 0x00000000ff000000ULL) << 8
61 | (n & 0x0000000000ff0000ULL) << 24
62 | (n & 0x000000000000ff00ULL) << 40
63 | (n & 0x00000000000000ffULL) << 56;
64 }
65
66 /**
67 * ciphers for use on cpu
68 */
69
70 #include "cpu-des.c"
71 #include "cpu-aes.c"
72
73 /**
74 * hashes for use on cpu
75 */
76
77 #include "cpu-md5.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 #ifdef _WIN
2631 void fsync (int fd)
2632 {
2633 HANDLE h = (HANDLE) _get_osfhandle (fd);
2634
2635 FlushFileBuffers (h);
2636 }
2637 #endif
2638
2639 /**
2640 * thermal
2641 */
2642
2643 #ifdef HAVE_HWMON
2644 #if defined(_WIN) && defined(HAVE_NVAPI)
2645 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2646 {
2647 NvU32 pGpuCount;
2648
2649 if (hc_NvAPI_EnumPhysicalGPUs (nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2650
2651 if (pGpuCount == 0)
2652 {
2653 log_info ("WARN: No NvAPI adapters found");
2654
2655 return (0);
2656 }
2657
2658 return (pGpuCount);
2659 }
2660 #endif // _WIN && HAVE_NVAPI
2661
2662 #if defined(LINUX) && defined(HAVE_NVML)
2663 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2664 {
2665 int pGpuCount = 0;
2666
2667 for (uint i = 0; i < DEVICES_MAX; i++)
2668 {
2669 if (hc_NVML_nvmlDeviceGetHandleByIndex (data.hm_dll_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2670
2671 // can be used to determine if the device by index matches the cuda device by index
2672 // char name[100]; memset (name, 0, sizeof (name));
2673 // hc_NVML_nvmlDeviceGetName (data.hm_dll_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2674
2675 pGpuCount++;
2676 }
2677
2678 if (pGpuCount == 0)
2679 {
2680 log_info ("WARN: No NVML adapters found");
2681
2682 return (0);
2683 }
2684
2685 return (pGpuCount);
2686 }
2687 #endif // LINUX && HAVE_NVML
2688
2689 #if defined(HAVE_ADL) || defined(HAVE_NVML)
2690 void hm_close (HM_LIB hm_dll)
2691 {
2692 #ifdef _POSIX
2693 dlclose (hm_dll);
2694
2695 #elif _WIN
2696 FreeLibrary (hm_dll);
2697
2698 #endif
2699 }
2700
2701 HM_LIB hm_init (const cl_uint vendor_id)
2702 {
2703 HM_LIB hm_dll = NULL;
2704
2705 #ifdef HAVE_ADL
2706 if (vendor_id == VENDOR_ID_AMD)
2707 {
2708 #ifdef _POSIX
2709 hm_dll = dlopen ("libatiadlxx.so", RTLD_LAZY | RTLD_GLOBAL);
2710
2711 #elif _WIN
2712 hm_dll = LoadLibrary ("atiadlxx.dll");
2713
2714 if (hm_dll == NULL)
2715 {
2716 hm_dll = LoadLibrary ("atiadlxy.dll");
2717 }
2718
2719 #endif
2720 }
2721 #endif
2722
2723 #if defined(LINUX) && defined(HAVE_NVML)
2724 if (vendor_id == VENDOR_ID_NV)
2725 {
2726 hm_dll = dlopen ("libnvidia-ml.so", RTLD_LAZY | RTLD_GLOBAL);
2727 }
2728 #endif
2729
2730 return hm_dll;
2731 }
2732 #endif // HAVE_ADL || HAVE_NVML
2733
2734 #ifdef HAVE_ADL
2735 int get_adapters_num_amd (HM_LIB hm_dll_amd, int *iNumberAdapters)
2736 {
2737 if (hc_ADL_Adapter_NumberOfAdapters_Get (hm_dll_amd, iNumberAdapters) != ADL_OK) return -1;
2738
2739 if (iNumberAdapters == 0)
2740 {
2741 log_info ("WARN: No ADL adapters found.");
2742
2743 return -1;
2744 }
2745
2746 return 0;
2747 }
2748
2749 /*
2750 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2751 {
2752 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2753 ADLODParameters lpOdParameters;
2754
2755 lpOdParameters.iSize = sizeof (ADLODParameters);
2756 size_t plevels_size = 0;
2757
2758 if (hc_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2759
2760 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2761 __func__, iAdapterIndex,
2762 lpOdParameters.iNumberOfPerformanceLevels,
2763 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2764 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2765
2766 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2767
2768 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2769
2770 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2771
2772 if (hc_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2773
2774 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2775 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2776 __func__, iAdapterIndex, j,
2777 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2778
2779 myfree (lpOdPerformanceLevels);
2780
2781 return 0;
2782 }
2783 */
2784
2785 LPAdapterInfo hm_get_adapter_info_amd (HM_LIB hm_dll_amd, int iNumberAdapters)
2786 {
2787 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2788
2789 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2790
2791 if (hc_ADL_Adapter_AdapterInfo_Get (hm_dll_amd, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2792
2793 return lpAdapterInfo;
2794 }
2795
2796 /*
2797 //
2798 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2799 //
2800
2801 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2802 {
2803 u32 idx = -1;
2804
2805 for (uint i = 0; i < num_adl_adapters; i++)
2806 {
2807 int opencl_bus_num = hm_device[i].busid;
2808 int opencl_dev_num = hm_device[i].devid;
2809
2810 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2811 {
2812 idx = i;
2813
2814 break;
2815 }
2816 }
2817
2818 if (idx >= DEVICES_MAX) return -1;
2819
2820 return idx;
2821 }
2822
2823 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2824 {
2825 for (uint i = 0; i < opencl_num_devices; i++)
2826 {
2827 cl_device_topology_amd device_topology;
2828
2829 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2830
2831 hm_device[i].busid = device_topology.pcie.bus;
2832 hm_device[i].devid = device_topology.pcie.device;
2833 }
2834 }
2835 */
2836
2837 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2838 {
2839 // basically bubble sort
2840
2841 for (int i = 0; i < num_adl_adapters; i++)
2842 {
2843 for (int j = 0; j < num_adl_adapters - 1; j++)
2844 {
2845 // get info of adapter [x]
2846
2847 u32 adapter_index_x = valid_adl_device_list[j];
2848 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2849
2850 u32 bus_num_x = info_x.iBusNumber;
2851 u32 dev_num_x = info_x.iDeviceNumber;
2852
2853 // get info of adapter [y]
2854
2855 u32 adapter_index_y = valid_adl_device_list[j + 1];
2856 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2857
2858 u32 bus_num_y = info_y.iBusNumber;
2859 u32 dev_num_y = info_y.iDeviceNumber;
2860
2861 uint need_swap = 0;
2862
2863 if (bus_num_y < bus_num_x)
2864 {
2865 need_swap = 1;
2866 }
2867 else if (bus_num_y == bus_num_x)
2868 {
2869 if (dev_num_y < dev_num_x)
2870 {
2871 need_swap = 1;
2872 }
2873 }
2874
2875 if (need_swap == 1)
2876 {
2877 u32 temp = valid_adl_device_list[j + 1];
2878
2879 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2880 valid_adl_device_list[j + 0] = temp;
2881 }
2882 }
2883 }
2884 }
2885
2886 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2887 {
2888 *num_adl_adapters = 0;
2889
2890 u32 *adl_adapters = NULL;
2891
2892 int *bus_numbers = NULL;
2893 int *device_numbers = NULL;
2894
2895 for (int i = 0; i < iNumberAdapters; i++)
2896 {
2897 AdapterInfo info = lpAdapterInfo[i];
2898
2899 if (strlen (info.strUDID) < 1) continue;
2900
2901 #ifdef WIN
2902 if (info.iVendorID != 1002) continue;
2903 #else
2904 if (info.iVendorID != 0x1002) continue;
2905 #endif
2906
2907 if (info.iBusNumber < 0) continue;
2908 if (info.iDeviceNumber < 0) continue;
2909
2910 int found = 0;
2911
2912 for (int pos = 0; pos < *num_adl_adapters; pos++)
2913 {
2914 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2915 {
2916 found = 1;
2917 break;
2918 }
2919 }
2920
2921 if (found) continue;
2922
2923 // add it to the list
2924
2925 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2926
2927 adl_adapters[*num_adl_adapters] = i;
2928
2929 // rest is just bookkeeping
2930
2931 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2932 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2933
2934 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2935 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2936
2937 (*num_adl_adapters)++;
2938 }
2939
2940 myfree (bus_numbers);
2941 myfree (device_numbers);
2942
2943 // sort the list by increasing bus id, device id number
2944
2945 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2946
2947 return adl_adapters;
2948 }
2949
2950 int hm_check_fanspeed_control (HM_LIB hm_dll_amd, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2951 {
2952 // loop through all valid devices
2953
2954 for (int i = 0; i < num_adl_adapters; i++)
2955 {
2956 u32 adapter_index = valid_adl_device_list[i];
2957
2958 // get AdapterInfo
2959
2960 AdapterInfo info = lpAdapterInfo[adapter_index];
2961
2962 // unfortunately this doesn't work since bus id and dev id are not unique
2963 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2964 // if (opencl_device_index == -1) continue;
2965
2966 int opencl_device_index = i;
2967
2968 // if (hm_show_performance_level (hm_dll_amd, info.iAdapterIndex) != 0) return -1;
2969
2970 // get fanspeed info
2971
2972 if (hm_device[opencl_device_index].od_version == 5)
2973 {
2974 ADLFanSpeedInfo FanSpeedInfo;
2975
2976 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2977
2978 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2979
2980 if (hc_ADL_Overdrive5_FanSpeedInfo_Get (hm_dll_amd, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2981
2982 // check read and write capability in fanspeedinfo
2983
2984 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2985 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2986 {
2987 hm_device[opencl_device_index].fan_supported = 1;
2988 }
2989 else
2990 {
2991 hm_device[opencl_device_index].fan_supported = 0;
2992 }
2993 }
2994 else // od_version == 6
2995 {
2996 ADLOD6FanSpeedInfo faninfo;
2997
2998 memset (&faninfo, 0, sizeof (faninfo));
2999
3000 if (hc_ADL_Overdrive6_FanSpeed_Get (hm_dll_amd, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
3001
3002 // check read capability in fanspeedinfo
3003
3004 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
3005 {
3006 hm_device[opencl_device_index].fan_supported = 1;
3007 }
3008 else
3009 {
3010 hm_device[opencl_device_index].fan_supported = 0;
3011 }
3012 }
3013 }
3014
3015 return 0;
3016 }
3017
3018 int hm_get_overdrive_version (HM_LIB hm_dll_amd, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3019 {
3020 for (int i = 0; i < num_adl_adapters; i++)
3021 {
3022 u32 adapter_index = valid_adl_device_list[i];
3023
3024 // get AdapterInfo
3025
3026 AdapterInfo info = lpAdapterInfo[adapter_index];
3027
3028 // get overdrive version
3029
3030 int od_supported = 0;
3031 int od_enabled = 0;
3032 int od_version = 0;
3033
3034 if (hc_ADL_Overdrive_Caps (hm_dll_amd, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3035
3036 // store the overdrive version in hm_device
3037
3038 // unfortunately this doesn't work since bus id and dev id are not unique
3039 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3040 // if (opencl_device_index == -1) continue;
3041
3042 int opencl_device_index = i;
3043
3044 hm_device[opencl_device_index].od_version = od_version;
3045 }
3046
3047 return 0;
3048 }
3049
3050 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3051 {
3052 for (int i = 0; i < num_adl_adapters; i++)
3053 {
3054 u32 adapter_index = valid_adl_device_list[i];
3055
3056 // get AdapterInfo
3057
3058 AdapterInfo info = lpAdapterInfo[adapter_index];
3059
3060 // store the iAdapterIndex in hm_device
3061
3062 // unfortunately this doesn't work since bus id and dev id are not unique
3063 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3064 // if (opencl_device_index == -1) continue;
3065
3066 int opencl_device_index = i;
3067
3068 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3069 }
3070
3071 return num_adl_adapters;
3072 }
3073 #endif // HAVE_ADL
3074
3075 int hm_get_temperature_with_device_id (const uint device_id)
3076 {
3077 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3078
3079 #ifdef HAVE_ADL
3080 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3081 {
3082 if (data.hm_dll_amd)
3083 {
3084 if (data.hm_device[device_id].od_version == 5)
3085 {
3086 ADLTemperature Temperature;
3087
3088 Temperature.iSize = sizeof (ADLTemperature);
3089
3090 if (hc_ADL_Overdrive5_Temperature_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3091
3092 return Temperature.iTemperature / 1000;
3093 }
3094 else if (data.hm_device[device_id].od_version == 6)
3095 {
3096 int Temperature = 0;
3097
3098 if (hc_ADL_Overdrive6_Temperature_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3099
3100 return Temperature / 1000;
3101 }
3102 }
3103 }
3104 #endif
3105
3106 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3107 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3108 {
3109 #if defined(LINUX) && defined(HAVE_NVML)
3110 int temperature = 0;
3111
3112 hc_NVML_nvmlDeviceGetTemperature (data.hm_dll_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3113
3114 return temperature;
3115 #endif
3116
3117 #if defined(WIN) && defined(HAVE_NVAPI)
3118 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3119
3120 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3121 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3122 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3123 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3124
3125 if (hc_NvAPI_GPU_GetThermalSettings (data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3126
3127 return pThermalSettings.sensor[0].currentTemp;
3128 #endif // WIN && HAVE_NVAPI
3129 }
3130 #endif // HAVE_NVML || HAVE_NVAPI
3131
3132 return -1;
3133 }
3134
3135 int hm_get_fanspeed_with_device_id (const uint device_id)
3136 {
3137 // we shouldn't really need this extra CL_DEVICE_TYPE_GPU check, because fan_supported should not be set w/ CPUs
3138 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3139
3140 if (data.hm_device[device_id].fan_supported == 1)
3141 {
3142 #ifdef HAVE_ADL
3143 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3144 {
3145 if (data.hm_dll_amd)
3146 {
3147 if (data.hm_device[device_id].od_version == 5)
3148 {
3149 ADLFanSpeedValue lpFanSpeedValue;
3150
3151 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3152
3153 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3154 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3155 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3156
3157 if (hc_ADL_Overdrive5_FanSpeed_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3158
3159 return lpFanSpeedValue.iFanSpeed;
3160 }
3161 else // od_version == 6
3162 {
3163 ADLOD6FanSpeedInfo faninfo;
3164
3165 memset (&faninfo, 0, sizeof (faninfo));
3166
3167 if (hc_ADL_Overdrive6_FanSpeed_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3168
3169 return faninfo.iFanSpeedPercent;
3170 }
3171 }
3172 }
3173 #endif // HAVE_ADL
3174
3175 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3176 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3177 {
3178 #if defined(LINUX) && defined(HAVE_NVML)
3179 int speed = 0;
3180
3181 hc_NVML_nvmlDeviceGetFanSpeed (data.hm_dll_nv, 1, data.hm_device[device_id].adapter_index.nv, (unsigned int *) &speed);
3182
3183 return speed;
3184 #endif
3185
3186 #if defined(WIN) && defined(HAVE_NVAPI)
3187 NvU32 speed = 0;
3188
3189 hc_NvAPI_GPU_GetTachReading (data.hm_device[device_id].adapter_index.nv, &speed);
3190
3191 return speed;
3192 #endif
3193 }
3194 #endif // HAVE_NVML || HAVE_NVAPI
3195 }
3196
3197 return -1;
3198 }
3199
3200 int hm_get_utilization_with_device_id (const uint device_id)
3201 {
3202 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3203
3204 #ifdef HAVE_ADL
3205 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3206 {
3207 if (data.hm_dll_amd)
3208 {
3209 ADLPMActivity PMActivity;
3210
3211 PMActivity.iSize = sizeof (ADLPMActivity);
3212
3213 if (hc_ADL_Overdrive_CurrentActivity_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3214
3215 return PMActivity.iActivityPercent;
3216 }
3217 }
3218 #endif // HAVE_ADL
3219
3220 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3221 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3222 {
3223 #if defined(LINUX) && defined(HAVE_NVML)
3224 nvmlUtilization_t utilization;
3225
3226 hc_NVML_nvmlDeviceGetUtilizationRates (data.hm_dll_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3227
3228 return utilization.gpu;
3229 #endif
3230
3231 #if defined(WIN) && defined(HAVE_NVAPI)
3232 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3233
3234 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3235
3236 if (hc_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3237
3238 return pDynamicPstatesInfoEx.utilization[0].percentage;
3239 #endif
3240 }
3241 #endif // HAVE_NVML || HAVE_NVAPI
3242
3243 return -1;
3244 }
3245
3246 #ifdef HAVE_ADL
3247 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3248 {
3249 if (data.hm_device[device_id].fan_supported == 1)
3250 {
3251 if (data.hm_dll_amd)
3252 {
3253 if (data.hm_device[device_id].od_version == 5)
3254 {
3255 ADLFanSpeedValue lpFanSpeedValue;
3256
3257 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3258
3259 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3260 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3261 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3262 lpFanSpeedValue.iFanSpeed = fanspeed;
3263
3264 if (hc_ADL_Overdrive5_FanSpeed_Set (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3265
3266 return 0;
3267 }
3268 else // od_version == 6
3269 {
3270 ADLOD6FanSpeedValue fan_speed_value;
3271
3272 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3273
3274 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3275 fan_speed_value.iFanSpeed = fanspeed;
3276
3277 if (hc_ADL_Overdrive6_FanSpeed_Set (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3278
3279 return 0;
3280 }
3281 }
3282 }
3283
3284 return -1;
3285 }
3286 #endif
3287
3288 // helper function for status display
3289
3290 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3291 {
3292 #define VALUE_NOT_AVAILABLE "N/A"
3293
3294 if (value == -1)
3295 {
3296 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3297 }
3298 else
3299 {
3300 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3301 }
3302 }
3303 #endif // HAVE_HWMON
3304
3305 /**
3306 * maskprocessor
3307 */
3308
3309 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3310 {
3311 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3312
3313 if (css_cnt > SP_PW_MAX)
3314 {
3315 log_error ("ERROR: mask length is too long");
3316
3317 exit (-1);
3318 }
3319
3320 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3321 {
3322 uint *uniq_tbl = uniq_tbls[css_pos];
3323
3324 uint *cs_buf = css[css_pos].cs_buf;
3325 uint cs_len = css[css_pos].cs_len;
3326
3327 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3328 {
3329 uint c = cs_buf[cs_pos] & 0xff;
3330
3331 uniq_tbl[c] = 1;
3332 }
3333 }
3334 }
3335
3336 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3337 {
3338 cs_t *cs = &css[css_cnt];
3339
3340 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3341
3342 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3343
3344 size_t i;
3345
3346 for (i = 0; i < cs->cs_len; i++)
3347 {
3348 const uint u = cs->cs_buf[i];
3349
3350 css_uniq[u] = 1;
3351 }
3352
3353 for (i = 0; i < in_len; i++)
3354 {
3355 uint u = in_buf[i] & 0xff;
3356
3357 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3358
3359 if (css_uniq[u] == 1) continue;
3360
3361 css_uniq[u] = 1;
3362
3363 cs->cs_buf[cs->cs_len] = u;
3364
3365 cs->cs_len++;
3366 }
3367
3368 myfree (css_uniq);
3369 }
3370
3371 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3372 {
3373 size_t in_pos;
3374
3375 for (in_pos = 0; in_pos < in_len; in_pos++)
3376 {
3377 uint p0 = in_buf[in_pos] & 0xff;
3378
3379 if (interpret == 1 && p0 == '?')
3380 {
3381 in_pos++;
3382
3383 if (in_pos == in_len) break;
3384
3385 uint p1 = in_buf[in_pos] & 0xff;
3386
3387 switch (p1)
3388 {
3389 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3390 break;
3391 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3392 break;
3393 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3394 break;
3395 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3396 break;
3397 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3398 break;
3399 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3400 break;
3401 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3402 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3403 break;
3404 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3405 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3406 break;
3407 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3408 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3409 break;
3410 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3411 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3412 break;
3413 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3414 break;
3415 default: log_error ("Syntax error: %s", in_buf);
3416 exit (-1);
3417 }
3418 }
3419 else
3420 {
3421 if (data.hex_charset)
3422 {
3423 in_pos++;
3424
3425 if (in_pos == in_len)
3426 {
3427 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3428
3429 exit (-1);
3430 }
3431
3432 uint p1 = in_buf[in_pos] & 0xff;
3433
3434 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3435 {
3436 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3437
3438 exit (-1);
3439 }
3440
3441 uint chr = 0;
3442
3443 chr = hex_convert (p1) << 0;
3444 chr |= hex_convert (p0) << 4;
3445
3446 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3447 }
3448 else
3449 {
3450 uint chr = p0;
3451
3452 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3453 }
3454 }
3455 }
3456 }
3457
3458 u64 mp_get_sum (uint css_cnt, cs_t *css)
3459 {
3460 u64 sum = 1;
3461
3462 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3463 {
3464 sum *= css[css_pos].cs_len;
3465 }
3466
3467 return (sum);
3468 }
3469
3470 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3471 {
3472 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3473
3474 uint mask_pos;
3475 uint css_pos;
3476
3477 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3478 {
3479 char p0 = mask_buf[mask_pos];
3480
3481 if (p0 == '?')
3482 {
3483 mask_pos++;
3484
3485 if (mask_pos == mask_len) break;
3486
3487 char p1 = mask_buf[mask_pos];
3488
3489 uint chr = p1;
3490
3491 switch (p1)
3492 {
3493 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3494 break;
3495 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3496 break;
3497 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3498 break;
3499 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3500 break;
3501 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3502 break;
3503 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3504 break;
3505 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3506 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3507 break;
3508 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3509 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3510 break;
3511 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3512 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3513 break;
3514 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3515 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3516 break;
3517 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3518 break;
3519 default: log_error ("ERROR: syntax error: %s", mask_buf);
3520 exit (-1);
3521 }
3522 }
3523 else
3524 {
3525 if (data.hex_charset)
3526 {
3527 mask_pos++;
3528
3529 // if there is no 2nd hex character, show an error:
3530
3531 if (mask_pos == mask_len)
3532 {
3533 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3534
3535 exit (-1);
3536 }
3537
3538 char p1 = mask_buf[mask_pos];
3539
3540 // if they are not valid hex character, show an error:
3541
3542 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3543 {
3544 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3545
3546 exit (-1);
3547 }
3548
3549 uint chr = 0;
3550
3551 chr |= hex_convert (p1) << 0;
3552 chr |= hex_convert (p0) << 4;
3553
3554 mp_add_cs_buf (&chr, 1, css, css_pos);
3555 }
3556 else
3557 {
3558 uint chr = p0;
3559
3560 mp_add_cs_buf (&chr, 1, css, css_pos);
3561 }
3562 }
3563 }
3564
3565 if (css_pos == 0)
3566 {
3567 log_error ("ERROR: invalid mask length (0)");
3568
3569 exit (-1);
3570 }
3571
3572 *css_cnt = css_pos;
3573
3574 return (css);
3575 }
3576
3577 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3578 {
3579 for (int i = 0; i < css_cnt; i++)
3580 {
3581 uint len = css[i].cs_len;
3582 u64 next = val / len;
3583 uint pos = val % len;
3584 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3585 val = next;
3586 }
3587 }
3588
3589 void mp_cut_at (char *mask, uint max)
3590 {
3591 uint i;
3592 uint j;
3593 uint mask_len = strlen (mask);
3594
3595 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3596 {
3597 if (mask[i] == '?') i++;
3598 }
3599
3600 mask[i] = 0;
3601 }
3602
3603 void mp_setup_sys (cs_t *mp_sys)
3604 {
3605 uint pos;
3606 uint chr;
3607 uint donec[CHARSIZ] = { 0 };
3608
3609 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3610 mp_sys[0].cs_buf[pos++] = chr;
3611 mp_sys[0].cs_len = pos; }
3612
3613 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3614 mp_sys[1].cs_buf[pos++] = chr;
3615 mp_sys[1].cs_len = pos; }
3616
3617 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3618 mp_sys[2].cs_buf[pos++] = chr;
3619 mp_sys[2].cs_len = pos; }
3620
3621 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3622 mp_sys[3].cs_buf[pos++] = chr;
3623 mp_sys[3].cs_len = pos; }
3624
3625 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3626 mp_sys[4].cs_len = pos; }
3627
3628 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3629 mp_sys[5].cs_len = pos; }
3630 }
3631
3632 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3633 {
3634 FILE *fp = fopen (buf, "rb");
3635
3636 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3637 {
3638 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3639 }
3640 else
3641 {
3642 char mp_file[1024] = { 0 };
3643
3644 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3645
3646 fclose (fp);
3647
3648 len = in_superchop (mp_file);
3649
3650 if (len == 0)
3651 {
3652 log_info ("WARNING: charset file corrupted");
3653
3654 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3655 }
3656 else
3657 {
3658 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3659 }
3660 }
3661 }
3662
3663 void mp_reset_usr (cs_t *mp_usr, uint index)
3664 {
3665 mp_usr[index].cs_len = 0;
3666
3667 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3668 }
3669
3670 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3671 {
3672 char *new_mask_buf = (char *) mymalloc (256);
3673
3674 uint mask_pos;
3675
3676 uint css_pos;
3677
3678 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3679 {
3680 if (css_pos == len) break;
3681
3682 char p0 = mask_buf[mask_pos];
3683
3684 new_mask_buf[mask_pos] = p0;
3685
3686 if (p0 == '?')
3687 {
3688 mask_pos++;
3689
3690 if (mask_pos == mask_len) break;
3691
3692 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3693 }
3694 else
3695 {
3696 if (data.hex_charset)
3697 {
3698 mask_pos++;
3699
3700 if (mask_pos == mask_len)
3701 {
3702 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3703
3704 exit (-1);
3705 }
3706
3707 char p1 = mask_buf[mask_pos];
3708
3709 // if they are not valid hex character, show an error:
3710
3711 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3712 {
3713 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3714
3715 exit (-1);
3716 }
3717
3718 new_mask_buf[mask_pos] = p1;
3719 }
3720 }
3721 }
3722
3723 if (css_pos == len) return (new_mask_buf);
3724
3725 myfree (new_mask_buf);
3726
3727 return (NULL);
3728 }
3729
3730 /**
3731 * statprocessor
3732 */
3733
3734 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3735 {
3736 u64 sum = 1;
3737
3738 uint i;
3739
3740 for (i = start; i < stop; i++)
3741 {
3742 sum *= root_css_buf[i].cs_len;
3743 }
3744
3745 return (sum);
3746 }
3747
3748 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3749 {
3750 u64 v = ctx;
3751
3752 cs_t *cs = &root_css_buf[start];
3753
3754 uint i;
3755
3756 for (i = start; i < stop; i++)
3757 {
3758 const u64 m = v % cs->cs_len;
3759 const u64 d = v / cs->cs_len;
3760
3761 v = d;
3762
3763 const uint k = cs->cs_buf[m];
3764
3765 pw_buf[i - start] = (char) k;
3766
3767 cs = &markov_css_buf[(i * CHARSIZ) + k];
3768 }
3769 }
3770
3771 int sp_comp_val (const void *p1, const void *p2)
3772 {
3773 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3774 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3775
3776 return b2->val - b1->val;
3777 }
3778
3779 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)
3780 {
3781 uint i;
3782 uint j;
3783 uint k;
3784
3785 /**
3786 * Initialize hcstats
3787 */
3788
3789 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3790
3791 u64 *root_stats_ptr = root_stats_buf;
3792
3793 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3794
3795 for (i = 0; i < SP_PW_MAX; i++)
3796 {
3797 root_stats_buf_by_pos[i] = root_stats_ptr;
3798
3799 root_stats_ptr += CHARSIZ;
3800 }
3801
3802 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3803
3804 u64 *markov_stats_ptr = markov_stats_buf;
3805
3806 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3807
3808 for (i = 0; i < SP_PW_MAX; i++)
3809 {
3810 for (j = 0; j < CHARSIZ; j++)
3811 {
3812 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3813
3814 markov_stats_ptr += CHARSIZ;
3815 }
3816 }
3817
3818 /**
3819 * Load hcstats File
3820 */
3821
3822 if (hcstat == NULL)
3823 {
3824 char hcstat_tmp[256] = { 0 };
3825
3826 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3827
3828 hcstat = hcstat_tmp;
3829 }
3830
3831 FILE *fd = fopen (hcstat, "rb");
3832
3833 if (fd == NULL)
3834 {
3835 log_error ("%s: %s", hcstat, strerror (errno));
3836
3837 exit (-1);
3838 }
3839
3840 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3841 {
3842 log_error ("%s: Could not load data", hcstat);
3843
3844 fclose (fd);
3845
3846 exit (-1);
3847 }
3848
3849 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3850 {
3851 log_error ("%s: Could not load data", hcstat);
3852
3853 fclose (fd);
3854
3855 exit (-1);
3856 }
3857
3858 fclose (fd);
3859
3860 /**
3861 * Markov modifier of hcstat_table on user request
3862 */
3863
3864 if (disable)
3865 {
3866 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3867 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3868 }
3869
3870 if (classic)
3871 {
3872 /* Add all stats to first position */
3873
3874 for (i = 1; i < SP_PW_MAX; i++)
3875 {
3876 u64 *out = root_stats_buf_by_pos[0];
3877 u64 *in = root_stats_buf_by_pos[i];
3878
3879 for (j = 0; j < CHARSIZ; j++)
3880 {
3881 *out++ += *in++;
3882 }
3883 }
3884
3885 for (i = 1; i < SP_PW_MAX; i++)
3886 {
3887 u64 *out = markov_stats_buf_by_key[0][0];
3888 u64 *in = markov_stats_buf_by_key[i][0];
3889
3890 for (j = 0; j < CHARSIZ; j++)
3891 {
3892 for (k = 0; k < CHARSIZ; k++)
3893 {
3894 *out++ += *in++;
3895 }
3896 }
3897 }
3898
3899 /* copy them to all pw_positions */
3900
3901 for (i = 1; i < SP_PW_MAX; i++)
3902 {
3903 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
3904 }
3905
3906 for (i = 1; i < SP_PW_MAX; i++)
3907 {
3908 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
3909 }
3910 }
3911
3912 /**
3913 * Initialize tables
3914 */
3915
3916 hcstat_table_t *root_table_ptr = root_table_buf;
3917
3918 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3919
3920 for (i = 0; i < SP_PW_MAX; i++)
3921 {
3922 root_table_buf_by_pos[i] = root_table_ptr;
3923
3924 root_table_ptr += CHARSIZ;
3925 }
3926
3927 hcstat_table_t *markov_table_ptr = markov_table_buf;
3928
3929 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3930
3931 for (i = 0; i < SP_PW_MAX; i++)
3932 {
3933 for (j = 0; j < CHARSIZ; j++)
3934 {
3935 markov_table_buf_by_key[i][j] = markov_table_ptr;
3936
3937 markov_table_ptr += CHARSIZ;
3938 }
3939 }
3940
3941 /**
3942 * Convert hcstat to tables
3943 */
3944
3945 for (i = 0; i < SP_ROOT_CNT; i++)
3946 {
3947 uint key = i % CHARSIZ;
3948
3949 root_table_buf[i].key = key;
3950 root_table_buf[i].val = root_stats_buf[i];
3951 }
3952
3953 for (i = 0; i < SP_MARKOV_CNT; i++)
3954 {
3955 uint key = i % CHARSIZ;
3956
3957 markov_table_buf[i].key = key;
3958 markov_table_buf[i].val = markov_stats_buf[i];
3959 }
3960
3961 myfree (root_stats_buf);
3962 myfree (markov_stats_buf);
3963
3964 /**
3965 * Finally sort them
3966 */
3967
3968 for (i = 0; i < SP_PW_MAX; i++)
3969 {
3970 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3971 }
3972
3973 for (i = 0; i < SP_PW_MAX; i++)
3974 {
3975 for (j = 0; j < CHARSIZ; j++)
3976 {
3977 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3978 }
3979 }
3980 }
3981
3982 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])
3983 {
3984 /**
3985 * Convert tables to css
3986 */
3987
3988 for (uint i = 0; i < SP_ROOT_CNT; i++)
3989 {
3990 uint pw_pos = i / CHARSIZ;
3991
3992 cs_t *cs = &root_css_buf[pw_pos];
3993
3994 if (cs->cs_len == threshold) continue;
3995
3996 uint key = root_table_buf[i].key;
3997
3998 if (uniq_tbls[pw_pos][key] == 0) continue;
3999
4000 cs->cs_buf[cs->cs_len] = key;
4001
4002 cs->cs_len++;
4003 }
4004
4005 /**
4006 * Convert table to css
4007 */
4008
4009 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4010 {
4011 uint c = i / CHARSIZ;
4012
4013 cs_t *cs = &markov_css_buf[c];
4014
4015 if (cs->cs_len == threshold) continue;
4016
4017 uint pw_pos = c / CHARSIZ;
4018
4019 uint key = markov_table_buf[i].key;
4020
4021 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4022
4023 cs->cs_buf[cs->cs_len] = key;
4024
4025 cs->cs_len++;
4026 }
4027
4028 /*
4029 for (uint i = 0; i < 8; i++)
4030 {
4031 for (uint j = 0x20; j < 0x80; j++)
4032 {
4033 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4034
4035 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4036
4037 for (uint k = 0; k < 10; k++)
4038 {
4039 printf (" %u\n", ptr->cs_buf[k]);
4040 }
4041 }
4042 }
4043 */
4044 }
4045
4046 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4047 {
4048 for (uint i = 0; i < SP_PW_MAX; i += 2)
4049 {
4050 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4051
4052 out += CHARSIZ;
4053 in += CHARSIZ;
4054
4055 out->key = 0;
4056 out->val = 1;
4057
4058 out++;
4059
4060 for (uint j = 1; j < CHARSIZ; j++)
4061 {
4062 out->key = j;
4063 out->val = 0;
4064
4065 out++;
4066 }
4067 }
4068 }
4069
4070 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4071 {
4072 for (uint i = 0; i < SP_PW_MAX; i += 2)
4073 {
4074 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4075
4076 out += CHARSIZ * CHARSIZ;
4077 in += CHARSIZ * CHARSIZ;
4078
4079 for (uint j = 0; j < CHARSIZ; j++)
4080 {
4081 out->key = 0;
4082 out->val = 1;
4083
4084 out++;
4085
4086 for (uint k = 1; k < CHARSIZ; k++)
4087 {
4088 out->key = k;
4089 out->val = 0;
4090
4091 out++;
4092 }
4093 }
4094 }
4095 }
4096
4097 /**
4098 * mixed shared functions
4099 */
4100
4101 void dump_hex (const u8 *s, const int sz)
4102 {
4103 for (int i = 0; i < sz; i++)
4104 {
4105 log_info_nn ("%02x ", s[i]);
4106 }
4107
4108 log_info ("");
4109 }
4110
4111 void usage_mini_print (const char *progname)
4112 {
4113 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4114 }
4115
4116 void usage_big_print (const char *progname)
4117 {
4118 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4119 }
4120
4121 char *get_exec_path ()
4122 {
4123 int exec_path_len = 1024;
4124
4125 char *exec_path = (char *) mymalloc (exec_path_len);
4126
4127 #ifdef LINUX
4128
4129 char tmp[32] = { 0 };
4130
4131 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4132
4133 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4134
4135 #elif WIN
4136
4137 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4138
4139 #elif OSX
4140
4141 uint size = exec_path_len;
4142
4143 if (_NSGetExecutablePath (exec_path, &size) != 0)
4144 {
4145 log_error("! executable path buffer too small\n");
4146
4147 exit (-1);
4148 }
4149
4150 const int len = strlen (exec_path);
4151
4152 #else
4153 #error Your Operating System is not supported or detected
4154 #endif
4155
4156 exec_path[len] = 0;
4157
4158 return exec_path;
4159 }
4160
4161 char *get_install_dir (const char *progname)
4162 {
4163 char *install_dir = mystrdup (progname);
4164 char *last_slash = NULL;
4165
4166 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4167 {
4168 *last_slash = 0;
4169 }
4170 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4171 {
4172 *last_slash = 0;
4173 }
4174 else
4175 {
4176 install_dir[0] = '.';
4177 install_dir[1] = 0;
4178 }
4179
4180 return (install_dir);
4181 }
4182
4183 char *get_profile_dir (const char *homedir)
4184 {
4185 #define DOT_HASHCAT ".hashcat"
4186
4187 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT);
4188
4189 char *profile_dir = (char *) mymalloc (len + 1);
4190
4191 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4192
4193 return profile_dir;
4194 }
4195
4196 char *get_session_dir (const char *profile_dir)
4197 {
4198 #define SESSIONS_FOLDER "sessions"
4199
4200 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER);
4201
4202 char *session_dir = (char *) mymalloc (len + 1);
4203
4204 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4205
4206 return session_dir;
4207 }
4208
4209 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4210 {
4211 uint crc = ~0;
4212
4213 FILE *fd = fopen (filename, "rb");
4214
4215 if (fd == NULL)
4216 {
4217 log_error ("%s: %s", filename, strerror (errno));
4218
4219 exit (-1);
4220 }
4221
4222 #define MAX_KEY_SIZE (1024 * 1024)
4223
4224 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4225
4226 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4227
4228 fclose (fd);
4229
4230 int kpos = 0;
4231
4232 for (int fpos = 0; fpos < nread; fpos++)
4233 {
4234 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4235
4236 keytab[kpos++] += (crc >> 24) & 0xff;
4237 keytab[kpos++] += (crc >> 16) & 0xff;
4238 keytab[kpos++] += (crc >> 8) & 0xff;
4239 keytab[kpos++] += (crc >> 0) & 0xff;
4240
4241 if (kpos >= 64) kpos = 0;
4242 }
4243
4244 myfree (buf);
4245 }
4246
4247 void set_cpu_affinity (char *cpu_affinity)
4248 {
4249 #ifdef WIN
4250 DWORD_PTR aff_mask = 0;
4251 #elif LINUX
4252 cpu_set_t cpuset;
4253 CPU_ZERO (&cpuset);
4254 #endif
4255
4256 if (cpu_affinity)
4257 {
4258 char *devices = strdup (cpu_affinity);
4259
4260 char *next = strtok (devices, ",");
4261
4262 do
4263 {
4264 uint cpu_id = atoi (next);
4265
4266 if (cpu_id == 0)
4267 {
4268 #ifdef WIN
4269 aff_mask = 0;
4270 #elif LINUX
4271 CPU_ZERO (&cpuset);
4272 #endif
4273
4274 break;
4275 }
4276
4277 if (cpu_id > 32)
4278 {
4279 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4280
4281 exit (-1);
4282 }
4283
4284 #ifdef WIN
4285 aff_mask |= 1 << (cpu_id - 1);
4286 #elif LINUX
4287 CPU_SET ((cpu_id - 1), &cpuset);
4288 #endif
4289
4290 } while ((next = strtok (NULL, ",")) != NULL);
4291
4292 free (devices);
4293 }
4294
4295 #ifdef WIN
4296 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4297 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4298 #elif LINUX
4299 pthread_t thread = pthread_self ();
4300 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4301 #endif
4302 }
4303
4304 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4305 {
4306 char *element, *end;
4307
4308 end = (char *) base + nmemb * size;
4309
4310 for (element = (char *) base; element < end; element += size)
4311 if (!compar (element, key))
4312 return element;
4313
4314 return NULL;
4315 }
4316
4317 int sort_by_salt (const void *v1, const void *v2)
4318 {
4319 const salt_t *s1 = (const salt_t *) v1;
4320 const salt_t *s2 = (const salt_t *) v2;
4321
4322 const int res1 = s1->salt_len - s2->salt_len;
4323
4324 if (res1 != 0) return (res1);
4325
4326 const int res2 = s1->salt_iter - s2->salt_iter;
4327
4328 if (res2 != 0) return (res2);
4329
4330 uint n;
4331
4332 n = 12;
4333
4334 while (n--)
4335 {
4336 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4337 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4338 }
4339
4340 n = 8;
4341
4342 while (n--)
4343 {
4344 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4345 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4346 }
4347
4348 return (0);
4349 }
4350
4351 int sort_by_salt_buf (const void *v1, const void *v2)
4352 {
4353 const pot_t *p1 = (const pot_t *) v1;
4354 const pot_t *p2 = (const pot_t *) v2;
4355
4356 const hash_t *h1 = &p1->hash;
4357 const hash_t *h2 = &p2->hash;
4358
4359 const salt_t *s1 = h1->salt;
4360 const salt_t *s2 = h2->salt;
4361
4362 uint n = 12;
4363
4364 while (n--)
4365 {
4366 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4367 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4368 }
4369
4370 return 0;
4371 }
4372
4373 int sort_by_hash_t_salt (const void *v1, const void *v2)
4374 {
4375 const hash_t *h1 = (const hash_t *) v1;
4376 const hash_t *h2 = (const hash_t *) v2;
4377
4378 const salt_t *s1 = h1->salt;
4379 const salt_t *s2 = h2->salt;
4380
4381 // testphase: this should work
4382 uint n = 12;
4383
4384 while (n--)
4385 {
4386 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4387 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4388 }
4389
4390 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4391 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4392 if (s1->salt_len > s2->salt_len) return ( 1);
4393 if (s1->salt_len < s2->salt_len) return (-1);
4394
4395 uint n = s1->salt_len;
4396
4397 while (n--)
4398 {
4399 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4400 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4401 }
4402 */
4403
4404 return 0;
4405 }
4406
4407 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4408 {
4409 const hash_t *h1 = (const hash_t *) v1;
4410 const hash_t *h2 = (const hash_t *) v2;
4411
4412 const salt_t *s1 = h1->salt;
4413 const salt_t *s2 = h2->salt;
4414
4415 // 12 - 2 (since last 2 uints contain the digest)
4416 uint n = 10;
4417
4418 while (n--)
4419 {
4420 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4421 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4422 }
4423
4424 return 0;
4425 }
4426
4427 int sort_by_hash_no_salt (const void *v1, const void *v2)
4428 {
4429 const hash_t *h1 = (const hash_t *) v1;
4430 const hash_t *h2 = (const hash_t *) v2;
4431
4432 const void *d1 = h1->digest;
4433 const void *d2 = h2->digest;
4434
4435 return data.sort_by_digest (d1, d2);
4436 }
4437
4438 int sort_by_hash (const void *v1, const void *v2)
4439 {
4440 const hash_t *h1 = (const hash_t *) v1;
4441 const hash_t *h2 = (const hash_t *) v2;
4442
4443 if (data.isSalted)
4444 {
4445 const salt_t *s1 = h1->salt;
4446 const salt_t *s2 = h2->salt;
4447
4448 int res = sort_by_salt (s1, s2);
4449
4450 if (res != 0) return (res);
4451 }
4452
4453 const void *d1 = h1->digest;
4454 const void *d2 = h2->digest;
4455
4456 return data.sort_by_digest (d1, d2);
4457 }
4458
4459 int sort_by_pot (const void *v1, const void *v2)
4460 {
4461 const pot_t *p1 = (const pot_t *) v1;
4462 const pot_t *p2 = (const pot_t *) v2;
4463
4464 const hash_t *h1 = &p1->hash;
4465 const hash_t *h2 = &p2->hash;
4466
4467 return sort_by_hash (h1, h2);
4468 }
4469
4470 int sort_by_mtime (const void *p1, const void *p2)
4471 {
4472 const char **f1 = (const char **) p1;
4473 const char **f2 = (const char **) p2;
4474
4475 struct stat s1; stat (*f1, &s1);
4476 struct stat s2; stat (*f2, &s2);
4477
4478 return s2.st_mtime - s1.st_mtime;
4479 }
4480
4481 int sort_by_cpu_rule (const void *p1, const void *p2)
4482 {
4483 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4484 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4485
4486 return memcmp (r1, r2, sizeof (cpu_rule_t));
4487 }
4488
4489 int sort_by_kernel_rule (const void *p1, const void *p2)
4490 {
4491 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4492 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4493
4494 return memcmp (r1, r2, sizeof (kernel_rule_t));
4495 }
4496
4497 int sort_by_stringptr (const void *p1, const void *p2)
4498 {
4499 const char **s1 = (const char **) p1;
4500 const char **s2 = (const char **) p2;
4501
4502 return strcmp (*s1, *s2);
4503 }
4504
4505 int sort_by_dictstat (const void *s1, const void *s2)
4506 {
4507 dictstat_t *d1 = (dictstat_t *) s1;
4508 dictstat_t *d2 = (dictstat_t *) s2;
4509
4510 #ifdef LINUX
4511 d2->stat.st_atim = d1->stat.st_atim;
4512 #else
4513 d2->stat.st_atime = d1->stat.st_atime;
4514 #endif
4515
4516 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4517 }
4518
4519 int sort_by_bitmap (const void *p1, const void *p2)
4520 {
4521 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4522 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4523
4524 return b1->collisions - b2->collisions;
4525 }
4526
4527 int sort_by_digest_4_2 (const void *v1, const void *v2)
4528 {
4529 const u32 *d1 = (const u32 *) v1;
4530 const u32 *d2 = (const u32 *) v2;
4531
4532 uint n = 2;
4533
4534 while (n--)
4535 {
4536 if (d1[n] > d2[n]) return ( 1);
4537 if (d1[n] < d2[n]) return (-1);
4538 }
4539
4540 return (0);
4541 }
4542
4543 int sort_by_digest_4_4 (const void *v1, const void *v2)
4544 {
4545 const u32 *d1 = (const u32 *) v1;
4546 const u32 *d2 = (const u32 *) v2;
4547
4548 uint n = 4;
4549
4550 while (n--)
4551 {
4552 if (d1[n] > d2[n]) return ( 1);
4553 if (d1[n] < d2[n]) return (-1);
4554 }
4555
4556 return (0);
4557 }
4558
4559 int sort_by_digest_4_5 (const void *v1, const void *v2)
4560 {
4561 const u32 *d1 = (const u32 *) v1;
4562 const u32 *d2 = (const u32 *) v2;
4563
4564 uint n = 5;
4565
4566 while (n--)
4567 {
4568 if (d1[n] > d2[n]) return ( 1);
4569 if (d1[n] < d2[n]) return (-1);
4570 }
4571
4572 return (0);
4573 }
4574
4575 int sort_by_digest_4_6 (const void *v1, const void *v2)
4576 {
4577 const u32 *d1 = (const u32 *) v1;
4578 const u32 *d2 = (const u32 *) v2;
4579
4580 uint n = 6;
4581
4582 while (n--)
4583 {
4584 if (d1[n] > d2[n]) return ( 1);
4585 if (d1[n] < d2[n]) return (-1);
4586 }
4587
4588 return (0);
4589 }
4590
4591 int sort_by_digest_4_8 (const void *v1, const void *v2)
4592 {
4593 const u32 *d1 = (const u32 *) v1;
4594 const u32 *d2 = (const u32 *) v2;
4595
4596 uint n = 8;
4597
4598 while (n--)
4599 {
4600 if (d1[n] > d2[n]) return ( 1);
4601 if (d1[n] < d2[n]) return (-1);
4602 }
4603
4604 return (0);
4605 }
4606
4607 int sort_by_digest_4_16 (const void *v1, const void *v2)
4608 {
4609 const u32 *d1 = (const u32 *) v1;
4610 const u32 *d2 = (const u32 *) v2;
4611
4612 uint n = 16;
4613
4614 while (n--)
4615 {
4616 if (d1[n] > d2[n]) return ( 1);
4617 if (d1[n] < d2[n]) return (-1);
4618 }
4619
4620 return (0);
4621 }
4622
4623 int sort_by_digest_4_32 (const void *v1, const void *v2)
4624 {
4625 const u32 *d1 = (const u32 *) v1;
4626 const u32 *d2 = (const u32 *) v2;
4627
4628 uint n = 32;
4629
4630 while (n--)
4631 {
4632 if (d1[n] > d2[n]) return ( 1);
4633 if (d1[n] < d2[n]) return (-1);
4634 }
4635
4636 return (0);
4637 }
4638
4639 int sort_by_digest_4_64 (const void *v1, const void *v2)
4640 {
4641 const u32 *d1 = (const u32 *) v1;
4642 const u32 *d2 = (const u32 *) v2;
4643
4644 uint n = 64;
4645
4646 while (n--)
4647 {
4648 if (d1[n] > d2[n]) return ( 1);
4649 if (d1[n] < d2[n]) return (-1);
4650 }
4651
4652 return (0);
4653 }
4654
4655 int sort_by_digest_8_8 (const void *v1, const void *v2)
4656 {
4657 const u64 *d1 = (const u64 *) v1;
4658 const u64 *d2 = (const u64 *) v2;
4659
4660 uint n = 8;
4661
4662 while (n--)
4663 {
4664 if (d1[n] > d2[n]) return ( 1);
4665 if (d1[n] < d2[n]) return (-1);
4666 }
4667
4668 return (0);
4669 }
4670
4671 int sort_by_digest_8_16 (const void *v1, const void *v2)
4672 {
4673 const u64 *d1 = (const u64 *) v1;
4674 const u64 *d2 = (const u64 *) v2;
4675
4676 uint n = 16;
4677
4678 while (n--)
4679 {
4680 if (d1[n] > d2[n]) return ( 1);
4681 if (d1[n] < d2[n]) return (-1);
4682 }
4683
4684 return (0);
4685 }
4686
4687 int sort_by_digest_8_25 (const void *v1, const void *v2)
4688 {
4689 const u64 *d1 = (const u64 *) v1;
4690 const u64 *d2 = (const u64 *) v2;
4691
4692 uint n = 25;
4693
4694 while (n--)
4695 {
4696 if (d1[n] > d2[n]) return ( 1);
4697 if (d1[n] < d2[n]) return (-1);
4698 }
4699
4700 return (0);
4701 }
4702
4703 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4704 {
4705 const u32 *d1 = (const u32 *) v1;
4706 const u32 *d2 = (const u32 *) v2;
4707
4708 const uint dgst_pos0 = data.dgst_pos0;
4709 const uint dgst_pos1 = data.dgst_pos1;
4710 const uint dgst_pos2 = data.dgst_pos2;
4711 const uint dgst_pos3 = data.dgst_pos3;
4712
4713 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4714 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4715 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4716 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4717 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4718 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4719 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4720 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4721
4722 return (0);
4723 }
4724
4725 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)
4726 {
4727 uint outfile_autohex = data.outfile_autohex;
4728
4729 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4730
4731 FILE *debug_fp = NULL;
4732
4733 if (debug_file != NULL)
4734 {
4735 debug_fp = fopen (debug_file, "ab");
4736 }
4737 else
4738 {
4739 debug_fp = stderr;
4740 }
4741
4742 if (debug_fp == NULL)
4743 {
4744 log_info ("WARNING: Could not open debug-file for writing");
4745 }
4746 else
4747 {
4748 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4749 {
4750 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4751
4752 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4753 }
4754
4755 fwrite (rule_ptr, rule_len, 1, debug_fp);
4756
4757 if (debug_mode == 4)
4758 {
4759 fputc (':', debug_fp);
4760
4761 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4762 }
4763
4764 fputc ('\n', debug_fp);
4765
4766 if (debug_file != NULL) fclose (debug_fp);
4767 }
4768 }
4769
4770 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4771 {
4772 int needs_hexify = 0;
4773
4774 if (outfile_autohex == 1)
4775 {
4776 for (uint i = 0; i < plain_len; i++)
4777 {
4778 if (plain_ptr[i] < 0x20)
4779 {
4780 needs_hexify = 1;
4781
4782 break;
4783 }
4784
4785 if (plain_ptr[i] > 0x7f)
4786 {
4787 needs_hexify = 1;
4788
4789 break;
4790 }
4791 }
4792 }
4793
4794 if (needs_hexify == 1)
4795 {
4796 fprintf (fp, "$HEX[");
4797
4798 for (uint i = 0; i < plain_len; i++)
4799 {
4800 fprintf (fp, "%02x", plain_ptr[i]);
4801 }
4802
4803 fprintf (fp, "]");
4804 }
4805 else
4806 {
4807 fwrite (plain_ptr, plain_len, 1, fp);
4808 }
4809 }
4810
4811 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)
4812 {
4813 uint outfile_format = data.outfile_format;
4814
4815 char separator = data.separator;
4816
4817 if (outfile_format & OUTFILE_FMT_HASH)
4818 {
4819 fprintf (out_fp, "%s", out_buf);
4820
4821 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4822 {
4823 fputc (separator, out_fp);
4824 }
4825 }
4826 else if (data.username)
4827 {
4828 if (username != NULL)
4829 {
4830 for (uint i = 0; i < user_len; i++)
4831 {
4832 fprintf (out_fp, "%c", username[i]);
4833 }
4834
4835 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4836 {
4837 fputc (separator, out_fp);
4838 }
4839 }
4840 }
4841
4842 if (outfile_format & OUTFILE_FMT_PLAIN)
4843 {
4844 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4845
4846 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4847 {
4848 fputc (separator, out_fp);
4849 }
4850 }
4851
4852 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4853 {
4854 for (uint i = 0; i < plain_len; i++)
4855 {
4856 fprintf (out_fp, "%02x", plain_ptr[i]);
4857 }
4858
4859 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4860 {
4861 fputc (separator, out_fp);
4862 }
4863 }
4864
4865 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4866 {
4867 #ifdef _WIN
4868 __mingw_fprintf (out_fp, "%llu", crackpos);
4869 #endif
4870
4871 #ifdef _POSIX
4872 #ifdef __x86_64__
4873 fprintf (out_fp, "%lu", (unsigned long) crackpos);
4874 #else
4875 fprintf (out_fp, "%llu", crackpos);
4876 #endif
4877 #endif
4878 }
4879
4880 fputc ('\n', out_fp);
4881 }
4882
4883 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)
4884 {
4885 pot_t pot_key;
4886
4887 pot_key.hash.salt = hashes_buf->salt;
4888 pot_key.hash.digest = hashes_buf->digest;
4889
4890 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4891
4892 if (pot_ptr)
4893 {
4894 log_info_nn ("");
4895
4896 input_buf[input_len] = 0;
4897
4898 // user
4899 unsigned char *username = NULL;
4900 uint user_len = 0;
4901
4902 if (data.username)
4903 {
4904 user_t *user = hashes_buf->hash_info->user;
4905
4906 if (user)
4907 {
4908 username = (unsigned char *) (user->user_name);
4909
4910 user_len = user->user_len;
4911 }
4912 }
4913
4914 // do output the line
4915 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4916 }
4917 }
4918
4919 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4920 #define LM_MASKED_PLAIN "[notfound]"
4921
4922 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)
4923 {
4924 // left
4925
4926 pot_t pot_left_key;
4927
4928 pot_left_key.hash.salt = hash_left->salt;
4929 pot_left_key.hash.digest = hash_left->digest;
4930
4931 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4932
4933 // right
4934
4935 uint weak_hash_found = 0;
4936
4937 pot_t pot_right_key;
4938
4939 pot_right_key.hash.salt = hash_right->salt;
4940 pot_right_key.hash.digest = hash_right->digest;
4941
4942 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4943
4944 if (pot_right_ptr == NULL)
4945 {
4946 // special case, if "weak hash"
4947
4948 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4949 {
4950 weak_hash_found = 1;
4951
4952 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4953
4954 // in theory this is not needed, but we are paranoia:
4955
4956 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4957 pot_right_ptr->plain_len = 0;
4958 }
4959 }
4960
4961 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4962 {
4963 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
4964
4965 return;
4966 }
4967
4968 // at least one half was found:
4969
4970 log_info_nn ("");
4971
4972 input_buf[input_len] = 0;
4973
4974 // user
4975
4976 unsigned char *username = NULL;
4977 uint user_len = 0;
4978
4979 if (data.username)
4980 {
4981 user_t *user = hash_left->hash_info->user;
4982
4983 if (user)
4984 {
4985 username = (unsigned char *) (user->user_name);
4986
4987 user_len = user->user_len;
4988 }
4989 }
4990
4991 // mask the part which was not found
4992
4993 uint left_part_masked = 0;
4994 uint right_part_masked = 0;
4995
4996 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
4997
4998 if (pot_left_ptr == NULL)
4999 {
5000 left_part_masked = 1;
5001
5002 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5003
5004 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5005
5006 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5007 pot_left_ptr->plain_len = mask_plain_len;
5008 }
5009
5010 if (pot_right_ptr == NULL)
5011 {
5012 right_part_masked = 1;
5013
5014 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5015
5016 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5017
5018 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5019 pot_right_ptr->plain_len = mask_plain_len;
5020 }
5021
5022 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5023
5024 pot_t pot_ptr;
5025
5026 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5027
5028 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5029
5030 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5031
5032 // do output the line
5033
5034 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5035
5036 if (weak_hash_found == 1) myfree (pot_right_ptr);
5037
5038 if (left_part_masked == 1) myfree (pot_left_ptr);
5039 if (right_part_masked == 1) myfree (pot_right_ptr);
5040 }
5041
5042 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)
5043 {
5044 pot_t pot_key;
5045
5046 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5047
5048 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5049
5050 if (pot_ptr == NULL)
5051 {
5052 log_info_nn ("");
5053
5054 input_buf[input_len] = 0;
5055
5056 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5057 }
5058 }
5059
5060 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)
5061 {
5062 // left
5063
5064 pot_t pot_left_key;
5065
5066 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5067
5068 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5069
5070 // right
5071
5072 pot_t pot_right_key;
5073
5074 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5075
5076 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5077
5078 uint weak_hash_found = 0;
5079
5080 if (pot_right_ptr == NULL)
5081 {
5082 // special case, if "weak hash"
5083
5084 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5085 {
5086 weak_hash_found = 1;
5087
5088 // we just need that pot_right_ptr is not a NULL pointer
5089
5090 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5091 }
5092 }
5093
5094 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5095 {
5096 if (weak_hash_found == 1) myfree (pot_right_ptr);
5097
5098 return;
5099 }
5100
5101 // ... at least one part was not cracked
5102
5103 log_info_nn ("");
5104
5105 input_buf[input_len] = 0;
5106
5107 // only show the hash part which is still not cracked
5108
5109 uint user_len = input_len - 32;
5110
5111 char *hash_output = (char *) mymalloc (33);
5112
5113 memcpy (hash_output, input_buf, input_len);
5114
5115 if (pot_left_ptr != NULL)
5116 {
5117 // only show right part (because left part was already found)
5118
5119 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5120
5121 hash_output[user_len + 16] = 0;
5122 }
5123
5124 if (pot_right_ptr != NULL)
5125 {
5126 // only show left part (because right part was already found)
5127
5128 memcpy (hash_output + user_len, input_buf + user_len, 16);
5129
5130 hash_output[user_len + 16] = 0;
5131 }
5132
5133 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5134
5135 myfree (hash_output);
5136
5137 if (weak_hash_found == 1) myfree (pot_right_ptr);
5138 }
5139
5140 uint setup_opencl_platforms_filter (char *opencl_platforms)
5141 {
5142 uint opencl_platforms_filter = 0;
5143
5144 if (opencl_platforms)
5145 {
5146 char *platforms = strdup (opencl_platforms);
5147
5148 char *next = strtok (platforms, ",");
5149
5150 do
5151 {
5152 int platform = atoi (next);
5153
5154 if (platform < 1 || platform > 32)
5155 {
5156 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5157
5158 exit (-1);
5159 }
5160
5161 opencl_platforms_filter |= 1 << (platform - 1);
5162
5163 } while ((next = strtok (NULL, ",")) != NULL);
5164
5165 free (platforms);
5166 }
5167 else
5168 {
5169 opencl_platforms_filter = -1;
5170 }
5171
5172 return opencl_platforms_filter;
5173 }
5174
5175 u32 setup_devices_filter (char *opencl_devices)
5176 {
5177 u32 devices_filter = 0;
5178
5179 if (opencl_devices)
5180 {
5181 char *devices = strdup (opencl_devices);
5182
5183 char *next = strtok (devices, ",");
5184
5185 do
5186 {
5187 int device_id = atoi (next);
5188
5189 if (device_id < 1 || device_id > 32)
5190 {
5191 log_error ("ERROR: invalid device_id %u specified", device_id);
5192
5193 exit (-1);
5194 }
5195
5196 devices_filter |= 1 << (device_id - 1);
5197
5198 } while ((next = strtok (NULL, ",")) != NULL);
5199
5200 free (devices);
5201 }
5202 else
5203 {
5204 devices_filter = -1;
5205 }
5206
5207 return devices_filter;
5208 }
5209
5210 cl_device_type setup_device_types_filter (char *opencl_device_types)
5211 {
5212 cl_device_type device_types_filter = 0;
5213
5214 if (opencl_device_types)
5215 {
5216 char *device_types = strdup (opencl_device_types);
5217
5218 char *next = strtok (device_types, ",");
5219
5220 do
5221 {
5222 int device_type = atoi (next);
5223
5224 if (device_type < 1 || device_type > 3)
5225 {
5226 log_error ("ERROR: invalid device_type %u specified", device_type);
5227
5228 exit (-1);
5229 }
5230
5231 device_types_filter |= 1 << device_type;
5232
5233 } while ((next = strtok (NULL, ",")) != NULL);
5234
5235 free (device_types);
5236 }
5237 else
5238 {
5239 // Do not use CPU by default, this often reduces GPU performance because
5240 // the CPU is too busy to handle GPU synchronization
5241
5242 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5243 }
5244
5245 return device_types_filter;
5246 }
5247
5248 u32 get_random_num (const u32 min, const u32 max)
5249 {
5250 if (min == max) return (min);
5251
5252 return ((rand () % (max - min)) + min);
5253 }
5254
5255 u32 mydivc32 (const u32 dividend, const u32 divisor)
5256 {
5257 u32 quotient = dividend / divisor;
5258
5259 if (dividend % divisor) quotient++;
5260
5261 return quotient;
5262 }
5263
5264 u64 mydivc64 (const u64 dividend, const u64 divisor)
5265 {
5266 u64 quotient = dividend / divisor;
5267
5268 if (dividend % divisor) quotient++;
5269
5270 return quotient;
5271 }
5272
5273 void format_timer_display (struct tm *tm, char *buf, size_t len)
5274 {
5275 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5276 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5277
5278 if (tm->tm_year - 70)
5279 {
5280 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5281 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5282
5283 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5284 }
5285 else if (tm->tm_yday)
5286 {
5287 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5288 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5289
5290 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5291 }
5292 else if (tm->tm_hour)
5293 {
5294 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5295 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5296
5297 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5298 }
5299 else if (tm->tm_min)
5300 {
5301 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5302 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5303
5304 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5305 }
5306 else
5307 {
5308 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5309
5310 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5311 }
5312 }
5313
5314 void format_speed_display (float val, char *buf, size_t len)
5315 {
5316 if (val <= 0)
5317 {
5318 buf[0] = '0';
5319 buf[1] = ' ';
5320 buf[2] = 0;
5321
5322 return;
5323 }
5324
5325 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5326
5327 uint level = 0;
5328
5329 while (val > 99999)
5330 {
5331 val /= 1000;
5332
5333 level++;
5334 }
5335
5336 /* generate output */
5337
5338 if (level == 0)
5339 {
5340 snprintf (buf, len - 1, "%.0f ", val);
5341 }
5342 else
5343 {
5344 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5345 }
5346 }
5347
5348 void lowercase (u8 *buf, int len)
5349 {
5350 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5351 }
5352
5353 void uppercase (u8 *buf, int len)
5354 {
5355 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5356 }
5357
5358 int fgetl (FILE *fp, char *line_buf)
5359 {
5360 int line_len = 0;
5361
5362 while (!feof (fp))
5363 {
5364 const int c = fgetc (fp);
5365
5366 if (c == EOF) break;
5367
5368 line_buf[line_len] = (char) c;
5369
5370 line_len++;
5371
5372 if (line_len == BUFSIZ) line_len--;
5373
5374 if (c == '\n') break;
5375 }
5376
5377 if (line_len == 0) return 0;
5378
5379 if (line_buf[line_len - 1] == '\n')
5380 {
5381 line_len--;
5382
5383 line_buf[line_len] = 0;
5384 }
5385
5386 if (line_len == 0) return 0;
5387
5388 if (line_buf[line_len - 1] == '\r')
5389 {
5390 line_len--;
5391
5392 line_buf[line_len] = 0;
5393 }
5394
5395 return (line_len);
5396 }
5397
5398 int in_superchop (char *buf)
5399 {
5400 int len = strlen (buf);
5401
5402 while (len)
5403 {
5404 if (buf[len - 1] == '\n')
5405 {
5406 len--;
5407
5408 continue;
5409 }
5410
5411 if (buf[len - 1] == '\r')
5412 {
5413 len--;
5414
5415 continue;
5416 }
5417
5418 break;
5419 }
5420
5421 buf[len] = 0;
5422
5423 return len;
5424 }
5425
5426 char **scan_directory (const char *path)
5427 {
5428 char *tmp_path = mystrdup (path);
5429
5430 size_t tmp_path_len = strlen (tmp_path);
5431
5432 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5433 {
5434 tmp_path[tmp_path_len - 1] = 0;
5435
5436 tmp_path_len = strlen (tmp_path);
5437 }
5438
5439 char **files = NULL;
5440
5441 int num_files = 0;
5442
5443 DIR *d = NULL;
5444
5445 if ((d = opendir (tmp_path)) != NULL)
5446 {
5447 #ifdef OSX
5448 struct dirent e;
5449
5450 for (;;) {
5451 memset (&e, 0, sizeof (e));
5452 struct dirent *de = NULL;
5453
5454 if (readdir_r (d, &e, &de) != 0)
5455 {
5456 log_error ("ERROR: readdir_r() failed");
5457
5458 break;
5459 }
5460
5461 if (de == NULL) break;
5462 #else
5463 struct dirent *de;
5464
5465 while ((de = readdir (d)) != NULL)
5466 {
5467 #endif
5468 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5469
5470 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5471
5472 char *path_file = (char *) mymalloc (path_size + 1);
5473
5474 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5475
5476 path_file[path_size] = 0;
5477
5478 DIR *d_test;
5479
5480 if ((d_test = opendir (path_file)) != NULL)
5481 {
5482 closedir (d_test);
5483
5484 myfree (path_file);
5485 }
5486 else
5487 {
5488 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5489
5490 num_files++;
5491
5492 files[num_files - 1] = path_file;
5493 }
5494 }
5495
5496 closedir (d);
5497 }
5498 else if (errno == ENOTDIR)
5499 {
5500 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5501
5502 num_files++;
5503
5504 files[num_files - 1] = mystrdup (path);
5505 }
5506
5507 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5508
5509 num_files++;
5510
5511 files[num_files - 1] = NULL;
5512
5513 myfree (tmp_path);
5514
5515 return (files);
5516 }
5517
5518 int count_dictionaries (char **dictionary_files)
5519 {
5520 if (dictionary_files == NULL) return 0;
5521
5522 int cnt = 0;
5523
5524 for (int d = 0; dictionary_files[d] != NULL; d++)
5525 {
5526 cnt++;
5527 }
5528
5529 return (cnt);
5530 }
5531
5532 char *stroptitype (const uint opti_type)
5533 {
5534 switch (opti_type)
5535 {
5536 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5537 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5538 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5539 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5540 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5541 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5542 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5543 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5544 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5545 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5546 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5547 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5548 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5549 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5550 }
5551
5552 return (NULL);
5553 }
5554
5555 char *strparser (const uint parser_status)
5556 {
5557 switch (parser_status)
5558 {
5559 case PARSER_OK: return ((char *) PA_000); break;
5560 case PARSER_COMMENT: return ((char *) PA_001); break;
5561 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5562 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5563 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5564 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5565 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5566 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5567 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5568 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5569 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5570 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5571 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5572 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5573 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5574 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5575 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5576 }
5577
5578 return ((char *) PA_255);
5579 }
5580
5581 char *strhashtype (const uint hash_mode)
5582 {
5583 switch (hash_mode)
5584 {
5585 case 0: return ((char *) HT_00000); break;
5586 case 10: return ((char *) HT_00010); break;
5587 case 11: return ((char *) HT_00011); break;
5588 case 12: return ((char *) HT_00012); break;
5589 case 20: return ((char *) HT_00020); break;
5590 case 21: return ((char *) HT_00021); break;
5591 case 22: return ((char *) HT_00022); break;
5592 case 23: return ((char *) HT_00023); break;
5593 case 30: return ((char *) HT_00030); break;
5594 case 40: return ((char *) HT_00040); break;
5595 case 50: return ((char *) HT_00050); break;
5596 case 60: return ((char *) HT_00060); break;
5597 case 100: return ((char *) HT_00100); break;
5598 case 101: return ((char *) HT_00101); break;
5599 case 110: return ((char *) HT_00110); break;
5600 case 111: return ((char *) HT_00111); break;
5601 case 112: return ((char *) HT_00112); break;
5602 case 120: return ((char *) HT_00120); break;
5603 case 121: return ((char *) HT_00121); break;
5604 case 122: return ((char *) HT_00122); break;
5605 case 124: return ((char *) HT_00124); break;
5606 case 130: return ((char *) HT_00130); break;
5607 case 131: return ((char *) HT_00131); break;
5608 case 132: return ((char *) HT_00132); break;
5609 case 133: return ((char *) HT_00133); break;
5610 case 140: return ((char *) HT_00140); break;
5611 case 141: return ((char *) HT_00141); break;
5612 case 150: return ((char *) HT_00150); break;
5613 case 160: return ((char *) HT_00160); break;
5614 case 190: return ((char *) HT_00190); break;
5615 case 200: return ((char *) HT_00200); break;
5616 case 300: return ((char *) HT_00300); break;
5617 case 400: return ((char *) HT_00400); break;
5618 case 500: return ((char *) HT_00500); break;
5619 case 501: return ((char *) HT_00501); break;
5620 case 900: return ((char *) HT_00900); break;
5621 case 910: return ((char *) HT_00910); break;
5622 case 1000: return ((char *) HT_01000); break;
5623 case 1100: return ((char *) HT_01100); break;
5624 case 1400: return ((char *) HT_01400); break;
5625 case 1410: return ((char *) HT_01410); break;
5626 case 1420: return ((char *) HT_01420); break;
5627 case 1421: return ((char *) HT_01421); break;
5628 case 1430: return ((char *) HT_01430); break;
5629 case 1440: return ((char *) HT_01440); break;
5630 case 1441: return ((char *) HT_01441); break;
5631 case 1450: return ((char *) HT_01450); break;
5632 case 1460: return ((char *) HT_01460); break;
5633 case 1500: return ((char *) HT_01500); break;
5634 case 1600: return ((char *) HT_01600); break;
5635 case 1700: return ((char *) HT_01700); break;
5636 case 1710: return ((char *) HT_01710); break;
5637 case 1711: return ((char *) HT_01711); break;
5638 case 1720: return ((char *) HT_01720); break;
5639 case 1722: return ((char *) HT_01722); break;
5640 case 1730: return ((char *) HT_01730); break;
5641 case 1731: return ((char *) HT_01731); break;
5642 case 1740: return ((char *) HT_01740); break;
5643 case 1750: return ((char *) HT_01750); break;
5644 case 1760: return ((char *) HT_01760); break;
5645 case 1800: return ((char *) HT_01800); break;
5646 case 2100: return ((char *) HT_02100); break;
5647 case 2400: return ((char *) HT_02400); break;
5648 case 2410: return ((char *) HT_02410); break;
5649 case 2500: return ((char *) HT_02500); break;
5650 case 2600: return ((char *) HT_02600); break;
5651 case 2611: return ((char *) HT_02611); break;
5652 case 2612: return ((char *) HT_02612); break;
5653 case 2711: return ((char *) HT_02711); break;
5654 case 2811: return ((char *) HT_02811); break;
5655 case 3000: return ((char *) HT_03000); break;
5656 case 3100: return ((char *) HT_03100); break;
5657 case 3200: return ((char *) HT_03200); break;
5658 case 3710: return ((char *) HT_03710); break;
5659 case 3711: return ((char *) HT_03711); break;
5660 case 3800: return ((char *) HT_03800); break;
5661 case 4300: return ((char *) HT_04300); break;
5662 case 4400: return ((char *) HT_04400); break;
5663 case 4500: return ((char *) HT_04500); break;
5664 case 4700: return ((char *) HT_04700); break;
5665 case 4800: return ((char *) HT_04800); break;
5666 case 4900: return ((char *) HT_04900); break;
5667 case 5000: return ((char *) HT_05000); break;
5668 case 5100: return ((char *) HT_05100); break;
5669 case 5200: return ((char *) HT_05200); break;
5670 case 5300: return ((char *) HT_05300); break;
5671 case 5400: return ((char *) HT_05400); break;
5672 case 5500: return ((char *) HT_05500); break;
5673 case 5600: return ((char *) HT_05600); break;
5674 case 5700: return ((char *) HT_05700); break;
5675 case 5800: return ((char *) HT_05800); break;
5676 case 6000: return ((char *) HT_06000); break;
5677 case 6100: return ((char *) HT_06100); break;
5678 case 6211: return ((char *) HT_06211); break;
5679 case 6212: return ((char *) HT_06212); break;
5680 case 6213: return ((char *) HT_06213); break;
5681 case 6221: return ((char *) HT_06221); break;
5682 case 6222: return ((char *) HT_06222); break;
5683 case 6223: return ((char *) HT_06223); break;
5684 case 6231: return ((char *) HT_06231); break;
5685 case 6232: return ((char *) HT_06232); break;
5686 case 6233: return ((char *) HT_06233); break;
5687 case 6241: return ((char *) HT_06241); break;
5688 case 6242: return ((char *) HT_06242); break;
5689 case 6243: return ((char *) HT_06243); break;
5690 case 6300: return ((char *) HT_06300); break;
5691 case 6400: return ((char *) HT_06400); break;
5692 case 6500: return ((char *) HT_06500); break;
5693 case 6600: return ((char *) HT_06600); break;
5694 case 6700: return ((char *) HT_06700); break;
5695 case 6800: return ((char *) HT_06800); break;
5696 case 6900: return ((char *) HT_06900); break;
5697 case 7100: return ((char *) HT_07100); break;
5698 case 7200: return ((char *) HT_07200); break;
5699 case 7300: return ((char *) HT_07300); break;
5700 case 7400: return ((char *) HT_07400); break;
5701 case 7500: return ((char *) HT_07500); break;
5702 case 7600: return ((char *) HT_07600); break;
5703 case 7700: return ((char *) HT_07700); break;
5704 case 7800: return ((char *) HT_07800); break;
5705 case 7900: return ((char *) HT_07900); break;
5706 case 8000: return ((char *) HT_08000); break;
5707 case 8100: return ((char *) HT_08100); break;
5708 case 8200: return ((char *) HT_08200); break;
5709 case 8300: return ((char *) HT_08300); break;
5710 case 8400: return ((char *) HT_08400); break;
5711 case 8500: return ((char *) HT_08500); break;
5712 case 8600: return ((char *) HT_08600); break;
5713 case 8700: return ((char *) HT_08700); break;
5714 case 8800: return ((char *) HT_08800); break;
5715 case 8900: return ((char *) HT_08900); break;
5716 case 9000: return ((char *) HT_09000); break;
5717 case 9100: return ((char *) HT_09100); break;
5718 case 9200: return ((char *) HT_09200); break;
5719 case 9300: return ((char *) HT_09300); break;
5720 case 9400: return ((char *) HT_09400); break;
5721 case 9500: return ((char *) HT_09500); break;
5722 case 9600: return ((char *) HT_09600); break;
5723 case 9700: return ((char *) HT_09700); break;
5724 case 9710: return ((char *) HT_09710); break;
5725 case 9720: return ((char *) HT_09720); break;
5726 case 9800: return ((char *) HT_09800); break;
5727 case 9810: return ((char *) HT_09810); break;
5728 case 9820: return ((char *) HT_09820); break;
5729 case 9900: return ((char *) HT_09900); break;
5730 case 10000: return ((char *) HT_10000); break;
5731 case 10100: return ((char *) HT_10100); break;
5732 case 10200: return ((char *) HT_10200); break;
5733 case 10300: return ((char *) HT_10300); break;
5734 case 10400: return ((char *) HT_10400); break;
5735 case 10410: return ((char *) HT_10410); break;
5736 case 10420: return ((char *) HT_10420); break;
5737 case 10500: return ((char *) HT_10500); break;
5738 case 10600: return ((char *) HT_10600); break;
5739 case 10700: return ((char *) HT_10700); break;
5740 case 10800: return ((char *) HT_10800); break;
5741 case 10900: return ((char *) HT_10900); break;
5742 case 11000: return ((char *) HT_11000); break;
5743 case 11100: return ((char *) HT_11100); break;
5744 case 11200: return ((char *) HT_11200); break;
5745 case 11300: return ((char *) HT_11300); break;
5746 case 11400: return ((char *) HT_11400); break;
5747 case 11500: return ((char *) HT_11500); break;
5748 case 11600: return ((char *) HT_11600); break;
5749 case 11700: return ((char *) HT_11700); break;
5750 case 11800: return ((char *) HT_11800); break;
5751 case 11900: return ((char *) HT_11900); break;
5752 case 12000: return ((char *) HT_12000); break;
5753 case 12100: return ((char *) HT_12100); break;
5754 case 12200: return ((char *) HT_12200); break;
5755 case 12300: return ((char *) HT_12300); break;
5756 case 12400: return ((char *) HT_12400); break;
5757 case 12500: return ((char *) HT_12500); break;
5758 case 12600: return ((char *) HT_12600); break;
5759 case 12700: return ((char *) HT_12700); break;
5760 case 12800: return ((char *) HT_12800); break;
5761 case 12900: return ((char *) HT_12900); break;
5762 case 13000: return ((char *) HT_13000); break;
5763 }
5764
5765 return ((char *) "Unknown");
5766 }
5767
5768 char *strstatus (const uint devices_status)
5769 {
5770 switch (devices_status)
5771 {
5772 case STATUS_INIT: return ((char *) ST_0000); break;
5773 case STATUS_STARTING: return ((char *) ST_0001); break;
5774 case STATUS_RUNNING: return ((char *) ST_0002); break;
5775 case STATUS_PAUSED: return ((char *) ST_0003); break;
5776 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5777 case STATUS_CRACKED: return ((char *) ST_0005); break;
5778 case STATUS_ABORTED: return ((char *) ST_0006); break;
5779 case STATUS_QUIT: return ((char *) ST_0007); break;
5780 case STATUS_BYPASS: return ((char *) ST_0008); break;
5781 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5782 }
5783
5784 return ((char *) "Unknown");
5785 }
5786
5787 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5788 {
5789 uint hash_type = data.hash_type;
5790 uint hash_mode = data.hash_mode;
5791 uint salt_type = data.salt_type;
5792 uint opts_type = data.opts_type;
5793 uint opti_type = data.opti_type;
5794 uint dgst_size = data.dgst_size;
5795
5796 char *hashfile = data.hashfile;
5797
5798 uint len = 4096;
5799
5800 uint digest_buf[64] = { 0 };
5801
5802 u64 *digest_buf64 = (u64 *) digest_buf;
5803
5804 char *digests_buf_ptr = (char *) data.digests_buf;
5805
5806 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5807
5808 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5809 {
5810 uint tt;
5811
5812 switch (hash_type)
5813 {
5814 case HASH_TYPE_DESCRYPT:
5815 FP (digest_buf[1], digest_buf[0], tt);
5816 break;
5817
5818 case HASH_TYPE_DESRACF:
5819 digest_buf[0] = rotl32 (digest_buf[0], 29);
5820 digest_buf[1] = rotl32 (digest_buf[1], 29);
5821
5822 FP (digest_buf[1], digest_buf[0], tt);
5823 break;
5824
5825 case HASH_TYPE_LM:
5826 FP (digest_buf[1], digest_buf[0], tt);
5827 break;
5828
5829 case HASH_TYPE_NETNTLM:
5830 digest_buf[0] = rotl32 (digest_buf[0], 29);
5831 digest_buf[1] = rotl32 (digest_buf[1], 29);
5832 digest_buf[2] = rotl32 (digest_buf[2], 29);
5833 digest_buf[3] = rotl32 (digest_buf[3], 29);
5834
5835 FP (digest_buf[1], digest_buf[0], tt);
5836 FP (digest_buf[3], digest_buf[2], tt);
5837 break;
5838
5839 case HASH_TYPE_BSDICRYPT:
5840 digest_buf[0] = rotl32 (digest_buf[0], 31);
5841 digest_buf[1] = rotl32 (digest_buf[1], 31);
5842
5843 FP (digest_buf[1], digest_buf[0], tt);
5844 break;
5845 }
5846 }
5847
5848 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5849 {
5850 switch (hash_type)
5851 {
5852 case HASH_TYPE_MD4:
5853 digest_buf[0] += MD4M_A;
5854 digest_buf[1] += MD4M_B;
5855 digest_buf[2] += MD4M_C;
5856 digest_buf[3] += MD4M_D;
5857 break;
5858
5859 case HASH_TYPE_MD5:
5860 digest_buf[0] += MD5M_A;
5861 digest_buf[1] += MD5M_B;
5862 digest_buf[2] += MD5M_C;
5863 digest_buf[3] += MD5M_D;
5864 break;
5865
5866 case HASH_TYPE_SHA1:
5867 digest_buf[0] += SHA1M_A;
5868 digest_buf[1] += SHA1M_B;
5869 digest_buf[2] += SHA1M_C;
5870 digest_buf[3] += SHA1M_D;
5871 digest_buf[4] += SHA1M_E;
5872 break;
5873
5874 case HASH_TYPE_SHA256:
5875 digest_buf[0] += SHA256M_A;
5876 digest_buf[1] += SHA256M_B;
5877 digest_buf[2] += SHA256M_C;
5878 digest_buf[3] += SHA256M_D;
5879 digest_buf[4] += SHA256M_E;
5880 digest_buf[5] += SHA256M_F;
5881 digest_buf[6] += SHA256M_G;
5882 digest_buf[7] += SHA256M_H;
5883 break;
5884
5885 case HASH_TYPE_SHA384:
5886 digest_buf64[0] += SHA384M_A;
5887 digest_buf64[1] += SHA384M_B;
5888 digest_buf64[2] += SHA384M_C;
5889 digest_buf64[3] += SHA384M_D;
5890 digest_buf64[4] += SHA384M_E;
5891 digest_buf64[5] += SHA384M_F;
5892 digest_buf64[6] += 0;
5893 digest_buf64[7] += 0;
5894 break;
5895
5896 case HASH_TYPE_SHA512:
5897 digest_buf64[0] += SHA512M_A;
5898 digest_buf64[1] += SHA512M_B;
5899 digest_buf64[2] += SHA512M_C;
5900 digest_buf64[3] += SHA512M_D;
5901 digest_buf64[4] += SHA512M_E;
5902 digest_buf64[5] += SHA512M_F;
5903 digest_buf64[6] += SHA512M_G;
5904 digest_buf64[7] += SHA512M_H;
5905 break;
5906 }
5907 }
5908
5909 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5910 {
5911 if (dgst_size == DGST_SIZE_4_2)
5912 {
5913 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5914 }
5915 else if (dgst_size == DGST_SIZE_4_4)
5916 {
5917 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5918 }
5919 else if (dgst_size == DGST_SIZE_4_5)
5920 {
5921 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5922 }
5923 else if (dgst_size == DGST_SIZE_4_6)
5924 {
5925 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5926 }
5927 else if (dgst_size == DGST_SIZE_4_8)
5928 {
5929 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5930 }
5931 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5932 {
5933 if (hash_type == HASH_TYPE_WHIRLPOOL)
5934 {
5935 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5936 }
5937 else if (hash_type == HASH_TYPE_SHA384)
5938 {
5939 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5940 }
5941 else if (hash_type == HASH_TYPE_SHA512)
5942 {
5943 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5944 }
5945 else if (hash_type == HASH_TYPE_GOST)
5946 {
5947 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5948 }
5949 }
5950 else if (dgst_size == DGST_SIZE_4_64)
5951 {
5952 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5953 }
5954 else if (dgst_size == DGST_SIZE_8_25)
5955 {
5956 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5957 }
5958 }
5959
5960 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5961 | (data.salt_type == SALT_TYPE_EXTERN)
5962 | (data.salt_type == SALT_TYPE_EMBEDDED));
5963
5964 salt_t salt;
5965
5966 if (isSalted)
5967 {
5968 memset (&salt, 0, sizeof (salt_t));
5969
5970 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5971
5972 char *ptr = (char *) salt.salt_buf;
5973
5974 uint len = salt.salt_len;
5975
5976 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5977 {
5978 uint tt;
5979
5980 switch (hash_type)
5981 {
5982 case HASH_TYPE_NETNTLM:
5983
5984 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
5985 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
5986
5987 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
5988
5989 break;
5990 }
5991 }
5992
5993 if (opts_type & OPTS_TYPE_ST_UNICODE)
5994 {
5995 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5996 {
5997 ptr[i] = ptr[j];
5998 }
5999
6000 len = len / 2;
6001 }
6002
6003 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6004 {
6005 uint max = salt.salt_len / 4;
6006
6007 if (len % 4) max++;
6008
6009 for (uint i = 0; i < max; i++)
6010 {
6011 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6012 }
6013 }
6014
6015 if (opts_type & OPTS_TYPE_ST_HEX)
6016 {
6017 char tmp[64] = { 0 };
6018
6019 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6020 {
6021 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6022 }
6023
6024 len = len * 2;
6025
6026 memcpy (ptr, tmp, len);
6027 }
6028
6029 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6030
6031 memset (ptr + len, 0, memset_size);
6032
6033 salt.salt_len = len;
6034 }
6035
6036 //
6037 // some modes require special encoding
6038 //
6039
6040 uint out_buf_plain[256] = { 0 };
6041 uint out_buf_salt[256] = { 0 };
6042
6043 char tmp_buf[1024] = { 0 };
6044
6045 char *ptr_plain = (char *) out_buf_plain;
6046 char *ptr_salt = (char *) out_buf_salt;
6047
6048 if (hash_mode == 22)
6049 {
6050 char username[30] = { 0 };
6051
6052 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6053
6054 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6055
6056 u16 *ptr = (u16 *) digest_buf;
6057
6058 tmp_buf[ 0] = sig[0];
6059 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6060 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6061 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6062 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6063 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6064 tmp_buf[ 6] = sig[1];
6065 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6066 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6067 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6068 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6069 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6070 tmp_buf[12] = sig[2];
6071 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6072 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6073 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6074 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6075 tmp_buf[17] = sig[3];
6076 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6077 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6078 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6079 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6080 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6081 tmp_buf[23] = sig[4];
6082 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6083 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6084 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6085 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6086 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6087 tmp_buf[29] = sig[5];
6088
6089 snprintf (out_buf, len-1, "%s:%s",
6090 tmp_buf,
6091 username);
6092 }
6093 else if (hash_mode == 23)
6094 {
6095 // do not show the \nskyper\n part in output
6096
6097 char *salt_buf_ptr = (char *) salt.salt_buf;
6098
6099 salt_buf_ptr[salt.salt_len - 8] = 0;
6100
6101 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6102 digest_buf[0],
6103 digest_buf[1],
6104 digest_buf[2],
6105 digest_buf[3],
6106 salt_buf_ptr);
6107 }
6108 else if (hash_mode == 101)
6109 {
6110 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6111
6112 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6113 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6114 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6115 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6116 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6117
6118 memcpy (tmp_buf, digest_buf, 20);
6119
6120 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6121
6122 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6123 }
6124 else if (hash_mode == 111)
6125 {
6126 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6127
6128 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6129 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6130 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6131 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6132 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6133
6134 memcpy (tmp_buf, digest_buf, 20);
6135 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6136
6137 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6138
6139 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6140 }
6141 else if (hash_mode == 122)
6142 {
6143 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6144 (char *) salt.salt_buf,
6145 digest_buf[0],
6146 digest_buf[1],
6147 digest_buf[2],
6148 digest_buf[3],
6149 digest_buf[4]);
6150 }
6151 else if (hash_mode == 124)
6152 {
6153 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6154 (char *) salt.salt_buf,
6155 digest_buf[0],
6156 digest_buf[1],
6157 digest_buf[2],
6158 digest_buf[3],
6159 digest_buf[4]);
6160 }
6161 else if (hash_mode == 131)
6162 {
6163 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6164 (char *) salt.salt_buf,
6165 0, 0, 0, 0, 0,
6166 digest_buf[0],
6167 digest_buf[1],
6168 digest_buf[2],
6169 digest_buf[3],
6170 digest_buf[4]);
6171 }
6172 else if (hash_mode == 132)
6173 {
6174 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6175 (char *) salt.salt_buf,
6176 digest_buf[0],
6177 digest_buf[1],
6178 digest_buf[2],
6179 digest_buf[3],
6180 digest_buf[4]);
6181 }
6182 else if (hash_mode == 133)
6183 {
6184 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6185
6186 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6187 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6188 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6189 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6190 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6191
6192 memcpy (tmp_buf, digest_buf, 20);
6193
6194 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6195
6196 snprintf (out_buf, len-1, "%s", ptr_plain);
6197 }
6198 else if (hash_mode == 141)
6199 {
6200 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6201
6202 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6203
6204 memset (tmp_buf, 0, sizeof (tmp_buf));
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 ptr_plain[27] = 0;
6219
6220 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6221 }
6222 else if (hash_mode == 400)
6223 {
6224 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6225
6226 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6227 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6228 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6229 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6230
6231 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6232
6233 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6234 }
6235 else if (hash_mode == 500)
6236 {
6237 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6238
6239 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6240 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6241 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6242 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6243
6244 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6245
6246 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6247 {
6248 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6249 }
6250 else
6251 {
6252 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6253 }
6254 }
6255 else if (hash_mode == 501)
6256 {
6257 uint digest_idx = salt.digests_offset + digest_pos;
6258
6259 hashinfo_t **hashinfo_ptr = data.hash_info;
6260 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6261
6262 snprintf (out_buf, len-1, "%s", hash_buf);
6263 }
6264 else if (hash_mode == 1421)
6265 {
6266 u8 *salt_ptr = (u8 *) salt.salt_buf;
6267
6268 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6269 salt_ptr[0],
6270 salt_ptr[1],
6271 salt_ptr[2],
6272 salt_ptr[3],
6273 salt_ptr[4],
6274 salt_ptr[5],
6275 digest_buf[0],
6276 digest_buf[1],
6277 digest_buf[2],
6278 digest_buf[3],
6279 digest_buf[4],
6280 digest_buf[5],
6281 digest_buf[6],
6282 digest_buf[7]);
6283 }
6284 else if (hash_mode == 1441)
6285 {
6286 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6287
6288 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6289
6290 memset (tmp_buf, 0, sizeof (tmp_buf));
6291
6292 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6293
6294 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6295 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6296 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6297 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6298 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6299 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6300 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6301 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6302
6303 memcpy (tmp_buf, digest_buf, 32);
6304
6305 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6306
6307 ptr_plain[43] = 0;
6308
6309 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6310 }
6311 else if (hash_mode == 1500)
6312 {
6313 out_buf[0] = salt.salt_sign[0] & 0xff;
6314 out_buf[1] = salt.salt_sign[1] & 0xff;
6315 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6316 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6317 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6318
6319 memset (tmp_buf, 0, sizeof (tmp_buf));
6320
6321 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6322
6323 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6324 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6325
6326 memcpy (tmp_buf, digest_buf, 8);
6327
6328 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6329
6330 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6331
6332 out_buf[13] = 0;
6333 }
6334 else if (hash_mode == 1600)
6335 {
6336 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6337
6338 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6339 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6340 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6341 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6342
6343 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6344
6345 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6346 {
6347 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6348 }
6349 else
6350 {
6351 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6352 }
6353 }
6354 else if (hash_mode == 1711)
6355 {
6356 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6357
6358 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6359 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6360 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6361 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6362 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6363 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6364 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6365 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6366
6367 memcpy (tmp_buf, digest_buf, 64);
6368 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6369
6370 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6371
6372 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6373 }
6374 else if (hash_mode == 1722)
6375 {
6376 uint *ptr = digest_buf;
6377
6378 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6379 (unsigned char *) salt.salt_buf,
6380 ptr[ 1], ptr[ 0],
6381 ptr[ 3], ptr[ 2],
6382 ptr[ 5], ptr[ 4],
6383 ptr[ 7], ptr[ 6],
6384 ptr[ 9], ptr[ 8],
6385 ptr[11], ptr[10],
6386 ptr[13], ptr[12],
6387 ptr[15], ptr[14]);
6388 }
6389 else if (hash_mode == 1731)
6390 {
6391 uint *ptr = digest_buf;
6392
6393 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6394 (unsigned char *) salt.salt_buf,
6395 ptr[ 1], ptr[ 0],
6396 ptr[ 3], ptr[ 2],
6397 ptr[ 5], ptr[ 4],
6398 ptr[ 7], ptr[ 6],
6399 ptr[ 9], ptr[ 8],
6400 ptr[11], ptr[10],
6401 ptr[13], ptr[12],
6402 ptr[15], ptr[14]);
6403 }
6404 else if (hash_mode == 1800)
6405 {
6406 // temp workaround
6407
6408 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6409 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6410 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6411 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6412 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6413 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6414 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6415 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6416
6417 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6418
6419 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6420 {
6421 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6422 }
6423 else
6424 {
6425 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6426 }
6427 }
6428 else if (hash_mode == 2100)
6429 {
6430 uint pos = 0;
6431
6432 snprintf (out_buf + pos, len-1, "%s%i#",
6433 SIGNATURE_DCC2,
6434 salt.salt_iter + 1);
6435
6436 uint signature_len = strlen (out_buf);
6437
6438 pos += signature_len;
6439 len -= signature_len;
6440
6441 char *salt_ptr = (char *) salt.salt_buf;
6442
6443 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6444
6445 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6446 byte_swap_32 (digest_buf[0]),
6447 byte_swap_32 (digest_buf[1]),
6448 byte_swap_32 (digest_buf[2]),
6449 byte_swap_32 (digest_buf[3]));
6450 }
6451 else if ((hash_mode == 2400) || (hash_mode == 2410))
6452 {
6453 memcpy (tmp_buf, digest_buf, 16);
6454
6455 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6456
6457 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6458 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6459 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6460 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6461
6462 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6463 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6464 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6465 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6466
6467 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6468 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6469 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6470 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6471
6472 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6473 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6474 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6475 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6476
6477 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6478 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6479 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6480 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6481
6482 out_buf[16] = 0;
6483 }
6484 else if (hash_mode == 2500)
6485 {
6486 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6487
6488 wpa_t *wpa = &wpas[salt_pos];
6489
6490 uint pke[25] = { 0 };
6491
6492 char *pke_ptr = (char *) pke;
6493
6494 for (uint i = 0; i < 25; i++)
6495 {
6496 pke[i] = byte_swap_32 (wpa->pke[i]);
6497 }
6498
6499 unsigned char mac1[6] = { 0 };
6500 unsigned char mac2[6] = { 0 };
6501
6502 memcpy (mac1, pke_ptr + 23, 6);
6503 memcpy (mac2, pke_ptr + 29, 6);
6504
6505 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6506 (char *) salt.salt_buf,
6507 mac1[0],
6508 mac1[1],
6509 mac1[2],
6510 mac1[3],
6511 mac1[4],
6512 mac1[5],
6513 mac2[0],
6514 mac2[1],
6515 mac2[2],
6516 mac2[3],
6517 mac2[4],
6518 mac2[5]);
6519 }
6520 else if (hash_mode == 4400)
6521 {
6522 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6523 byte_swap_32 (digest_buf[0]),
6524 byte_swap_32 (digest_buf[1]),
6525 byte_swap_32 (digest_buf[2]),
6526 byte_swap_32 (digest_buf[3]));
6527 }
6528 else if (hash_mode == 4700)
6529 {
6530 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6531 byte_swap_32 (digest_buf[0]),
6532 byte_swap_32 (digest_buf[1]),
6533 byte_swap_32 (digest_buf[2]),
6534 byte_swap_32 (digest_buf[3]),
6535 byte_swap_32 (digest_buf[4]));
6536 }
6537 else if (hash_mode == 4800)
6538 {
6539 u8 chap_id_byte = (u8) salt.salt_buf[4];
6540
6541 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6542 digest_buf[0],
6543 digest_buf[1],
6544 digest_buf[2],
6545 digest_buf[3],
6546 byte_swap_32 (salt.salt_buf[0]),
6547 byte_swap_32 (salt.salt_buf[1]),
6548 byte_swap_32 (salt.salt_buf[2]),
6549 byte_swap_32 (salt.salt_buf[3]),
6550 chap_id_byte);
6551 }
6552 else if (hash_mode == 4900)
6553 {
6554 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6555 byte_swap_32 (digest_buf[0]),
6556 byte_swap_32 (digest_buf[1]),
6557 byte_swap_32 (digest_buf[2]),
6558 byte_swap_32 (digest_buf[3]),
6559 byte_swap_32 (digest_buf[4]));
6560 }
6561 else if (hash_mode == 5100)
6562 {
6563 snprintf (out_buf, len-1, "%08x%08x",
6564 digest_buf[0],
6565 digest_buf[1]);
6566 }
6567 else if (hash_mode == 5200)
6568 {
6569 snprintf (out_buf, len-1, "%s", hashfile);
6570 }
6571 else if (hash_mode == 5300)
6572 {
6573 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6574
6575 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6576
6577 int buf_len = len -1;
6578
6579 // msg_buf
6580
6581 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6582
6583 for (uint i = 0; i < ikepsk_msg_len; i++)
6584 {
6585 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6586 {
6587 snprintf (out_buf, buf_len, ":");
6588
6589 buf_len--;
6590 out_buf++;
6591 }
6592
6593 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6594
6595 buf_len -= 8;
6596 out_buf += 8;
6597 }
6598
6599 // nr_buf
6600
6601 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6602
6603 for (uint i = 0; i < ikepsk_nr_len; i++)
6604 {
6605 if ((i == 0) || (i == 5))
6606 {
6607 snprintf (out_buf, buf_len, ":");
6608
6609 buf_len--;
6610 out_buf++;
6611 }
6612
6613 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6614
6615 buf_len -= 8;
6616 out_buf += 8;
6617 }
6618
6619 // digest_buf
6620
6621 for (uint i = 0; i < 4; i++)
6622 {
6623 if (i == 0)
6624 {
6625 snprintf (out_buf, buf_len, ":");
6626
6627 buf_len--;
6628 out_buf++;
6629 }
6630
6631 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6632
6633 buf_len -= 8;
6634 out_buf += 8;
6635 }
6636 }
6637 else if (hash_mode == 5400)
6638 {
6639 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6640
6641 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6642
6643 int buf_len = len -1;
6644
6645 // msg_buf
6646
6647 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6648
6649 for (uint i = 0; i < ikepsk_msg_len; i++)
6650 {
6651 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6652 {
6653 snprintf (out_buf, buf_len, ":");
6654
6655 buf_len--;
6656 out_buf++;
6657 }
6658
6659 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6660
6661 buf_len -= 8;
6662 out_buf += 8;
6663 }
6664
6665 // nr_buf
6666
6667 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6668
6669 for (uint i = 0; i < ikepsk_nr_len; i++)
6670 {
6671 if ((i == 0) || (i == 5))
6672 {
6673 snprintf (out_buf, buf_len, ":");
6674
6675 buf_len--;
6676 out_buf++;
6677 }
6678
6679 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6680
6681 buf_len -= 8;
6682 out_buf += 8;
6683 }
6684
6685 // digest_buf
6686
6687 for (uint i = 0; i < 5; i++)
6688 {
6689 if (i == 0)
6690 {
6691 snprintf (out_buf, buf_len, ":");
6692
6693 buf_len--;
6694 out_buf++;
6695 }
6696
6697 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6698
6699 buf_len -= 8;
6700 out_buf += 8;
6701 }
6702 }
6703 else if (hash_mode == 5500)
6704 {
6705 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6706
6707 netntlm_t *netntlm = &netntlms[salt_pos];
6708
6709 char user_buf[64] = { 0 };
6710 char domain_buf[64] = { 0 };
6711 char srvchall_buf[1024] = { 0 };
6712 char clichall_buf[1024] = { 0 };
6713
6714 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6715 {
6716 char *ptr = (char *) netntlm->userdomain_buf;
6717
6718 user_buf[i] = ptr[j];
6719 }
6720
6721 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6722 {
6723 char *ptr = (char *) netntlm->userdomain_buf;
6724
6725 domain_buf[i] = ptr[netntlm->user_len + j];
6726 }
6727
6728 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6729 {
6730 u8 *ptr = (u8 *) netntlm->chall_buf;
6731
6732 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6733 }
6734
6735 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6736 {
6737 u8 *ptr = (u8 *) netntlm->chall_buf;
6738
6739 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6740 }
6741
6742 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6743 user_buf,
6744 domain_buf,
6745 srvchall_buf,
6746 digest_buf[0],
6747 digest_buf[1],
6748 digest_buf[2],
6749 digest_buf[3],
6750 byte_swap_32 (salt.salt_buf_pc[0]),
6751 byte_swap_32 (salt.salt_buf_pc[1]),
6752 clichall_buf);
6753 }
6754 else if (hash_mode == 5600)
6755 {
6756 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6757
6758 netntlm_t *netntlm = &netntlms[salt_pos];
6759
6760 char user_buf[64] = { 0 };
6761 char domain_buf[64] = { 0 };
6762 char srvchall_buf[1024] = { 0 };
6763 char clichall_buf[1024] = { 0 };
6764
6765 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6766 {
6767 char *ptr = (char *) netntlm->userdomain_buf;
6768
6769 user_buf[i] = ptr[j];
6770 }
6771
6772 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6773 {
6774 char *ptr = (char *) netntlm->userdomain_buf;
6775
6776 domain_buf[i] = ptr[netntlm->user_len + j];
6777 }
6778
6779 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6780 {
6781 u8 *ptr = (u8 *) netntlm->chall_buf;
6782
6783 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6784 }
6785
6786 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6787 {
6788 u8 *ptr = (u8 *) netntlm->chall_buf;
6789
6790 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6791 }
6792
6793 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6794 user_buf,
6795 domain_buf,
6796 srvchall_buf,
6797 digest_buf[0],
6798 digest_buf[1],
6799 digest_buf[2],
6800 digest_buf[3],
6801 clichall_buf);
6802 }
6803 else if (hash_mode == 5700)
6804 {
6805 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6806
6807 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6808 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6809 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6810 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6811 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6812 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6813 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6814 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6815
6816 memcpy (tmp_buf, digest_buf, 32);
6817
6818 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6819
6820 ptr_plain[43] = 0;
6821
6822 snprintf (out_buf, len-1, "%s", ptr_plain);
6823 }
6824 else if (hash_mode == 5800)
6825 {
6826 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6827 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6828 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6829 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6830 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6831
6832 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6833 digest_buf[0],
6834 digest_buf[1],
6835 digest_buf[2],
6836 digest_buf[3],
6837 digest_buf[4]);
6838 }
6839 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6840 {
6841 snprintf (out_buf, len-1, "%s", hashfile);
6842 }
6843 else if (hash_mode == 6300)
6844 {
6845 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6846
6847 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6848 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6849 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6850 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6851
6852 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6853
6854 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6855 }
6856 else if (hash_mode == 6400)
6857 {
6858 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6859
6860 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6861 }
6862 else if (hash_mode == 6500)
6863 {
6864 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6865
6866 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6867 }
6868 else if (hash_mode == 6600)
6869 {
6870 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6871
6872 agilekey_t *agilekey = &agilekeys[salt_pos];
6873
6874 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6875 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6876
6877 uint buf_len = len - 1;
6878
6879 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6880 buf_len -= 22;
6881
6882 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6883 {
6884 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6885
6886 buf_len -= 2;
6887 }
6888 }
6889 else if (hash_mode == 6700)
6890 {
6891 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6892
6893 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6894 }
6895 else if (hash_mode == 6800)
6896 {
6897 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6898 }
6899 else if (hash_mode == 7100)
6900 {
6901 uint *ptr = digest_buf;
6902
6903 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6904
6905 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6906
6907 uint esalt[8] = { 0 };
6908
6909 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6910 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6911 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6912 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6913 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6914 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6915 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6916 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6917
6918 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",
6919 SIGNATURE_SHA512OSX,
6920 salt.salt_iter + 1,
6921 esalt[ 0], esalt[ 1],
6922 esalt[ 2], esalt[ 3],
6923 esalt[ 4], esalt[ 5],
6924 esalt[ 6], esalt[ 7],
6925 ptr [ 1], ptr [ 0],
6926 ptr [ 3], ptr [ 2],
6927 ptr [ 5], ptr [ 4],
6928 ptr [ 7], ptr [ 6],
6929 ptr [ 9], ptr [ 8],
6930 ptr [11], ptr [10],
6931 ptr [13], ptr [12],
6932 ptr [15], ptr [14]);
6933 }
6934 else if (hash_mode == 7200)
6935 {
6936 uint *ptr = digest_buf;
6937
6938 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6939
6940 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6941
6942 uint len_used = 0;
6943
6944 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6945
6946 len_used = strlen (out_buf);
6947
6948 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6949
6950 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6951 {
6952 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6953 }
6954
6955 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",
6956 ptr [ 1], ptr [ 0],
6957 ptr [ 3], ptr [ 2],
6958 ptr [ 5], ptr [ 4],
6959 ptr [ 7], ptr [ 6],
6960 ptr [ 9], ptr [ 8],
6961 ptr [11], ptr [10],
6962 ptr [13], ptr [12],
6963 ptr [15], ptr [14]);
6964 }
6965 else if (hash_mode == 7300)
6966 {
6967 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6968
6969 rakp_t *rakp = &rakps[salt_pos];
6970
6971 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6972 {
6973 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6974 }
6975
6976 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6977 digest_buf[0],
6978 digest_buf[1],
6979 digest_buf[2],
6980 digest_buf[3],
6981 digest_buf[4]);
6982 }
6983 else if (hash_mode == 7400)
6984 {
6985 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6986
6987 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6988 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6989 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6990 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6991 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6992 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6993 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6994 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6995
6996 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6997
6998 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
6999 {
7000 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7001 }
7002 else
7003 {
7004 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7005 }
7006 }
7007 else if (hash_mode == 7500)
7008 {
7009 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7010
7011 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7012
7013 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7014 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7015
7016 char data[128] = { 0 };
7017
7018 char *ptr_data = data;
7019
7020 for (uint i = 0; i < 36; i++, ptr_data += 2)
7021 {
7022 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7023 }
7024
7025 for (uint i = 0; i < 16; i++, ptr_data += 2)
7026 {
7027 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7028 }
7029
7030 *ptr_data = 0;
7031
7032 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7033 SIGNATURE_KRB5PA,
7034 (char *) krb5pa->user,
7035 (char *) krb5pa->realm,
7036 (char *) krb5pa->salt,
7037 data);
7038 }
7039 else if (hash_mode == 7700)
7040 {
7041 snprintf (out_buf, len-1, "%s$%08X%08X",
7042 (char *) salt.salt_buf,
7043 digest_buf[0],
7044 digest_buf[1]);
7045 }
7046 else if (hash_mode == 7800)
7047 {
7048 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7049 (char *) salt.salt_buf,
7050 digest_buf[0],
7051 digest_buf[1],
7052 digest_buf[2],
7053 digest_buf[3],
7054 digest_buf[4]);
7055 }
7056 else if (hash_mode == 7900)
7057 {
7058 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7059
7060 // ugly hack start
7061
7062 char *tmp = (char *) salt.salt_buf_pc;
7063
7064 ptr_plain[42] = tmp[0];
7065
7066 // ugly hack end
7067
7068 ptr_plain[43] = 0;
7069
7070 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7071 }
7072 else if (hash_mode == 8000)
7073 {
7074 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7075 (unsigned char *) salt.salt_buf,
7076 digest_buf[0],
7077 digest_buf[1],
7078 digest_buf[2],
7079 digest_buf[3],
7080 digest_buf[4],
7081 digest_buf[5],
7082 digest_buf[6],
7083 digest_buf[7]);
7084 }
7085 else if (hash_mode == 8100)
7086 {
7087 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7088 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7089
7090 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7091 (unsigned char *) salt.salt_buf,
7092 digest_buf[0],
7093 digest_buf[1],
7094 digest_buf[2],
7095 digest_buf[3],
7096 digest_buf[4]);
7097 }
7098 else if (hash_mode == 8200)
7099 {
7100 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7101
7102 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7103
7104 char data_buf[4096] = { 0 };
7105
7106 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7107 {
7108 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7109 }
7110
7111 data_buf[cloudkey->data_len * 2] = 0;
7112
7113 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7114 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7115 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7116 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7117 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7118 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7119 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7120 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7121
7122 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7123 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7124 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7125 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7126
7127 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7128 digest_buf[0],
7129 digest_buf[1],
7130 digest_buf[2],
7131 digest_buf[3],
7132 digest_buf[4],
7133 digest_buf[5],
7134 digest_buf[6],
7135 digest_buf[7],
7136 salt.salt_buf[0],
7137 salt.salt_buf[1],
7138 salt.salt_buf[2],
7139 salt.salt_buf[3],
7140 salt.salt_iter + 1,
7141 data_buf);
7142 }
7143 else if (hash_mode == 8300)
7144 {
7145 char digest_buf_c[34] = { 0 };
7146
7147 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7148
7149 digest_buf_c[32] = 0;
7150
7151 // domain
7152
7153 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7154
7155 char domain_buf_c[33] = { 0 };
7156
7157 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7158
7159 for (uint i = 0; i < salt_pc_len; i++)
7160 {
7161 const char next = domain_buf_c[i];
7162
7163 domain_buf_c[i] = '.';
7164
7165 i += next;
7166 }
7167
7168 domain_buf_c[salt_pc_len] = 0;
7169
7170 // final
7171
7172 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7173 }
7174 else if (hash_mode == 8500)
7175 {
7176 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7177 }
7178 else if (hash_mode == 2612)
7179 {
7180 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7181 SIGNATURE_PHPS,
7182 (char *) salt.salt_buf,
7183 digest_buf[0],
7184 digest_buf[1],
7185 digest_buf[2],
7186 digest_buf[3]);
7187 }
7188 else if (hash_mode == 3711)
7189 {
7190 char *salt_ptr = (char *) salt.salt_buf;
7191
7192 salt_ptr[salt.salt_len - 1] = 0;
7193
7194 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7195 SIGNATURE_MEDIAWIKI_B,
7196 salt_ptr,
7197 digest_buf[0],
7198 digest_buf[1],
7199 digest_buf[2],
7200 digest_buf[3]);
7201 }
7202 else if (hash_mode == 8800)
7203 {
7204 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7205
7206 androidfde_t *androidfde = &androidfdes[salt_pos];
7207
7208 char tmp[3073] = { 0 };
7209
7210 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7211 {
7212 sprintf (tmp + j, "%08x", androidfde->data[i]);
7213 }
7214
7215 tmp[3072] = 0;
7216
7217 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7218 SIGNATURE_ANDROIDFDE,
7219 byte_swap_32 (salt.salt_buf[0]),
7220 byte_swap_32 (salt.salt_buf[1]),
7221 byte_swap_32 (salt.salt_buf[2]),
7222 byte_swap_32 (salt.salt_buf[3]),
7223 byte_swap_32 (digest_buf[0]),
7224 byte_swap_32 (digest_buf[1]),
7225 byte_swap_32 (digest_buf[2]),
7226 byte_swap_32 (digest_buf[3]),
7227 tmp);
7228 }
7229 else if (hash_mode == 8900)
7230 {
7231 uint N = salt.scrypt_N;
7232 uint r = salt.scrypt_r;
7233 uint p = salt.scrypt_p;
7234
7235 char base64_salt[32] = { 0 };
7236
7237 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7238
7239 memset (tmp_buf, 0, 46);
7240
7241 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7242 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7243 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7244 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7245 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7246 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7247 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7248 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7249 digest_buf[8] = 0; // needed for base64_encode ()
7250
7251 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7252
7253 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7254 SIGNATURE_SCRYPT,
7255 N,
7256 r,
7257 p,
7258 base64_salt,
7259 tmp_buf);
7260 }
7261 else if (hash_mode == 9000)
7262 {
7263 snprintf (out_buf, len-1, "%s", hashfile);
7264 }
7265 else if (hash_mode == 9200)
7266 {
7267 // salt
7268
7269 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7270
7271 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7272
7273 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7274
7275 // hash
7276
7277 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7278 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7279 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7280 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7281 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7282 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7283 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7284 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7285 digest_buf[8] = 0; // needed for base64_encode ()
7286
7287 char tmp_buf[64] = { 0 };
7288
7289 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7290 tmp_buf[43] = 0; // cut it here
7291
7292 // output
7293
7294 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7295 }
7296 else if (hash_mode == 9300)
7297 {
7298 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7299 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7300 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7301 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7302 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7303 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7304 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7305 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7306 digest_buf[8] = 0; // needed for base64_encode ()
7307
7308 char tmp_buf[64] = { 0 };
7309
7310 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7311 tmp_buf[43] = 0; // cut it here
7312
7313 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7314
7315 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7316 }
7317 else if (hash_mode == 9400)
7318 {
7319 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7320
7321 office2007_t *office2007 = &office2007s[salt_pos];
7322
7323 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7324 SIGNATURE_OFFICE2007,
7325 2007,
7326 20,
7327 office2007->keySize,
7328 16,
7329 salt.salt_buf[0],
7330 salt.salt_buf[1],
7331 salt.salt_buf[2],
7332 salt.salt_buf[3],
7333 office2007->encryptedVerifier[0],
7334 office2007->encryptedVerifier[1],
7335 office2007->encryptedVerifier[2],
7336 office2007->encryptedVerifier[3],
7337 office2007->encryptedVerifierHash[0],
7338 office2007->encryptedVerifierHash[1],
7339 office2007->encryptedVerifierHash[2],
7340 office2007->encryptedVerifierHash[3],
7341 office2007->encryptedVerifierHash[4]);
7342 }
7343 else if (hash_mode == 9500)
7344 {
7345 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7346
7347 office2010_t *office2010 = &office2010s[salt_pos];
7348
7349 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,
7350
7351 salt.salt_buf[0],
7352 salt.salt_buf[1],
7353 salt.salt_buf[2],
7354 salt.salt_buf[3],
7355 office2010->encryptedVerifier[0],
7356 office2010->encryptedVerifier[1],
7357 office2010->encryptedVerifier[2],
7358 office2010->encryptedVerifier[3],
7359 office2010->encryptedVerifierHash[0],
7360 office2010->encryptedVerifierHash[1],
7361 office2010->encryptedVerifierHash[2],
7362 office2010->encryptedVerifierHash[3],
7363 office2010->encryptedVerifierHash[4],
7364 office2010->encryptedVerifierHash[5],
7365 office2010->encryptedVerifierHash[6],
7366 office2010->encryptedVerifierHash[7]);
7367 }
7368 else if (hash_mode == 9600)
7369 {
7370 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7371
7372 office2013_t *office2013 = &office2013s[salt_pos];
7373
7374 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,
7375
7376 salt.salt_buf[0],
7377 salt.salt_buf[1],
7378 salt.salt_buf[2],
7379 salt.salt_buf[3],
7380 office2013->encryptedVerifier[0],
7381 office2013->encryptedVerifier[1],
7382 office2013->encryptedVerifier[2],
7383 office2013->encryptedVerifier[3],
7384 office2013->encryptedVerifierHash[0],
7385 office2013->encryptedVerifierHash[1],
7386 office2013->encryptedVerifierHash[2],
7387 office2013->encryptedVerifierHash[3],
7388 office2013->encryptedVerifierHash[4],
7389 office2013->encryptedVerifierHash[5],
7390 office2013->encryptedVerifierHash[6],
7391 office2013->encryptedVerifierHash[7]);
7392 }
7393 else if (hash_mode == 9700)
7394 {
7395 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7396
7397 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7398
7399 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7400 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7401 byte_swap_32 (salt.salt_buf[0]),
7402 byte_swap_32 (salt.salt_buf[1]),
7403 byte_swap_32 (salt.salt_buf[2]),
7404 byte_swap_32 (salt.salt_buf[3]),
7405 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7406 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7407 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7408 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7409 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7410 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7411 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7412 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7413 }
7414 else if (hash_mode == 9710)
7415 {
7416 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7417
7418 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7419
7420 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7421 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7422 byte_swap_32 (salt.salt_buf[0]),
7423 byte_swap_32 (salt.salt_buf[1]),
7424 byte_swap_32 (salt.salt_buf[2]),
7425 byte_swap_32 (salt.salt_buf[3]),
7426 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7427 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7428 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7429 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7430 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7431 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7432 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7433 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7434 }
7435 else if (hash_mode == 9720)
7436 {
7437 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7438
7439 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7440
7441 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7442
7443 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7444 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7445 byte_swap_32 (salt.salt_buf[0]),
7446 byte_swap_32 (salt.salt_buf[1]),
7447 byte_swap_32 (salt.salt_buf[2]),
7448 byte_swap_32 (salt.salt_buf[3]),
7449 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7450 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7451 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7452 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7453 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7454 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7455 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7456 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7457 rc4key[0],
7458 rc4key[1],
7459 rc4key[2],
7460 rc4key[3],
7461 rc4key[4]);
7462 }
7463 else if (hash_mode == 9800)
7464 {
7465 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7466
7467 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7468
7469 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7470 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7471 salt.salt_buf[0],
7472 salt.salt_buf[1],
7473 salt.salt_buf[2],
7474 salt.salt_buf[3],
7475 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7476 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7477 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7478 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7479 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7480 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7481 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7482 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7483 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7484 }
7485 else if (hash_mode == 9810)
7486 {
7487 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7488
7489 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7490
7491 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7492 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7493 salt.salt_buf[0],
7494 salt.salt_buf[1],
7495 salt.salt_buf[2],
7496 salt.salt_buf[3],
7497 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7498 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7499 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7500 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7501 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7502 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7503 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7504 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7505 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7506 }
7507 else if (hash_mode == 9820)
7508 {
7509 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7510
7511 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7512
7513 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7514
7515 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7516 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7517 salt.salt_buf[0],
7518 salt.salt_buf[1],
7519 salt.salt_buf[2],
7520 salt.salt_buf[3],
7521 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7522 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7523 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7524 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7525 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7526 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7527 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7528 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7529 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7530 rc4key[0],
7531 rc4key[1],
7532 rc4key[2],
7533 rc4key[3],
7534 rc4key[4]);
7535 }
7536 else if (hash_mode == 10000)
7537 {
7538 // salt
7539
7540 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7541
7542 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7543
7544 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7545
7546 // hash
7547
7548 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7549 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7550 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7551 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7552 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7553 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7554 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7555 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7556 digest_buf[8] = 0; // needed for base64_encode ()
7557
7558 char tmp_buf[64] = { 0 };
7559
7560 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7561
7562 // output
7563
7564 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7565 }
7566 else if (hash_mode == 10100)
7567 {
7568 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7569 digest_buf[0],
7570 digest_buf[1],
7571 2,
7572 4,
7573 byte_swap_32 (salt.salt_buf[0]),
7574 byte_swap_32 (salt.salt_buf[1]),
7575 byte_swap_32 (salt.salt_buf[2]),
7576 byte_swap_32 (salt.salt_buf[3]));
7577 }
7578 else if (hash_mode == 10200)
7579 {
7580 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7581
7582 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7583
7584 // challenge
7585
7586 char challenge[100] = { 0 };
7587
7588 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7589
7590 // response
7591
7592 char tmp_buf[100] = { 0 };
7593
7594 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7595 (char *) cram_md5->user,
7596 digest_buf[0],
7597 digest_buf[1],
7598 digest_buf[2],
7599 digest_buf[3]);
7600
7601 char response[100] = { 0 };
7602
7603 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7604
7605 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7606 }
7607 else if (hash_mode == 10300)
7608 {
7609 char tmp_buf[100] = { 0 };
7610
7611 memcpy (tmp_buf + 0, digest_buf, 20);
7612 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7613
7614 uint tmp_len = 20 + salt.salt_len;
7615
7616 // base64 encode it
7617
7618 char base64_encoded[100] = { 0 };
7619
7620 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7621
7622 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7623 }
7624 else if (hash_mode == 10400)
7625 {
7626 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7627
7628 pdf_t *pdf = &pdfs[salt_pos];
7629
7630 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",
7631
7632 pdf->V,
7633 pdf->R,
7634 40,
7635 pdf->P,
7636 pdf->enc_md,
7637 pdf->id_len,
7638 byte_swap_32 (pdf->id_buf[0]),
7639 byte_swap_32 (pdf->id_buf[1]),
7640 byte_swap_32 (pdf->id_buf[2]),
7641 byte_swap_32 (pdf->id_buf[3]),
7642 pdf->u_len,
7643 byte_swap_32 (pdf->u_buf[0]),
7644 byte_swap_32 (pdf->u_buf[1]),
7645 byte_swap_32 (pdf->u_buf[2]),
7646 byte_swap_32 (pdf->u_buf[3]),
7647 byte_swap_32 (pdf->u_buf[4]),
7648 byte_swap_32 (pdf->u_buf[5]),
7649 byte_swap_32 (pdf->u_buf[6]),
7650 byte_swap_32 (pdf->u_buf[7]),
7651 pdf->o_len,
7652 byte_swap_32 (pdf->o_buf[0]),
7653 byte_swap_32 (pdf->o_buf[1]),
7654 byte_swap_32 (pdf->o_buf[2]),
7655 byte_swap_32 (pdf->o_buf[3]),
7656 byte_swap_32 (pdf->o_buf[4]),
7657 byte_swap_32 (pdf->o_buf[5]),
7658 byte_swap_32 (pdf->o_buf[6]),
7659 byte_swap_32 (pdf->o_buf[7])
7660 );
7661 }
7662 else if (hash_mode == 10410)
7663 {
7664 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7665
7666 pdf_t *pdf = &pdfs[salt_pos];
7667
7668 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",
7669
7670 pdf->V,
7671 pdf->R,
7672 40,
7673 pdf->P,
7674 pdf->enc_md,
7675 pdf->id_len,
7676 byte_swap_32 (pdf->id_buf[0]),
7677 byte_swap_32 (pdf->id_buf[1]),
7678 byte_swap_32 (pdf->id_buf[2]),
7679 byte_swap_32 (pdf->id_buf[3]),
7680 pdf->u_len,
7681 byte_swap_32 (pdf->u_buf[0]),
7682 byte_swap_32 (pdf->u_buf[1]),
7683 byte_swap_32 (pdf->u_buf[2]),
7684 byte_swap_32 (pdf->u_buf[3]),
7685 byte_swap_32 (pdf->u_buf[4]),
7686 byte_swap_32 (pdf->u_buf[5]),
7687 byte_swap_32 (pdf->u_buf[6]),
7688 byte_swap_32 (pdf->u_buf[7]),
7689 pdf->o_len,
7690 byte_swap_32 (pdf->o_buf[0]),
7691 byte_swap_32 (pdf->o_buf[1]),
7692 byte_swap_32 (pdf->o_buf[2]),
7693 byte_swap_32 (pdf->o_buf[3]),
7694 byte_swap_32 (pdf->o_buf[4]),
7695 byte_swap_32 (pdf->o_buf[5]),
7696 byte_swap_32 (pdf->o_buf[6]),
7697 byte_swap_32 (pdf->o_buf[7])
7698 );
7699 }
7700 else if (hash_mode == 10420)
7701 {
7702 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7703
7704 pdf_t *pdf = &pdfs[salt_pos];
7705
7706 u8 *rc4key = (u8 *) pdf->rc4key;
7707
7708 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",
7709
7710 pdf->V,
7711 pdf->R,
7712 40,
7713 pdf->P,
7714 pdf->enc_md,
7715 pdf->id_len,
7716 byte_swap_32 (pdf->id_buf[0]),
7717 byte_swap_32 (pdf->id_buf[1]),
7718 byte_swap_32 (pdf->id_buf[2]),
7719 byte_swap_32 (pdf->id_buf[3]),
7720 pdf->u_len,
7721 byte_swap_32 (pdf->u_buf[0]),
7722 byte_swap_32 (pdf->u_buf[1]),
7723 byte_swap_32 (pdf->u_buf[2]),
7724 byte_swap_32 (pdf->u_buf[3]),
7725 byte_swap_32 (pdf->u_buf[4]),
7726 byte_swap_32 (pdf->u_buf[5]),
7727 byte_swap_32 (pdf->u_buf[6]),
7728 byte_swap_32 (pdf->u_buf[7]),
7729 pdf->o_len,
7730 byte_swap_32 (pdf->o_buf[0]),
7731 byte_swap_32 (pdf->o_buf[1]),
7732 byte_swap_32 (pdf->o_buf[2]),
7733 byte_swap_32 (pdf->o_buf[3]),
7734 byte_swap_32 (pdf->o_buf[4]),
7735 byte_swap_32 (pdf->o_buf[5]),
7736 byte_swap_32 (pdf->o_buf[6]),
7737 byte_swap_32 (pdf->o_buf[7]),
7738 rc4key[0],
7739 rc4key[1],
7740 rc4key[2],
7741 rc4key[3],
7742 rc4key[4]
7743 );
7744 }
7745 else if (hash_mode == 10500)
7746 {
7747 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7748
7749 pdf_t *pdf = &pdfs[salt_pos];
7750
7751 if (pdf->id_len == 32)
7752 {
7753 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",
7754
7755 pdf->V,
7756 pdf->R,
7757 128,
7758 pdf->P,
7759 pdf->enc_md,
7760 pdf->id_len,
7761 byte_swap_32 (pdf->id_buf[0]),
7762 byte_swap_32 (pdf->id_buf[1]),
7763 byte_swap_32 (pdf->id_buf[2]),
7764 byte_swap_32 (pdf->id_buf[3]),
7765 byte_swap_32 (pdf->id_buf[4]),
7766 byte_swap_32 (pdf->id_buf[5]),
7767 byte_swap_32 (pdf->id_buf[6]),
7768 byte_swap_32 (pdf->id_buf[7]),
7769 pdf->u_len,
7770 byte_swap_32 (pdf->u_buf[0]),
7771 byte_swap_32 (pdf->u_buf[1]),
7772 byte_swap_32 (pdf->u_buf[2]),
7773 byte_swap_32 (pdf->u_buf[3]),
7774 byte_swap_32 (pdf->u_buf[4]),
7775 byte_swap_32 (pdf->u_buf[5]),
7776 byte_swap_32 (pdf->u_buf[6]),
7777 byte_swap_32 (pdf->u_buf[7]),
7778 pdf->o_len,
7779 byte_swap_32 (pdf->o_buf[0]),
7780 byte_swap_32 (pdf->o_buf[1]),
7781 byte_swap_32 (pdf->o_buf[2]),
7782 byte_swap_32 (pdf->o_buf[3]),
7783 byte_swap_32 (pdf->o_buf[4]),
7784 byte_swap_32 (pdf->o_buf[5]),
7785 byte_swap_32 (pdf->o_buf[6]),
7786 byte_swap_32 (pdf->o_buf[7])
7787 );
7788 }
7789 else
7790 {
7791 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",
7792
7793 pdf->V,
7794 pdf->R,
7795 128,
7796 pdf->P,
7797 pdf->enc_md,
7798 pdf->id_len,
7799 byte_swap_32 (pdf->id_buf[0]),
7800 byte_swap_32 (pdf->id_buf[1]),
7801 byte_swap_32 (pdf->id_buf[2]),
7802 byte_swap_32 (pdf->id_buf[3]),
7803 pdf->u_len,
7804 byte_swap_32 (pdf->u_buf[0]),
7805 byte_swap_32 (pdf->u_buf[1]),
7806 byte_swap_32 (pdf->u_buf[2]),
7807 byte_swap_32 (pdf->u_buf[3]),
7808 byte_swap_32 (pdf->u_buf[4]),
7809 byte_swap_32 (pdf->u_buf[5]),
7810 byte_swap_32 (pdf->u_buf[6]),
7811 byte_swap_32 (pdf->u_buf[7]),
7812 pdf->o_len,
7813 byte_swap_32 (pdf->o_buf[0]),
7814 byte_swap_32 (pdf->o_buf[1]),
7815 byte_swap_32 (pdf->o_buf[2]),
7816 byte_swap_32 (pdf->o_buf[3]),
7817 byte_swap_32 (pdf->o_buf[4]),
7818 byte_swap_32 (pdf->o_buf[5]),
7819 byte_swap_32 (pdf->o_buf[6]),
7820 byte_swap_32 (pdf->o_buf[7])
7821 );
7822 }
7823 }
7824 else if (hash_mode == 10600)
7825 {
7826 uint digest_idx = salt.digests_offset + digest_pos;
7827
7828 hashinfo_t **hashinfo_ptr = data.hash_info;
7829 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7830
7831 snprintf (out_buf, len-1, "%s", hash_buf);
7832 }
7833 else if (hash_mode == 10700)
7834 {
7835 uint digest_idx = salt.digests_offset + digest_pos;
7836
7837 hashinfo_t **hashinfo_ptr = data.hash_info;
7838 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7839
7840 snprintf (out_buf, len-1, "%s", hash_buf);
7841 }
7842 else if (hash_mode == 10900)
7843 {
7844 uint digest_idx = salt.digests_offset + digest_pos;
7845
7846 hashinfo_t **hashinfo_ptr = data.hash_info;
7847 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7848
7849 snprintf (out_buf, len-1, "%s", hash_buf);
7850 }
7851 else if (hash_mode == 11100)
7852 {
7853 u32 salt_challenge = salt.salt_buf[0];
7854
7855 salt_challenge = byte_swap_32 (salt_challenge);
7856
7857 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7858
7859 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7860 SIGNATURE_POSTGRESQL_AUTH,
7861 user_name,
7862 salt_challenge,
7863 digest_buf[0],
7864 digest_buf[1],
7865 digest_buf[2],
7866 digest_buf[3]);
7867 }
7868 else if (hash_mode == 11200)
7869 {
7870 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7871 SIGNATURE_MYSQL_AUTH,
7872 (unsigned char *) salt.salt_buf,
7873 digest_buf[0],
7874 digest_buf[1],
7875 digest_buf[2],
7876 digest_buf[3],
7877 digest_buf[4]);
7878 }
7879 else if (hash_mode == 11300)
7880 {
7881 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7882
7883 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7884
7885 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7886 const uint ckey_len = bitcoin_wallet->ckey_len;
7887 const uint public_key_len = bitcoin_wallet->public_key_len;
7888
7889 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7890 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7891 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7892
7893 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7894 {
7895 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7896
7897 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7898 }
7899
7900 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7901 {
7902 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7903
7904 sprintf (ckey_buf + j, "%02x", ptr[i]);
7905 }
7906
7907 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7908 {
7909 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
7910
7911 sprintf (public_key_buf + j, "%02x", ptr[i]);
7912 }
7913
7914 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7915 SIGNATURE_BITCOIN_WALLET,
7916 cry_master_len * 2,
7917 cry_master_buf,
7918 salt.salt_len,
7919 (unsigned char *) salt.salt_buf,
7920 salt.salt_iter + 1,
7921 ckey_len * 2,
7922 ckey_buf,
7923 public_key_len * 2,
7924 public_key_buf
7925 );
7926
7927 free (cry_master_buf);
7928 free (ckey_buf);
7929 free (public_key_buf);
7930 }
7931 else if (hash_mode == 11400)
7932 {
7933 uint digest_idx = salt.digests_offset + digest_pos;
7934
7935 hashinfo_t **hashinfo_ptr = data.hash_info;
7936 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7937
7938 snprintf (out_buf, len-1, "%s", hash_buf);
7939 }
7940 else if (hash_mode == 11600)
7941 {
7942 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7943
7944 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7945
7946 const uint data_len = seven_zip->data_len;
7947
7948 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7949
7950 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7951 {
7952 const u8 *ptr = (const u8 *) seven_zip->data_buf;
7953
7954 sprintf (data_buf + j, "%02x", ptr[i]);
7955 }
7956
7957 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7958 SIGNATURE_SEVEN_ZIP,
7959 0,
7960 salt.salt_sign[0],
7961 0,
7962 (char *) seven_zip->salt_buf,
7963 seven_zip->iv_len,
7964 seven_zip->iv_buf[0],
7965 seven_zip->iv_buf[1],
7966 seven_zip->iv_buf[2],
7967 seven_zip->iv_buf[3],
7968 seven_zip->crc,
7969 seven_zip->data_len,
7970 seven_zip->unpack_size,
7971 data_buf);
7972
7973 free (data_buf);
7974 }
7975 else if (hash_mode == 11700)
7976 {
7977 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7978 digest_buf[0],
7979 digest_buf[1],
7980 digest_buf[2],
7981 digest_buf[3],
7982 digest_buf[4],
7983 digest_buf[5],
7984 digest_buf[6],
7985 digest_buf[7]);
7986 }
7987 else if (hash_mode == 11800)
7988 {
7989 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
7990 digest_buf[ 0],
7991 digest_buf[ 1],
7992 digest_buf[ 2],
7993 digest_buf[ 3],
7994 digest_buf[ 4],
7995 digest_buf[ 5],
7996 digest_buf[ 6],
7997 digest_buf[ 7],
7998 digest_buf[ 8],
7999 digest_buf[ 9],
8000 digest_buf[10],
8001 digest_buf[11],
8002 digest_buf[12],
8003 digest_buf[13],
8004 digest_buf[14],
8005 digest_buf[15]);
8006 }
8007 else if (hash_mode == 11900)
8008 {
8009 uint digest_idx = salt.digests_offset + digest_pos;
8010
8011 hashinfo_t **hashinfo_ptr = data.hash_info;
8012 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8013
8014 snprintf (out_buf, len-1, "%s", hash_buf);
8015 }
8016 else if (hash_mode == 12000)
8017 {
8018 uint digest_idx = salt.digests_offset + digest_pos;
8019
8020 hashinfo_t **hashinfo_ptr = data.hash_info;
8021 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8022
8023 snprintf (out_buf, len-1, "%s", hash_buf);
8024 }
8025 else if (hash_mode == 12100)
8026 {
8027 uint digest_idx = salt.digests_offset + digest_pos;
8028
8029 hashinfo_t **hashinfo_ptr = data.hash_info;
8030 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8031
8032 snprintf (out_buf, len-1, "%s", hash_buf);
8033 }
8034 else if (hash_mode == 12200)
8035 {
8036 uint *ptr_digest = digest_buf;
8037 uint *ptr_salt = salt.salt_buf;
8038
8039 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8040 SIGNATURE_ECRYPTFS,
8041 ptr_salt[0],
8042 ptr_salt[1],
8043 ptr_digest[0],
8044 ptr_digest[1]);
8045 }
8046 else if (hash_mode == 12300)
8047 {
8048 uint *ptr_digest = digest_buf;
8049 uint *ptr_salt = salt.salt_buf;
8050
8051 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",
8052 ptr_digest[ 0], ptr_digest[ 1],
8053 ptr_digest[ 2], ptr_digest[ 3],
8054 ptr_digest[ 4], ptr_digest[ 5],
8055 ptr_digest[ 6], ptr_digest[ 7],
8056 ptr_digest[ 8], ptr_digest[ 9],
8057 ptr_digest[10], ptr_digest[11],
8058 ptr_digest[12], ptr_digest[13],
8059 ptr_digest[14], ptr_digest[15],
8060 ptr_salt[0],
8061 ptr_salt[1],
8062 ptr_salt[2],
8063 ptr_salt[3]);
8064 }
8065 else if (hash_mode == 12400)
8066 {
8067 // encode iteration count
8068
8069 char salt_iter[5] = { 0 };
8070
8071 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8072 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8073 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8074 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8075 salt_iter[4] = 0;
8076
8077 // encode salt
8078
8079 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8080 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8081 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8082 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8083 ptr_salt[4] = 0;
8084
8085 // encode digest
8086
8087 memset (tmp_buf, 0, sizeof (tmp_buf));
8088
8089 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8090 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8091
8092 memcpy (tmp_buf, digest_buf, 8);
8093
8094 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8095
8096 ptr_plain[11] = 0;
8097
8098 // fill the resulting buffer
8099
8100 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8101 }
8102 else if (hash_mode == 12500)
8103 {
8104 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8105 SIGNATURE_RAR3,
8106 byte_swap_32 (salt.salt_buf[0]),
8107 byte_swap_32 (salt.salt_buf[1]),
8108 salt.salt_buf[2],
8109 salt.salt_buf[3],
8110 salt.salt_buf[4],
8111 salt.salt_buf[5]);
8112 }
8113 else if (hash_mode == 12600)
8114 {
8115 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8116 digest_buf[0] + salt.salt_buf_pc[0],
8117 digest_buf[1] + salt.salt_buf_pc[1],
8118 digest_buf[2] + salt.salt_buf_pc[2],
8119 digest_buf[3] + salt.salt_buf_pc[3],
8120 digest_buf[4] + salt.salt_buf_pc[4],
8121 digest_buf[5] + salt.salt_buf_pc[5],
8122 digest_buf[6] + salt.salt_buf_pc[6],
8123 digest_buf[7] + salt.salt_buf_pc[7]);
8124 }
8125 else if (hash_mode == 12700)
8126 {
8127 uint digest_idx = salt.digests_offset + digest_pos;
8128
8129 hashinfo_t **hashinfo_ptr = data.hash_info;
8130 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8131
8132 snprintf (out_buf, len-1, "%s", hash_buf);
8133 }
8134 else if (hash_mode == 12800)
8135 {
8136 const u8 *ptr = (const u8 *) salt.salt_buf;
8137
8138 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",
8139 SIGNATURE_MS_DRSR,
8140 ptr[0],
8141 ptr[1],
8142 ptr[2],
8143 ptr[3],
8144 ptr[4],
8145 ptr[5],
8146 ptr[6],
8147 ptr[7],
8148 ptr[8],
8149 ptr[9],
8150 salt.salt_iter + 1,
8151 byte_swap_32 (digest_buf[0]),
8152 byte_swap_32 (digest_buf[1]),
8153 byte_swap_32 (digest_buf[2]),
8154 byte_swap_32 (digest_buf[3]),
8155 byte_swap_32 (digest_buf[4]),
8156 byte_swap_32 (digest_buf[5]),
8157 byte_swap_32 (digest_buf[6]),
8158 byte_swap_32 (digest_buf[7])
8159 );
8160 }
8161 else if (hash_mode == 12900)
8162 {
8163 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",
8164 salt.salt_buf[ 4],
8165 salt.salt_buf[ 5],
8166 salt.salt_buf[ 6],
8167 salt.salt_buf[ 7],
8168 salt.salt_buf[ 8],
8169 salt.salt_buf[ 9],
8170 salt.salt_buf[10],
8171 salt.salt_buf[11],
8172 byte_swap_32 (digest_buf[0]),
8173 byte_swap_32 (digest_buf[1]),
8174 byte_swap_32 (digest_buf[2]),
8175 byte_swap_32 (digest_buf[3]),
8176 byte_swap_32 (digest_buf[4]),
8177 byte_swap_32 (digest_buf[5]),
8178 byte_swap_32 (digest_buf[6]),
8179 byte_swap_32 (digest_buf[7]),
8180 salt.salt_buf[ 0],
8181 salt.salt_buf[ 1],
8182 salt.salt_buf[ 2],
8183 salt.salt_buf[ 3]
8184 );
8185 }
8186 else if (hash_mode == 13000)
8187 {
8188 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8189
8190 rar5_t *rar5 = &rar5s[salt_pos];
8191
8192 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8193 salt.salt_buf[0],
8194 salt.salt_buf[1],
8195 salt.salt_buf[2],
8196 salt.salt_buf[3],
8197 salt.salt_sign[0],
8198 rar5->iv[0],
8199 rar5->iv[1],
8200 rar5->iv[2],
8201 rar5->iv[3],
8202 byte_swap_32 (digest_buf[0]),
8203 byte_swap_32 (digest_buf[1])
8204 );
8205 }
8206 else
8207 {
8208 if (hash_type == HASH_TYPE_MD4)
8209 {
8210 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8211 digest_buf[0],
8212 digest_buf[1],
8213 digest_buf[2],
8214 digest_buf[3]);
8215 }
8216 else if (hash_type == HASH_TYPE_MD5)
8217 {
8218 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8219 digest_buf[0],
8220 digest_buf[1],
8221 digest_buf[2],
8222 digest_buf[3]);
8223 }
8224 else if (hash_type == HASH_TYPE_SHA1)
8225 {
8226 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8227 digest_buf[0],
8228 digest_buf[1],
8229 digest_buf[2],
8230 digest_buf[3],
8231 digest_buf[4]);
8232 }
8233 else if (hash_type == HASH_TYPE_SHA256)
8234 {
8235 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8236 digest_buf[0],
8237 digest_buf[1],
8238 digest_buf[2],
8239 digest_buf[3],
8240 digest_buf[4],
8241 digest_buf[5],
8242 digest_buf[6],
8243 digest_buf[7]);
8244 }
8245 else if (hash_type == HASH_TYPE_SHA384)
8246 {
8247 uint *ptr = digest_buf;
8248
8249 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8250 ptr[ 1], ptr[ 0],
8251 ptr[ 3], ptr[ 2],
8252 ptr[ 5], ptr[ 4],
8253 ptr[ 7], ptr[ 6],
8254 ptr[ 9], ptr[ 8],
8255 ptr[11], ptr[10]);
8256 }
8257 else if (hash_type == HASH_TYPE_SHA512)
8258 {
8259 uint *ptr = digest_buf;
8260
8261 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8262 ptr[ 1], ptr[ 0],
8263 ptr[ 3], ptr[ 2],
8264 ptr[ 5], ptr[ 4],
8265 ptr[ 7], ptr[ 6],
8266 ptr[ 9], ptr[ 8],
8267 ptr[11], ptr[10],
8268 ptr[13], ptr[12],
8269 ptr[15], ptr[14]);
8270 }
8271 else if (hash_type == HASH_TYPE_LM)
8272 {
8273 snprintf (out_buf, len-1, "%08x%08x",
8274 digest_buf[0],
8275 digest_buf[1]);
8276 }
8277 else if (hash_type == HASH_TYPE_ORACLEH)
8278 {
8279 snprintf (out_buf, len-1, "%08X%08X",
8280 digest_buf[0],
8281 digest_buf[1]);
8282 }
8283 else if (hash_type == HASH_TYPE_BCRYPT)
8284 {
8285 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8286 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8287
8288 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8289
8290 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8291 }
8292 else if (hash_type == HASH_TYPE_KECCAK)
8293 {
8294 uint *ptr = digest_buf;
8295
8296 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%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",
8297 ptr[ 1], ptr[ 0],
8298 ptr[ 3], ptr[ 2],
8299 ptr[ 5], ptr[ 4],
8300 ptr[ 7], ptr[ 6],
8301 ptr[ 9], ptr[ 8],
8302 ptr[11], ptr[10],
8303 ptr[13], ptr[12],
8304 ptr[15], ptr[14],
8305 ptr[17], ptr[16],
8306 ptr[19], ptr[18],
8307 ptr[21], ptr[20],
8308 ptr[23], ptr[22],
8309 ptr[25], ptr[24],
8310 ptr[27], ptr[26],
8311 ptr[29], ptr[28],
8312 ptr[31], ptr[30],
8313 ptr[33], ptr[32],
8314 ptr[35], ptr[34],
8315 ptr[37], ptr[36],
8316 ptr[39], ptr[38],
8317 ptr[41], ptr[30],
8318 ptr[43], ptr[42],
8319 ptr[45], ptr[44],
8320 ptr[47], ptr[46],
8321 ptr[49], ptr[48]
8322 );
8323
8324 out_buf[salt.keccak_mdlen * 2] = 0;
8325 }
8326 else if (hash_type == HASH_TYPE_RIPEMD160)
8327 {
8328 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8329 digest_buf[0],
8330 digest_buf[1],
8331 digest_buf[2],
8332 digest_buf[3],
8333 digest_buf[4]);
8334 }
8335 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8336 {
8337 digest_buf[ 0] = digest_buf[ 0];
8338 digest_buf[ 1] = digest_buf[ 1];
8339 digest_buf[ 2] = digest_buf[ 2];
8340 digest_buf[ 3] = digest_buf[ 3];
8341 digest_buf[ 4] = digest_buf[ 4];
8342 digest_buf[ 5] = digest_buf[ 5];
8343 digest_buf[ 6] = digest_buf[ 6];
8344 digest_buf[ 7] = digest_buf[ 7];
8345 digest_buf[ 8] = digest_buf[ 8];
8346 digest_buf[ 9] = digest_buf[ 9];
8347 digest_buf[10] = digest_buf[10];
8348 digest_buf[11] = digest_buf[11];
8349 digest_buf[12] = digest_buf[12];
8350 digest_buf[13] = digest_buf[13];
8351 digest_buf[14] = digest_buf[14];
8352 digest_buf[15] = digest_buf[15];
8353
8354 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8355 digest_buf[ 0],
8356 digest_buf[ 1],
8357 digest_buf[ 2],
8358 digest_buf[ 3],
8359 digest_buf[ 4],
8360 digest_buf[ 5],
8361 digest_buf[ 6],
8362 digest_buf[ 7],
8363 digest_buf[ 8],
8364 digest_buf[ 9],
8365 digest_buf[10],
8366 digest_buf[11],
8367 digest_buf[12],
8368 digest_buf[13],
8369 digest_buf[14],
8370 digest_buf[15]);
8371 }
8372 else if (hash_type == HASH_TYPE_GOST)
8373 {
8374 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8375 digest_buf[0],
8376 digest_buf[1],
8377 digest_buf[2],
8378 digest_buf[3],
8379 digest_buf[4],
8380 digest_buf[5],
8381 digest_buf[6],
8382 digest_buf[7]);
8383 }
8384 else if (hash_type == HASH_TYPE_MYSQL)
8385 {
8386 snprintf (out_buf, len-1, "%08x%08x",
8387 digest_buf[0],
8388 digest_buf[1]);
8389 }
8390 else if (hash_type == HASH_TYPE_LOTUS5)
8391 {
8392 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8393 digest_buf[0],
8394 digest_buf[1],
8395 digest_buf[2],
8396 digest_buf[3]);
8397 }
8398 else if (hash_type == HASH_TYPE_LOTUS6)
8399 {
8400 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8401 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8402 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8403 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8404
8405 char buf[16] = { 0 };
8406
8407 memcpy (buf + 0, salt.salt_buf, 5);
8408 memcpy (buf + 5, digest_buf, 9);
8409
8410 buf[3] -= -4;
8411
8412 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8413
8414 tmp_buf[18] = salt.salt_buf_pc[7];
8415 tmp_buf[19] = 0;
8416
8417 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8418 }
8419 else if (hash_type == HASH_TYPE_LOTUS8)
8420 {
8421 char buf[52] = { 0 };
8422
8423 // salt
8424
8425 memcpy (buf + 0, salt.salt_buf, 16);
8426
8427 buf[3] -= -4;
8428
8429 // iteration
8430
8431 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8432
8433 // chars
8434
8435 buf[26] = salt.salt_buf_pc[0];
8436 buf[27] = salt.salt_buf_pc[1];
8437
8438 // digest
8439
8440 memcpy (buf + 28, digest_buf, 8);
8441
8442 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8443
8444 tmp_buf[49] = 0;
8445
8446 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8447 }
8448 else if (hash_type == HASH_TYPE_CRC32)
8449 {
8450 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8451 }
8452 }
8453
8454 if (salt_type == SALT_TYPE_INTERN)
8455 {
8456 size_t pos = strlen (out_buf);
8457
8458 out_buf[pos] = data.separator;
8459
8460 char *ptr = (char *) salt.salt_buf;
8461
8462 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8463
8464 out_buf[pos + 1 + salt.salt_len] = 0;
8465 }
8466 }
8467
8468 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8469 {
8470 memset (hccap, 0, sizeof (hccap_t));
8471
8472 salt_t *salt = &data.salts_buf[salt_pos];
8473
8474 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8475
8476 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8477 wpa_t *wpa = &wpas[salt_pos];
8478
8479 hccap->keyver = wpa->keyver;
8480
8481 hccap->eapol_size = wpa->eapol_size;
8482
8483 if (wpa->keyver != 1)
8484 {
8485 uint eapol_tmp[64] = { 0 };
8486
8487 for (uint i = 0; i < 64; i++)
8488 {
8489 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8490 }
8491
8492 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8493 }
8494 else
8495 {
8496 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8497 }
8498
8499 uint pke_tmp[25] = { 0 };
8500
8501 for (int i = 5; i < 25; i++)
8502 {
8503 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8504 }
8505
8506 char *pke_ptr = (char *) pke_tmp;
8507
8508 memcpy (hccap->mac1, pke_ptr + 23, 6);
8509 memcpy (hccap->mac2, pke_ptr + 29, 6);
8510 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8511 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8512
8513 char *digests_buf_ptr = (char *) data.digests_buf;
8514
8515 uint dgst_size = data.dgst_size;
8516
8517 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8518
8519 if (wpa->keyver != 1)
8520 {
8521 uint digest_tmp[4] = { 0 };
8522
8523 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8524 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8525 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8526 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8527
8528 memcpy (hccap->keymic, digest_tmp, 16);
8529 }
8530 else
8531 {
8532 memcpy (hccap->keymic, digest_ptr, 16);
8533 }
8534 }
8535
8536 void SuspendThreads ()
8537 {
8538 if (data.devices_status == STATUS_RUNNING)
8539 {
8540 hc_timer_set (&data.timer_paused);
8541
8542 data.devices_status = STATUS_PAUSED;
8543
8544 log_info ("Paused");
8545 }
8546 }
8547
8548 void ResumeThreads ()
8549 {
8550 if (data.devices_status == STATUS_PAUSED)
8551 {
8552 float ms_paused;
8553
8554 hc_timer_get (data.timer_paused, ms_paused);
8555
8556 data.ms_paused += ms_paused;
8557
8558 data.devices_status = STATUS_RUNNING;
8559
8560 log_info ("Resumed");
8561 }
8562 }
8563
8564 void bypass ()
8565 {
8566 if (data.devices_status != STATUS_RUNNING) return;
8567
8568 data.devices_status = STATUS_BYPASS;
8569
8570 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8571 }
8572
8573 void stop_at_checkpoint ()
8574 {
8575 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8576 {
8577 if (data.devices_status != STATUS_RUNNING) return;
8578 }
8579
8580 // this feature only makes sense if --restore-disable was not specified
8581
8582 if (data.restore_disable == 1)
8583 {
8584 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8585
8586 return;
8587 }
8588
8589 // check if monitoring of Restore Point updates should be enabled or disabled
8590
8591 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8592 {
8593 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8594
8595 // save the current restore point value
8596
8597 data.checkpoint_cur_words = get_lowest_words_done ();
8598
8599 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8600 }
8601 else
8602 {
8603 data.devices_status = STATUS_RUNNING;
8604
8605 // reset the global value for checkpoint checks
8606
8607 data.checkpoint_cur_words = 0;
8608
8609 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8610 }
8611 }
8612
8613 void myabort ()
8614 {
8615 if (data.devices_status == STATUS_INIT) return;
8616 if (data.devices_status == STATUS_STARTING) return;
8617
8618 data.devices_status = STATUS_ABORTED;
8619 }
8620
8621 void myquit ()
8622 {
8623 if (data.devices_status == STATUS_INIT) return;
8624 if (data.devices_status == STATUS_STARTING) return;
8625
8626 data.devices_status = STATUS_QUIT;
8627 }
8628
8629 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8630 {
8631 FILE *fp = fopen (kernel_file, "rb");
8632
8633 if (fp != NULL)
8634 {
8635 struct stat st;
8636
8637 memset (&st, 0, sizeof (st));
8638
8639 stat (kernel_file, &st);
8640
8641 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8642
8643 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8644
8645 if (num_read != (size_t) st.st_size)
8646 {
8647 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8648
8649 exit (-1);
8650 }
8651
8652 fclose (fp);
8653
8654 buf[st.st_size] = 0;
8655
8656 for (int i = 0; i < num_devices; i++)
8657 {
8658 kernel_lengths[i] = (size_t) st.st_size;
8659
8660 kernel_sources[i] = buf;
8661 }
8662 }
8663 else
8664 {
8665 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8666
8667 exit (-1);
8668 }
8669
8670 return;
8671 }
8672
8673 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8674 {
8675 FILE *fp = fopen (dst, "wb");
8676
8677 fwrite (binary, sizeof (u8), binary_size, fp);
8678
8679 fflush (fp);
8680 fclose (fp);
8681 }
8682
8683 /**
8684 * restore
8685 */
8686
8687 restore_data_t *init_restore (int argc, char **argv)
8688 {
8689 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8690
8691 if (data.restore_disable == 0)
8692 {
8693 FILE *fp = fopen (data.eff_restore_file, "rb");
8694
8695 if (fp)
8696 {
8697 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8698
8699 if (nread != 1)
8700 {
8701 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8702
8703 exit (-1);
8704 }
8705
8706 fclose (fp);
8707
8708 if (rd->pid)
8709 {
8710 char pidbin[BUFSIZ] = { 0 };
8711
8712 int pidbin_len = -1;
8713
8714 #ifdef _POSIX
8715 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8716
8717 FILE *fd = fopen (pidbin, "rb");
8718
8719 if (fd)
8720 {
8721 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8722
8723 pidbin[pidbin_len] = 0;
8724
8725 fclose (fd);
8726
8727 char *argv0_r = strrchr (argv[0], '/');
8728
8729 char *pidbin_r = strrchr (pidbin, '/');
8730
8731 if (argv0_r == NULL) argv0_r = argv[0];
8732
8733 if (pidbin_r == NULL) pidbin_r = pidbin;
8734
8735 if (strcmp (argv0_r, pidbin_r) == 0)
8736 {
8737 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8738
8739 exit (-1);
8740 }
8741 }
8742
8743 #elif _WIN
8744 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8745
8746 char pidbin2[BUFSIZ] = { 0 };
8747
8748 int pidbin2_len = -1;
8749
8750 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8751 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8752
8753 pidbin[pidbin_len] = 0;
8754 pidbin2[pidbin2_len] = 0;
8755
8756 if (pidbin2_len)
8757 {
8758 if (strcmp (pidbin, pidbin2) == 0)
8759 {
8760 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8761
8762 exit (-1);
8763 }
8764 }
8765 #endif
8766 }
8767
8768 if (rd->version_bin < RESTORE_MIN)
8769 {
8770 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8771
8772 exit (-1);
8773 }
8774 }
8775 }
8776
8777 memset (rd, 0, sizeof (restore_data_t));
8778
8779 rd->version_bin = VERSION_BIN;
8780
8781 #ifdef _POSIX
8782 rd->pid = getpid ();
8783 #elif _WIN
8784 rd->pid = GetCurrentProcessId ();
8785 #endif
8786
8787 if (getcwd (rd->cwd, 255) == NULL)
8788 {
8789 myfree (rd);
8790
8791 return (NULL);
8792 }
8793
8794 rd->argc = argc;
8795 rd->argv = argv;
8796
8797 return (rd);
8798 }
8799
8800 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8801 {
8802 FILE *fp = fopen (eff_restore_file, "rb");
8803
8804 if (fp == NULL)
8805 {
8806 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8807
8808 exit (-1);
8809 }
8810
8811 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8812 {
8813 log_error ("ERROR: cannot read %s", eff_restore_file);
8814
8815 exit (-1);
8816 }
8817
8818 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8819
8820 for (uint i = 0; i < rd->argc; i++)
8821 {
8822 char buf[BUFSIZ] = { 0 };
8823
8824 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8825 {
8826 log_error ("ERROR: cannot read %s", eff_restore_file);
8827
8828 exit (-1);
8829 }
8830
8831 size_t len = strlen (buf);
8832
8833 if (len) buf[len - 1] = 0;
8834
8835 rd->argv[i] = mystrdup (buf);
8836 }
8837
8838 fclose (fp);
8839
8840 char new_cwd[1024] = { 0 };
8841
8842 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8843
8844 if (nwd == NULL)
8845 {
8846 log_error ("Restore file is corrupted");
8847 }
8848
8849 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8850 {
8851 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8852 {
8853 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8854
8855 exit (-1);
8856 }
8857
8858 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8859 }
8860
8861 if (chdir (rd->cwd))
8862 {
8863 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8864
8865 exit (-1);
8866 }
8867 }
8868
8869 u64 get_lowest_words_done ()
8870 {
8871 u64 words_cur = -1;
8872
8873 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8874 {
8875 hc_device_param_t *device_param = &data.devices_param[device_id];
8876
8877 if (device_param->skipped) continue;
8878
8879 const u64 words_done = device_param->words_done;
8880
8881 if (words_done < words_cur) words_cur = words_done;
8882 }
8883
8884 // It's possible that a device's workload isn't finished right after a restore-case.
8885 // In that case, this function would return 0 and overwrite the real restore point
8886 // There's also data.words_cur which is set to rd->words_cur but it changes while
8887 // the attack is running therefore we should stick to rd->words_cur.
8888 // Note that -s influences rd->words_cur we should keep a close look on that.
8889
8890 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8891
8892 return words_cur;
8893 }
8894
8895 void write_restore (const char *new_restore_file, restore_data_t *rd)
8896 {
8897 u64 words_cur = get_lowest_words_done ();
8898
8899 rd->words_cur = words_cur;
8900
8901 FILE *fp = fopen (new_restore_file, "wb");
8902
8903 if (fp == NULL)
8904 {
8905 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8906
8907 exit (-1);
8908 }
8909
8910 if (setvbuf (fp, NULL, _IONBF, 0))
8911 {
8912 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8913
8914 exit (-1);
8915 }
8916
8917 fwrite (rd, sizeof (restore_data_t), 1, fp);
8918
8919 for (uint i = 0; i < rd->argc; i++)
8920 {
8921 fprintf (fp, "%s", rd->argv[i]);
8922 fputc ('\n', fp);
8923 }
8924
8925 fflush (fp);
8926
8927 fsync (fileno (fp));
8928
8929 fclose (fp);
8930 }
8931
8932 void cycle_restore ()
8933 {
8934 const char *eff_restore_file = data.eff_restore_file;
8935 const char *new_restore_file = data.new_restore_file;
8936
8937 restore_data_t *rd = data.rd;
8938
8939 write_restore (new_restore_file, rd);
8940
8941 struct stat st;
8942
8943 memset (&st, 0, sizeof(st));
8944
8945 if (stat (eff_restore_file, &st) == 0)
8946 {
8947 if (unlink (eff_restore_file))
8948 {
8949 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8950 }
8951 }
8952
8953 if (rename (new_restore_file, eff_restore_file))
8954 {
8955 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8956 }
8957 }
8958
8959 void check_checkpoint ()
8960 {
8961 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8962
8963 u64 words_cur = get_lowest_words_done ();
8964
8965 if (words_cur != data.checkpoint_cur_words)
8966 {
8967 myabort ();
8968 }
8969 }
8970
8971 /**
8972 * adjustments
8973 */
8974
8975 uint set_kernel_accel (uint hash_mode)
8976 {
8977 switch (hash_mode)
8978 {
8979 case 0: return GET_ACCEL (0);
8980 case 10: return GET_ACCEL (10);
8981 case 11: return GET_ACCEL (11);
8982 case 12: return GET_ACCEL (12);
8983 case 20: return GET_ACCEL (20);
8984 case 21: return GET_ACCEL (21);
8985 case 22: return GET_ACCEL (22);
8986 case 23: return GET_ACCEL (23);
8987 case 30: return GET_ACCEL (30);
8988 case 40: return GET_ACCEL (40);
8989 case 50: return GET_ACCEL (50);
8990 case 60: return GET_ACCEL (60);
8991 case 100: return GET_ACCEL (100);
8992 case 101: return GET_ACCEL (101);
8993 case 110: return GET_ACCEL (110);
8994 case 111: return GET_ACCEL (111);
8995 case 112: return GET_ACCEL (112);
8996 case 120: return GET_ACCEL (120);
8997 case 121: return GET_ACCEL (121);
8998 case 122: return GET_ACCEL (122);
8999 case 124: return GET_ACCEL (124);
9000 case 130: return GET_ACCEL (130);
9001 case 131: return GET_ACCEL (131);
9002 case 132: return GET_ACCEL (132);
9003 case 133: return GET_ACCEL (133);
9004 case 140: return GET_ACCEL (140);
9005 case 141: return GET_ACCEL (141);
9006 case 150: return GET_ACCEL (150);
9007 case 160: return GET_ACCEL (160);
9008 case 190: return GET_ACCEL (190);
9009 case 200: return GET_ACCEL (200);
9010 case 300: return GET_ACCEL (300);
9011 case 400: return GET_ACCEL (400);
9012 case 500: return GET_ACCEL (500);
9013 case 501: return GET_ACCEL (501);
9014 case 900: return GET_ACCEL (900);
9015 case 910: return GET_ACCEL (910);
9016 case 1000: return GET_ACCEL (1000);
9017 case 1100: return GET_ACCEL (1100);
9018 case 1400: return GET_ACCEL (1400);
9019 case 1410: return GET_ACCEL (1410);
9020 case 1420: return GET_ACCEL (1420);
9021 case 1421: return GET_ACCEL (1421);
9022 case 1430: return GET_ACCEL (1430);
9023 case 1440: return GET_ACCEL (1440);
9024 case 1441: return GET_ACCEL (1441);
9025 case 1450: return GET_ACCEL (1450);
9026 case 1460: return GET_ACCEL (1460);
9027 case 1500: return GET_ACCEL (1500);
9028 case 1600: return GET_ACCEL (1600);
9029 case 1700: return GET_ACCEL (1700);
9030 case 1710: return GET_ACCEL (1710);
9031 case 1711: return GET_ACCEL (1711);
9032 case 1720: return GET_ACCEL (1720);
9033 case 1722: return GET_ACCEL (1722);
9034 case 1730: return GET_ACCEL (1730);
9035 case 1731: return GET_ACCEL (1731);
9036 case 1740: return GET_ACCEL (1740);
9037 case 1750: return GET_ACCEL (1750);
9038 case 1760: return GET_ACCEL (1760);
9039 case 1800: return GET_ACCEL (1800);
9040 case 2100: return GET_ACCEL (2100);
9041 case 2400: return GET_ACCEL (2400);
9042 case 2410: return GET_ACCEL (2410);
9043 case 2500: return GET_ACCEL (2500);
9044 case 2600: return GET_ACCEL (2600);
9045 case 2611: return GET_ACCEL (2611);
9046 case 2612: return GET_ACCEL (2612);
9047 case 2711: return GET_ACCEL (2711);
9048 case 2811: return GET_ACCEL (2811);
9049 case 3000: return GET_ACCEL (3000);
9050 case 3100: return GET_ACCEL (3100);
9051 case 3200: return GET_ACCEL (3200);
9052 case 3710: return GET_ACCEL (3710);
9053 case 3711: return GET_ACCEL (3711);
9054 case 3800: return GET_ACCEL (3800);
9055 case 4300: return GET_ACCEL (4300);
9056 case 4400: return GET_ACCEL (4400);
9057 case 4500: return GET_ACCEL (4500);
9058 case 4700: return GET_ACCEL (4700);
9059 case 4800: return GET_ACCEL (4800);
9060 case 4900: return GET_ACCEL (4900);
9061 case 5000: return GET_ACCEL (5000);
9062 case 5100: return GET_ACCEL (5100);
9063 case 5200: return GET_ACCEL (5200);
9064 case 5300: return GET_ACCEL (5300);
9065 case 5400: return GET_ACCEL (5400);
9066 case 5500: return GET_ACCEL (5500);
9067 case 5600: return GET_ACCEL (5600);
9068 case 5700: return GET_ACCEL (5700);
9069 case 5800: return GET_ACCEL (5800);
9070 case 6000: return GET_ACCEL (6000);
9071 case 6100: return GET_ACCEL (6100);
9072 case 6211: return GET_ACCEL (6211);
9073 case 6212: return GET_ACCEL (6212);
9074 case 6213: return GET_ACCEL (6213);
9075 case 6221: return GET_ACCEL (6221);
9076 case 6222: return GET_ACCEL (6222);
9077 case 6223: return GET_ACCEL (6223);
9078 case 6231: return GET_ACCEL (6231);
9079 case 6232: return GET_ACCEL (6232);
9080 case 6233: return GET_ACCEL (6233);
9081 case 6241: return GET_ACCEL (6241);
9082 case 6242: return GET_ACCEL (6242);
9083 case 6243: return GET_ACCEL (6243);
9084 case 6300: return GET_ACCEL (6300);
9085 case 6400: return GET_ACCEL (6400);
9086 case 6500: return GET_ACCEL (6500);
9087 case 6600: return GET_ACCEL (6600);
9088 case 6700: return GET_ACCEL (6700);
9089 case 6800: return GET_ACCEL (6800);
9090 case 6900: return GET_ACCEL (6900);
9091 case 7100: return GET_ACCEL (7100);
9092 case 7200: return GET_ACCEL (7200);
9093 case 7300: return GET_ACCEL (7300);
9094 case 7400: return GET_ACCEL (7400);
9095 case 7500: return GET_ACCEL (7500);
9096 case 7600: return GET_ACCEL (7600);
9097 case 7700: return GET_ACCEL (7700);
9098 case 7800: return GET_ACCEL (7800);
9099 case 7900: return GET_ACCEL (7900);
9100 case 8000: return GET_ACCEL (8000);
9101 case 8100: return GET_ACCEL (8100);
9102 case 8200: return GET_ACCEL (8200);
9103 case 8300: return GET_ACCEL (8300);
9104 case 8400: return GET_ACCEL (8400);
9105 case 8500: return GET_ACCEL (8500);
9106 case 8600: return GET_ACCEL (8600);
9107 case 8700: return GET_ACCEL (8700);
9108 case 8800: return GET_ACCEL (8800);
9109 case 8900: return GET_ACCEL (8900);
9110 case 9000: return GET_ACCEL (9000);
9111 case 9100: return GET_ACCEL (9100);
9112 case 9200: return GET_ACCEL (9200);
9113 case 9300: return GET_ACCEL (9300);
9114 case 9400: return GET_ACCEL (9400);
9115 case 9500: return GET_ACCEL (9500);
9116 case 9600: return GET_ACCEL (9600);
9117 case 9700: return GET_ACCEL (9700);
9118 case 9710: return GET_ACCEL (9710);
9119 case 9720: return GET_ACCEL (9720);
9120 case 9800: return GET_ACCEL (9800);
9121 case 9810: return GET_ACCEL (9810);
9122 case 9820: return GET_ACCEL (9820);
9123 case 9900: return GET_ACCEL (9900);
9124 case 10000: return GET_ACCEL (10000);
9125 case 10100: return GET_ACCEL (10100);
9126 case 10200: return GET_ACCEL (10200);
9127 case 10300: return GET_ACCEL (10300);
9128 case 10400: return GET_ACCEL (10400);
9129 case 10410: return GET_ACCEL (10410);
9130 case 10420: return GET_ACCEL (10420);
9131 case 10500: return GET_ACCEL (10500);
9132 case 10600: return GET_ACCEL (10600);
9133 case 10700: return GET_ACCEL (10700);
9134 case 10800: return GET_ACCEL (10800);
9135 case 10900: return GET_ACCEL (10900);
9136 case 11000: return GET_ACCEL (11000);
9137 case 11100: return GET_ACCEL (11100);
9138 case 11200: return GET_ACCEL (11200);
9139 case 11300: return GET_ACCEL (11300);
9140 case 11400: return GET_ACCEL (11400);
9141 case 11500: return GET_ACCEL (11500);
9142 case 11600: return GET_ACCEL (11600);
9143 case 11700: return GET_ACCEL (11700);
9144 case 11800: return GET_ACCEL (11800);
9145 case 11900: return GET_ACCEL (11900);
9146 case 12000: return GET_ACCEL (12000);
9147 case 12100: return GET_ACCEL (12100);
9148 case 12200: return GET_ACCEL (12200);
9149 case 12300: return GET_ACCEL (12300);
9150 case 12400: return GET_ACCEL (12400);
9151 case 12500: return GET_ACCEL (12500);
9152 case 12600: return GET_ACCEL (12600);
9153 case 12700: return GET_ACCEL (12700);
9154 case 12800: return GET_ACCEL (12800);
9155 case 12900: return GET_ACCEL (12900);
9156 case 13000: return GET_ACCEL (13000);
9157 }
9158
9159 return 0;
9160 }
9161
9162 uint set_kernel_loops (uint hash_mode)
9163 {
9164 switch (hash_mode)
9165 {
9166 case 0: return GET_LOOPS (0);
9167 case 10: return GET_LOOPS (10);
9168 case 11: return GET_LOOPS (11);
9169 case 12: return GET_LOOPS (12);
9170 case 20: return GET_LOOPS (20);
9171 case 21: return GET_LOOPS (21);
9172 case 22: return GET_LOOPS (22);
9173 case 23: return GET_LOOPS (23);
9174 case 30: return GET_LOOPS (30);
9175 case 40: return GET_LOOPS (40);
9176 case 50: return GET_LOOPS (50);
9177 case 60: return GET_LOOPS (60);
9178 case 100: return GET_LOOPS (100);
9179 case 101: return GET_LOOPS (101);
9180 case 110: return GET_LOOPS (110);
9181 case 111: return GET_LOOPS (111);
9182 case 112: return GET_LOOPS (112);
9183 case 120: return GET_LOOPS (120);
9184 case 121: return GET_LOOPS (121);
9185 case 122: return GET_LOOPS (122);
9186 case 124: return GET_LOOPS (124);
9187 case 130: return GET_LOOPS (130);
9188 case 131: return GET_LOOPS (131);
9189 case 132: return GET_LOOPS (132);
9190 case 133: return GET_LOOPS (133);
9191 case 140: return GET_LOOPS (140);
9192 case 141: return GET_LOOPS (141);
9193 case 150: return GET_LOOPS (150);
9194 case 160: return GET_LOOPS (160);
9195 case 190: return GET_LOOPS (190);
9196 case 200: return GET_LOOPS (200);
9197 case 300: return GET_LOOPS (300);
9198 case 400: return GET_LOOPS (400);
9199 case 500: return GET_LOOPS (500);
9200 case 501: return GET_LOOPS (501);
9201 case 900: return GET_LOOPS (900);
9202 case 910: return GET_LOOPS (910);
9203 case 1000: return GET_LOOPS (1000);
9204 case 1100: return GET_LOOPS (1100);
9205 case 1400: return GET_LOOPS (1400);
9206 case 1410: return GET_LOOPS (1410);
9207 case 1420: return GET_LOOPS (1420);
9208 case 1421: return GET_LOOPS (1421);
9209 case 1430: return GET_LOOPS (1430);
9210 case 1440: return GET_LOOPS (1440);
9211 case 1441: return GET_LOOPS (1441);
9212 case 1450: return GET_LOOPS (1450);
9213 case 1460: return GET_LOOPS (1460);
9214 case 1500: return GET_LOOPS (1500);
9215 case 1600: return GET_LOOPS (1600);
9216 case 1700: return GET_LOOPS (1700);
9217 case 1710: return GET_LOOPS (1710);
9218 case 1711: return GET_LOOPS (1711);
9219 case 1720: return GET_LOOPS (1720);
9220 case 1722: return GET_LOOPS (1722);
9221 case 1730: return GET_LOOPS (1730);
9222 case 1731: return GET_LOOPS (1731);
9223 case 1740: return GET_LOOPS (1740);
9224 case 1750: return GET_LOOPS (1750);
9225 case 1760: return GET_LOOPS (1760);
9226 case 1800: return GET_LOOPS (1800);
9227 case 2100: return GET_LOOPS (2100);
9228 case 2400: return GET_LOOPS (2400);
9229 case 2410: return GET_LOOPS (2410);
9230 case 2500: return GET_LOOPS (2500);
9231 case 2600: return GET_LOOPS (2600);
9232 case 2611: return GET_LOOPS (2611);
9233 case 2612: return GET_LOOPS (2612);
9234 case 2711: return GET_LOOPS (2711);
9235 case 2811: return GET_LOOPS (2811);
9236 case 3000: return GET_LOOPS (3000);
9237 case 3100: return GET_LOOPS (3100);
9238 case 3200: return GET_LOOPS (3200);
9239 case 3710: return GET_LOOPS (3710);
9240 case 3711: return GET_LOOPS (3711);
9241 case 3800: return GET_LOOPS (3800);
9242 case 4300: return GET_LOOPS (4300);
9243 case 4400: return GET_LOOPS (4400);
9244 case 4500: return GET_LOOPS (4500);
9245 case 4700: return GET_LOOPS (4700);
9246 case 4800: return GET_LOOPS (4800);
9247 case 4900: return GET_LOOPS (4900);
9248 case 5000: return GET_LOOPS (5000);
9249 case 5100: return GET_LOOPS (5100);
9250 case 5200: return GET_LOOPS (5200);
9251 case 5300: return GET_LOOPS (5300);
9252 case 5400: return GET_LOOPS (5400);
9253 case 5500: return GET_LOOPS (5500);
9254 case 5600: return GET_LOOPS (5600);
9255 case 5700: return GET_LOOPS (5700);
9256 case 5800: return GET_LOOPS (5800);
9257 case 6000: return GET_LOOPS (6000);
9258 case 6100: return GET_LOOPS (6100);
9259 case 6211: return GET_LOOPS (6211);
9260 case 6212: return GET_LOOPS (6212);
9261 case 6213: return GET_LOOPS (6213);
9262 case 6221: return GET_LOOPS (6221);
9263 case 6222: return GET_LOOPS (6222);
9264 case 6223: return GET_LOOPS (6223);
9265 case 6231: return GET_LOOPS (6231);
9266 case 6232: return GET_LOOPS (6232);
9267 case 6233: return GET_LOOPS (6233);
9268 case 6241: return GET_LOOPS (6241);
9269 case 6242: return GET_LOOPS (6242);
9270 case 6243: return GET_LOOPS (6243);
9271 case 6300: return GET_LOOPS (6300);
9272 case 6400: return GET_LOOPS (6400);
9273 case 6500: return GET_LOOPS (6500);
9274 case 6600: return GET_LOOPS (6600);
9275 case 6700: return GET_LOOPS (6700);
9276 case 6800: return GET_LOOPS (6800);
9277 case 6900: return GET_LOOPS (6900);
9278 case 7100: return GET_LOOPS (7100);
9279 case 7200: return GET_LOOPS (7200);
9280 case 7300: return GET_LOOPS (7300);
9281 case 7400: return GET_LOOPS (7400);
9282 case 7500: return GET_LOOPS (7500);
9283 case 7600: return GET_LOOPS (7600);
9284 case 7700: return GET_LOOPS (7700);
9285 case 7800: return GET_LOOPS (7800);
9286 case 7900: return GET_LOOPS (7900);
9287 case 8000: return GET_LOOPS (8000);
9288 case 8100: return GET_LOOPS (8100);
9289 case 8200: return GET_LOOPS (8200);
9290 case 8300: return GET_LOOPS (8300);
9291 case 8400: return GET_LOOPS (8400);
9292 case 8500: return GET_LOOPS (8500);
9293 case 8600: return GET_LOOPS (8600);
9294 case 8700: return GET_LOOPS (8700);
9295 case 8800: return GET_LOOPS (8800);
9296 case 8900: return GET_LOOPS (8900);
9297 case 9000: return GET_LOOPS (9000);
9298 case 9100: return GET_LOOPS (9100);
9299 case 9200: return GET_LOOPS (9200);
9300 case 9300: return GET_LOOPS (9300);
9301 case 9400: return GET_LOOPS (9400);
9302 case 9500: return GET_LOOPS (9500);
9303 case 9600: return GET_LOOPS (9600);
9304 case 9700: return GET_LOOPS (9700);
9305 case 9710: return GET_LOOPS (9710);
9306 case 9720: return GET_LOOPS (9720);
9307 case 9800: return GET_LOOPS (9800);
9308 case 9810: return GET_LOOPS (9810);
9309 case 9820: return GET_LOOPS (9820);
9310 case 9900: return GET_LOOPS (9900);
9311 case 10000: return GET_LOOPS (10000);
9312 case 10100: return GET_LOOPS (10100);
9313 case 10200: return GET_LOOPS (10200);
9314 case 10300: return GET_LOOPS (10300);
9315 case 10400: return GET_LOOPS (10400);
9316 case 10410: return GET_LOOPS (10410);
9317 case 10420: return GET_LOOPS (10420);
9318 case 10500: return GET_LOOPS (10500);
9319 case 10600: return GET_LOOPS (10600);
9320 case 10700: return GET_LOOPS (10700);
9321 case 10800: return GET_LOOPS (10800);
9322 case 10900: return GET_LOOPS (10900);
9323 case 11000: return GET_LOOPS (11000);
9324 case 11100: return GET_LOOPS (11100);
9325 case 11200: return GET_LOOPS (11200);
9326 case 11300: return GET_LOOPS (11300);
9327 case 11400: return GET_LOOPS (11400);
9328 case 11500: return GET_LOOPS (11500);
9329 case 11600: return GET_LOOPS (11600);
9330 case 11700: return GET_LOOPS (11700);
9331 case 11800: return GET_LOOPS (11800);
9332 case 11900: return GET_LOOPS (11900);
9333 case 12000: return GET_LOOPS (12000);
9334 case 12100: return GET_LOOPS (12100);
9335 case 12200: return GET_LOOPS (12200);
9336 case 12300: return GET_LOOPS (12300);
9337 case 12400: return GET_LOOPS (12400);
9338 case 12500: return GET_LOOPS (12500);
9339 case 12600: return GET_LOOPS (12600);
9340 case 12700: return GET_LOOPS (12700);
9341 case 12800: return GET_LOOPS (12800);
9342 case 12900: return GET_LOOPS (12900);
9343 case 13000: return GET_LOOPS (13000);
9344 }
9345
9346 return 0;
9347 }
9348
9349 /**
9350 * parser
9351 */
9352
9353 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9354 {
9355 u8 tmp[256] = { 0 };
9356
9357 if (salt_len > sizeof (tmp))
9358 {
9359 return UINT_MAX;
9360 }
9361
9362 memcpy (tmp, in, salt_len);
9363
9364 if (data.opts_type & OPTS_TYPE_ST_HEX)
9365 {
9366 if ((salt_len % 2) == 0)
9367 {
9368 u32 new_salt_len = salt_len / 2;
9369
9370 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9371 {
9372 u8 p0 = tmp[j + 0];
9373 u8 p1 = tmp[j + 1];
9374
9375 tmp[i] = hex_convert (p1) << 0;
9376 tmp[i] |= hex_convert (p0) << 4;
9377 }
9378
9379 salt_len = new_salt_len;
9380 }
9381 else
9382 {
9383 return UINT_MAX;
9384 }
9385 }
9386 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9387 {
9388 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9389 }
9390
9391 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9392
9393 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9394 {
9395 if (salt_len < 20)
9396 {
9397 u32 *tmp_uint = (u32 *) tmp;
9398
9399 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9400 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9401 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9402 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9403 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9404 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9405 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9406 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9407 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9408 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9409
9410 salt_len = salt_len * 2;
9411 }
9412 else
9413 {
9414 return UINT_MAX;
9415 }
9416 }
9417
9418 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9419 {
9420 lowercase (tmp, salt_len);
9421 }
9422
9423 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9424 {
9425 uppercase (tmp, salt_len);
9426 }
9427
9428 u32 len = salt_len;
9429
9430 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9431 {
9432 tmp[len++] = 0x80;
9433 }
9434
9435 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9436 {
9437 tmp[len++] = 0x01;
9438 }
9439
9440 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9441 {
9442 u32 *tmp_uint = (uint *) tmp;
9443
9444 u32 max = len / 4;
9445
9446 if (len % 4) max++;
9447
9448 for (u32 i = 0; i < max; i++)
9449 {
9450 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9451 }
9452
9453 // Important: we may need to increase the length of memcpy since
9454 // we don't want to "loose" some swapped bytes (could happen if
9455 // they do not perfectly fit in the 4-byte blocks)
9456 // Memcpy does always copy the bytes in the BE order, but since
9457 // we swapped them, some important bytes could be in positions
9458 // we normally skip with the original len
9459
9460 if (len % 4) len += 4 - (len % 4);
9461 }
9462
9463 memcpy (out, tmp, len);
9464
9465 return (salt_len);
9466 }
9467
9468 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9469 {
9470 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9471
9472 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9473
9474 u32 *digest = (u32 *) hash_buf->digest;
9475
9476 salt_t *salt = hash_buf->salt;
9477
9478 memcpy ((char *) salt->salt_sign, input_buf, 6);
9479
9480 char *iter_pos = input_buf + 4;
9481
9482 salt->salt_iter = 1 << atoi (iter_pos);
9483
9484 char *salt_pos = strchr (iter_pos, '$');
9485
9486 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9487
9488 salt_pos++;
9489
9490 uint salt_len = 16;
9491
9492 salt->salt_len = salt_len;
9493
9494 u8 tmp_buf[100] = { 0 };
9495
9496 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9497
9498 char *salt_buf_ptr = (char *) salt->salt_buf;
9499
9500 memcpy (salt_buf_ptr, tmp_buf, 16);
9501
9502 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9503 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9504 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9505 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9506
9507 char *hash_pos = salt_pos + 22;
9508
9509 memset (tmp_buf, 0, sizeof (tmp_buf));
9510
9511 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9512
9513 memcpy (digest, tmp_buf, 24);
9514
9515 digest[0] = byte_swap_32 (digest[0]);
9516 digest[1] = byte_swap_32 (digest[1]);
9517 digest[2] = byte_swap_32 (digest[2]);
9518 digest[3] = byte_swap_32 (digest[3]);
9519 digest[4] = byte_swap_32 (digest[4]);
9520 digest[5] = byte_swap_32 (digest[5]);
9521
9522 digest[5] &= ~0xff; // its just 23 not 24 !
9523
9524 return (PARSER_OK);
9525 }
9526
9527 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9528 {
9529 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9530
9531 u32 *digest = (u32 *) hash_buf->digest;
9532
9533 u8 tmp_buf[100] = { 0 };
9534
9535 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9536
9537 memcpy (digest, tmp_buf, 32);
9538
9539 digest[0] = byte_swap_32 (digest[0]);
9540 digest[1] = byte_swap_32 (digest[1]);
9541 digest[2] = byte_swap_32 (digest[2]);
9542 digest[3] = byte_swap_32 (digest[3]);
9543 digest[4] = byte_swap_32 (digest[4]);
9544 digest[5] = byte_swap_32 (digest[5]);
9545 digest[6] = byte_swap_32 (digest[6]);
9546 digest[7] = byte_swap_32 (digest[7]);
9547
9548 digest[0] -= SHA256M_A;
9549 digest[1] -= SHA256M_B;
9550 digest[2] -= SHA256M_C;
9551 digest[3] -= SHA256M_D;
9552 digest[4] -= SHA256M_E;
9553 digest[5] -= SHA256M_F;
9554 digest[6] -= SHA256M_G;
9555 digest[7] -= SHA256M_H;
9556
9557 return (PARSER_OK);
9558 }
9559
9560 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9561 {
9562 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9563
9564 u32 *digest = (u32 *) hash_buf->digest;
9565
9566 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9567 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9568
9569 digest[0] = byte_swap_32 (digest[0]);
9570 digest[1] = byte_swap_32 (digest[1]);
9571
9572 uint tt;
9573
9574 IP (digest[0], digest[1], tt);
9575
9576 digest[0] = digest[0];
9577 digest[1] = digest[1];
9578 digest[2] = 0;
9579 digest[3] = 0;
9580
9581 return (PARSER_OK);
9582 }
9583
9584 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9585 {
9586 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9587
9588 u32 *digest = (u32 *) hash_buf->digest;
9589
9590 salt_t *salt = hash_buf->salt;
9591
9592 char *hash_pos = input_buf + 8;
9593
9594 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9595 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9596 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9597 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9598 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9599
9600 digest[0] -= SHA1M_A;
9601 digest[1] -= SHA1M_B;
9602 digest[2] -= SHA1M_C;
9603 digest[3] -= SHA1M_D;
9604 digest[4] -= SHA1M_E;
9605
9606 uint salt_len = 8;
9607
9608 char *salt_buf_ptr = (char *) salt->salt_buf;
9609
9610 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9611
9612 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9613
9614 salt->salt_len = salt_len;
9615
9616 return (PARSER_OK);
9617 }
9618
9619 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9620 {
9621 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9622
9623 u64 *digest = (u64 *) hash_buf->digest;
9624
9625 salt_t *salt = hash_buf->salt;
9626
9627 char *hash_pos = input_buf + 8;
9628
9629 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9630 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9631 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9632 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9633 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9634 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9635 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9636 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9637
9638 digest[0] -= SHA512M_A;
9639 digest[1] -= SHA512M_B;
9640 digest[2] -= SHA512M_C;
9641 digest[3] -= SHA512M_D;
9642 digest[4] -= SHA512M_E;
9643 digest[5] -= SHA512M_F;
9644 digest[6] -= SHA512M_G;
9645 digest[7] -= SHA512M_H;
9646
9647 uint salt_len = 8;
9648
9649 char *salt_buf_ptr = (char *) salt->salt_buf;
9650
9651 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9652
9653 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9654
9655 salt->salt_len = salt_len;
9656
9657 return (PARSER_OK);
9658 }
9659
9660 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9661 {
9662 if (data.opts_type & OPTS_TYPE_ST_HEX)
9663 {
9664 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9665 }
9666 else
9667 {
9668 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9669 }
9670
9671 u32 *digest = (u32 *) hash_buf->digest;
9672
9673 salt_t *salt = hash_buf->salt;
9674
9675 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9676 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9677 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9678 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9679
9680 digest[0] = byte_swap_32 (digest[0]);
9681 digest[1] = byte_swap_32 (digest[1]);
9682 digest[2] = byte_swap_32 (digest[2]);
9683 digest[3] = byte_swap_32 (digest[3]);
9684
9685 digest[0] -= MD5M_A;
9686 digest[1] -= MD5M_B;
9687 digest[2] -= MD5M_C;
9688 digest[3] -= MD5M_D;
9689
9690 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9691
9692 uint salt_len = input_len - 32 - 1;
9693
9694 char *salt_buf = input_buf + 32 + 1;
9695
9696 char *salt_buf_ptr = (char *) salt->salt_buf;
9697
9698 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9699
9700 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9701
9702 salt->salt_len = salt_len;
9703
9704 return (PARSER_OK);
9705 }
9706
9707 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9708 {
9709 if (data.opts_type & OPTS_TYPE_ST_HEX)
9710 {
9711 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9712 }
9713 else
9714 {
9715 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9716 }
9717
9718 // unscramble
9719
9720 char clean_input_buf[32] = { 0 };
9721
9722 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9723 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9724
9725 for (int i = 0, j = 0, k = 0; i < 30; i++)
9726 {
9727 if (i == pos[j])
9728 {
9729 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9730
9731 j++;
9732 }
9733 else
9734 {
9735 clean_input_buf[k] = input_buf[i];
9736
9737 k++;
9738 }
9739 }
9740
9741 // base64 decode
9742
9743 u32 *digest = (u32 *) hash_buf->digest;
9744
9745 salt_t *salt = hash_buf->salt;
9746
9747 u32 a, b, c, d, e, f;
9748
9749 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9750 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9751 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9752 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9753 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9754 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9755
9756 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9757 | (((d << 12) | (e << 6) | (f)) << 0);
9758
9759 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9760 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9761 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9762 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9763 e = base64_to_int (clean_input_buf[10] & 0x7f);
9764 f = base64_to_int (clean_input_buf[11] & 0x7f);
9765
9766 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9767 | (((d << 12) | (e << 6) | (f)) << 0);
9768
9769 a = base64_to_int (clean_input_buf[12] & 0x7f);
9770 b = base64_to_int (clean_input_buf[13] & 0x7f);
9771 c = base64_to_int (clean_input_buf[14] & 0x7f);
9772 d = base64_to_int (clean_input_buf[15] & 0x7f);
9773 e = base64_to_int (clean_input_buf[16] & 0x7f);
9774 f = base64_to_int (clean_input_buf[17] & 0x7f);
9775
9776 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9777 | (((d << 12) | (e << 6) | (f)) << 0);
9778
9779 a = base64_to_int (clean_input_buf[18] & 0x7f);
9780 b = base64_to_int (clean_input_buf[19] & 0x7f);
9781 c = base64_to_int (clean_input_buf[20] & 0x7f);
9782 d = base64_to_int (clean_input_buf[21] & 0x7f);
9783 e = base64_to_int (clean_input_buf[22] & 0x7f);
9784 f = base64_to_int (clean_input_buf[23] & 0x7f);
9785
9786 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9787 | (((d << 12) | (e << 6) | (f)) << 0);
9788
9789 digest[0] = byte_swap_32 (digest[0]);
9790 digest[1] = byte_swap_32 (digest[1]);
9791 digest[2] = byte_swap_32 (digest[2]);
9792 digest[3] = byte_swap_32 (digest[3]);
9793
9794 digest[0] -= MD5M_A;
9795 digest[1] -= MD5M_B;
9796 digest[2] -= MD5M_C;
9797 digest[3] -= MD5M_D;
9798
9799 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9800
9801 uint salt_len = input_len - 30 - 1;
9802
9803 char *salt_buf = input_buf + 30 + 1;
9804
9805 char *salt_buf_ptr = (char *) salt->salt_buf;
9806
9807 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9808
9809 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9810 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9811
9812 salt->salt_len = salt_len;
9813
9814 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9815
9816 salt->salt_len += 22;
9817
9818 return (PARSER_OK);
9819 }
9820
9821 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9822 {
9823 if (data.opts_type & OPTS_TYPE_ST_HEX)
9824 {
9825 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9826 }
9827 else
9828 {
9829 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9830 }
9831
9832 u32 *digest = (u32 *) hash_buf->digest;
9833
9834 salt_t *salt = hash_buf->salt;
9835
9836 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9837 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9838 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9839 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9840 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
9841
9842 digest[0] -= SHA1M_A;
9843 digest[1] -= SHA1M_B;
9844 digest[2] -= SHA1M_C;
9845 digest[3] -= SHA1M_D;
9846 digest[4] -= SHA1M_E;
9847
9848 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9849
9850 uint salt_len = input_len - 40 - 1;
9851
9852 char *salt_buf = input_buf + 40 + 1;
9853
9854 char *salt_buf_ptr = (char *) salt->salt_buf;
9855
9856 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9857
9858 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9859
9860 salt->salt_len = salt_len;
9861
9862 return (PARSER_OK);
9863 }
9864
9865 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9866 {
9867 if (data.opts_type & OPTS_TYPE_ST_HEX)
9868 {
9869 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9870 }
9871 else
9872 {
9873 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9874 }
9875
9876 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9877
9878 char *iter_pos = input_buf + 6;
9879
9880 salt_t *salt = hash_buf->salt;
9881
9882 uint iter = atoi (iter_pos);
9883
9884 if (iter < 1)
9885 {
9886 iter = ROUNDS_DCC2;
9887 }
9888
9889 salt->salt_iter = iter - 1;
9890
9891 char *salt_pos = strchr (iter_pos, '#');
9892
9893 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9894
9895 salt_pos++;
9896
9897 char *digest_pos = strchr (salt_pos, '#');
9898
9899 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9900
9901 digest_pos++;
9902
9903 uint salt_len = digest_pos - salt_pos - 1;
9904
9905 u32 *digest = (u32 *) hash_buf->digest;
9906
9907 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
9908 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
9909 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
9910 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
9911
9912 char *salt_buf_ptr = (char *) salt->salt_buf;
9913
9914 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9915
9916 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9917
9918 salt->salt_len = salt_len;
9919
9920 return (PARSER_OK);
9921 }
9922
9923 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9924 {
9925 u32 *digest = (u32 *) hash_buf->digest;
9926
9927 salt_t *salt = hash_buf->salt;
9928
9929 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9930
9931 hccap_t in;
9932
9933 memcpy (&in, input_buf, input_len);
9934
9935 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9936
9937 memcpy (digest, in.keymic, 16);
9938
9939 /*
9940 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9941 The phrase "Pairwise key expansion"
9942 Access Point Address (referred to as Authenticator Address AA)
9943 Supplicant Address (referred to as Supplicant Address SA)
9944 Access Point Nonce (referred to as Authenticator Anonce)
9945 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9946 */
9947
9948 uint salt_len = strlen (in.essid);
9949
9950 memcpy (salt->salt_buf, in.essid, salt_len);
9951
9952 salt->salt_len = salt_len;
9953
9954 salt->salt_iter = ROUNDS_WPA2 - 1;
9955
9956 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9957
9958 memcpy (pke_ptr, "Pairwise key expansion", 23);
9959
9960 if (memcmp (in.mac1, in.mac2, 6) < 0)
9961 {
9962 memcpy (pke_ptr + 23, in.mac1, 6);
9963 memcpy (pke_ptr + 29, in.mac2, 6);
9964 }
9965 else
9966 {
9967 memcpy (pke_ptr + 23, in.mac2, 6);
9968 memcpy (pke_ptr + 29, in.mac1, 6);
9969 }
9970
9971 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9972 {
9973 memcpy (pke_ptr + 35, in.nonce1, 32);
9974 memcpy (pke_ptr + 67, in.nonce2, 32);
9975 }
9976 else
9977 {
9978 memcpy (pke_ptr + 35, in.nonce2, 32);
9979 memcpy (pke_ptr + 67, in.nonce1, 32);
9980 }
9981
9982 for (int i = 0; i < 25; i++)
9983 {
9984 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9985 }
9986
9987 wpa->keyver = in.keyver;
9988
9989 if (wpa->keyver > 255)
9990 {
9991 log_info ("ATTENTION!");
9992 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9993 log_info (" This could be due to a recent aircrack-ng bug.");
9994 log_info (" The key version was automatically reset to a reasonable value.");
9995 log_info ("");
9996
9997 wpa->keyver &= 0xff;
9998 }
9999
10000 wpa->eapol_size = in.eapol_size;
10001
10002 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10003
10004 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10005
10006 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10007
10008 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10009
10010 if (wpa->keyver == 1)
10011 {
10012 // nothing to do
10013 }
10014 else
10015 {
10016 digest[0] = byte_swap_32 (digest[0]);
10017 digest[1] = byte_swap_32 (digest[1]);
10018 digest[2] = byte_swap_32 (digest[2]);
10019 digest[3] = byte_swap_32 (digest[3]);
10020
10021 for (int i = 0; i < 64; i++)
10022 {
10023 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10024 }
10025 }
10026
10027 salt->salt_buf[10] = digest[1];
10028 salt->salt_buf[11] = digest[2];
10029
10030 return (PARSER_OK);
10031 }
10032
10033 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10034 {
10035 u32 *digest = (u32 *) hash_buf->digest;
10036
10037 salt_t *salt = hash_buf->salt;
10038
10039 if (input_len == 0)
10040 {
10041 log_error ("Password Safe v2 container not specified");
10042
10043 exit (-1);
10044 }
10045
10046 FILE *fp = fopen (input_buf, "rb");
10047
10048 if (fp == NULL)
10049 {
10050 log_error ("%s: %s", input_buf, strerror (errno));
10051
10052 exit (-1);
10053 }
10054
10055 psafe2_hdr buf;
10056
10057 memset (&buf, 0, sizeof (psafe2_hdr));
10058
10059 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10060
10061 fclose (fp);
10062
10063 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10064
10065 salt->salt_buf[0] = buf.random[0];
10066 salt->salt_buf[1] = buf.random[1];
10067
10068 salt->salt_len = 8;
10069 salt->salt_iter = 1000;
10070
10071 digest[0] = byte_swap_32 (buf.hash[0]);
10072 digest[1] = byte_swap_32 (buf.hash[1]);
10073 digest[2] = byte_swap_32 (buf.hash[2]);
10074 digest[3] = byte_swap_32 (buf.hash[3]);
10075 digest[4] = byte_swap_32 (buf.hash[4]);
10076
10077 return (PARSER_OK);
10078 }
10079
10080 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10081 {
10082 u32 *digest = (u32 *) hash_buf->digest;
10083
10084 salt_t *salt = hash_buf->salt;
10085
10086 if (input_len == 0)
10087 {
10088 log_error (".psafe3 not specified");
10089
10090 exit (-1);
10091 }
10092
10093 FILE *fp = fopen (input_buf, "rb");
10094
10095 if (fp == NULL)
10096 {
10097 log_error ("%s: %s", input_buf, strerror (errno));
10098
10099 exit (-1);
10100 }
10101
10102 psafe3_t in;
10103
10104 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10105
10106 fclose (fp);
10107
10108 data.hashfile = input_buf; // we will need this in case it gets cracked
10109
10110 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10111
10112 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10113
10114 salt->salt_iter = in.iterations + 1;
10115
10116 salt->salt_buf[0] = in.salt_buf[0];
10117 salt->salt_buf[1] = in.salt_buf[1];
10118 salt->salt_buf[2] = in.salt_buf[2];
10119 salt->salt_buf[3] = in.salt_buf[3];
10120 salt->salt_buf[4] = in.salt_buf[4];
10121 salt->salt_buf[5] = in.salt_buf[5];
10122 salt->salt_buf[6] = in.salt_buf[6];
10123 salt->salt_buf[7] = in.salt_buf[7];
10124
10125 salt->salt_len = 32;
10126
10127 digest[0] = in.hash_buf[0];
10128 digest[1] = in.hash_buf[1];
10129 digest[2] = in.hash_buf[2];
10130 digest[3] = in.hash_buf[3];
10131 digest[4] = in.hash_buf[4];
10132 digest[5] = in.hash_buf[5];
10133 digest[6] = in.hash_buf[6];
10134 digest[7] = in.hash_buf[7];
10135
10136 digest[0] = byte_swap_32 (digest[0]);
10137 digest[1] = byte_swap_32 (digest[1]);
10138 digest[2] = byte_swap_32 (digest[2]);
10139 digest[3] = byte_swap_32 (digest[3]);
10140 digest[4] = byte_swap_32 (digest[4]);
10141 digest[5] = byte_swap_32 (digest[5]);
10142 digest[6] = byte_swap_32 (digest[6]);
10143 digest[7] = byte_swap_32 (digest[7]);
10144
10145 return (PARSER_OK);
10146 }
10147
10148 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10149 {
10150 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10151
10152 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10153
10154 u32 *digest = (u32 *) hash_buf->digest;
10155
10156 salt_t *salt = hash_buf->salt;
10157
10158 char *iter_pos = input_buf + 3;
10159
10160 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10161
10162 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10163
10164 memcpy ((char *) salt->salt_sign, input_buf, 4);
10165
10166 salt->salt_iter = salt_iter;
10167
10168 char *salt_pos = iter_pos + 1;
10169
10170 uint salt_len = 8;
10171
10172 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10173
10174 salt->salt_len = salt_len;
10175
10176 char *hash_pos = salt_pos + salt_len;
10177
10178 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10179
10180 return (PARSER_OK);
10181 }
10182
10183 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10184 {
10185 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10186
10187 u32 *digest = (u32 *) hash_buf->digest;
10188
10189 salt_t *salt = hash_buf->salt;
10190
10191 char *salt_pos = input_buf + 3;
10192
10193 uint iterations_len = 0;
10194
10195 if (memcmp (salt_pos, "rounds=", 7) == 0)
10196 {
10197 salt_pos += 7;
10198
10199 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10200
10201 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10202 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10203
10204 salt_pos[0] = 0x0;
10205
10206 salt->salt_iter = atoi (salt_pos - iterations_len);
10207
10208 salt_pos += 1;
10209
10210 iterations_len += 8;
10211 }
10212 else
10213 {
10214 salt->salt_iter = ROUNDS_MD5CRYPT;
10215 }
10216
10217 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10218
10219 char *hash_pos = strchr (salt_pos, '$');
10220
10221 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10222
10223 uint salt_len = hash_pos - salt_pos;
10224
10225 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10226
10227 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10228
10229 salt->salt_len = salt_len;
10230
10231 hash_pos++;
10232
10233 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10234
10235 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10236
10237 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10238
10239 return (PARSER_OK);
10240 }
10241
10242 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10243 {
10244 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10245
10246 u32 *digest = (u32 *) hash_buf->digest;
10247
10248 salt_t *salt = hash_buf->salt;
10249
10250 char *salt_pos = input_buf + 6;
10251
10252 uint iterations_len = 0;
10253
10254 if (memcmp (salt_pos, "rounds=", 7) == 0)
10255 {
10256 salt_pos += 7;
10257
10258 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10259
10260 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10261 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10262
10263 salt_pos[0] = 0x0;
10264
10265 salt->salt_iter = atoi (salt_pos - iterations_len);
10266
10267 salt_pos += 1;
10268
10269 iterations_len += 8;
10270 }
10271 else
10272 {
10273 salt->salt_iter = ROUNDS_MD5CRYPT;
10274 }
10275
10276 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10277
10278 char *hash_pos = strchr (salt_pos, '$');
10279
10280 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10281
10282 uint salt_len = hash_pos - salt_pos;
10283
10284 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10285
10286 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10287
10288 salt->salt_len = salt_len;
10289
10290 hash_pos++;
10291
10292 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10293
10294 return (PARSER_OK);
10295 }
10296
10297 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10298 {
10299 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10300
10301 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10302
10303 u32 *digest = (u32 *) hash_buf->digest;
10304
10305 salt_t *salt = hash_buf->salt;
10306
10307 char *salt_pos = input_buf + 14;
10308
10309 char *hash_pos = strchr (salt_pos, '*');
10310
10311 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10312
10313 hash_pos++;
10314
10315 uint salt_len = hash_pos - salt_pos - 1;
10316
10317 char *salt_buf_ptr = (char *) salt->salt_buf;
10318
10319 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10320
10321 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10322
10323 salt->salt_len = salt_len;
10324
10325 u8 tmp_buf[100] = { 0 };
10326
10327 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10328
10329 memcpy (digest, tmp_buf, 20);
10330
10331 digest[0] = byte_swap_32 (digest[0]);
10332 digest[1] = byte_swap_32 (digest[1]);
10333 digest[2] = byte_swap_32 (digest[2]);
10334 digest[3] = byte_swap_32 (digest[3]);
10335 digest[4] = byte_swap_32 (digest[4]);
10336
10337 digest[0] -= SHA1M_A;
10338 digest[1] -= SHA1M_B;
10339 digest[2] -= SHA1M_C;
10340 digest[3] -= SHA1M_D;
10341 digest[4] -= SHA1M_E;
10342
10343 return (PARSER_OK);
10344 }
10345
10346 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10347 {
10348 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10349
10350 unsigned char c12 = itoa64_to_int (input_buf[12]);
10351
10352 if (c12 & 3) return (PARSER_HASH_VALUE);
10353
10354 u32 *digest = (u32 *) hash_buf->digest;
10355
10356 salt_t *salt = hash_buf->salt;
10357
10358 // for ascii_digest
10359 salt->salt_sign[0] = input_buf[0];
10360 salt->salt_sign[1] = input_buf[1];
10361
10362 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10363 | itoa64_to_int (input_buf[1]) << 6;
10364
10365 salt->salt_len = 2;
10366
10367 u8 tmp_buf[100] = { 0 };
10368
10369 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10370
10371 memcpy (digest, tmp_buf, 8);
10372
10373 uint tt;
10374
10375 IP (digest[0], digest[1], tt);
10376
10377 digest[2] = 0;
10378 digest[3] = 0;
10379
10380 return (PARSER_OK);
10381 }
10382
10383 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10384 {
10385 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10386
10387 u32 *digest = (u32 *) hash_buf->digest;
10388
10389 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10390 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10391 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10392 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10393
10394 digest[0] = byte_swap_32 (digest[0]);
10395 digest[1] = byte_swap_32 (digest[1]);
10396 digest[2] = byte_swap_32 (digest[2]);
10397 digest[3] = byte_swap_32 (digest[3]);
10398
10399 digest[0] -= MD4M_A;
10400 digest[1] -= MD4M_B;
10401 digest[2] -= MD4M_C;
10402 digest[3] -= MD4M_D;
10403
10404 return (PARSER_OK);
10405 }
10406
10407 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10408 {
10409 if (data.opts_type & OPTS_TYPE_ST_HEX)
10410 {
10411 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10412 }
10413 else
10414 {
10415 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10416 }
10417
10418 u32 *digest = (u32 *) hash_buf->digest;
10419
10420 salt_t *salt = hash_buf->salt;
10421
10422 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10423 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10424 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10425 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10426
10427 digest[0] = byte_swap_32 (digest[0]);
10428 digest[1] = byte_swap_32 (digest[1]);
10429 digest[2] = byte_swap_32 (digest[2]);
10430 digest[3] = byte_swap_32 (digest[3]);
10431
10432 digest[0] -= MD4M_A;
10433 digest[1] -= MD4M_B;
10434 digest[2] -= MD4M_C;
10435 digest[3] -= MD4M_D;
10436
10437 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10438
10439 uint salt_len = input_len - 32 - 1;
10440
10441 char *salt_buf = input_buf + 32 + 1;
10442
10443 char *salt_buf_ptr = (char *) salt->salt_buf;
10444
10445 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10446
10447 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10448
10449 salt->salt_len = salt_len;
10450
10451 return (PARSER_OK);
10452 }
10453
10454 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10455 {
10456 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10457
10458 u32 *digest = (u32 *) hash_buf->digest;
10459
10460 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10461 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10462 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10463 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10464
10465 digest[0] = byte_swap_32 (digest[0]);
10466 digest[1] = byte_swap_32 (digest[1]);
10467 digest[2] = byte_swap_32 (digest[2]);
10468 digest[3] = byte_swap_32 (digest[3]);
10469
10470 digest[0] -= MD5M_A;
10471 digest[1] -= MD5M_B;
10472 digest[2] -= MD5M_C;
10473 digest[3] -= MD5M_D;
10474
10475 return (PARSER_OK);
10476 }
10477
10478 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10479 {
10480 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10481
10482 u32 *digest = (u32 *) hash_buf->digest;
10483
10484 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10485 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10486 digest[2] = 0;
10487 digest[3] = 0;
10488
10489 digest[0] = byte_swap_32 (digest[0]);
10490 digest[1] = byte_swap_32 (digest[1]);
10491
10492 return (PARSER_OK);
10493 }
10494
10495 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10496 {
10497 if (data.opts_type & OPTS_TYPE_ST_HEX)
10498 {
10499 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10500 }
10501 else
10502 {
10503 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10504 }
10505
10506 u32 *digest = (u32 *) hash_buf->digest;
10507
10508 salt_t *salt = hash_buf->salt;
10509
10510 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10511 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10512 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10513 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10514
10515 digest[0] = byte_swap_32 (digest[0]);
10516 digest[1] = byte_swap_32 (digest[1]);
10517 digest[2] = byte_swap_32 (digest[2]);
10518 digest[3] = byte_swap_32 (digest[3]);
10519
10520 digest[0] -= MD5M_A;
10521 digest[1] -= MD5M_B;
10522 digest[2] -= MD5M_C;
10523 digest[3] -= MD5M_D;
10524
10525 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10526
10527 uint salt_len = input_len - 32 - 1;
10528
10529 char *salt_buf = input_buf + 32 + 1;
10530
10531 char *salt_buf_ptr = (char *) salt->salt_buf;
10532
10533 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10534
10535 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10536
10537 salt->salt_len = salt_len;
10538
10539 return (PARSER_OK);
10540 }
10541
10542 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10543 {
10544 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10545
10546 u32 *digest = (u32 *) hash_buf->digest;
10547
10548 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10549 | itoa64_to_int (input_buf[ 1]) << 6
10550 | itoa64_to_int (input_buf[ 2]) << 12
10551 | itoa64_to_int (input_buf[ 3]) << 18;
10552 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10553 | itoa64_to_int (input_buf[ 5]) << 6
10554 | itoa64_to_int (input_buf[ 6]) << 12
10555 | itoa64_to_int (input_buf[ 7]) << 18;
10556 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10557 | itoa64_to_int (input_buf[ 9]) << 6
10558 | itoa64_to_int (input_buf[10]) << 12
10559 | itoa64_to_int (input_buf[11]) << 18;
10560 digest[3] = itoa64_to_int (input_buf[12]) << 0
10561 | itoa64_to_int (input_buf[13]) << 6
10562 | itoa64_to_int (input_buf[14]) << 12
10563 | itoa64_to_int (input_buf[15]) << 18;
10564
10565 digest[0] -= MD5M_A;
10566 digest[1] -= MD5M_B;
10567 digest[2] -= MD5M_C;
10568 digest[3] -= MD5M_D;
10569
10570 digest[0] &= 0x00ffffff;
10571 digest[1] &= 0x00ffffff;
10572 digest[2] &= 0x00ffffff;
10573 digest[3] &= 0x00ffffff;
10574
10575 return (PARSER_OK);
10576 }
10577
10578 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10579 {
10580 if (data.opts_type & OPTS_TYPE_ST_HEX)
10581 {
10582 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10583 }
10584 else
10585 {
10586 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10587 }
10588
10589 u32 *digest = (u32 *) hash_buf->digest;
10590
10591 salt_t *salt = hash_buf->salt;
10592
10593 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10594 | itoa64_to_int (input_buf[ 1]) << 6
10595 | itoa64_to_int (input_buf[ 2]) << 12
10596 | itoa64_to_int (input_buf[ 3]) << 18;
10597 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10598 | itoa64_to_int (input_buf[ 5]) << 6
10599 | itoa64_to_int (input_buf[ 6]) << 12
10600 | itoa64_to_int (input_buf[ 7]) << 18;
10601 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10602 | itoa64_to_int (input_buf[ 9]) << 6
10603 | itoa64_to_int (input_buf[10]) << 12
10604 | itoa64_to_int (input_buf[11]) << 18;
10605 digest[3] = itoa64_to_int (input_buf[12]) << 0
10606 | itoa64_to_int (input_buf[13]) << 6
10607 | itoa64_to_int (input_buf[14]) << 12
10608 | itoa64_to_int (input_buf[15]) << 18;
10609
10610 digest[0] -= MD5M_A;
10611 digest[1] -= MD5M_B;
10612 digest[2] -= MD5M_C;
10613 digest[3] -= MD5M_D;
10614
10615 digest[0] &= 0x00ffffff;
10616 digest[1] &= 0x00ffffff;
10617 digest[2] &= 0x00ffffff;
10618 digest[3] &= 0x00ffffff;
10619
10620 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10621
10622 uint salt_len = input_len - 16 - 1;
10623
10624 char *salt_buf = input_buf + 16 + 1;
10625
10626 char *salt_buf_ptr = (char *) salt->salt_buf;
10627
10628 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10629
10630 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10631
10632 salt->salt_len = salt_len;
10633
10634 return (PARSER_OK);
10635 }
10636
10637 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10638 {
10639 key[0] = (nthash[0] >> 0);
10640 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10641 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10642 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10643 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10644 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10645 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10646 key[7] = (nthash[6] << 1);
10647
10648 key[0] |= 0x01;
10649 key[1] |= 0x01;
10650 key[2] |= 0x01;
10651 key[3] |= 0x01;
10652 key[4] |= 0x01;
10653 key[5] |= 0x01;
10654 key[6] |= 0x01;
10655 key[7] |= 0x01;
10656 }
10657
10658 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10659 {
10660 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10661
10662 u32 *digest = (u32 *) hash_buf->digest;
10663
10664 salt_t *salt = hash_buf->salt;
10665
10666 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10667
10668 /**
10669 * parse line
10670 */
10671
10672 char *user_pos = input_buf;
10673
10674 char *unused_pos = strchr (user_pos, ':');
10675
10676 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10677
10678 uint user_len = unused_pos - user_pos;
10679
10680 if (user_len > 60) return (PARSER_SALT_LENGTH);
10681
10682 unused_pos++;
10683
10684 char *domain_pos = strchr (unused_pos, ':');
10685
10686 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10687
10688 uint unused_len = domain_pos - unused_pos;
10689
10690 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10691
10692 domain_pos++;
10693
10694 char *srvchall_pos = strchr (domain_pos, ':');
10695
10696 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10697
10698 uint domain_len = srvchall_pos - domain_pos;
10699
10700 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10701
10702 srvchall_pos++;
10703
10704 char *hash_pos = strchr (srvchall_pos, ':');
10705
10706 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10707
10708 uint srvchall_len = hash_pos - srvchall_pos;
10709
10710 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10711
10712 hash_pos++;
10713
10714 char *clichall_pos = strchr (hash_pos, ':');
10715
10716 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10717
10718 uint hash_len = clichall_pos - hash_pos;
10719
10720 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10721
10722 clichall_pos++;
10723
10724 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10725
10726 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10727
10728 /**
10729 * store some data for later use
10730 */
10731
10732 netntlm->user_len = user_len * 2;
10733 netntlm->domain_len = domain_len * 2;
10734 netntlm->srvchall_len = srvchall_len / 2;
10735 netntlm->clichall_len = clichall_len / 2;
10736
10737 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10738 char *chall_ptr = (char *) netntlm->chall_buf;
10739
10740 /**
10741 * handle username and domainname
10742 */
10743
10744 for (uint i = 0; i < user_len; i++)
10745 {
10746 *userdomain_ptr++ = user_pos[i];
10747 *userdomain_ptr++ = 0;
10748 }
10749
10750 for (uint i = 0; i < domain_len; i++)
10751 {
10752 *userdomain_ptr++ = domain_pos[i];
10753 *userdomain_ptr++ = 0;
10754 }
10755
10756 /**
10757 * handle server challenge encoding
10758 */
10759
10760 for (uint i = 0; i < srvchall_len; i += 2)
10761 {
10762 const char p0 = srvchall_pos[i + 0];
10763 const char p1 = srvchall_pos[i + 1];
10764
10765 *chall_ptr++ = hex_convert (p1) << 0
10766 | hex_convert (p0) << 4;
10767 }
10768
10769 /**
10770 * handle client challenge encoding
10771 */
10772
10773 for (uint i = 0; i < clichall_len; i += 2)
10774 {
10775 const char p0 = clichall_pos[i + 0];
10776 const char p1 = clichall_pos[i + 1];
10777
10778 *chall_ptr++ = hex_convert (p1) << 0
10779 | hex_convert (p0) << 4;
10780 }
10781
10782 /**
10783 * store data
10784 */
10785
10786 char *salt_buf_ptr = (char *) salt->salt_buf;
10787
10788 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10789
10790 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10791
10792 salt->salt_len = salt_len;
10793
10794 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10795 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10796 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10797 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10798
10799 digest[0] = byte_swap_32 (digest[0]);
10800 digest[1] = byte_swap_32 (digest[1]);
10801 digest[2] = byte_swap_32 (digest[2]);
10802 digest[3] = byte_swap_32 (digest[3]);
10803
10804 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10805
10806 uint digest_tmp[2] = { 0 };
10807
10808 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10809 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
10810
10811 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10812 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10813
10814 /* special case 2: ESS */
10815
10816 if (srvchall_len == 48)
10817 {
10818 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10819 {
10820 uint w[16] = { 0 };
10821
10822 w[ 0] = netntlm->chall_buf[6];
10823 w[ 1] = netntlm->chall_buf[7];
10824 w[ 2] = netntlm->chall_buf[0];
10825 w[ 3] = netntlm->chall_buf[1];
10826 w[ 4] = 0x80;
10827 w[14] = 16 * 8;
10828
10829 uint dgst[4] = { 0 };
10830
10831 dgst[0] = MAGIC_A;
10832 dgst[1] = MAGIC_B;
10833 dgst[2] = MAGIC_C;
10834 dgst[3] = MAGIC_D;
10835
10836 md5_64 (w, dgst);
10837
10838 salt->salt_buf[0] = dgst[0];
10839 salt->salt_buf[1] = dgst[1];
10840 }
10841 }
10842
10843 /* precompute netntlmv1 exploit start */
10844
10845 for (uint i = 0; i < 0x10000; i++)
10846 {
10847 uint key_md4[2] = { i, 0 };
10848 uint key_des[2] = { 0, 0 };
10849
10850 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
10851
10852 uint Kc[16] = { 0 };
10853 uint Kd[16] = { 0 };
10854
10855 _des_keysetup (key_des, Kc, Kd, c_skb);
10856
10857 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10858
10859 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10860
10861 if (data3[0] != digest_tmp[0]) continue;
10862 if (data3[1] != digest_tmp[1]) continue;
10863
10864 salt->salt_buf[2] = i;
10865
10866 salt->salt_len = 24;
10867
10868 break;
10869 }
10870
10871 salt->salt_buf_pc[0] = digest_tmp[0];
10872 salt->salt_buf_pc[1] = digest_tmp[1];
10873
10874 /* precompute netntlmv1 exploit stop */
10875
10876 u32 tt;
10877
10878 IP (digest[0], digest[1], tt);
10879 IP (digest[2], digest[3], tt);
10880
10881 digest[0] = rotr32 (digest[0], 29);
10882 digest[1] = rotr32 (digest[1], 29);
10883 digest[2] = rotr32 (digest[2], 29);
10884 digest[3] = rotr32 (digest[3], 29);
10885
10886 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10887
10888 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
10889 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
10890
10891 return (PARSER_OK);
10892 }
10893
10894 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10895 {
10896 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10897
10898 u32 *digest = (u32 *) hash_buf->digest;
10899
10900 salt_t *salt = hash_buf->salt;
10901
10902 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10903
10904 /**
10905 * parse line
10906 */
10907
10908 char *user_pos = input_buf;
10909
10910 char *unused_pos = strchr (user_pos, ':');
10911
10912 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10913
10914 uint user_len = unused_pos - user_pos;
10915
10916 if (user_len > 60) return (PARSER_SALT_LENGTH);
10917
10918 unused_pos++;
10919
10920 char *domain_pos = strchr (unused_pos, ':');
10921
10922 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10923
10924 uint unused_len = domain_pos - unused_pos;
10925
10926 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10927
10928 domain_pos++;
10929
10930 char *srvchall_pos = strchr (domain_pos, ':');
10931
10932 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10933
10934 uint domain_len = srvchall_pos - domain_pos;
10935
10936 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10937
10938 srvchall_pos++;
10939
10940 char *hash_pos = strchr (srvchall_pos, ':');
10941
10942 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10943
10944 uint srvchall_len = hash_pos - srvchall_pos;
10945
10946 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10947
10948 hash_pos++;
10949
10950 char *clichall_pos = strchr (hash_pos, ':');
10951
10952 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10953
10954 uint hash_len = clichall_pos - hash_pos;
10955
10956 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10957
10958 clichall_pos++;
10959
10960 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10961
10962 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10963
10964 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10965
10966 /**
10967 * store some data for later use
10968 */
10969
10970 netntlm->user_len = user_len * 2;
10971 netntlm->domain_len = domain_len * 2;
10972 netntlm->srvchall_len = srvchall_len / 2;
10973 netntlm->clichall_len = clichall_len / 2;
10974
10975 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10976 char *chall_ptr = (char *) netntlm->chall_buf;
10977
10978 /**
10979 * handle username and domainname
10980 */
10981
10982 for (uint i = 0; i < user_len; i++)
10983 {
10984 *userdomain_ptr++ = toupper (user_pos[i]);
10985 *userdomain_ptr++ = 0;
10986 }
10987
10988 for (uint i = 0; i < domain_len; i++)
10989 {
10990 *userdomain_ptr++ = domain_pos[i];
10991 *userdomain_ptr++ = 0;
10992 }
10993
10994 *userdomain_ptr++ = 0x80;
10995
10996 /**
10997 * handle server challenge encoding
10998 */
10999
11000 for (uint i = 0; i < srvchall_len; i += 2)
11001 {
11002 const char p0 = srvchall_pos[i + 0];
11003 const char p1 = srvchall_pos[i + 1];
11004
11005 *chall_ptr++ = hex_convert (p1) << 0
11006 | hex_convert (p0) << 4;
11007 }
11008
11009 /**
11010 * handle client challenge encoding
11011 */
11012
11013 for (uint i = 0; i < clichall_len; i += 2)
11014 {
11015 const char p0 = clichall_pos[i + 0];
11016 const char p1 = clichall_pos[i + 1];
11017
11018 *chall_ptr++ = hex_convert (p1) << 0
11019 | hex_convert (p0) << 4;
11020 }
11021
11022 *chall_ptr++ = 0x80;
11023
11024 /**
11025 * handle hash itself
11026 */
11027
11028 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11029 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11030 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11031 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11032
11033 digest[0] = byte_swap_32 (digest[0]);
11034 digest[1] = byte_swap_32 (digest[1]);
11035 digest[2] = byte_swap_32 (digest[2]);
11036 digest[3] = byte_swap_32 (digest[3]);
11037
11038 /**
11039 * reuse challange data as salt_buf, its the buffer that is most likely unique
11040 */
11041
11042 salt->salt_buf[0] = 0;
11043 salt->salt_buf[1] = 0;
11044 salt->salt_buf[2] = 0;
11045 salt->salt_buf[3] = 0;
11046 salt->salt_buf[4] = 0;
11047 salt->salt_buf[5] = 0;
11048 salt->salt_buf[6] = 0;
11049 salt->salt_buf[7] = 0;
11050
11051 uint *uptr;
11052
11053 uptr = (uint *) netntlm->userdomain_buf;
11054
11055 for (uint i = 0; i < 16; i += 16)
11056 {
11057 md5_64 (uptr, salt->salt_buf);
11058 }
11059
11060 uptr = (uint *) netntlm->chall_buf;
11061
11062 for (uint i = 0; i < 256; i += 16)
11063 {
11064 md5_64 (uptr, salt->salt_buf);
11065 }
11066
11067 salt->salt_len = 16;
11068
11069 return (PARSER_OK);
11070 }
11071
11072 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11073 {
11074 if (data.opts_type & OPTS_TYPE_ST_HEX)
11075 {
11076 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11077 }
11078 else
11079 {
11080 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11081 }
11082
11083 u32 *digest = (u32 *) hash_buf->digest;
11084
11085 salt_t *salt = hash_buf->salt;
11086
11087 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11088 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11089 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11090 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11091
11092 digest[0] = byte_swap_32 (digest[0]);
11093 digest[1] = byte_swap_32 (digest[1]);
11094 digest[2] = byte_swap_32 (digest[2]);
11095 digest[3] = byte_swap_32 (digest[3]);
11096
11097 digest[0] -= MD5M_A;
11098 digest[1] -= MD5M_B;
11099 digest[2] -= MD5M_C;
11100 digest[3] -= MD5M_D;
11101
11102 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11103
11104 uint salt_len = input_len - 32 - 1;
11105
11106 char *salt_buf = input_buf + 32 + 1;
11107
11108 char *salt_buf_ptr = (char *) salt->salt_buf;
11109
11110 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11111
11112 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11113
11114 salt->salt_len = salt_len;
11115
11116 return (PARSER_OK);
11117 }
11118
11119 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11120 {
11121 if (data.opts_type & OPTS_TYPE_ST_HEX)
11122 {
11123 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11124 }
11125 else
11126 {
11127 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11128 }
11129
11130 u32 *digest = (u32 *) hash_buf->digest;
11131
11132 salt_t *salt = hash_buf->salt;
11133
11134 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11135 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11136 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11137 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11138
11139 digest[0] = byte_swap_32 (digest[0]);
11140 digest[1] = byte_swap_32 (digest[1]);
11141 digest[2] = byte_swap_32 (digest[2]);
11142 digest[3] = byte_swap_32 (digest[3]);
11143
11144 digest[0] -= MD5M_A;
11145 digest[1] -= MD5M_B;
11146 digest[2] -= MD5M_C;
11147 digest[3] -= MD5M_D;
11148
11149 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11150
11151 uint salt_len = input_len - 32 - 1;
11152
11153 char *salt_buf = input_buf + 32 + 1;
11154
11155 char *salt_buf_ptr = (char *) salt->salt_buf;
11156
11157 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11158
11159 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11160
11161 salt->salt_len = salt_len;
11162
11163 return (PARSER_OK);
11164 }
11165
11166 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11167 {
11168 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11169
11170 u32 *digest = (u32 *) hash_buf->digest;
11171
11172 salt_t *salt = hash_buf->salt;
11173
11174 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11175 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11176 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11177 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11178
11179 digest[0] = byte_swap_32 (digest[0]);
11180 digest[1] = byte_swap_32 (digest[1]);
11181 digest[2] = byte_swap_32 (digest[2]);
11182 digest[3] = byte_swap_32 (digest[3]);
11183
11184 digest[0] -= MD5M_A;
11185 digest[1] -= MD5M_B;
11186 digest[2] -= MD5M_C;
11187 digest[3] -= MD5M_D;
11188
11189 /**
11190 * This is a virtual salt. While the algorithm is basically not salted
11191 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11192 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11193 */
11194
11195 char *salt_buf_ptr = (char *) salt->salt_buf;
11196
11197 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11198
11199 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11200
11201 salt->salt_len = salt_len;
11202
11203 return (PARSER_OK);
11204 }
11205
11206 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11207 {
11208 if (data.opts_type & OPTS_TYPE_ST_HEX)
11209 {
11210 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11211 }
11212 else
11213 {
11214 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11215 }
11216
11217 u32 *digest = (u32 *) hash_buf->digest;
11218
11219 salt_t *salt = hash_buf->salt;
11220
11221 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11222 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11223 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11224 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11225
11226 digest[0] = byte_swap_32 (digest[0]);
11227 digest[1] = byte_swap_32 (digest[1]);
11228 digest[2] = byte_swap_32 (digest[2]);
11229 digest[3] = byte_swap_32 (digest[3]);
11230
11231 digest[0] -= MD5M_A;
11232 digest[1] -= MD5M_B;
11233 digest[2] -= MD5M_C;
11234 digest[3] -= MD5M_D;
11235
11236 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11237
11238 uint salt_len = input_len - 32 - 1;
11239
11240 char *salt_buf = input_buf + 32 + 1;
11241
11242 char *salt_buf_ptr = (char *) salt->salt_buf;
11243
11244 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11245
11246 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11247
11248 salt->salt_len = salt_len;
11249
11250 return (PARSER_OK);
11251 }
11252
11253 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11254 {
11255 if (data.opts_type & OPTS_TYPE_ST_HEX)
11256 {
11257 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11258 }
11259 else
11260 {
11261 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11262 }
11263
11264 u32 *digest = (u32 *) hash_buf->digest;
11265
11266 salt_t *salt = hash_buf->salt;
11267
11268 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11269 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11270 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11271 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11272
11273 digest[0] = byte_swap_32 (digest[0]);
11274 digest[1] = byte_swap_32 (digest[1]);
11275 digest[2] = byte_swap_32 (digest[2]);
11276 digest[3] = byte_swap_32 (digest[3]);
11277
11278 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11279
11280 uint salt_len = input_len - 32 - 1;
11281
11282 char *salt_buf = input_buf + 32 + 1;
11283
11284 char *salt_buf_ptr = (char *) salt->salt_buf;
11285
11286 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11287
11288 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11289
11290 salt->salt_len = salt_len;
11291
11292 return (PARSER_OK);
11293 }
11294
11295 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11296 {
11297 if (data.opts_type & OPTS_TYPE_ST_HEX)
11298 {
11299 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11300 }
11301 else
11302 {
11303 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11304 }
11305
11306 u32 *digest = (u32 *) hash_buf->digest;
11307
11308 salt_t *salt = hash_buf->salt;
11309
11310 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11311 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11312 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11313 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11314
11315 digest[0] = byte_swap_32 (digest[0]);
11316 digest[1] = byte_swap_32 (digest[1]);
11317 digest[2] = byte_swap_32 (digest[2]);
11318 digest[3] = byte_swap_32 (digest[3]);
11319
11320 digest[0] -= MD4M_A;
11321 digest[1] -= MD4M_B;
11322 digest[2] -= MD4M_C;
11323 digest[3] -= MD4M_D;
11324
11325 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11326
11327 uint salt_len = input_len - 32 - 1;
11328
11329 char *salt_buf = input_buf + 32 + 1;
11330
11331 char *salt_buf_ptr = (char *) salt->salt_buf;
11332
11333 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11334
11335 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11336
11337 salt->salt_len = salt_len;
11338
11339 return (PARSER_OK);
11340 }
11341
11342 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11343 {
11344 if (data.opts_type & OPTS_TYPE_ST_HEX)
11345 {
11346 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11347 }
11348 else
11349 {
11350 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11351 }
11352
11353 u32 *digest = (u32 *) hash_buf->digest;
11354
11355 salt_t *salt = hash_buf->salt;
11356
11357 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11358 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11359 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11360 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11361
11362 digest[0] = byte_swap_32 (digest[0]);
11363 digest[1] = byte_swap_32 (digest[1]);
11364 digest[2] = byte_swap_32 (digest[2]);
11365 digest[3] = byte_swap_32 (digest[3]);
11366
11367 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11368
11369 uint salt_len = input_len - 32 - 1;
11370
11371 char *salt_buf = input_buf + 32 + 1;
11372
11373 uint salt_pc_block[16] = { 0 };
11374
11375 char *salt_pc_block_ptr = (char *) salt_pc_block;
11376
11377 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11378
11379 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11380
11381 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11382
11383 salt_pc_block[14] = salt_len * 8;
11384
11385 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11386
11387 md5_64 (salt_pc_block, salt_pc_digest);
11388
11389 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11390 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11391 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11392 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11393
11394 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11395
11396 memcpy (salt_buf_ptr, salt_buf, salt_len);
11397
11398 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11399
11400 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11401 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11402 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11403 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11404
11405 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11406
11407 return (PARSER_OK);
11408 }
11409
11410 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11411 {
11412 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11413
11414 u32 *digest = (u32 *) hash_buf->digest;
11415
11416 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11417 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11418 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11419 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11420 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11421
11422 digest[0] -= SHA1M_A;
11423 digest[1] -= SHA1M_B;
11424 digest[2] -= SHA1M_C;
11425 digest[3] -= SHA1M_D;
11426 digest[4] -= SHA1M_E;
11427
11428 return (PARSER_OK);
11429 }
11430
11431 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11432 {
11433 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11434
11435 u32 *digest = (u32 *) hash_buf->digest;
11436
11437 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11438 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11439 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11440 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11441 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11442
11443 return (PARSER_OK);
11444 }
11445
11446 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11447 {
11448 if (data.opts_type & OPTS_TYPE_ST_HEX)
11449 {
11450 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11451 }
11452 else
11453 {
11454 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11455 }
11456
11457 u32 *digest = (u32 *) hash_buf->digest;
11458
11459 salt_t *salt = hash_buf->salt;
11460
11461 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11462 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11463 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11464 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11465 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11466
11467 digest[0] -= SHA1M_A;
11468 digest[1] -= SHA1M_B;
11469 digest[2] -= SHA1M_C;
11470 digest[3] -= SHA1M_D;
11471 digest[4] -= SHA1M_E;
11472
11473 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11474
11475 uint salt_len = input_len - 40 - 1;
11476
11477 char *salt_buf = input_buf + 40 + 1;
11478
11479 char *salt_buf_ptr = (char *) salt->salt_buf;
11480
11481 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11482
11483 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11484
11485 salt->salt_len = salt_len;
11486
11487 return (PARSER_OK);
11488 }
11489
11490 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11491 {
11492 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11493
11494 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11495
11496 u32 *digest = (u32 *) hash_buf->digest;
11497
11498 u8 tmp_buf[100] = { 0 };
11499
11500 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11501
11502 memcpy (digest, tmp_buf, 20);
11503
11504 digest[0] = byte_swap_32 (digest[0]);
11505 digest[1] = byte_swap_32 (digest[1]);
11506 digest[2] = byte_swap_32 (digest[2]);
11507 digest[3] = byte_swap_32 (digest[3]);
11508 digest[4] = byte_swap_32 (digest[4]);
11509
11510 digest[0] -= SHA1M_A;
11511 digest[1] -= SHA1M_B;
11512 digest[2] -= SHA1M_C;
11513 digest[3] -= SHA1M_D;
11514 digest[4] -= SHA1M_E;
11515
11516 return (PARSER_OK);
11517 }
11518
11519 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11520 {
11521 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11522
11523 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11524
11525 u32 *digest = (u32 *) hash_buf->digest;
11526
11527 salt_t *salt = hash_buf->salt;
11528
11529 u8 tmp_buf[100] = { 0 };
11530
11531 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11532
11533 memcpy (digest, tmp_buf, 20);
11534
11535 salt->salt_len = tmp_len - 20;
11536
11537 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11538
11539 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11540 {
11541 char *ptr = (char *) salt->salt_buf;
11542
11543 ptr[salt->salt_len] = 0x80;
11544 }
11545
11546 digest[0] = byte_swap_32 (digest[0]);
11547 digest[1] = byte_swap_32 (digest[1]);
11548 digest[2] = byte_swap_32 (digest[2]);
11549 digest[3] = byte_swap_32 (digest[3]);
11550 digest[4] = byte_swap_32 (digest[4]);
11551
11552 digest[0] -= SHA1M_A;
11553 digest[1] -= SHA1M_B;
11554 digest[2] -= SHA1M_C;
11555 digest[3] -= SHA1M_D;
11556 digest[4] -= SHA1M_E;
11557
11558 return (PARSER_OK);
11559 }
11560
11561 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11562 {
11563 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11564
11565 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11566
11567 u32 *digest = (u32 *) hash_buf->digest;
11568
11569 salt_t *salt = hash_buf->salt;
11570
11571 char *salt_buf = input_buf + 6;
11572
11573 uint salt_len = 8;
11574
11575 char *salt_buf_ptr = (char *) salt->salt_buf;
11576
11577 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11578
11579 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11580
11581 salt->salt_len = salt_len;
11582
11583 char *hash_pos = input_buf + 6 + 8 + 40;
11584
11585 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11586 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11587 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11588 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11589 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11590
11591 digest[0] -= SHA1M_A;
11592 digest[1] -= SHA1M_B;
11593 digest[2] -= SHA1M_C;
11594 digest[3] -= SHA1M_D;
11595 digest[4] -= SHA1M_E;
11596
11597 return (PARSER_OK);
11598 }
11599
11600 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11601 {
11602 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11603
11604 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11605
11606 u32 *digest = (u32 *) hash_buf->digest;
11607
11608 salt_t *salt = hash_buf->salt;
11609
11610 char *salt_buf = input_buf + 6;
11611
11612 uint salt_len = 8;
11613
11614 char *salt_buf_ptr = (char *) salt->salt_buf;
11615
11616 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11617
11618 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11619
11620 salt->salt_len = salt_len;
11621
11622 char *hash_pos = input_buf + 6 + 8;
11623
11624 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11625 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11626 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11627 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11628 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11629
11630 digest[0] -= SHA1M_A;
11631 digest[1] -= SHA1M_B;
11632 digest[2] -= SHA1M_C;
11633 digest[3] -= SHA1M_D;
11634 digest[4] -= SHA1M_E;
11635
11636 return (PARSER_OK);
11637 }
11638
11639 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11640 {
11641 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11642
11643 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11644
11645 u64 *digest = (u64 *) hash_buf->digest;
11646
11647 salt_t *salt = hash_buf->salt;
11648
11649 char *salt_buf = input_buf + 6;
11650
11651 uint salt_len = 8;
11652
11653 char *salt_buf_ptr = (char *) salt->salt_buf;
11654
11655 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11656
11657 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11658
11659 salt->salt_len = salt_len;
11660
11661 char *hash_pos = input_buf + 6 + 8;
11662
11663 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11664 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11665 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11666 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11667 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11668 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11669 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11670 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11671
11672 digest[0] -= SHA512M_A;
11673 digest[1] -= SHA512M_B;
11674 digest[2] -= SHA512M_C;
11675 digest[3] -= SHA512M_D;
11676 digest[4] -= SHA512M_E;
11677 digest[5] -= SHA512M_F;
11678 digest[6] -= SHA512M_G;
11679 digest[7] -= SHA512M_H;
11680
11681 return (PARSER_OK);
11682 }
11683
11684 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11685 {
11686 if (data.opts_type & OPTS_TYPE_ST_HEX)
11687 {
11688 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11689 }
11690 else
11691 {
11692 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11693 }
11694
11695 u32 *digest = (u32 *) hash_buf->digest;
11696
11697 salt_t *salt = hash_buf->salt;
11698
11699 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11700 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11701 digest[2] = 0;
11702 digest[3] = 0;
11703
11704 digest[0] = byte_swap_32 (digest[0]);
11705 digest[1] = byte_swap_32 (digest[1]);
11706
11707 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11708
11709 uint salt_len = input_len - 16 - 1;
11710
11711 char *salt_buf = input_buf + 16 + 1;
11712
11713 char *salt_buf_ptr = (char *) salt->salt_buf;
11714
11715 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11716
11717 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11718
11719 salt->salt_len = salt_len;
11720
11721 return (PARSER_OK);
11722 }
11723
11724 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11725 {
11726 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11727
11728 u32 *digest = (u32 *) hash_buf->digest;
11729
11730 salt_t *salt = hash_buf->salt;
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] = hex_to_u32 ((const u8 *) &input_buf[32]);
11737
11738 digest[0] -= SHA1M_A;
11739 digest[1] -= SHA1M_B;
11740 digest[2] -= SHA1M_C;
11741 digest[3] -= SHA1M_D;
11742 digest[4] -= SHA1M_E;
11743
11744 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11745
11746 uint salt_len = input_len - 40 - 1;
11747
11748 char *salt_buf = input_buf + 40 + 1;
11749
11750 char *salt_buf_ptr = (char *) salt->salt_buf;
11751
11752 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11753
11754 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11755
11756 salt->salt_len = salt_len;
11757
11758 return (PARSER_OK);
11759 }
11760
11761 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11762 {
11763 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11764
11765 u32 *digest = (u32 *) hash_buf->digest;
11766
11767 salt_t *salt = hash_buf->salt;
11768
11769 char *hash_pos = input_buf;
11770
11771 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11772 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11773 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11774 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11775 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
11776 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
11777 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
11778 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
11779 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
11780 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
11781 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
11782 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
11783 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
11784 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
11785 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
11786 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
11787
11788 char *salt_pos = input_buf + 128;
11789
11790 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
11791 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
11792 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
11793 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
11794
11795 salt->salt_iter = ROUNDS_ORACLET - 1;
11796 salt->salt_len = 16;
11797
11798 return (PARSER_OK);
11799 }
11800
11801 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11802 {
11803 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11804
11805 u32 *digest = (u32 *) hash_buf->digest;
11806
11807 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11808 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11809 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11810 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11811 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11812 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11813 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11814 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11815
11816 digest[0] -= SHA256M_A;
11817 digest[1] -= SHA256M_B;
11818 digest[2] -= SHA256M_C;
11819 digest[3] -= SHA256M_D;
11820 digest[4] -= SHA256M_E;
11821 digest[5] -= SHA256M_F;
11822 digest[6] -= SHA256M_G;
11823 digest[7] -= SHA256M_H;
11824
11825 return (PARSER_OK);
11826 }
11827
11828 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11829 {
11830 if (data.opts_type & OPTS_TYPE_ST_HEX)
11831 {
11832 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11833 }
11834 else
11835 {
11836 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11837 }
11838
11839 u32 *digest = (u32 *) hash_buf->digest;
11840
11841 salt_t *salt = hash_buf->salt;
11842
11843 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11844 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11845 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11846 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11847 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11848 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11849 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11850 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11851
11852 digest[0] -= SHA256M_A;
11853 digest[1] -= SHA256M_B;
11854 digest[2] -= SHA256M_C;
11855 digest[3] -= SHA256M_D;
11856 digest[4] -= SHA256M_E;
11857 digest[5] -= SHA256M_F;
11858 digest[6] -= SHA256M_G;
11859 digest[7] -= SHA256M_H;
11860
11861 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11862
11863 uint salt_len = input_len - 64 - 1;
11864
11865 char *salt_buf = input_buf + 64 + 1;
11866
11867 char *salt_buf_ptr = (char *) salt->salt_buf;
11868
11869 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11870
11871 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11872
11873 salt->salt_len = salt_len;
11874
11875 return (PARSER_OK);
11876 }
11877
11878 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11879 {
11880 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11881
11882 u64 *digest = (u64 *) hash_buf->digest;
11883
11884 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11885 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11886 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11887 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11888 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11889 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11890 digest[6] = 0;
11891 digest[7] = 0;
11892
11893 digest[0] -= SHA384M_A;
11894 digest[1] -= SHA384M_B;
11895 digest[2] -= SHA384M_C;
11896 digest[3] -= SHA384M_D;
11897 digest[4] -= SHA384M_E;
11898 digest[5] -= SHA384M_F;
11899 digest[6] -= 0;
11900 digest[7] -= 0;
11901
11902 return (PARSER_OK);
11903 }
11904
11905 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11906 {
11907 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11908
11909 u64 *digest = (u64 *) hash_buf->digest;
11910
11911 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11912 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11913 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11914 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11915 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11916 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11917 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11918 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11919
11920 digest[0] -= SHA512M_A;
11921 digest[1] -= SHA512M_B;
11922 digest[2] -= SHA512M_C;
11923 digest[3] -= SHA512M_D;
11924 digest[4] -= SHA512M_E;
11925 digest[5] -= SHA512M_F;
11926 digest[6] -= SHA512M_G;
11927 digest[7] -= SHA512M_H;
11928
11929 return (PARSER_OK);
11930 }
11931
11932 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11933 {
11934 if (data.opts_type & OPTS_TYPE_ST_HEX)
11935 {
11936 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11937 }
11938 else
11939 {
11940 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11941 }
11942
11943 u64 *digest = (u64 *) hash_buf->digest;
11944
11945 salt_t *salt = hash_buf->salt;
11946
11947 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11948 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11949 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11950 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11951 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11952 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11953 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11954 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11955
11956 digest[0] -= SHA512M_A;
11957 digest[1] -= SHA512M_B;
11958 digest[2] -= SHA512M_C;
11959 digest[3] -= SHA512M_D;
11960 digest[4] -= SHA512M_E;
11961 digest[5] -= SHA512M_F;
11962 digest[6] -= SHA512M_G;
11963 digest[7] -= SHA512M_H;
11964
11965 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11966
11967 uint salt_len = input_len - 128 - 1;
11968
11969 char *salt_buf = input_buf + 128 + 1;
11970
11971 char *salt_buf_ptr = (char *) salt->salt_buf;
11972
11973 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11974
11975 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11976
11977 salt->salt_len = salt_len;
11978
11979 return (PARSER_OK);
11980 }
11981
11982 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11983 {
11984 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11985
11986 u64 *digest = (u64 *) hash_buf->digest;
11987
11988 salt_t *salt = hash_buf->salt;
11989
11990 char *salt_pos = input_buf + 3;
11991
11992 uint iterations_len = 0;
11993
11994 if (memcmp (salt_pos, "rounds=", 7) == 0)
11995 {
11996 salt_pos += 7;
11997
11998 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
11999
12000 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12001 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12002
12003 salt_pos[0] = 0x0;
12004
12005 salt->salt_iter = atoi (salt_pos - iterations_len);
12006
12007 salt_pos += 1;
12008
12009 iterations_len += 8;
12010 }
12011 else
12012 {
12013 salt->salt_iter = ROUNDS_SHA512CRYPT;
12014 }
12015
12016 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12017
12018 char *hash_pos = strchr (salt_pos, '$');
12019
12020 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12021
12022 uint salt_len = hash_pos - salt_pos;
12023
12024 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12025
12026 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12027
12028 salt->salt_len = salt_len;
12029
12030 hash_pos++;
12031
12032 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12033
12034 return (PARSER_OK);
12035 }
12036
12037 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12038 {
12039 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12040
12041 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12042
12043 u64 *digest = (u64 *) hash_buf->digest;
12044
12045 salt_t *salt = hash_buf->salt;
12046
12047 uint keccak_mdlen = input_len / 2;
12048
12049 for (uint i = 0; i < keccak_mdlen / 8; i++)
12050 {
12051 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12052
12053 digest[i] = byte_swap_64 (digest[i]);
12054 }
12055
12056 salt->keccak_mdlen = keccak_mdlen;
12057
12058 return (PARSER_OK);
12059 }
12060
12061 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12062 {
12063 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12064
12065 u32 *digest = (u32 *) hash_buf->digest;
12066
12067 salt_t *salt = hash_buf->salt;
12068
12069 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12070
12071 /**
12072 * Parse that strange long line
12073 */
12074
12075 char *in_off[9];
12076
12077 size_t in_len[9] = { 0 };
12078
12079 in_off[0] = strtok (input_buf, ":");
12080
12081 in_len[0] = strlen (in_off[0]);
12082
12083 size_t i;
12084
12085 for (i = 1; i < 9; i++)
12086 {
12087 in_off[i] = strtok (NULL, ":");
12088
12089 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12090
12091 in_len[i] = strlen (in_off[i]);
12092 }
12093
12094 char *ptr = (char *) ikepsk->msg_buf;
12095
12096 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12097 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12098 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12099 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12100 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12101 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12102
12103 *ptr = 0x80;
12104
12105 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12106
12107 ptr = (char *) ikepsk->nr_buf;
12108
12109 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12110 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12111
12112 *ptr = 0x80;
12113
12114 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12115
12116 /**
12117 * Store to database
12118 */
12119
12120 ptr = in_off[8];
12121
12122 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12123 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12124 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12125 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12126
12127 digest[0] = byte_swap_32 (digest[0]);
12128 digest[1] = byte_swap_32 (digest[1]);
12129 digest[2] = byte_swap_32 (digest[2]);
12130 digest[3] = byte_swap_32 (digest[3]);
12131
12132 salt->salt_len = 32;
12133
12134 salt->salt_buf[0] = ikepsk->nr_buf[0];
12135 salt->salt_buf[1] = ikepsk->nr_buf[1];
12136 salt->salt_buf[2] = ikepsk->nr_buf[2];
12137 salt->salt_buf[3] = ikepsk->nr_buf[3];
12138 salt->salt_buf[4] = ikepsk->nr_buf[4];
12139 salt->salt_buf[5] = ikepsk->nr_buf[5];
12140 salt->salt_buf[6] = ikepsk->nr_buf[6];
12141 salt->salt_buf[7] = ikepsk->nr_buf[7];
12142
12143 return (PARSER_OK);
12144 }
12145
12146 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12147 {
12148 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12149
12150 u32 *digest = (u32 *) hash_buf->digest;
12151
12152 salt_t *salt = hash_buf->salt;
12153
12154 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12155
12156 /**
12157 * Parse that strange long line
12158 */
12159
12160 char *in_off[9];
12161
12162 size_t in_len[9] = { 0 };
12163
12164 in_off[0] = strtok (input_buf, ":");
12165
12166 in_len[0] = strlen (in_off[0]);
12167
12168 size_t i;
12169
12170 for (i = 1; i < 9; i++)
12171 {
12172 in_off[i] = strtok (NULL, ":");
12173
12174 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12175
12176 in_len[i] = strlen (in_off[i]);
12177 }
12178
12179 char *ptr = (char *) ikepsk->msg_buf;
12180
12181 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12182 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12183 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12184 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12185 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12186 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12187
12188 *ptr = 0x80;
12189
12190 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12191
12192 ptr = (char *) ikepsk->nr_buf;
12193
12194 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12195 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12196
12197 *ptr = 0x80;
12198
12199 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12200
12201 /**
12202 * Store to database
12203 */
12204
12205 ptr = in_off[8];
12206
12207 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12208 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12209 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12210 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12211 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12212
12213 salt->salt_len = 32;
12214
12215 salt->salt_buf[0] = ikepsk->nr_buf[0];
12216 salt->salt_buf[1] = ikepsk->nr_buf[1];
12217 salt->salt_buf[2] = ikepsk->nr_buf[2];
12218 salt->salt_buf[3] = ikepsk->nr_buf[3];
12219 salt->salt_buf[4] = ikepsk->nr_buf[4];
12220 salt->salt_buf[5] = ikepsk->nr_buf[5];
12221 salt->salt_buf[6] = ikepsk->nr_buf[6];
12222 salt->salt_buf[7] = ikepsk->nr_buf[7];
12223
12224 return (PARSER_OK);
12225 }
12226
12227 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12228 {
12229 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12230
12231 u32 *digest = (u32 *) hash_buf->digest;
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
12239 digest[0] = byte_swap_32 (digest[0]);
12240 digest[1] = byte_swap_32 (digest[1]);
12241 digest[2] = byte_swap_32 (digest[2]);
12242 digest[3] = byte_swap_32 (digest[3]);
12243 digest[4] = byte_swap_32 (digest[4]);
12244
12245 return (PARSER_OK);
12246 }
12247
12248 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12249 {
12250 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12251
12252 u32 *digest = (u32 *) hash_buf->digest;
12253
12254 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12255 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12256 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12257 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12258 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12259 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12260 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12261 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12262 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12263 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12264 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12265 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12266 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12267 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12268 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12269 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12270
12271 return (PARSER_OK);
12272 }
12273
12274 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12275 {
12276 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12277
12278 u32 *digest = (u32 *) hash_buf->digest;
12279
12280 salt_t *salt = hash_buf->salt;
12281
12282 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12283 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12284 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12285 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12286 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12287
12288 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12289
12290 uint salt_len = input_len - 40 - 1;
12291
12292 char *salt_buf = input_buf + 40 + 1;
12293
12294 char *salt_buf_ptr = (char *) salt->salt_buf;
12295
12296 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12297
12298 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12299
12300 salt->salt_len = salt_len;
12301
12302 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12303
12304 return (PARSER_OK);
12305 }
12306
12307 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12308 {
12309 u32 *digest = (u32 *) hash_buf->digest;
12310
12311 salt_t *salt = hash_buf->salt;
12312
12313 tc_t *tc = (tc_t *) hash_buf->esalt;
12314
12315 if (input_len == 0)
12316 {
12317 log_error ("TrueCrypt container not specified");
12318
12319 exit (-1);
12320 }
12321
12322 FILE *fp = fopen (input_buf, "rb");
12323
12324 if (fp == NULL)
12325 {
12326 log_error ("%s: %s", input_buf, strerror (errno));
12327
12328 exit (-1);
12329 }
12330
12331 char buf[512] = { 0 };
12332
12333 int n = fread (buf, 1, sizeof (buf), fp);
12334
12335 fclose (fp);
12336
12337 if (n != 512) return (PARSER_TC_FILE_SIZE);
12338
12339 memcpy (tc->salt_buf, buf, 64);
12340
12341 memcpy (tc->data_buf, buf + 64, 512 - 64);
12342
12343 salt->salt_buf[0] = tc->salt_buf[0];
12344
12345 salt->salt_len = 4;
12346
12347 salt->salt_iter = 1000 - 1;
12348
12349 digest[0] = tc->data_buf[0];
12350
12351 return (PARSER_OK);
12352 }
12353
12354 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12355 {
12356 u32 *digest = (u32 *) hash_buf->digest;
12357
12358 salt_t *salt = hash_buf->salt;
12359
12360 tc_t *tc = (tc_t *) hash_buf->esalt;
12361
12362 if (input_len == 0)
12363 {
12364 log_error ("TrueCrypt container not specified");
12365
12366 exit (-1);
12367 }
12368
12369 FILE *fp = fopen (input_buf, "rb");
12370
12371 if (fp == NULL)
12372 {
12373 log_error ("%s: %s", input_buf, strerror (errno));
12374
12375 exit (-1);
12376 }
12377
12378 char buf[512] = { 0 };
12379
12380 int n = fread (buf, 1, sizeof (buf), fp);
12381
12382 fclose (fp);
12383
12384 if (n != 512) return (PARSER_TC_FILE_SIZE);
12385
12386 memcpy (tc->salt_buf, buf, 64);
12387
12388 memcpy (tc->data_buf, buf + 64, 512 - 64);
12389
12390 salt->salt_buf[0] = tc->salt_buf[0];
12391
12392 salt->salt_len = 4;
12393
12394 salt->salt_iter = 2000 - 1;
12395
12396 digest[0] = tc->data_buf[0];
12397
12398 return (PARSER_OK);
12399 }
12400
12401 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12402 {
12403 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12404
12405 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12406
12407 u32 *digest = (u32 *) hash_buf->digest;
12408
12409 salt_t *salt = hash_buf->salt;
12410
12411 char *salt_pos = input_buf + 6;
12412
12413 char *hash_pos = strchr (salt_pos, '$');
12414
12415 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12416
12417 uint salt_len = hash_pos - salt_pos;
12418
12419 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12420
12421 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12422
12423 salt->salt_len = salt_len;
12424
12425 salt->salt_iter = 1000;
12426
12427 hash_pos++;
12428
12429 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12430
12431 return (PARSER_OK);
12432 }
12433
12434 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12435 {
12436 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12437
12438 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12439
12440 u32 *digest = (u32 *) hash_buf->digest;
12441
12442 salt_t *salt = hash_buf->salt;
12443
12444 char *iter_pos = input_buf + 7;
12445
12446 char *salt_pos = strchr (iter_pos, '$');
12447
12448 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12449
12450 salt_pos++;
12451
12452 char *hash_pos = strchr (salt_pos, '$');
12453
12454 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12455
12456 uint salt_len = hash_pos - salt_pos;
12457
12458 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12459
12460 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12461
12462 salt->salt_len = salt_len;
12463
12464 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12465
12466 salt->salt_sign[0] = atoi (salt_iter);
12467
12468 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12469
12470 hash_pos++;
12471
12472 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12473
12474 digest[0] = byte_swap_32 (digest[0]);
12475 digest[1] = byte_swap_32 (digest[1]);
12476 digest[2] = byte_swap_32 (digest[2]);
12477 digest[3] = byte_swap_32 (digest[3]);
12478 digest[4] = byte_swap_32 (digest[4]);
12479
12480 return (PARSER_OK);
12481 }
12482
12483 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12484 {
12485 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12486
12487 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12488
12489 u32 *digest = (u32 *) hash_buf->digest;
12490
12491 salt_t *salt = hash_buf->salt;
12492
12493 char *iter_pos = input_buf + 9;
12494
12495 char *salt_pos = strchr (iter_pos, '$');
12496
12497 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12498
12499 salt_pos++;
12500
12501 char *hash_pos = strchr (salt_pos, '$');
12502
12503 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12504
12505 uint salt_len = hash_pos - salt_pos;
12506
12507 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12508
12509 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12510
12511 salt->salt_len = salt_len;
12512
12513 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12514
12515 salt->salt_sign[0] = atoi (salt_iter);
12516
12517 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12518
12519 hash_pos++;
12520
12521 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12522
12523 digest[0] = byte_swap_32 (digest[0]);
12524 digest[1] = byte_swap_32 (digest[1]);
12525 digest[2] = byte_swap_32 (digest[2]);
12526 digest[3] = byte_swap_32 (digest[3]);
12527 digest[4] = byte_swap_32 (digest[4]);
12528 digest[5] = byte_swap_32 (digest[5]);
12529 digest[6] = byte_swap_32 (digest[6]);
12530 digest[7] = byte_swap_32 (digest[7]);
12531
12532 return (PARSER_OK);
12533 }
12534
12535 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12536 {
12537 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12538
12539 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12540
12541 u64 *digest = (u64 *) hash_buf->digest;
12542
12543 salt_t *salt = hash_buf->salt;
12544
12545 char *iter_pos = input_buf + 9;
12546
12547 char *salt_pos = strchr (iter_pos, '$');
12548
12549 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12550
12551 salt_pos++;
12552
12553 char *hash_pos = strchr (salt_pos, '$');
12554
12555 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12556
12557 uint salt_len = hash_pos - salt_pos;
12558
12559 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12560
12561 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12562
12563 salt->salt_len = salt_len;
12564
12565 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12566
12567 salt->salt_sign[0] = atoi (salt_iter);
12568
12569 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12570
12571 hash_pos++;
12572
12573 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12574
12575 digest[0] = byte_swap_64 (digest[0]);
12576 digest[1] = byte_swap_64 (digest[1]);
12577 digest[2] = byte_swap_64 (digest[2]);
12578 digest[3] = byte_swap_64 (digest[3]);
12579 digest[4] = byte_swap_64 (digest[4]);
12580 digest[5] = byte_swap_64 (digest[5]);
12581 digest[6] = byte_swap_64 (digest[6]);
12582 digest[7] = byte_swap_64 (digest[7]);
12583
12584 return (PARSER_OK);
12585 }
12586
12587 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12588 {
12589 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12590
12591 u32 *digest = (u32 *) hash_buf->digest;
12592
12593 salt_t *salt = hash_buf->salt;
12594
12595 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12596
12597 /**
12598 * parse line
12599 */
12600
12601 char *iterations_pos = input_buf;
12602
12603 char *saltbuf_pos = strchr (iterations_pos, ':');
12604
12605 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12606
12607 uint iterations_len = saltbuf_pos - iterations_pos;
12608
12609 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12610
12611 saltbuf_pos++;
12612
12613 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12614
12615 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12616
12617 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12618
12619 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12620
12621 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12622
12623 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12624
12625 cipherbuf_pos++;
12626
12627 /**
12628 * pbkdf2 iterations
12629 */
12630
12631 salt->salt_iter = atoi (iterations_pos) - 1;
12632
12633 /**
12634 * handle salt encoding
12635 */
12636
12637 char *saltbuf_ptr = (char *) salt->salt_buf;
12638
12639 for (uint i = 0; i < saltbuf_len; i += 2)
12640 {
12641 const char p0 = saltbuf_pos[i + 0];
12642 const char p1 = saltbuf_pos[i + 1];
12643
12644 *saltbuf_ptr++ = hex_convert (p1) << 0
12645 | hex_convert (p0) << 4;
12646 }
12647
12648 salt->salt_len = saltbuf_len / 2;
12649
12650 /**
12651 * handle cipher encoding
12652 */
12653
12654 uint *tmp = (uint *) mymalloc (32);
12655
12656 char *cipherbuf_ptr = (char *) tmp;
12657
12658 for (uint i = 2016; i < cipherbuf_len; i += 2)
12659 {
12660 const char p0 = cipherbuf_pos[i + 0];
12661 const char p1 = cipherbuf_pos[i + 1];
12662
12663 *cipherbuf_ptr++ = hex_convert (p1) << 0
12664 | hex_convert (p0) << 4;
12665 }
12666
12667 // iv is stored at salt_buf 4 (length 16)
12668 // data is stored at salt_buf 8 (length 16)
12669
12670 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12671 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12672 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12673 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12674
12675 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12676 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12677 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12678 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12679
12680 free (tmp);
12681
12682 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12683 {
12684 const char p0 = cipherbuf_pos[j + 0];
12685 const char p1 = cipherbuf_pos[j + 1];
12686
12687 agilekey->cipher[i] = hex_convert (p1) << 0
12688 | hex_convert (p0) << 4;
12689 }
12690
12691 /**
12692 * digest buf
12693 */
12694
12695 digest[0] = 0x10101010;
12696 digest[1] = 0x10101010;
12697 digest[2] = 0x10101010;
12698 digest[3] = 0x10101010;
12699
12700 return (PARSER_OK);
12701 }
12702
12703 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12704 {
12705 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12706
12707 u32 *digest = (u32 *) hash_buf->digest;
12708
12709 salt_t *salt = hash_buf->salt;
12710
12711 char *hashbuf_pos = input_buf;
12712
12713 char *iterations_pos = strchr (hashbuf_pos, ':');
12714
12715 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12716
12717 uint hash_len = iterations_pos - hashbuf_pos;
12718
12719 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12720
12721 iterations_pos++;
12722
12723 char *saltbuf_pos = strchr (iterations_pos, ':');
12724
12725 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12726
12727 uint iterations_len = saltbuf_pos - iterations_pos;
12728
12729 saltbuf_pos++;
12730
12731 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12732
12733 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12734
12735 char *salt_buf_ptr = (char *) salt->salt_buf;
12736
12737 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12738
12739 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12740
12741 salt->salt_len = salt_len;
12742
12743 salt->salt_iter = atoi (iterations_pos) - 1;
12744
12745 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12746 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12747 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12748 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12749
12750 return (PARSER_OK);
12751 }
12752
12753 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12754 {
12755 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12756
12757 u32 *digest = (u32 *) hash_buf->digest;
12758
12759 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12760 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12761 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12762 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12763 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12764 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12765 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12766 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12767
12768 digest[0] = byte_swap_32 (digest[0]);
12769 digest[1] = byte_swap_32 (digest[1]);
12770 digest[2] = byte_swap_32 (digest[2]);
12771 digest[3] = byte_swap_32 (digest[3]);
12772 digest[4] = byte_swap_32 (digest[4]);
12773 digest[5] = byte_swap_32 (digest[5]);
12774 digest[6] = byte_swap_32 (digest[6]);
12775 digest[7] = byte_swap_32 (digest[7]);
12776
12777 return (PARSER_OK);
12778 }
12779
12780 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12781 {
12782 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12783
12784 u32 *digest = (u32 *) hash_buf->digest;
12785
12786 salt_t *salt = hash_buf->salt;
12787
12788 char *salt_pos = input_buf + 3;
12789
12790 uint iterations_len = 0;
12791
12792 if (memcmp (salt_pos, "rounds=", 7) == 0)
12793 {
12794 salt_pos += 7;
12795
12796 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12797
12798 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12799 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12800
12801 salt_pos[0] = 0x0;
12802
12803 salt->salt_iter = atoi (salt_pos - iterations_len);
12804
12805 salt_pos += 1;
12806
12807 iterations_len += 8;
12808 }
12809 else
12810 {
12811 salt->salt_iter = ROUNDS_SHA256CRYPT;
12812 }
12813
12814 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12815
12816 char *hash_pos = strchr (salt_pos, '$');
12817
12818 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12819
12820 uint salt_len = hash_pos - salt_pos;
12821
12822 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12823
12824 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12825
12826 salt->salt_len = salt_len;
12827
12828 hash_pos++;
12829
12830 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12831
12832 return (PARSER_OK);
12833 }
12834
12835 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12836 {
12837 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12838
12839 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12840
12841 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12842
12843 u64 *digest = (u64 *) hash_buf->digest;
12844
12845 salt_t *salt = hash_buf->salt;
12846
12847 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12848
12849 char *iter_pos = input_buf + 4;
12850
12851 char *salt_pos = strchr (iter_pos, '$');
12852
12853 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12854
12855 salt_pos++;
12856
12857 char *hash_pos = strchr (salt_pos, '$');
12858
12859 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12860
12861 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12862
12863 hash_pos++;
12864
12865 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12866 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12867 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12868 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12869 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12870 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12871 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12872 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12873
12874 uint salt_len = hash_pos - salt_pos - 1;
12875
12876 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12877
12878 salt->salt_len = salt_len / 2;
12879
12880 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12881 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12882 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12883 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12884 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
12885 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
12886 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
12887 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
12888
12889 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12890 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12891 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12892 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12893 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12894 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12895 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12896 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12897 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12898 pbkdf2_sha512->salt_buf[9] = 0x80;
12899
12900 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12901
12902 salt->salt_iter = atoi (iter_pos) - 1;
12903
12904 return (PARSER_OK);
12905 }
12906
12907 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12908 {
12909 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12910
12911 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12912
12913 u32 *digest = (u32 *) hash_buf->digest;
12914
12915 salt_t *salt = hash_buf->salt;
12916
12917 char *salt_pos = input_buf + 14;
12918
12919 char *hash_pos = strchr (salt_pos, '*');
12920
12921 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12922
12923 hash_pos++;
12924
12925 uint salt_len = hash_pos - salt_pos - 1;
12926
12927 char *salt_buf_ptr = (char *) salt->salt_buf;
12928
12929 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12930
12931 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12932
12933 salt->salt_len = salt_len;
12934
12935 u8 tmp_buf[100] = { 0 };
12936
12937 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
12938
12939 memcpy (digest, tmp_buf, 32);
12940
12941 digest[0] = byte_swap_32 (digest[0]);
12942 digest[1] = byte_swap_32 (digest[1]);
12943 digest[2] = byte_swap_32 (digest[2]);
12944 digest[3] = byte_swap_32 (digest[3]);
12945 digest[4] = byte_swap_32 (digest[4]);
12946 digest[5] = byte_swap_32 (digest[5]);
12947 digest[6] = byte_swap_32 (digest[6]);
12948 digest[7] = byte_swap_32 (digest[7]);
12949
12950 digest[0] -= SHA256M_A;
12951 digest[1] -= SHA256M_B;
12952 digest[2] -= SHA256M_C;
12953 digest[3] -= SHA256M_D;
12954 digest[4] -= SHA256M_E;
12955 digest[5] -= SHA256M_F;
12956 digest[6] -= SHA256M_G;
12957 digest[7] -= SHA256M_H;
12958
12959 return (PARSER_OK);
12960 }
12961
12962 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12963 {
12964 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12965
12966 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12967
12968 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12969
12970 u64 *digest = (u64 *) hash_buf->digest;
12971
12972 salt_t *salt = hash_buf->salt;
12973
12974 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12975
12976 char *iter_pos = input_buf + 19;
12977
12978 char *salt_pos = strchr (iter_pos, '.');
12979
12980 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12981
12982 salt_pos++;
12983
12984 char *hash_pos = strchr (salt_pos, '.');
12985
12986 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12987
12988 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12989
12990 hash_pos++;
12991
12992 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12993 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12994 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12995 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12996 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12997 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12998 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12999 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13000
13001 uint salt_len = hash_pos - salt_pos - 1;
13002
13003 salt_len /= 2;
13004
13005 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13006
13007 uint i;
13008
13009 for (i = 0; i < salt_len; i++)
13010 {
13011 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13012 }
13013
13014 salt_buf_ptr[salt_len + 3] = 0x01;
13015 salt_buf_ptr[salt_len + 4] = 0x80;
13016
13017 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13018
13019 salt->salt_len = salt_len;
13020
13021 salt->salt_iter = atoi (iter_pos) - 1;
13022
13023 return (PARSER_OK);
13024 }
13025
13026 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13027 {
13028 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13029
13030 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13031
13032 u64 *digest = (u64 *) hash_buf->digest;
13033
13034 salt_t *salt = hash_buf->salt;
13035
13036 u8 tmp_buf[120] = { 0 };
13037
13038 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13039
13040 memcpy (digest, tmp_buf, 64);
13041
13042 digest[0] = byte_swap_64 (digest[0]);
13043 digest[1] = byte_swap_64 (digest[1]);
13044 digest[2] = byte_swap_64 (digest[2]);
13045 digest[3] = byte_swap_64 (digest[3]);
13046 digest[4] = byte_swap_64 (digest[4]);
13047 digest[5] = byte_swap_64 (digest[5]);
13048 digest[6] = byte_swap_64 (digest[6]);
13049 digest[7] = byte_swap_64 (digest[7]);
13050
13051 digest[0] -= SHA512M_A;
13052 digest[1] -= SHA512M_B;
13053 digest[2] -= SHA512M_C;
13054 digest[3] -= SHA512M_D;
13055 digest[4] -= SHA512M_E;
13056 digest[5] -= SHA512M_F;
13057 digest[6] -= SHA512M_G;
13058 digest[7] -= SHA512M_H;
13059
13060 salt->salt_len = tmp_len - 64;
13061
13062 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13063
13064 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13065 {
13066 char *ptr = (char *) salt->salt_buf;
13067
13068 ptr[salt->salt_len] = 0x80;
13069 }
13070
13071 return (PARSER_OK);
13072 }
13073
13074 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13075 {
13076 if (data.opts_type & OPTS_TYPE_ST_HEX)
13077 {
13078 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13079 }
13080 else
13081 {
13082 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13083 }
13084
13085 u32 *digest = (u32 *) hash_buf->digest;
13086
13087 salt_t *salt = hash_buf->salt;
13088
13089 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13090 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13091 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13092 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13093
13094 digest[0] = byte_swap_32 (digest[0]);
13095 digest[1] = byte_swap_32 (digest[1]);
13096 digest[2] = byte_swap_32 (digest[2]);
13097 digest[3] = byte_swap_32 (digest[3]);
13098
13099 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13100
13101 uint salt_len = input_len - 32 - 1;
13102
13103 char *salt_buf = input_buf + 32 + 1;
13104
13105 char *salt_buf_ptr = (char *) salt->salt_buf;
13106
13107 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13108
13109 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13110
13111 salt->salt_len = salt_len;
13112
13113 return (PARSER_OK);
13114 }
13115
13116 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13117 {
13118 if (data.opts_type & OPTS_TYPE_ST_HEX)
13119 {
13120 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13121 }
13122 else
13123 {
13124 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13125 }
13126
13127 u32 *digest = (u32 *) hash_buf->digest;
13128
13129 salt_t *salt = hash_buf->salt;
13130
13131 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13132 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13133 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13134 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13135 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13136
13137 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13138
13139 uint salt_len = input_len - 40 - 1;
13140
13141 char *salt_buf = input_buf + 40 + 1;
13142
13143 char *salt_buf_ptr = (char *) salt->salt_buf;
13144
13145 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13146
13147 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13148
13149 salt->salt_len = salt_len;
13150
13151 return (PARSER_OK);
13152 }
13153
13154 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13155 {
13156 if (data.opts_type & OPTS_TYPE_ST_HEX)
13157 {
13158 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13159 }
13160 else
13161 {
13162 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13163 }
13164
13165 u32 *digest = (u32 *) hash_buf->digest;
13166
13167 salt_t *salt = hash_buf->salt;
13168
13169 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13170 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13171 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13172 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13173 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13174 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13175 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13176 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13177
13178 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13179
13180 uint salt_len = input_len - 64 - 1;
13181
13182 char *salt_buf = input_buf + 64 + 1;
13183
13184 char *salt_buf_ptr = (char *) salt->salt_buf;
13185
13186 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13187
13188 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13189
13190 salt->salt_len = salt_len;
13191
13192 return (PARSER_OK);
13193 }
13194
13195 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13196 {
13197 if (data.opts_type & OPTS_TYPE_ST_HEX)
13198 {
13199 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13200 }
13201 else
13202 {
13203 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13204 }
13205
13206 u64 *digest = (u64 *) hash_buf->digest;
13207
13208 salt_t *salt = hash_buf->salt;
13209
13210 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13211 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13212 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13213 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13214 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13215 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13216 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13217 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13218
13219 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13220
13221 uint salt_len = input_len - 128 - 1;
13222
13223 char *salt_buf = input_buf + 128 + 1;
13224
13225 char *salt_buf_ptr = (char *) salt->salt_buf;
13226
13227 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13228
13229 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13230
13231 salt->salt_len = salt_len;
13232
13233 return (PARSER_OK);
13234 }
13235
13236 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13237 {
13238 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13239
13240 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13241
13242 u32 *digest = (u32 *) hash_buf->digest;
13243
13244 salt_t *salt = hash_buf->salt;
13245
13246 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13247
13248 /**
13249 * parse line
13250 */
13251
13252 char *user_pos = input_buf + 10 + 1;
13253
13254 char *realm_pos = strchr (user_pos, '$');
13255
13256 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13257
13258 uint user_len = realm_pos - user_pos;
13259
13260 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13261
13262 realm_pos++;
13263
13264 char *salt_pos = strchr (realm_pos, '$');
13265
13266 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13267
13268 uint realm_len = salt_pos - realm_pos;
13269
13270 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13271
13272 salt_pos++;
13273
13274 char *data_pos = strchr (salt_pos, '$');
13275
13276 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13277
13278 uint salt_len = data_pos - salt_pos;
13279
13280 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13281
13282 data_pos++;
13283
13284 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13285
13286 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13287
13288 /**
13289 * copy data
13290 */
13291
13292 memcpy (krb5pa->user, user_pos, user_len);
13293 memcpy (krb5pa->realm, realm_pos, realm_len);
13294 memcpy (krb5pa->salt, salt_pos, salt_len);
13295
13296 char *timestamp_ptr = (char *) krb5pa->timestamp;
13297
13298 for (uint i = 0; i < (36 * 2); i += 2)
13299 {
13300 const char p0 = data_pos[i + 0];
13301 const char p1 = data_pos[i + 1];
13302
13303 *timestamp_ptr++ = hex_convert (p1) << 0
13304 | hex_convert (p0) << 4;
13305 }
13306
13307 char *checksum_ptr = (char *) krb5pa->checksum;
13308
13309 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13310 {
13311 const char p0 = data_pos[i + 0];
13312 const char p1 = data_pos[i + 1];
13313
13314 *checksum_ptr++ = hex_convert (p1) << 0
13315 | hex_convert (p0) << 4;
13316 }
13317
13318 /**
13319 * copy some data to generic buffers to make sorting happy
13320 */
13321
13322 salt->salt_buf[0] = krb5pa->timestamp[0];
13323 salt->salt_buf[1] = krb5pa->timestamp[1];
13324 salt->salt_buf[2] = krb5pa->timestamp[2];
13325 salt->salt_buf[3] = krb5pa->timestamp[3];
13326 salt->salt_buf[4] = krb5pa->timestamp[4];
13327 salt->salt_buf[5] = krb5pa->timestamp[5];
13328 salt->salt_buf[6] = krb5pa->timestamp[6];
13329 salt->salt_buf[7] = krb5pa->timestamp[7];
13330 salt->salt_buf[8] = krb5pa->timestamp[8];
13331
13332 salt->salt_len = 36;
13333
13334 digest[0] = krb5pa->checksum[0];
13335 digest[1] = krb5pa->checksum[1];
13336 digest[2] = krb5pa->checksum[2];
13337 digest[3] = krb5pa->checksum[3];
13338
13339 return (PARSER_OK);
13340 }
13341
13342 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13343 {
13344 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13345
13346 u32 *digest = (u32 *) hash_buf->digest;
13347
13348 salt_t *salt = hash_buf->salt;
13349
13350 /**
13351 * parse line
13352 */
13353
13354 char *salt_pos = input_buf;
13355
13356 char *hash_pos = strchr (salt_pos, '$');
13357
13358 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13359
13360 uint salt_len = hash_pos - salt_pos;
13361
13362 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13363
13364 hash_pos++;
13365
13366 uint hash_len = input_len - 1 - salt_len;
13367
13368 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13369
13370 /**
13371 * valid some data
13372 */
13373
13374 uint user_len = 0;
13375
13376 for (uint i = 0; i < salt_len; i++)
13377 {
13378 if (salt_pos[i] == ' ') continue;
13379
13380 user_len++;
13381 }
13382
13383 // SAP user names cannot be longer than 12 characters
13384 if (user_len > 12) return (PARSER_SALT_LENGTH);
13385
13386 // SAP user name cannot start with ! or ?
13387 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13388
13389 /**
13390 * copy data
13391 */
13392
13393 char *salt_buf_ptr = (char *) salt->salt_buf;
13394
13395 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13396
13397 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13398
13399 salt->salt_len = salt_len;
13400
13401 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13402 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13403 digest[2] = 0;
13404 digest[3] = 0;
13405
13406 digest[0] = byte_swap_32 (digest[0]);
13407 digest[1] = byte_swap_32 (digest[1]);
13408
13409 return (PARSER_OK);
13410 }
13411
13412 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13413 {
13414 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13415
13416 u32 *digest = (u32 *) hash_buf->digest;
13417
13418 salt_t *salt = hash_buf->salt;
13419
13420 /**
13421 * parse line
13422 */
13423
13424 char *salt_pos = input_buf;
13425
13426 char *hash_pos = strchr (salt_pos, '$');
13427
13428 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13429
13430 uint salt_len = hash_pos - salt_pos;
13431
13432 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13433
13434 hash_pos++;
13435
13436 uint hash_len = input_len - 1 - salt_len;
13437
13438 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13439
13440 /**
13441 * valid some data
13442 */
13443
13444 uint user_len = 0;
13445
13446 for (uint i = 0; i < salt_len; i++)
13447 {
13448 if (salt_pos[i] == ' ') continue;
13449
13450 user_len++;
13451 }
13452
13453 // SAP user names cannot be longer than 12 characters
13454 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13455 // so far nobody complained so we stay with this because it helps in optimization
13456 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13457
13458 if (user_len > 12) return (PARSER_SALT_LENGTH);
13459
13460 // SAP user name cannot start with ! or ?
13461 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13462
13463 /**
13464 * copy data
13465 */
13466
13467 char *salt_buf_ptr = (char *) salt->salt_buf;
13468
13469 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13470
13471 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13472
13473 salt->salt_len = salt_len;
13474
13475 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13476 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13477 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13478 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13479 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13480
13481 return (PARSER_OK);
13482 }
13483
13484 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13485 {
13486 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13487
13488 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13489
13490 u64 *digest = (u64 *) hash_buf->digest;
13491
13492 salt_t *salt = hash_buf->salt;
13493
13494 char *iter_pos = input_buf + 3;
13495
13496 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13497
13498 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13499
13500 memcpy ((char *) salt->salt_sign, input_buf, 4);
13501
13502 salt->salt_iter = salt_iter;
13503
13504 char *salt_pos = iter_pos + 1;
13505
13506 uint salt_len = 8;
13507
13508 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13509
13510 salt->salt_len = salt_len;
13511
13512 char *hash_pos = salt_pos + salt_len;
13513
13514 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13515
13516 // ugly hack start
13517
13518 char *tmp = (char *) salt->salt_buf_pc;
13519
13520 tmp[0] = hash_pos[42];
13521
13522 // ugly hack end
13523
13524 digest[ 0] = byte_swap_64 (digest[ 0]);
13525 digest[ 1] = byte_swap_64 (digest[ 1]);
13526 digest[ 2] = byte_swap_64 (digest[ 2]);
13527 digest[ 3] = byte_swap_64 (digest[ 3]);
13528 digest[ 4] = 0;
13529 digest[ 5] = 0;
13530 digest[ 6] = 0;
13531 digest[ 7] = 0;
13532
13533 return (PARSER_OK);
13534 }
13535
13536 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13537 {
13538 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13539
13540 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13541
13542 u32 *digest = (u32 *) hash_buf->digest;
13543
13544 salt_t *salt = hash_buf->salt;
13545
13546 char *salt_buf = input_buf + 6;
13547
13548 uint salt_len = 16;
13549
13550 char *salt_buf_ptr = (char *) salt->salt_buf;
13551
13552 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13553
13554 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13555
13556 salt->salt_len = salt_len;
13557
13558 char *hash_pos = input_buf + 6 + 16;
13559
13560 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13561 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13562 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13563 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13564 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13565 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13566 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13567 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13568
13569 return (PARSER_OK);
13570 }
13571
13572 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13573 {
13574 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13575
13576 u32 *digest = (u32 *) hash_buf->digest;
13577
13578 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13579 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13580 digest[2] = 0;
13581 digest[3] = 0;
13582
13583 return (PARSER_OK);
13584 }
13585
13586 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13587 {
13588 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13589
13590 u32 *digest = (u32 *) hash_buf->digest;
13591
13592 salt_t *salt = hash_buf->salt;
13593
13594 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13595
13596 char *saltbuf_pos = input_buf;
13597
13598 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13599
13600 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13601
13602 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13603
13604 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13605 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13606
13607 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13608
13609 hashbuf_pos++;
13610
13611 uint hashbuf_len = input_len - saltbuf_len - 1;
13612
13613 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13614
13615 char *salt_ptr = (char *) saltbuf_pos;
13616 char *rakp_ptr = (char *) rakp->salt_buf;
13617
13618 uint i;
13619 uint j;
13620
13621 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13622 {
13623 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13624 }
13625
13626 rakp_ptr[j] = 0x80;
13627
13628 rakp->salt_len = j;
13629
13630 for (i = 0; i < 64; i++)
13631 {
13632 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13633 }
13634
13635 salt->salt_buf[0] = rakp->salt_buf[0];
13636 salt->salt_buf[1] = rakp->salt_buf[1];
13637 salt->salt_buf[2] = rakp->salt_buf[2];
13638 salt->salt_buf[3] = rakp->salt_buf[3];
13639 salt->salt_buf[4] = rakp->salt_buf[4];
13640 salt->salt_buf[5] = rakp->salt_buf[5];
13641 salt->salt_buf[6] = rakp->salt_buf[6];
13642 salt->salt_buf[7] = rakp->salt_buf[7];
13643
13644 salt->salt_len = 32; // muss min. 32 haben
13645
13646 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13647 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13648 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13649 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13650 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13651
13652 return (PARSER_OK);
13653 }
13654
13655 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13656 {
13657 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13658
13659 u32 *digest = (u32 *) hash_buf->digest;
13660
13661 salt_t *salt = hash_buf->salt;
13662
13663 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13664
13665 char *salt_pos = input_buf + 1;
13666
13667 memcpy (salt->salt_buf, salt_pos, 8);
13668
13669 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13670 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13671
13672 salt->salt_len = 8;
13673
13674 char *hash_pos = salt_pos + 8;
13675
13676 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13677 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13678 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13679 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13680 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13681
13682 digest[0] -= SHA1M_A;
13683 digest[1] -= SHA1M_B;
13684 digest[2] -= SHA1M_C;
13685 digest[3] -= SHA1M_D;
13686 digest[4] -= SHA1M_E;
13687
13688 return (PARSER_OK);
13689 }
13690
13691 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13692 {
13693 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13694
13695 u32 *digest = (u32 *) hash_buf->digest;
13696
13697 salt_t *salt = hash_buf->salt;
13698
13699 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13700 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13701 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13702 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13703
13704 digest[0] = byte_swap_32 (digest[0]);
13705 digest[1] = byte_swap_32 (digest[1]);
13706 digest[2] = byte_swap_32 (digest[2]);
13707 digest[3] = byte_swap_32 (digest[3]);
13708
13709 digest[0] -= MD5M_A;
13710 digest[1] -= MD5M_B;
13711 digest[2] -= MD5M_C;
13712 digest[3] -= MD5M_D;
13713
13714 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13715
13716 char *salt_buf_ptr = input_buf + 32 + 1;
13717
13718 u32 *salt_buf = salt->salt_buf;
13719
13720 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13721 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13722 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13723 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13724
13725 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13726 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13727 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13728 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13729
13730 salt->salt_len = 16 + 1;
13731
13732 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13733
13734 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13735
13736 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13737
13738 return (PARSER_OK);
13739 }
13740
13741 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13742 {
13743 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13744
13745 u32 *digest = (u32 *) hash_buf->digest;
13746
13747 salt_t *salt = hash_buf->salt;
13748
13749 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13750
13751 /**
13752 * parse line
13753 */
13754
13755 char *hashbuf_pos = input_buf;
13756
13757 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13758
13759 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13760
13761 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13762
13763 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13764
13765 saltbuf_pos++;
13766
13767 char *iteration_pos = strchr (saltbuf_pos, ':');
13768
13769 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13770
13771 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13772
13773 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13774
13775 iteration_pos++;
13776
13777 char *databuf_pos = strchr (iteration_pos, ':');
13778
13779 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13780
13781 const uint iteration_len = databuf_pos - iteration_pos;
13782
13783 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13784 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13785
13786 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13787
13788 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13789 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13790
13791 databuf_pos++;
13792
13793 // digest
13794
13795 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13796 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13797 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13798 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13799 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13800 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
13801 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
13802 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
13803
13804 // salt
13805
13806 char *saltbuf_ptr = (char *) salt->salt_buf;
13807
13808 for (uint i = 0; i < saltbuf_len; i += 2)
13809 {
13810 const char p0 = saltbuf_pos[i + 0];
13811 const char p1 = saltbuf_pos[i + 1];
13812
13813 *saltbuf_ptr++ = hex_convert (p1) << 0
13814 | hex_convert (p0) << 4;
13815 }
13816
13817 salt->salt_buf[4] = 0x01000000;
13818 salt->salt_buf[5] = 0x80;
13819
13820 salt->salt_len = saltbuf_len / 2;
13821
13822 // iteration
13823
13824 salt->salt_iter = atoi (iteration_pos) - 1;
13825
13826 // data
13827
13828 char *databuf_ptr = (char *) cloudkey->data_buf;
13829
13830 for (uint i = 0; i < databuf_len; i += 2)
13831 {
13832 const char p0 = databuf_pos[i + 0];
13833 const char p1 = databuf_pos[i + 1];
13834
13835 *databuf_ptr++ = hex_convert (p1) << 0
13836 | hex_convert (p0) << 4;
13837 }
13838
13839 *databuf_ptr++ = 0x80;
13840
13841 for (uint i = 0; i < 512; i++)
13842 {
13843 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13844 }
13845
13846 cloudkey->data_len = databuf_len / 2;
13847
13848 return (PARSER_OK);
13849 }
13850
13851 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13852 {
13853 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13854
13855 u32 *digest = (u32 *) hash_buf->digest;
13856
13857 salt_t *salt = hash_buf->salt;
13858
13859 /**
13860 * parse line
13861 */
13862
13863 char *hashbuf_pos = input_buf;
13864
13865 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13866
13867 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13868
13869 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13870
13871 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13872
13873 domainbuf_pos++;
13874
13875 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13876
13877 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13878
13879 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13880
13881 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13882
13883 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13884
13885 saltbuf_pos++;
13886
13887 char *iteration_pos = strchr (saltbuf_pos, ':');
13888
13889 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13890
13891 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13892
13893 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13894
13895 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13896
13897 iteration_pos++;
13898
13899 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13900
13901 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13902 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13903
13904 // ok, the plan for this algorithm is the following:
13905 // we have 2 salts here, the domain-name and a random salt
13906 // while both are used in the initial transformation,
13907 // only the random salt is used in the following iterations
13908 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13909 // and one that includes only the real salt (stored into salt_buf[]).
13910 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13911
13912 u8 tmp_buf[100] = { 0 };
13913
13914 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
13915
13916 memcpy (digest, tmp_buf, 20);
13917
13918 digest[0] = byte_swap_32 (digest[0]);
13919 digest[1] = byte_swap_32 (digest[1]);
13920 digest[2] = byte_swap_32 (digest[2]);
13921 digest[3] = byte_swap_32 (digest[3]);
13922 digest[4] = byte_swap_32 (digest[4]);
13923
13924 // domain
13925
13926 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13927
13928 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13929
13930 char *len_ptr = NULL;
13931
13932 for (uint i = 0; i < domainbuf_len; i++)
13933 {
13934 if (salt_buf_pc_ptr[i] == '.')
13935 {
13936 len_ptr = &salt_buf_pc_ptr[i];
13937
13938 *len_ptr = 0;
13939 }
13940 else
13941 {
13942 *len_ptr += 1;
13943 }
13944 }
13945
13946 salt->salt_buf_pc[7] = domainbuf_len;
13947
13948 // "real" salt
13949
13950 char *salt_buf_ptr = (char *) salt->salt_buf;
13951
13952 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13953
13954 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13955
13956 salt->salt_len = salt_len;
13957
13958 // iteration
13959
13960 salt->salt_iter = atoi (iteration_pos);
13961
13962 return (PARSER_OK);
13963 }
13964
13965 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13966 {
13967 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13968
13969 u32 *digest = (u32 *) hash_buf->digest;
13970
13971 salt_t *salt = hash_buf->salt;
13972
13973 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13974 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13975 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13976 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13977 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13978
13979 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13980
13981 uint salt_len = input_len - 40 - 1;
13982
13983 char *salt_buf = input_buf + 40 + 1;
13984
13985 char *salt_buf_ptr = (char *) salt->salt_buf;
13986
13987 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13988
13989 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13990
13991 salt->salt_len = salt_len;
13992
13993 return (PARSER_OK);
13994 }
13995
13996 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13997 {
13998 const u8 ascii_to_ebcdic[] =
13999 {
14000 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14001 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14002 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14003 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14004 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14005 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14006 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14007 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14008 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14009 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14010 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14011 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14012 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14013 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14014 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14015 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14016 };
14017
14018 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14019
14020 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14021
14022 u32 *digest = (u32 *) hash_buf->digest;
14023
14024 salt_t *salt = hash_buf->salt;
14025
14026 char *salt_pos = input_buf + 6 + 1;
14027
14028 char *digest_pos = strchr (salt_pos, '*');
14029
14030 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14031
14032 uint salt_len = digest_pos - salt_pos;
14033
14034 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14035
14036 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14037
14038 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14039
14040 digest_pos++;
14041
14042 char *salt_buf_ptr = (char *) salt->salt_buf;
14043 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14044
14045 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14046
14047 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14048
14049 salt->salt_len = salt_len;
14050
14051 for (uint i = 0; i < salt_len; i++)
14052 {
14053 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14054 }
14055 for (uint i = salt_len; i < 8; i++)
14056 {
14057 salt_buf_pc_ptr[i] = 0x40;
14058 }
14059
14060 uint tt;
14061
14062 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14063
14064 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14065 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14066
14067 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14068 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14069
14070 digest[0] = byte_swap_32 (digest[0]);
14071 digest[1] = byte_swap_32 (digest[1]);
14072
14073 IP (digest[0], digest[1], tt);
14074
14075 digest[0] = rotr32 (digest[0], 29);
14076 digest[1] = rotr32 (digest[1], 29);
14077 digest[2] = 0;
14078 digest[3] = 0;
14079
14080 return (PARSER_OK);
14081 }
14082
14083 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14084 {
14085 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14086
14087 u32 *digest = (u32 *) hash_buf->digest;
14088
14089 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14090 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14091 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14092 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14093
14094 digest[0] = byte_swap_32 (digest[0]);
14095 digest[1] = byte_swap_32 (digest[1]);
14096 digest[2] = byte_swap_32 (digest[2]);
14097 digest[3] = byte_swap_32 (digest[3]);
14098
14099 return (PARSER_OK);
14100 }
14101
14102 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14103 {
14104 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14105
14106 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14107
14108 u32 *digest = (u32 *) hash_buf->digest;
14109
14110 salt_t *salt = hash_buf->salt;
14111
14112 u8 tmp_buf[120] = { 0 };
14113
14114 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14115
14116 tmp_buf[3] += -4; // dont ask!
14117
14118 memcpy (salt->salt_buf, tmp_buf, 5);
14119
14120 salt->salt_len = 5;
14121
14122 memcpy (digest, tmp_buf + 5, 9);
14123
14124 // yes, only 9 byte are needed to crack, but 10 to display
14125
14126 salt->salt_buf_pc[7] = input_buf[20];
14127
14128 return (PARSER_OK);
14129 }
14130
14131 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14132 {
14133 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14134
14135 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14136
14137 u32 *digest = (u32 *) hash_buf->digest;
14138
14139 salt_t *salt = hash_buf->salt;
14140
14141 u8 tmp_buf[120] = { 0 };
14142
14143 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14144
14145 tmp_buf[3] += -4; // dont ask!
14146
14147 // salt
14148
14149 memcpy (salt->salt_buf, tmp_buf, 16);
14150
14151 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)
14152
14153 // iteration
14154
14155 char tmp_iter_buf[11] = { 0 };
14156
14157 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14158
14159 tmp_iter_buf[10] = 0;
14160
14161 salt->salt_iter = atoi (tmp_iter_buf);
14162
14163 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14164 {
14165 return (PARSER_SALT_ITERATION);
14166 }
14167
14168 salt->salt_iter--; // first round in init
14169
14170 // 2 additional bytes for display only
14171
14172 salt->salt_buf_pc[0] = tmp_buf[26];
14173 salt->salt_buf_pc[1] = tmp_buf[27];
14174
14175 // digest
14176
14177 memcpy (digest, tmp_buf + 28, 8);
14178
14179 digest[0] = byte_swap_32 (digest[0]);
14180 digest[1] = byte_swap_32 (digest[1]);
14181 digest[2] = 0;
14182 digest[3] = 0;
14183
14184 return (PARSER_OK);
14185 }
14186
14187 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14188 {
14189 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14190
14191 u32 *digest = (u32 *) hash_buf->digest;
14192
14193 salt_t *salt = hash_buf->salt;
14194
14195 char *salt_buf_pos = input_buf;
14196
14197 char *hash_buf_pos = salt_buf_pos + 6;
14198
14199 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14200 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14201 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14202 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14203 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14204 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14205 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14206 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14207
14208 digest[0] -= SHA256M_A;
14209 digest[1] -= SHA256M_B;
14210 digest[2] -= SHA256M_C;
14211 digest[3] -= SHA256M_D;
14212 digest[4] -= SHA256M_E;
14213 digest[5] -= SHA256M_F;
14214 digest[6] -= SHA256M_G;
14215 digest[7] -= SHA256M_H;
14216
14217 char *salt_buf_ptr = (char *) salt->salt_buf;
14218
14219 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14220
14221 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14222
14223 salt->salt_len = salt_len;
14224
14225 return (PARSER_OK);
14226 }
14227
14228 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14229 {
14230 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14231
14232 u32 *digest = (u32 *) hash_buf->digest;
14233
14234 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14235
14236 salt_t *salt = hash_buf->salt;
14237
14238 char *salt_buf = input_buf + 6;
14239
14240 char *digest_buf = strchr (salt_buf, '$');
14241
14242 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14243
14244 uint salt_len = digest_buf - salt_buf;
14245
14246 digest_buf++; // skip the '$' symbol
14247
14248 char *salt_buf_ptr = (char *) salt->salt_buf;
14249
14250 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14251
14252 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14253
14254 salt->salt_len = salt_len;
14255
14256 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14257 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14258 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14259 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14260
14261 digest[0] = byte_swap_32 (digest[0]);
14262 digest[1] = byte_swap_32 (digest[1]);
14263 digest[2] = byte_swap_32 (digest[2]);
14264 digest[3] = byte_swap_32 (digest[3]);
14265
14266 digest[0] -= MD5M_A;
14267 digest[1] -= MD5M_B;
14268 digest[2] -= MD5M_C;
14269 digest[3] -= MD5M_D;
14270
14271 return (PARSER_OK);
14272 }
14273
14274 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14275 {
14276 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14277
14278 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14279
14280 u32 *digest = (u32 *) hash_buf->digest;
14281
14282 salt_t *salt = hash_buf->salt;
14283
14284 char *salt_buf = input_buf + 3;
14285
14286 char *digest_buf = strchr (salt_buf, '$');
14287
14288 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14289
14290 uint salt_len = digest_buf - salt_buf;
14291
14292 digest_buf++; // skip the '$' symbol
14293
14294 char *salt_buf_ptr = (char *) salt->salt_buf;
14295
14296 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14297
14298 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14299
14300 salt_buf_ptr[salt_len] = 0x2d;
14301
14302 salt->salt_len = salt_len + 1;
14303
14304 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14305 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14306 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14307 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14308
14309 digest[0] = byte_swap_32 (digest[0]);
14310 digest[1] = byte_swap_32 (digest[1]);
14311 digest[2] = byte_swap_32 (digest[2]);
14312 digest[3] = byte_swap_32 (digest[3]);
14313
14314 digest[0] -= MD5M_A;
14315 digest[1] -= MD5M_B;
14316 digest[2] -= MD5M_C;
14317 digest[3] -= MD5M_D;
14318
14319 return (PARSER_OK);
14320 }
14321
14322 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14323 {
14324 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14325
14326 u32 *digest = (u32 *) hash_buf->digest;
14327
14328 u8 tmp_buf[100] = { 0 };
14329
14330 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14331
14332 memcpy (digest, tmp_buf, 20);
14333
14334 digest[0] = byte_swap_32 (digest[0]);
14335 digest[1] = byte_swap_32 (digest[1]);
14336 digest[2] = byte_swap_32 (digest[2]);
14337 digest[3] = byte_swap_32 (digest[3]);
14338 digest[4] = byte_swap_32 (digest[4]);
14339
14340 digest[0] -= SHA1M_A;
14341 digest[1] -= SHA1M_B;
14342 digest[2] -= SHA1M_C;
14343 digest[3] -= SHA1M_D;
14344 digest[4] -= SHA1M_E;
14345
14346 return (PARSER_OK);
14347 }
14348
14349 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14350 {
14351 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14352
14353 u32 *digest = (u32 *) hash_buf->digest;
14354
14355 salt_t *salt = hash_buf->salt;
14356
14357 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14358 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14359 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14360 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14361
14362 digest[0] = byte_swap_32 (digest[0]);
14363 digest[1] = byte_swap_32 (digest[1]);
14364 digest[2] = byte_swap_32 (digest[2]);
14365 digest[3] = byte_swap_32 (digest[3]);
14366
14367 digest[0] -= MD5M_A;
14368 digest[1] -= MD5M_B;
14369 digest[2] -= MD5M_C;
14370 digest[3] -= MD5M_D;
14371
14372 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14373
14374 uint salt_len = input_len - 32 - 1;
14375
14376 char *salt_buf = input_buf + 32 + 1;
14377
14378 char *salt_buf_ptr = (char *) salt->salt_buf;
14379
14380 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14381
14382 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14383
14384 /*
14385 * add static "salt" part
14386 */
14387
14388 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14389
14390 salt_len += 8;
14391
14392 salt->salt_len = salt_len;
14393
14394 return (PARSER_OK);
14395 }
14396
14397 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14398 {
14399 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14400
14401 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14402
14403 u32 *digest = (u32 *) hash_buf->digest;
14404
14405 salt_t *salt = hash_buf->salt;
14406
14407 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14408
14409 /**
14410 * parse line
14411 */
14412
14413 char *saltlen_pos = input_buf + 1 + 3 + 1;
14414
14415 char *saltbuf_pos = strchr (saltlen_pos, '$');
14416
14417 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14418
14419 uint saltlen_len = saltbuf_pos - saltlen_pos;
14420
14421 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14422
14423 saltbuf_pos++;
14424
14425 char *keylen_pos = strchr (saltbuf_pos, '$');
14426
14427 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14428
14429 uint saltbuf_len = keylen_pos - saltbuf_pos;
14430
14431 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14432
14433 keylen_pos++;
14434
14435 char *keybuf_pos = strchr (keylen_pos, '$');
14436
14437 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14438
14439 uint keylen_len = keybuf_pos - keylen_pos;
14440
14441 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14442
14443 keybuf_pos++;
14444
14445 char *databuf_pos = strchr (keybuf_pos, '$');
14446
14447 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14448
14449 uint keybuf_len = databuf_pos - keybuf_pos;
14450
14451 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14452
14453 databuf_pos++;
14454
14455 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14456
14457 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14458
14459 /**
14460 * copy data
14461 */
14462
14463 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14464 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14465 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14466 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14467
14468 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14469 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14470 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14471 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14472
14473 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14474 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14475 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14476 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14477
14478 salt->salt_len = 16;
14479 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14480
14481 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14482 {
14483 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14484 }
14485
14486 return (PARSER_OK);
14487 }
14488
14489 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14490 {
14491 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14492
14493 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14494
14495 u32 *digest = (u32 *) hash_buf->digest;
14496
14497 salt_t *salt = hash_buf->salt;
14498
14499 /**
14500 * parse line
14501 */
14502
14503 // first is the N salt parameter
14504
14505 char *N_pos = input_buf + 6;
14506
14507 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14508
14509 N_pos++;
14510
14511 salt->scrypt_N = atoi (N_pos);
14512
14513 // r
14514
14515 char *r_pos = strchr (N_pos, ':');
14516
14517 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14518
14519 r_pos++;
14520
14521 salt->scrypt_r = atoi (r_pos);
14522
14523 // p
14524
14525 char *p_pos = strchr (r_pos, ':');
14526
14527 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14528
14529 p_pos++;
14530
14531 salt->scrypt_p = atoi (p_pos);
14532
14533 // salt
14534
14535 char *saltbuf_pos = strchr (p_pos, ':');
14536
14537 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14538
14539 saltbuf_pos++;
14540
14541 char *hash_pos = strchr (saltbuf_pos, ':');
14542
14543 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14544
14545 hash_pos++;
14546
14547 // base64 decode
14548
14549 u8 tmp_buf[33] = { 0 };
14550
14551 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14552
14553 char *salt_buf_ptr = (char *) salt->salt_buf;
14554
14555 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14556
14557 salt->salt_len = tmp_len;
14558 salt->salt_iter = 1;
14559
14560 // digest - base64 decode
14561
14562 memset (tmp_buf, 0, sizeof (tmp_buf));
14563
14564 tmp_len = input_len - (hash_pos - input_buf);
14565
14566 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14567
14568 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14569
14570 memcpy (digest, tmp_buf, 32);
14571
14572 return (PARSER_OK);
14573 }
14574
14575 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14576 {
14577 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14578
14579 u32 *digest = (u32 *) hash_buf->digest;
14580
14581 salt_t *salt = hash_buf->salt;
14582
14583 /**
14584 * parse line
14585 */
14586
14587 char decrypted[76] = { 0 }; // iv + hash
14588
14589 juniper_decrypt_hash (input_buf, decrypted);
14590
14591 char *md5crypt_hash = decrypted + 12;
14592
14593 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14594
14595 salt->salt_iter = ROUNDS_MD5CRYPT;
14596
14597 char *salt_pos = md5crypt_hash + 3;
14598
14599 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14600
14601 salt->salt_len = hash_pos - salt_pos; // should be 8
14602
14603 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14604
14605 hash_pos++;
14606
14607 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14608
14609 return (PARSER_OK);
14610 }
14611
14612 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14613 {
14614 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14615
14616 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14617
14618 u32 *digest = (u32 *) hash_buf->digest;
14619
14620 salt_t *salt = hash_buf->salt;
14621
14622 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14623
14624 /**
14625 * parse line
14626 */
14627
14628 // first is *raw* salt
14629
14630 char *salt_pos = input_buf + 3;
14631
14632 char *hash_pos = strchr (salt_pos, '$');
14633
14634 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14635
14636 uint salt_len = hash_pos - salt_pos;
14637
14638 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14639
14640 hash_pos++;
14641
14642 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14643
14644 memcpy (salt_buf_ptr, salt_pos, 14);
14645
14646 salt_buf_ptr[17] = 0x01;
14647 salt_buf_ptr[18] = 0x80;
14648
14649 // add some stuff to normal salt to make sorted happy
14650
14651 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14652 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14653 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14654 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14655
14656 salt->salt_len = salt_len;
14657 salt->salt_iter = ROUNDS_CISCO8 - 1;
14658
14659 // base64 decode hash
14660
14661 u8 tmp_buf[100] = { 0 };
14662
14663 uint hash_len = input_len - 3 - salt_len - 1;
14664
14665 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14666
14667 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14668
14669 memcpy (digest, tmp_buf, 32);
14670
14671 digest[0] = byte_swap_32 (digest[0]);
14672 digest[1] = byte_swap_32 (digest[1]);
14673 digest[2] = byte_swap_32 (digest[2]);
14674 digest[3] = byte_swap_32 (digest[3]);
14675 digest[4] = byte_swap_32 (digest[4]);
14676 digest[5] = byte_swap_32 (digest[5]);
14677 digest[6] = byte_swap_32 (digest[6]);
14678 digest[7] = byte_swap_32 (digest[7]);
14679
14680 return (PARSER_OK);
14681 }
14682
14683 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14684 {
14685 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14686
14687 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14688
14689 u32 *digest = (u32 *) hash_buf->digest;
14690
14691 salt_t *salt = hash_buf->salt;
14692
14693 /**
14694 * parse line
14695 */
14696
14697 // first is *raw* salt
14698
14699 char *salt_pos = input_buf + 3;
14700
14701 char *hash_pos = strchr (salt_pos, '$');
14702
14703 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14704
14705 uint salt_len = hash_pos - salt_pos;
14706
14707 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14708
14709 salt->salt_len = salt_len;
14710 hash_pos++;
14711
14712 char *salt_buf_ptr = (char *) salt->salt_buf;
14713
14714 memcpy (salt_buf_ptr, salt_pos, salt_len);
14715 salt_buf_ptr[salt_len] = 0;
14716
14717 // base64 decode hash
14718
14719 u8 tmp_buf[100] = { 0 };
14720
14721 uint hash_len = input_len - 3 - salt_len - 1;
14722
14723 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14724
14725 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14726
14727 memcpy (digest, tmp_buf, 32);
14728
14729 // fixed:
14730 salt->scrypt_N = 16384;
14731 salt->scrypt_r = 1;
14732 salt->scrypt_p = 1;
14733 salt->salt_iter = 1;
14734
14735 return (PARSER_OK);
14736 }
14737
14738 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14739 {
14740 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14741
14742 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14743
14744 u32 *digest = (u32 *) hash_buf->digest;
14745
14746 salt_t *salt = hash_buf->salt;
14747
14748 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14749
14750 /**
14751 * parse line
14752 */
14753
14754 char *version_pos = input_buf + 8 + 1;
14755
14756 char *verifierHashSize_pos = strchr (version_pos, '*');
14757
14758 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14759
14760 u32 version_len = verifierHashSize_pos - version_pos;
14761
14762 if (version_len != 4) return (PARSER_SALT_LENGTH);
14763
14764 verifierHashSize_pos++;
14765
14766 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14767
14768 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14769
14770 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14771
14772 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14773
14774 keySize_pos++;
14775
14776 char *saltSize_pos = strchr (keySize_pos, '*');
14777
14778 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14779
14780 u32 keySize_len = saltSize_pos - keySize_pos;
14781
14782 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14783
14784 saltSize_pos++;
14785
14786 char *osalt_pos = strchr (saltSize_pos, '*');
14787
14788 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14789
14790 u32 saltSize_len = osalt_pos - saltSize_pos;
14791
14792 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14793
14794 osalt_pos++;
14795
14796 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14797
14798 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14799
14800 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14801
14802 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14803
14804 encryptedVerifier_pos++;
14805
14806 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14807
14808 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14809
14810 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14811
14812 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14813
14814 encryptedVerifierHash_pos++;
14815
14816 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;
14817
14818 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14819
14820 const uint version = atoi (version_pos);
14821
14822 if (version != 2007) return (PARSER_SALT_VALUE);
14823
14824 const uint verifierHashSize = atoi (verifierHashSize_pos);
14825
14826 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14827
14828 const uint keySize = atoi (keySize_pos);
14829
14830 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14831
14832 office2007->keySize = keySize;
14833
14834 const uint saltSize = atoi (saltSize_pos);
14835
14836 if (saltSize != 16) return (PARSER_SALT_VALUE);
14837
14838 /**
14839 * salt
14840 */
14841
14842 salt->salt_len = 16;
14843 salt->salt_iter = ROUNDS_OFFICE2007;
14844
14845 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14846 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14847 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14848 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14849
14850 /**
14851 * esalt
14852 */
14853
14854 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14855 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14856 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14857 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14858
14859 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14860 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14861 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14862 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14863 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14864
14865 /**
14866 * digest
14867 */
14868
14869 digest[0] = office2007->encryptedVerifierHash[0];
14870 digest[1] = office2007->encryptedVerifierHash[1];
14871 digest[2] = office2007->encryptedVerifierHash[2];
14872 digest[3] = office2007->encryptedVerifierHash[3];
14873
14874 return (PARSER_OK);
14875 }
14876
14877 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14878 {
14879 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14880
14881 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14882
14883 u32 *digest = (u32 *) hash_buf->digest;
14884
14885 salt_t *salt = hash_buf->salt;
14886
14887 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14888
14889 /**
14890 * parse line
14891 */
14892
14893 char *version_pos = input_buf + 8 + 1;
14894
14895 char *spinCount_pos = strchr (version_pos, '*');
14896
14897 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14898
14899 u32 version_len = spinCount_pos - version_pos;
14900
14901 if (version_len != 4) return (PARSER_SALT_LENGTH);
14902
14903 spinCount_pos++;
14904
14905 char *keySize_pos = strchr (spinCount_pos, '*');
14906
14907 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14908
14909 u32 spinCount_len = keySize_pos - spinCount_pos;
14910
14911 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14912
14913 keySize_pos++;
14914
14915 char *saltSize_pos = strchr (keySize_pos, '*');
14916
14917 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14918
14919 u32 keySize_len = saltSize_pos - keySize_pos;
14920
14921 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14922
14923 saltSize_pos++;
14924
14925 char *osalt_pos = strchr (saltSize_pos, '*');
14926
14927 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14928
14929 u32 saltSize_len = osalt_pos - saltSize_pos;
14930
14931 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14932
14933 osalt_pos++;
14934
14935 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14936
14937 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14938
14939 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14940
14941 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14942
14943 encryptedVerifier_pos++;
14944
14945 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14946
14947 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14948
14949 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14950
14951 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14952
14953 encryptedVerifierHash_pos++;
14954
14955 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;
14956
14957 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14958
14959 const uint version = atoi (version_pos);
14960
14961 if (version != 2010) return (PARSER_SALT_VALUE);
14962
14963 const uint spinCount = atoi (spinCount_pos);
14964
14965 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14966
14967 const uint keySize = atoi (keySize_pos);
14968
14969 if (keySize != 128) return (PARSER_SALT_VALUE);
14970
14971 const uint saltSize = atoi (saltSize_pos);
14972
14973 if (saltSize != 16) return (PARSER_SALT_VALUE);
14974
14975 /**
14976 * salt
14977 */
14978
14979 salt->salt_len = 16;
14980 salt->salt_iter = spinCount;
14981
14982 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14983 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14984 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14985 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14986
14987 /**
14988 * esalt
14989 */
14990
14991 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14992 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14993 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14994 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14995
14996 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14997 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14998 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14999 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15000 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15001 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15002 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15003 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15004
15005 /**
15006 * digest
15007 */
15008
15009 digest[0] = office2010->encryptedVerifierHash[0];
15010 digest[1] = office2010->encryptedVerifierHash[1];
15011 digest[2] = office2010->encryptedVerifierHash[2];
15012 digest[3] = office2010->encryptedVerifierHash[3];
15013
15014 return (PARSER_OK);
15015 }
15016
15017 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15018 {
15019 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15020
15021 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15022
15023 u32 *digest = (u32 *) hash_buf->digest;
15024
15025 salt_t *salt = hash_buf->salt;
15026
15027 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15028
15029 /**
15030 * parse line
15031 */
15032
15033 char *version_pos = input_buf + 8 + 1;
15034
15035 char *spinCount_pos = strchr (version_pos, '*');
15036
15037 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15038
15039 u32 version_len = spinCount_pos - version_pos;
15040
15041 if (version_len != 4) return (PARSER_SALT_LENGTH);
15042
15043 spinCount_pos++;
15044
15045 char *keySize_pos = strchr (spinCount_pos, '*');
15046
15047 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15048
15049 u32 spinCount_len = keySize_pos - spinCount_pos;
15050
15051 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15052
15053 keySize_pos++;
15054
15055 char *saltSize_pos = strchr (keySize_pos, '*');
15056
15057 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15058
15059 u32 keySize_len = saltSize_pos - keySize_pos;
15060
15061 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15062
15063 saltSize_pos++;
15064
15065 char *osalt_pos = strchr (saltSize_pos, '*');
15066
15067 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15068
15069 u32 saltSize_len = osalt_pos - saltSize_pos;
15070
15071 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15072
15073 osalt_pos++;
15074
15075 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15076
15077 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15078
15079 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15080
15081 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15082
15083 encryptedVerifier_pos++;
15084
15085 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15086
15087 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15088
15089 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15090
15091 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15092
15093 encryptedVerifierHash_pos++;
15094
15095 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;
15096
15097 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15098
15099 const uint version = atoi (version_pos);
15100
15101 if (version != 2013) return (PARSER_SALT_VALUE);
15102
15103 const uint spinCount = atoi (spinCount_pos);
15104
15105 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15106
15107 const uint keySize = atoi (keySize_pos);
15108
15109 if (keySize != 256) return (PARSER_SALT_VALUE);
15110
15111 const uint saltSize = atoi (saltSize_pos);
15112
15113 if (saltSize != 16) return (PARSER_SALT_VALUE);
15114
15115 /**
15116 * salt
15117 */
15118
15119 salt->salt_len = 16;
15120 salt->salt_iter = spinCount;
15121
15122 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15123 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15124 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15125 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15126
15127 /**
15128 * esalt
15129 */
15130
15131 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15132 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15133 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15134 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15135
15136 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15137 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15138 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15139 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15140 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15141 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15142 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15143 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15144
15145 /**
15146 * digest
15147 */
15148
15149 digest[0] = office2013->encryptedVerifierHash[0];
15150 digest[1] = office2013->encryptedVerifierHash[1];
15151 digest[2] = office2013->encryptedVerifierHash[2];
15152 digest[3] = office2013->encryptedVerifierHash[3];
15153
15154 return (PARSER_OK);
15155 }
15156
15157 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15158 {
15159 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15160
15161 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15162
15163 u32 *digest = (u32 *) hash_buf->digest;
15164
15165 salt_t *salt = hash_buf->salt;
15166
15167 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15168
15169 /**
15170 * parse line
15171 */
15172
15173 char *version_pos = input_buf + 11;
15174
15175 char *osalt_pos = strchr (version_pos, '*');
15176
15177 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15178
15179 u32 version_len = osalt_pos - version_pos;
15180
15181 if (version_len != 1) return (PARSER_SALT_LENGTH);
15182
15183 osalt_pos++;
15184
15185 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15186
15187 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15188
15189 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15190
15191 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15192
15193 encryptedVerifier_pos++;
15194
15195 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15196
15197 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15198
15199 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15200
15201 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15202
15203 encryptedVerifierHash_pos++;
15204
15205 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15206
15207 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15208
15209 const uint version = *version_pos - 0x30;
15210
15211 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15212
15213 /**
15214 * esalt
15215 */
15216
15217 oldoffice01->version = version;
15218
15219 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15220 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15221 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15222 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15223
15224 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15225 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15226 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15227 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15228
15229 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15230 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15231 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15232 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15233
15234 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15235 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15236 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15237 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15238
15239 /**
15240 * salt
15241 */
15242
15243 salt->salt_len = 16;
15244
15245 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15246 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15247 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15248 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15249
15250 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15251 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15252 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15253 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15254
15255 // this is a workaround as office produces multiple documents with the same salt
15256
15257 salt->salt_len += 32;
15258
15259 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15260 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15261 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15262 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15263 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15264 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15265 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15266 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15267
15268 /**
15269 * digest
15270 */
15271
15272 digest[0] = oldoffice01->encryptedVerifierHash[0];
15273 digest[1] = oldoffice01->encryptedVerifierHash[1];
15274 digest[2] = oldoffice01->encryptedVerifierHash[2];
15275 digest[3] = oldoffice01->encryptedVerifierHash[3];
15276
15277 return (PARSER_OK);
15278 }
15279
15280 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15281 {
15282 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15283 }
15284
15285 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15286 {
15287 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15288
15289 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15290
15291 u32 *digest = (u32 *) hash_buf->digest;
15292
15293 salt_t *salt = hash_buf->salt;
15294
15295 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15296
15297 /**
15298 * parse line
15299 */
15300
15301 char *version_pos = input_buf + 11;
15302
15303 char *osalt_pos = strchr (version_pos, '*');
15304
15305 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15306
15307 u32 version_len = osalt_pos - version_pos;
15308
15309 if (version_len != 1) return (PARSER_SALT_LENGTH);
15310
15311 osalt_pos++;
15312
15313 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15314
15315 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15316
15317 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15318
15319 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15320
15321 encryptedVerifier_pos++;
15322
15323 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15324
15325 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15326
15327 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15328
15329 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15330
15331 encryptedVerifierHash_pos++;
15332
15333 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15334
15335 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15336
15337 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15338
15339 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15340
15341 rc4key_pos++;
15342
15343 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15344
15345 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15346
15347 const uint version = *version_pos - 0x30;
15348
15349 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15350
15351 /**
15352 * esalt
15353 */
15354
15355 oldoffice01->version = version;
15356
15357 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15358 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15359 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15360 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15361
15362 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15363 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15364 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15365 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15366
15367 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15368 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15369 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15370 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15371
15372 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15373 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15374 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15375 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15376
15377 oldoffice01->rc4key[1] = 0;
15378 oldoffice01->rc4key[0] = 0;
15379
15380 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15381 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15382 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15383 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15384 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15385 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15386 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15387 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15388 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15389 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15390
15391 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15392 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15393
15394 /**
15395 * salt
15396 */
15397
15398 salt->salt_len = 16;
15399
15400 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15401 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15402 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15403 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15404
15405 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15406 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15407 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15408 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15409
15410 // this is a workaround as office produces multiple documents with the same salt
15411
15412 salt->salt_len += 32;
15413
15414 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15415 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15416 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15417 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15418 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15419 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15420 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15421 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15422
15423 /**
15424 * digest
15425 */
15426
15427 digest[0] = oldoffice01->rc4key[0];
15428 digest[1] = oldoffice01->rc4key[1];
15429 digest[2] = 0;
15430 digest[3] = 0;
15431
15432 return (PARSER_OK);
15433 }
15434
15435 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15436 {
15437 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15438
15439 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15440
15441 u32 *digest = (u32 *) hash_buf->digest;
15442
15443 salt_t *salt = hash_buf->salt;
15444
15445 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15446
15447 /**
15448 * parse line
15449 */
15450
15451 char *version_pos = input_buf + 11;
15452
15453 char *osalt_pos = strchr (version_pos, '*');
15454
15455 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15456
15457 u32 version_len = osalt_pos - version_pos;
15458
15459 if (version_len != 1) return (PARSER_SALT_LENGTH);
15460
15461 osalt_pos++;
15462
15463 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15464
15465 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15466
15467 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15468
15469 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15470
15471 encryptedVerifier_pos++;
15472
15473 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15474
15475 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15476
15477 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15478
15479 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15480
15481 encryptedVerifierHash_pos++;
15482
15483 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15484
15485 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15486
15487 const uint version = *version_pos - 0x30;
15488
15489 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15490
15491 /**
15492 * esalt
15493 */
15494
15495 oldoffice34->version = version;
15496
15497 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15498 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15499 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15500 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15501
15502 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15503 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15504 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15505 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15506
15507 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15508 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15509 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15510 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15511 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15512
15513 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15514 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15515 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15516 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15517 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15518
15519 /**
15520 * salt
15521 */
15522
15523 salt->salt_len = 16;
15524
15525 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15526 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15527 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15528 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15529
15530 // this is a workaround as office produces multiple documents with the same salt
15531
15532 salt->salt_len += 32;
15533
15534 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15535 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15536 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15537 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15538 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15539 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15540 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15541 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15542
15543 /**
15544 * digest
15545 */
15546
15547 digest[0] = oldoffice34->encryptedVerifierHash[0];
15548 digest[1] = oldoffice34->encryptedVerifierHash[1];
15549 digest[2] = oldoffice34->encryptedVerifierHash[2];
15550 digest[3] = oldoffice34->encryptedVerifierHash[3];
15551
15552 return (PARSER_OK);
15553 }
15554
15555 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15556 {
15557 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15558
15559 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15560 }
15561
15562 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15563 {
15564 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15565
15566 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15567
15568 u32 *digest = (u32 *) hash_buf->digest;
15569
15570 salt_t *salt = hash_buf->salt;
15571
15572 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15573
15574 /**
15575 * parse line
15576 */
15577
15578 char *version_pos = input_buf + 11;
15579
15580 char *osalt_pos = strchr (version_pos, '*');
15581
15582 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15583
15584 u32 version_len = osalt_pos - version_pos;
15585
15586 if (version_len != 1) return (PARSER_SALT_LENGTH);
15587
15588 osalt_pos++;
15589
15590 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15591
15592 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15593
15594 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15595
15596 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15597
15598 encryptedVerifier_pos++;
15599
15600 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15601
15602 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15603
15604 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15605
15606 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15607
15608 encryptedVerifierHash_pos++;
15609
15610 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15611
15612 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15613
15614 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15615
15616 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15617
15618 rc4key_pos++;
15619
15620 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15621
15622 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15623
15624 const uint version = *version_pos - 0x30;
15625
15626 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15627
15628 /**
15629 * esalt
15630 */
15631
15632 oldoffice34->version = version;
15633
15634 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15635 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15636 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15637 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15638
15639 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15640 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15641 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15642 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15643
15644 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15645 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15646 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15647 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15648 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15649
15650 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15651 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15652 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15653 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15654 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15655
15656 oldoffice34->rc4key[1] = 0;
15657 oldoffice34->rc4key[0] = 0;
15658
15659 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15660 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15661 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15662 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15663 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15664 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15665 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15666 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15667 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15668 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15669
15670 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15671 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15672
15673 /**
15674 * salt
15675 */
15676
15677 salt->salt_len = 16;
15678
15679 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15680 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15681 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15682 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15683
15684 // this is a workaround as office produces multiple documents with the same salt
15685
15686 salt->salt_len += 32;
15687
15688 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15689 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15690 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15691 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15692 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15693 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15694 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15695 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15696
15697 /**
15698 * digest
15699 */
15700
15701 digest[0] = oldoffice34->rc4key[0];
15702 digest[1] = oldoffice34->rc4key[1];
15703 digest[2] = 0;
15704 digest[3] = 0;
15705
15706 return (PARSER_OK);
15707 }
15708
15709 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15710 {
15711 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15712
15713 u32 *digest = (u32 *) hash_buf->digest;
15714
15715 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15716 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15717 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15718 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15719
15720 digest[0] = byte_swap_32 (digest[0]);
15721 digest[1] = byte_swap_32 (digest[1]);
15722 digest[2] = byte_swap_32 (digest[2]);
15723 digest[3] = byte_swap_32 (digest[3]);
15724
15725 return (PARSER_OK);
15726 }
15727
15728 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15729 {
15730 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15731
15732 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15733
15734 u32 *digest = (u32 *) hash_buf->digest;
15735
15736 salt_t *salt = hash_buf->salt;
15737
15738 char *signature_pos = input_buf;
15739
15740 char *salt_pos = strchr (signature_pos, '$');
15741
15742 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15743
15744 u32 signature_len = salt_pos - signature_pos;
15745
15746 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15747
15748 salt_pos++;
15749
15750 char *hash_pos = strchr (salt_pos, '$');
15751
15752 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15753
15754 u32 salt_len = hash_pos - salt_pos;
15755
15756 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15757
15758 hash_pos++;
15759
15760 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15761
15762 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15763
15764 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15765 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15766 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15767 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15768 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15769
15770 digest[0] -= SHA1M_A;
15771 digest[1] -= SHA1M_B;
15772 digest[2] -= SHA1M_C;
15773 digest[3] -= SHA1M_D;
15774 digest[4] -= SHA1M_E;
15775
15776 char *salt_buf_ptr = (char *) salt->salt_buf;
15777
15778 memcpy (salt_buf_ptr, salt_pos, salt_len);
15779
15780 salt->salt_len = salt_len;
15781
15782 return (PARSER_OK);
15783 }
15784
15785 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15786 {
15787 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15788
15789 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15790
15791 u32 *digest = (u32 *) hash_buf->digest;
15792
15793 salt_t *salt = hash_buf->salt;
15794
15795 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15796
15797 /**
15798 * parse line
15799 */
15800
15801 char *iter_pos = input_buf + 14;
15802
15803 const int iter = atoi (iter_pos);
15804
15805 if (iter < 1) return (PARSER_SALT_ITERATION);
15806
15807 salt->salt_iter = iter - 1;
15808
15809 char *salt_pos = strchr (iter_pos, '$');
15810
15811 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15812
15813 salt_pos++;
15814
15815 char *hash_pos = strchr (salt_pos, '$');
15816
15817 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15818
15819 const uint salt_len = hash_pos - salt_pos;
15820
15821 hash_pos++;
15822
15823 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15824
15825 memcpy (salt_buf_ptr, salt_pos, salt_len);
15826
15827 salt->salt_len = salt_len;
15828
15829 salt_buf_ptr[salt_len + 3] = 0x01;
15830 salt_buf_ptr[salt_len + 4] = 0x80;
15831
15832 // add some stuff to normal salt to make sorted happy
15833
15834 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15835 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15836 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15837 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15838 salt->salt_buf[4] = salt->salt_iter;
15839
15840 // base64 decode hash
15841
15842 u8 tmp_buf[100] = { 0 };
15843
15844 uint hash_len = input_len - (hash_pos - input_buf);
15845
15846 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15847
15848 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15849
15850 memcpy (digest, tmp_buf, 32);
15851
15852 digest[0] = byte_swap_32 (digest[0]);
15853 digest[1] = byte_swap_32 (digest[1]);
15854 digest[2] = byte_swap_32 (digest[2]);
15855 digest[3] = byte_swap_32 (digest[3]);
15856 digest[4] = byte_swap_32 (digest[4]);
15857 digest[5] = byte_swap_32 (digest[5]);
15858 digest[6] = byte_swap_32 (digest[6]);
15859 digest[7] = byte_swap_32 (digest[7]);
15860
15861 return (PARSER_OK);
15862 }
15863
15864 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15865 {
15866 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15867
15868 u32 *digest = (u32 *) hash_buf->digest;
15869
15870 salt_t *salt = hash_buf->salt;
15871
15872 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15873 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15874 digest[2] = 0;
15875 digest[3] = 0;
15876
15877 digest[0] = byte_swap_32 (digest[0]);
15878 digest[1] = byte_swap_32 (digest[1]);
15879
15880 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15881 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15882 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15883
15884 char iter_c = input_buf[17];
15885 char iter_d = input_buf[19];
15886
15887 // atm only defaults, let's see if there's more request
15888 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15889 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15890
15891 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15892
15893 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
15894 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
15895 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
15896 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
15897
15898 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15899 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15900 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15901 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15902
15903 salt->salt_len = 16;
15904
15905 return (PARSER_OK);
15906 }
15907
15908 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15909 {
15910 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15911
15912 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15913
15914 u32 *digest = (u32 *) hash_buf->digest;
15915
15916 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15917
15918 salt_t *salt = hash_buf->salt;
15919
15920 char *salt_pos = input_buf + 10;
15921
15922 char *hash_pos = strchr (salt_pos, '$');
15923
15924 uint salt_len = hash_pos - salt_pos;
15925
15926 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15927
15928 hash_pos++;
15929
15930 uint hash_len = input_len - 10 - salt_len - 1;
15931
15932 // base64 decode salt
15933
15934 u8 tmp_buf[100] = { 0 };
15935
15936 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
15937
15938 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15939
15940 tmp_buf[salt_len] = 0x80;
15941
15942 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15943
15944 salt->salt_len = salt_len;
15945
15946 // base64 decode salt
15947
15948 memset (tmp_buf, 0, sizeof (tmp_buf));
15949
15950 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15951
15952 uint user_len = hash_len - 32;
15953
15954 const u8 *tmp_hash = tmp_buf + user_len;
15955
15956 user_len--; // skip the trailing space
15957
15958 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
15959 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
15960 digest[2] = hex_to_u32 (&tmp_hash[16]);
15961 digest[3] = hex_to_u32 (&tmp_hash[24]);
15962
15963 digest[0] = byte_swap_32 (digest[0]);
15964 digest[1] = byte_swap_32 (digest[1]);
15965 digest[2] = byte_swap_32 (digest[2]);
15966 digest[3] = byte_swap_32 (digest[3]);
15967
15968 // store username for host only (output hash if cracked)
15969
15970 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15971 memcpy (cram_md5->user, tmp_buf, user_len);
15972
15973 return (PARSER_OK);
15974 }
15975
15976 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15977 {
15978 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15979
15980 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15981
15982 u32 *digest = (u32 *) hash_buf->digest;
15983
15984 salt_t *salt = hash_buf->salt;
15985
15986 char *iter_pos = input_buf + 10;
15987
15988 u32 iter = atoi (iter_pos);
15989
15990 if (iter < 1)
15991 {
15992 return (PARSER_SALT_ITERATION);
15993 }
15994
15995 iter--; // first iteration is special
15996
15997 salt->salt_iter = iter;
15998
15999 char *base64_pos = strchr (iter_pos, '}');
16000
16001 if (base64_pos == NULL)
16002 {
16003 return (PARSER_SIGNATURE_UNMATCHED);
16004 }
16005
16006 base64_pos++;
16007
16008 // base64 decode salt
16009
16010 u32 base64_len = input_len - (base64_pos - input_buf);
16011
16012 u8 tmp_buf[100] = { 0 };
16013
16014 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16015
16016 if (decoded_len < 24)
16017 {
16018 return (PARSER_SALT_LENGTH);
16019 }
16020
16021 // copy the salt
16022
16023 uint salt_len = decoded_len - 20;
16024
16025 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16026 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16027
16028 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16029
16030 salt->salt_len = salt_len;
16031
16032 // set digest
16033
16034 u32 *digest_ptr = (u32*) tmp_buf;
16035
16036 digest[0] = byte_swap_32 (digest_ptr[0]);
16037 digest[1] = byte_swap_32 (digest_ptr[1]);
16038 digest[2] = byte_swap_32 (digest_ptr[2]);
16039 digest[3] = byte_swap_32 (digest_ptr[3]);
16040 digest[4] = byte_swap_32 (digest_ptr[4]);
16041
16042 return (PARSER_OK);
16043 }
16044
16045 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16046 {
16047 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16048
16049 u32 *digest = (u32 *) hash_buf->digest;
16050
16051 salt_t *salt = hash_buf->salt;
16052
16053 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16054 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16055 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16056 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16057 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16058
16059 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16060
16061 uint salt_len = input_len - 40 - 1;
16062
16063 char *salt_buf = input_buf + 40 + 1;
16064
16065 char *salt_buf_ptr = (char *) salt->salt_buf;
16066
16067 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16068
16069 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16070
16071 salt->salt_len = salt_len;
16072
16073 return (PARSER_OK);
16074 }
16075
16076 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16077 {
16078 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16079
16080 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16081
16082 u32 *digest = (u32 *) hash_buf->digest;
16083
16084 salt_t *salt = hash_buf->salt;
16085
16086 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16087
16088 /**
16089 * parse line
16090 */
16091
16092 char *V_pos = input_buf + 5;
16093
16094 char *R_pos = strchr (V_pos, '*');
16095
16096 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16097
16098 u32 V_len = R_pos - V_pos;
16099
16100 R_pos++;
16101
16102 char *bits_pos = strchr (R_pos, '*');
16103
16104 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16105
16106 u32 R_len = bits_pos - R_pos;
16107
16108 bits_pos++;
16109
16110 char *P_pos = strchr (bits_pos, '*');
16111
16112 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16113
16114 u32 bits_len = P_pos - bits_pos;
16115
16116 P_pos++;
16117
16118 char *enc_md_pos = strchr (P_pos, '*');
16119
16120 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16121
16122 u32 P_len = enc_md_pos - P_pos;
16123
16124 enc_md_pos++;
16125
16126 char *id_len_pos = strchr (enc_md_pos, '*');
16127
16128 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16129
16130 u32 enc_md_len = id_len_pos - enc_md_pos;
16131
16132 id_len_pos++;
16133
16134 char *id_buf_pos = strchr (id_len_pos, '*');
16135
16136 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16137
16138 u32 id_len_len = id_buf_pos - id_len_pos;
16139
16140 id_buf_pos++;
16141
16142 char *u_len_pos = strchr (id_buf_pos, '*');
16143
16144 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16145
16146 u32 id_buf_len = u_len_pos - id_buf_pos;
16147
16148 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16149
16150 u_len_pos++;
16151
16152 char *u_buf_pos = strchr (u_len_pos, '*');
16153
16154 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16155
16156 u32 u_len_len = u_buf_pos - u_len_pos;
16157
16158 u_buf_pos++;
16159
16160 char *o_len_pos = strchr (u_buf_pos, '*');
16161
16162 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16163
16164 u32 u_buf_len = o_len_pos - u_buf_pos;
16165
16166 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16167
16168 o_len_pos++;
16169
16170 char *o_buf_pos = strchr (o_len_pos, '*');
16171
16172 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16173
16174 u32 o_len_len = o_buf_pos - o_len_pos;
16175
16176 o_buf_pos++;
16177
16178 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;
16179
16180 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16181
16182 // validate data
16183
16184 const int V = atoi (V_pos);
16185 const int R = atoi (R_pos);
16186 const int P = atoi (P_pos);
16187
16188 if (V != 1) return (PARSER_SALT_VALUE);
16189 if (R != 2) return (PARSER_SALT_VALUE);
16190
16191 const int enc_md = atoi (enc_md_pos);
16192
16193 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16194
16195 const int id_len = atoi (id_len_pos);
16196 const int u_len = atoi (u_len_pos);
16197 const int o_len = atoi (o_len_pos);
16198
16199 if (id_len != 16) return (PARSER_SALT_VALUE);
16200 if (u_len != 32) return (PARSER_SALT_VALUE);
16201 if (o_len != 32) return (PARSER_SALT_VALUE);
16202
16203 const int bits = atoi (bits_pos);
16204
16205 if (bits != 40) return (PARSER_SALT_VALUE);
16206
16207 // copy data to esalt
16208
16209 pdf->V = V;
16210 pdf->R = R;
16211 pdf->P = P;
16212
16213 pdf->enc_md = enc_md;
16214
16215 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16216 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16217 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16218 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16219 pdf->id_len = id_len;
16220
16221 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16222 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16223 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16224 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16225 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16226 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16227 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16228 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16229 pdf->u_len = u_len;
16230
16231 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16232 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16233 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16234 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16235 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16236 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16237 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16238 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16239 pdf->o_len = o_len;
16240
16241 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16242 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16243 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16244 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16245
16246 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16247 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16248 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16249 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16250 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16251 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16252 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16253 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16254
16255 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16256 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16257 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16258 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16259 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16260 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16261 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16262 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16263
16264 // we use ID for salt, maybe needs to change, we will see...
16265
16266 salt->salt_buf[0] = pdf->id_buf[0];
16267 salt->salt_buf[1] = pdf->id_buf[1];
16268 salt->salt_buf[2] = pdf->id_buf[2];
16269 salt->salt_buf[3] = pdf->id_buf[3];
16270 salt->salt_len = pdf->id_len;
16271
16272 digest[0] = pdf->u_buf[0];
16273 digest[1] = pdf->u_buf[1];
16274 digest[2] = pdf->u_buf[2];
16275 digest[3] = pdf->u_buf[3];
16276
16277 return (PARSER_OK);
16278 }
16279
16280 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16281 {
16282 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16283 }
16284
16285 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16286 {
16287 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16288
16289 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16290
16291 u32 *digest = (u32 *) hash_buf->digest;
16292
16293 salt_t *salt = hash_buf->salt;
16294
16295 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16296
16297 /**
16298 * parse line
16299 */
16300
16301 char *V_pos = input_buf + 5;
16302
16303 char *R_pos = strchr (V_pos, '*');
16304
16305 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16306
16307 u32 V_len = R_pos - V_pos;
16308
16309 R_pos++;
16310
16311 char *bits_pos = strchr (R_pos, '*');
16312
16313 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16314
16315 u32 R_len = bits_pos - R_pos;
16316
16317 bits_pos++;
16318
16319 char *P_pos = strchr (bits_pos, '*');
16320
16321 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16322
16323 u32 bits_len = P_pos - bits_pos;
16324
16325 P_pos++;
16326
16327 char *enc_md_pos = strchr (P_pos, '*');
16328
16329 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16330
16331 u32 P_len = enc_md_pos - P_pos;
16332
16333 enc_md_pos++;
16334
16335 char *id_len_pos = strchr (enc_md_pos, '*');
16336
16337 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16338
16339 u32 enc_md_len = id_len_pos - enc_md_pos;
16340
16341 id_len_pos++;
16342
16343 char *id_buf_pos = strchr (id_len_pos, '*');
16344
16345 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16346
16347 u32 id_len_len = id_buf_pos - id_len_pos;
16348
16349 id_buf_pos++;
16350
16351 char *u_len_pos = strchr (id_buf_pos, '*');
16352
16353 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16354
16355 u32 id_buf_len = u_len_pos - id_buf_pos;
16356
16357 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16358
16359 u_len_pos++;
16360
16361 char *u_buf_pos = strchr (u_len_pos, '*');
16362
16363 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16364
16365 u32 u_len_len = u_buf_pos - u_len_pos;
16366
16367 u_buf_pos++;
16368
16369 char *o_len_pos = strchr (u_buf_pos, '*');
16370
16371 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16372
16373 u32 u_buf_len = o_len_pos - u_buf_pos;
16374
16375 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16376
16377 o_len_pos++;
16378
16379 char *o_buf_pos = strchr (o_len_pos, '*');
16380
16381 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16382
16383 u32 o_len_len = o_buf_pos - o_len_pos;
16384
16385 o_buf_pos++;
16386
16387 char *rc4key_pos = strchr (o_buf_pos, ':');
16388
16389 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16390
16391 u32 o_buf_len = rc4key_pos - o_buf_pos;
16392
16393 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16394
16395 rc4key_pos++;
16396
16397 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;
16398
16399 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16400
16401 // validate data
16402
16403 const int V = atoi (V_pos);
16404 const int R = atoi (R_pos);
16405 const int P = atoi (P_pos);
16406
16407 if (V != 1) return (PARSER_SALT_VALUE);
16408 if (R != 2) return (PARSER_SALT_VALUE);
16409
16410 const int enc_md = atoi (enc_md_pos);
16411
16412 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16413
16414 const int id_len = atoi (id_len_pos);
16415 const int u_len = atoi (u_len_pos);
16416 const int o_len = atoi (o_len_pos);
16417
16418 if (id_len != 16) return (PARSER_SALT_VALUE);
16419 if (u_len != 32) return (PARSER_SALT_VALUE);
16420 if (o_len != 32) return (PARSER_SALT_VALUE);
16421
16422 const int bits = atoi (bits_pos);
16423
16424 if (bits != 40) return (PARSER_SALT_VALUE);
16425
16426 // copy data to esalt
16427
16428 pdf->V = V;
16429 pdf->R = R;
16430 pdf->P = P;
16431
16432 pdf->enc_md = enc_md;
16433
16434 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16435 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16436 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16437 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16438 pdf->id_len = id_len;
16439
16440 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16441 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16442 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16443 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16444 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16445 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16446 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16447 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16448 pdf->u_len = u_len;
16449
16450 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16451 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16452 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16453 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16454 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16455 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16456 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16457 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16458 pdf->o_len = o_len;
16459
16460 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16461 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16462 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16463 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16464
16465 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16466 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16467 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16468 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16469 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16470 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16471 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16472 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16473
16474 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16475 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16476 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16477 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16478 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16479 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16480 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16481 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16482
16483 pdf->rc4key[1] = 0;
16484 pdf->rc4key[0] = 0;
16485
16486 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16487 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16488 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16489 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16490 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16491 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16492 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16493 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16494 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16495 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16496
16497 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16498 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16499
16500 // we use ID for salt, maybe needs to change, we will see...
16501
16502 salt->salt_buf[0] = pdf->id_buf[0];
16503 salt->salt_buf[1] = pdf->id_buf[1];
16504 salt->salt_buf[2] = pdf->id_buf[2];
16505 salt->salt_buf[3] = pdf->id_buf[3];
16506 salt->salt_buf[4] = pdf->u_buf[0];
16507 salt->salt_buf[5] = pdf->u_buf[1];
16508 salt->salt_buf[6] = pdf->o_buf[0];
16509 salt->salt_buf[7] = pdf->o_buf[1];
16510 salt->salt_len = pdf->id_len + 16;
16511
16512 digest[0] = pdf->rc4key[0];
16513 digest[1] = pdf->rc4key[1];
16514 digest[2] = 0;
16515 digest[3] = 0;
16516
16517 return (PARSER_OK);
16518 }
16519
16520 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16521 {
16522 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16523
16524 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16525
16526 u32 *digest = (u32 *) hash_buf->digest;
16527
16528 salt_t *salt = hash_buf->salt;
16529
16530 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16531
16532 /**
16533 * parse line
16534 */
16535
16536 char *V_pos = input_buf + 5;
16537
16538 char *R_pos = strchr (V_pos, '*');
16539
16540 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16541
16542 u32 V_len = R_pos - V_pos;
16543
16544 R_pos++;
16545
16546 char *bits_pos = strchr (R_pos, '*');
16547
16548 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16549
16550 u32 R_len = bits_pos - R_pos;
16551
16552 bits_pos++;
16553
16554 char *P_pos = strchr (bits_pos, '*');
16555
16556 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16557
16558 u32 bits_len = P_pos - bits_pos;
16559
16560 P_pos++;
16561
16562 char *enc_md_pos = strchr (P_pos, '*');
16563
16564 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16565
16566 u32 P_len = enc_md_pos - P_pos;
16567
16568 enc_md_pos++;
16569
16570 char *id_len_pos = strchr (enc_md_pos, '*');
16571
16572 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16573
16574 u32 enc_md_len = id_len_pos - enc_md_pos;
16575
16576 id_len_pos++;
16577
16578 char *id_buf_pos = strchr (id_len_pos, '*');
16579
16580 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16581
16582 u32 id_len_len = id_buf_pos - id_len_pos;
16583
16584 id_buf_pos++;
16585
16586 char *u_len_pos = strchr (id_buf_pos, '*');
16587
16588 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16589
16590 u32 id_buf_len = u_len_pos - id_buf_pos;
16591
16592 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16593
16594 u_len_pos++;
16595
16596 char *u_buf_pos = strchr (u_len_pos, '*');
16597
16598 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16599
16600 u32 u_len_len = u_buf_pos - u_len_pos;
16601
16602 u_buf_pos++;
16603
16604 char *o_len_pos = strchr (u_buf_pos, '*');
16605
16606 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16607
16608 u32 u_buf_len = o_len_pos - u_buf_pos;
16609
16610 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16611
16612 o_len_pos++;
16613
16614 char *o_buf_pos = strchr (o_len_pos, '*');
16615
16616 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16617
16618 u32 o_len_len = o_buf_pos - o_len_pos;
16619
16620 o_buf_pos++;
16621
16622 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;
16623
16624 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16625
16626 // validate data
16627
16628 const int V = atoi (V_pos);
16629 const int R = atoi (R_pos);
16630 const int P = atoi (P_pos);
16631
16632 int vr_ok = 0;
16633
16634 if ((V == 2) && (R == 3)) vr_ok = 1;
16635 if ((V == 4) && (R == 4)) vr_ok = 1;
16636
16637 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16638
16639 const int id_len = atoi (id_len_pos);
16640 const int u_len = atoi (u_len_pos);
16641 const int o_len = atoi (o_len_pos);
16642
16643 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16644
16645 if (u_len != 32) return (PARSER_SALT_VALUE);
16646 if (o_len != 32) return (PARSER_SALT_VALUE);
16647
16648 const int bits = atoi (bits_pos);
16649
16650 if (bits != 128) return (PARSER_SALT_VALUE);
16651
16652 int enc_md = 1;
16653
16654 if (R >= 4)
16655 {
16656 enc_md = atoi (enc_md_pos);
16657 }
16658
16659 // copy data to esalt
16660
16661 pdf->V = V;
16662 pdf->R = R;
16663 pdf->P = P;
16664
16665 pdf->enc_md = enc_md;
16666
16667 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16668 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16669 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16670 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16671
16672 if (id_len == 32)
16673 {
16674 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16675 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16676 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16677 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16678 }
16679
16680 pdf->id_len = id_len;
16681
16682 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16683 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16684 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16685 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16686 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16687 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16688 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16689 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16690 pdf->u_len = u_len;
16691
16692 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16693 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16694 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16695 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16696 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16697 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16698 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16699 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16700 pdf->o_len = o_len;
16701
16702 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16703 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16704 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16705 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16706
16707 if (id_len == 32)
16708 {
16709 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16710 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16711 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16712 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16713 }
16714
16715 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16716 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16717 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16718 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16719 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16720 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16721 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16722 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16723
16724 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16725 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16726 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16727 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16728 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16729 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16730 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16731 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16732
16733 // precompute rc4 data for later use
16734
16735 uint padding[8] =
16736 {
16737 0x5e4ebf28,
16738 0x418a754e,
16739 0x564e0064,
16740 0x0801faff,
16741 0xb6002e2e,
16742 0x803e68d0,
16743 0xfea90c2f,
16744 0x7a695364
16745 };
16746
16747 // md5
16748
16749 uint salt_pc_block[32] = { 0 };
16750
16751 char *salt_pc_ptr = (char *) salt_pc_block;
16752
16753 memcpy (salt_pc_ptr, padding, 32);
16754 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16755
16756 uint salt_pc_digest[4] = { 0 };
16757
16758 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16759
16760 pdf->rc4data[0] = salt_pc_digest[0];
16761 pdf->rc4data[1] = salt_pc_digest[1];
16762
16763 // we use ID for salt, maybe needs to change, we will see...
16764
16765 salt->salt_buf[0] = pdf->id_buf[0];
16766 salt->salt_buf[1] = pdf->id_buf[1];
16767 salt->salt_buf[2] = pdf->id_buf[2];
16768 salt->salt_buf[3] = pdf->id_buf[3];
16769 salt->salt_buf[4] = pdf->u_buf[0];
16770 salt->salt_buf[5] = pdf->u_buf[1];
16771 salt->salt_buf[6] = pdf->o_buf[0];
16772 salt->salt_buf[7] = pdf->o_buf[1];
16773 salt->salt_len = pdf->id_len + 16;
16774
16775 salt->salt_iter = ROUNDS_PDF14;
16776
16777 digest[0] = pdf->u_buf[0];
16778 digest[1] = pdf->u_buf[1];
16779 digest[2] = 0;
16780 digest[3] = 0;
16781
16782 return (PARSER_OK);
16783 }
16784
16785 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16786 {
16787 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16788
16789 if (ret != PARSER_OK)
16790 {
16791 return ret;
16792 }
16793
16794 u32 *digest = (u32 *) hash_buf->digest;
16795
16796 salt_t *salt = hash_buf->salt;
16797
16798 digest[0] -= SHA256M_A;
16799 digest[1] -= SHA256M_B;
16800 digest[2] -= SHA256M_C;
16801 digest[3] -= SHA256M_D;
16802 digest[4] -= SHA256M_E;
16803 digest[5] -= SHA256M_F;
16804 digest[6] -= SHA256M_G;
16805 digest[7] -= SHA256M_H;
16806
16807 salt->salt_buf[2] = 0x80;
16808
16809 return (PARSER_OK);
16810 }
16811
16812 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16813 {
16814 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16815
16816 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16817
16818 u32 *digest = (u32 *) hash_buf->digest;
16819
16820 salt_t *salt = hash_buf->salt;
16821
16822 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16823
16824 /**
16825 * parse line
16826 */
16827
16828 char *V_pos = input_buf + 5;
16829
16830 char *R_pos = strchr (V_pos, '*');
16831
16832 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16833
16834 u32 V_len = R_pos - V_pos;
16835
16836 R_pos++;
16837
16838 char *bits_pos = strchr (R_pos, '*');
16839
16840 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16841
16842 u32 R_len = bits_pos - R_pos;
16843
16844 bits_pos++;
16845
16846 char *P_pos = strchr (bits_pos, '*');
16847
16848 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16849
16850 u32 bits_len = P_pos - bits_pos;
16851
16852 P_pos++;
16853
16854 char *enc_md_pos = strchr (P_pos, '*');
16855
16856 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16857
16858 u32 P_len = enc_md_pos - P_pos;
16859
16860 enc_md_pos++;
16861
16862 char *id_len_pos = strchr (enc_md_pos, '*');
16863
16864 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16865
16866 u32 enc_md_len = id_len_pos - enc_md_pos;
16867
16868 id_len_pos++;
16869
16870 char *id_buf_pos = strchr (id_len_pos, '*');
16871
16872 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16873
16874 u32 id_len_len = id_buf_pos - id_len_pos;
16875
16876 id_buf_pos++;
16877
16878 char *u_len_pos = strchr (id_buf_pos, '*');
16879
16880 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16881
16882 u32 id_buf_len = u_len_pos - id_buf_pos;
16883
16884 u_len_pos++;
16885
16886 char *u_buf_pos = strchr (u_len_pos, '*');
16887
16888 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16889
16890 u32 u_len_len = u_buf_pos - u_len_pos;
16891
16892 u_buf_pos++;
16893
16894 char *o_len_pos = strchr (u_buf_pos, '*');
16895
16896 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16897
16898 u32 u_buf_len = o_len_pos - u_buf_pos;
16899
16900 o_len_pos++;
16901
16902 char *o_buf_pos = strchr (o_len_pos, '*');
16903
16904 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16905
16906 u32 o_len_len = o_buf_pos - o_len_pos;
16907
16908 o_buf_pos++;
16909
16910 char *last = strchr (o_buf_pos, '*');
16911
16912 if (last == NULL) last = input_buf + input_len;
16913
16914 u32 o_buf_len = last - o_buf_pos;
16915
16916 // validate data
16917
16918 const int V = atoi (V_pos);
16919 const int R = atoi (R_pos);
16920
16921 int vr_ok = 0;
16922
16923 if ((V == 5) && (R == 5)) vr_ok = 1;
16924 if ((V == 5) && (R == 6)) vr_ok = 1;
16925
16926 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16927
16928 const int bits = atoi (bits_pos);
16929
16930 if (bits != 256) return (PARSER_SALT_VALUE);
16931
16932 int enc_md = atoi (enc_md_pos);
16933
16934 if (enc_md != 1) return (PARSER_SALT_VALUE);
16935
16936 const uint id_len = atoi (id_len_pos);
16937 const uint u_len = atoi (u_len_pos);
16938 const uint o_len = atoi (o_len_pos);
16939
16940 if (V_len > 6) return (PARSER_SALT_LENGTH);
16941 if (R_len > 6) return (PARSER_SALT_LENGTH);
16942 if (P_len > 6) return (PARSER_SALT_LENGTH);
16943 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16944 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16945 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16946 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16947 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16948
16949 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16950 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16951 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16952
16953 // copy data to esalt
16954
16955 if (u_len < 40) return (PARSER_SALT_VALUE);
16956
16957 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16958 {
16959 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
16960 }
16961
16962 salt->salt_buf[0] = pdf->u_buf[8];
16963 salt->salt_buf[1] = pdf->u_buf[9];
16964
16965 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16966 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16967
16968 salt->salt_len = 8;
16969 salt->salt_iter = ROUNDS_PDF17L8;
16970
16971 digest[0] = pdf->u_buf[0];
16972 digest[1] = pdf->u_buf[1];
16973 digest[2] = pdf->u_buf[2];
16974 digest[3] = pdf->u_buf[3];
16975 digest[4] = pdf->u_buf[4];
16976 digest[5] = pdf->u_buf[5];
16977 digest[6] = pdf->u_buf[6];
16978 digest[7] = pdf->u_buf[7];
16979
16980 return (PARSER_OK);
16981 }
16982
16983 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16984 {
16985 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16986
16987 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16988
16989 u32 *digest = (u32 *) hash_buf->digest;
16990
16991 salt_t *salt = hash_buf->salt;
16992
16993 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16994
16995 /**
16996 * parse line
16997 */
16998
16999 // iterations
17000
17001 char *iter_pos = input_buf + 7;
17002
17003 u32 iter = atoi (iter_pos);
17004
17005 if (iter < 1) return (PARSER_SALT_ITERATION);
17006 if (iter > 999999) return (PARSER_SALT_ITERATION);
17007
17008 // first is *raw* salt
17009
17010 char *salt_pos = strchr (iter_pos, ':');
17011
17012 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17013
17014 salt_pos++;
17015
17016 char *hash_pos = strchr (salt_pos, ':');
17017
17018 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17019
17020 u32 salt_len = hash_pos - salt_pos;
17021
17022 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17023
17024 hash_pos++;
17025
17026 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17027
17028 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17029
17030 // decode salt
17031
17032 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17033
17034 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17035
17036 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17037
17038 salt_buf_ptr[salt_len + 3] = 0x01;
17039 salt_buf_ptr[salt_len + 4] = 0x80;
17040
17041 salt->salt_len = salt_len;
17042 salt->salt_iter = iter - 1;
17043
17044 // decode hash
17045
17046 u8 tmp_buf[100] = { 0 };
17047
17048 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17049
17050 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17051
17052 memcpy (digest, tmp_buf, 16);
17053
17054 digest[0] = byte_swap_32 (digest[0]);
17055 digest[1] = byte_swap_32 (digest[1]);
17056 digest[2] = byte_swap_32 (digest[2]);
17057 digest[3] = byte_swap_32 (digest[3]);
17058
17059 // add some stuff to normal salt to make sorted happy
17060
17061 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17062 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17063 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17064 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17065 salt->salt_buf[4] = salt->salt_iter;
17066
17067 return (PARSER_OK);
17068 }
17069
17070 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17071 {
17072 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17073
17074 u32 *digest = (u32 *) hash_buf->digest;
17075
17076 salt_t *salt = hash_buf->salt;
17077
17078 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17079 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17080 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17081 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17082
17083 digest[0] = byte_swap_32 (digest[0]);
17084 digest[1] = byte_swap_32 (digest[1]);
17085 digest[2] = byte_swap_32 (digest[2]);
17086 digest[3] = byte_swap_32 (digest[3]);
17087
17088 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17089
17090 uint salt_len = input_len - 32 - 1;
17091
17092 char *salt_buf = input_buf + 32 + 1;
17093
17094 char *salt_buf_ptr = (char *) salt->salt_buf;
17095
17096 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17097
17098 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17099
17100 salt->salt_len = salt_len;
17101
17102 return (PARSER_OK);
17103 }
17104
17105 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17106 {
17107 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17108
17109 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17110
17111 u32 *digest = (u32 *) hash_buf->digest;
17112
17113 salt_t *salt = hash_buf->salt;
17114
17115 char *user_pos = input_buf + 10;
17116
17117 char *salt_pos = strchr (user_pos, '*');
17118
17119 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17120
17121 salt_pos++;
17122
17123 char *hash_pos = strchr (salt_pos, '*');
17124
17125 hash_pos++;
17126
17127 uint hash_len = input_len - (hash_pos - input_buf);
17128
17129 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17130
17131 uint user_len = salt_pos - user_pos - 1;
17132
17133 uint salt_len = hash_pos - salt_pos - 1;
17134
17135 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17136
17137 /*
17138 * store digest
17139 */
17140
17141 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17142 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17143 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17144 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17145
17146 digest[0] = byte_swap_32 (digest[0]);
17147 digest[1] = byte_swap_32 (digest[1]);
17148 digest[2] = byte_swap_32 (digest[2]);
17149 digest[3] = byte_swap_32 (digest[3]);
17150
17151 digest[0] -= MD5M_A;
17152 digest[1] -= MD5M_B;
17153 digest[2] -= MD5M_C;
17154 digest[3] -= MD5M_D;
17155
17156 /*
17157 * store salt
17158 */
17159
17160 char *salt_buf_ptr = (char *) salt->salt_buf;
17161
17162 // first 4 bytes are the "challenge"
17163
17164 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17165 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17166 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17167 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17168
17169 // append the user name
17170
17171 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17172
17173 salt->salt_len = 4 + user_len;
17174
17175 return (PARSER_OK);
17176 }
17177
17178 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17179 {
17180 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17181
17182 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17183
17184 u32 *digest = (u32 *) hash_buf->digest;
17185
17186 salt_t *salt = hash_buf->salt;
17187
17188 char *salt_pos = input_buf + 9;
17189
17190 char *hash_pos = strchr (salt_pos, '*');
17191
17192 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17193
17194 hash_pos++;
17195
17196 uint hash_len = input_len - (hash_pos - input_buf);
17197
17198 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17199
17200 uint salt_len = hash_pos - salt_pos - 1;
17201
17202 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17203
17204 /*
17205 * store digest
17206 */
17207
17208 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17209 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17210 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17211 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17212 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17213
17214 /*
17215 * store salt
17216 */
17217
17218 char *salt_buf_ptr = (char *) salt->salt_buf;
17219
17220 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17221
17222 salt->salt_len = salt_len;
17223
17224 return (PARSER_OK);
17225 }
17226
17227 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17228 {
17229 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17230
17231 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17232
17233 u32 *digest = (u32 *) hash_buf->digest;
17234
17235 salt_t *salt = hash_buf->salt;
17236
17237 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17238
17239 /**
17240 * parse line
17241 */
17242
17243 char *cry_master_len_pos = input_buf + 9;
17244
17245 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17246
17247 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17248
17249 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17250
17251 cry_master_buf_pos++;
17252
17253 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17254
17255 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17256
17257 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17258
17259 cry_salt_len_pos++;
17260
17261 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17262
17263 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17264
17265 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17266
17267 cry_salt_buf_pos++;
17268
17269 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17270
17271 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17272
17273 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17274
17275 cry_rounds_pos++;
17276
17277 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17278
17279 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17280
17281 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17282
17283 ckey_len_pos++;
17284
17285 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17286
17287 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17288
17289 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17290
17291 ckey_buf_pos++;
17292
17293 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17294
17295 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17296
17297 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17298
17299 public_key_len_pos++;
17300
17301 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17302
17303 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17304
17305 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17306
17307 public_key_buf_pos++;
17308
17309 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;
17310
17311 const uint cry_master_len = atoi (cry_master_len_pos);
17312 const uint cry_salt_len = atoi (cry_salt_len_pos);
17313 const uint ckey_len = atoi (ckey_len_pos);
17314 const uint public_key_len = atoi (public_key_len_pos);
17315
17316 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17317 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17318 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17319 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17320
17321 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17322 {
17323 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17324
17325 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17326 }
17327
17328 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17329 {
17330 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17331
17332 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17333 }
17334
17335 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17336 {
17337 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17338
17339 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17340 }
17341
17342 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17343 bitcoin_wallet->ckey_len = ckey_len / 2;
17344 bitcoin_wallet->public_key_len = public_key_len / 2;
17345
17346 /*
17347 * store digest (should be unique enought, hopefully)
17348 */
17349
17350 digest[0] = bitcoin_wallet->cry_master_buf[0];
17351 digest[1] = bitcoin_wallet->cry_master_buf[1];
17352 digest[2] = bitcoin_wallet->cry_master_buf[2];
17353 digest[3] = bitcoin_wallet->cry_master_buf[3];
17354
17355 /*
17356 * store salt
17357 */
17358
17359 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17360
17361 const uint cry_rounds = atoi (cry_rounds_pos);
17362
17363 salt->salt_iter = cry_rounds - 1;
17364
17365 char *salt_buf_ptr = (char *) salt->salt_buf;
17366
17367 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17368
17369 salt->salt_len = salt_len;
17370
17371 return (PARSER_OK);
17372 }
17373
17374 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17375 {
17376 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17377
17378 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17379
17380 u32 *digest = (u32 *) hash_buf->digest;
17381
17382 salt_t *salt = hash_buf->salt;
17383
17384 sip_t *sip = (sip_t *) hash_buf->esalt;
17385
17386 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17387
17388 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17389
17390 memcpy (temp_input_buf, input_buf, input_len);
17391
17392 // URI_server:
17393
17394 char *URI_server_pos = temp_input_buf + 6;
17395
17396 char *URI_client_pos = strchr (URI_server_pos, '*');
17397
17398 if (URI_client_pos == NULL)
17399 {
17400 myfree (temp_input_buf);
17401
17402 return (PARSER_SEPARATOR_UNMATCHED);
17403 }
17404
17405 URI_client_pos[0] = 0;
17406 URI_client_pos++;
17407
17408 uint URI_server_len = strlen (URI_server_pos);
17409
17410 if (URI_server_len > 512)
17411 {
17412 myfree (temp_input_buf);
17413
17414 return (PARSER_SALT_LENGTH);
17415 }
17416
17417 // URI_client:
17418
17419 char *user_pos = strchr (URI_client_pos, '*');
17420
17421 if (user_pos == NULL)
17422 {
17423 myfree (temp_input_buf);
17424
17425 return (PARSER_SEPARATOR_UNMATCHED);
17426 }
17427
17428 user_pos[0] = 0;
17429 user_pos++;
17430
17431 uint URI_client_len = strlen (URI_client_pos);
17432
17433 if (URI_client_len > 512)
17434 {
17435 myfree (temp_input_buf);
17436
17437 return (PARSER_SALT_LENGTH);
17438 }
17439
17440 // user:
17441
17442 char *realm_pos = strchr (user_pos, '*');
17443
17444 if (realm_pos == NULL)
17445 {
17446 myfree (temp_input_buf);
17447
17448 return (PARSER_SEPARATOR_UNMATCHED);
17449 }
17450
17451 realm_pos[0] = 0;
17452 realm_pos++;
17453
17454 uint user_len = strlen (user_pos);
17455
17456 if (user_len > 116)
17457 {
17458 myfree (temp_input_buf);
17459
17460 return (PARSER_SALT_LENGTH);
17461 }
17462
17463 // realm:
17464
17465 char *method_pos = strchr (realm_pos, '*');
17466
17467 if (method_pos == NULL)
17468 {
17469 myfree (temp_input_buf);
17470
17471 return (PARSER_SEPARATOR_UNMATCHED);
17472 }
17473
17474 method_pos[0] = 0;
17475 method_pos++;
17476
17477 uint realm_len = strlen (realm_pos);
17478
17479 if (realm_len > 116)
17480 {
17481 myfree (temp_input_buf);
17482
17483 return (PARSER_SALT_LENGTH);
17484 }
17485
17486 // method:
17487
17488 char *URI_prefix_pos = strchr (method_pos, '*');
17489
17490 if (URI_prefix_pos == NULL)
17491 {
17492 myfree (temp_input_buf);
17493
17494 return (PARSER_SEPARATOR_UNMATCHED);
17495 }
17496
17497 URI_prefix_pos[0] = 0;
17498 URI_prefix_pos++;
17499
17500 uint method_len = strlen (method_pos);
17501
17502 if (method_len > 246)
17503 {
17504 myfree (temp_input_buf);
17505
17506 return (PARSER_SALT_LENGTH);
17507 }
17508
17509 // URI_prefix:
17510
17511 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17512
17513 if (URI_resource_pos == NULL)
17514 {
17515 myfree (temp_input_buf);
17516
17517 return (PARSER_SEPARATOR_UNMATCHED);
17518 }
17519
17520 URI_resource_pos[0] = 0;
17521 URI_resource_pos++;
17522
17523 uint URI_prefix_len = strlen (URI_prefix_pos);
17524
17525 if (URI_prefix_len > 245)
17526 {
17527 myfree (temp_input_buf);
17528
17529 return (PARSER_SALT_LENGTH);
17530 }
17531
17532 // URI_resource:
17533
17534 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17535
17536 if (URI_suffix_pos == NULL)
17537 {
17538 myfree (temp_input_buf);
17539
17540 return (PARSER_SEPARATOR_UNMATCHED);
17541 }
17542
17543 URI_suffix_pos[0] = 0;
17544 URI_suffix_pos++;
17545
17546 uint URI_resource_len = strlen (URI_resource_pos);
17547
17548 if (URI_resource_len < 1 || URI_resource_len > 246)
17549 {
17550 myfree (temp_input_buf);
17551
17552 return (PARSER_SALT_LENGTH);
17553 }
17554
17555 // URI_suffix:
17556
17557 char *nonce_pos = strchr (URI_suffix_pos, '*');
17558
17559 if (nonce_pos == NULL)
17560 {
17561 myfree (temp_input_buf);
17562
17563 return (PARSER_SEPARATOR_UNMATCHED);
17564 }
17565
17566 nonce_pos[0] = 0;
17567 nonce_pos++;
17568
17569 uint URI_suffix_len = strlen (URI_suffix_pos);
17570
17571 if (URI_suffix_len > 245)
17572 {
17573 myfree (temp_input_buf);
17574
17575 return (PARSER_SALT_LENGTH);
17576 }
17577
17578 // nonce:
17579
17580 char *nonce_client_pos = strchr (nonce_pos, '*');
17581
17582 if (nonce_client_pos == NULL)
17583 {
17584 myfree (temp_input_buf);
17585
17586 return (PARSER_SEPARATOR_UNMATCHED);
17587 }
17588
17589 nonce_client_pos[0] = 0;
17590 nonce_client_pos++;
17591
17592 uint nonce_len = strlen (nonce_pos);
17593
17594 if (nonce_len < 1 || nonce_len > 50)
17595 {
17596 myfree (temp_input_buf);
17597
17598 return (PARSER_SALT_LENGTH);
17599 }
17600
17601 // nonce_client:
17602
17603 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17604
17605 if (nonce_count_pos == NULL)
17606 {
17607 myfree (temp_input_buf);
17608
17609 return (PARSER_SEPARATOR_UNMATCHED);
17610 }
17611
17612 nonce_count_pos[0] = 0;
17613 nonce_count_pos++;
17614
17615 uint nonce_client_len = strlen (nonce_client_pos);
17616
17617 if (nonce_client_len > 50)
17618 {
17619 myfree (temp_input_buf);
17620
17621 return (PARSER_SALT_LENGTH);
17622 }
17623
17624 // nonce_count:
17625
17626 char *qop_pos = strchr (nonce_count_pos, '*');
17627
17628 if (qop_pos == NULL)
17629 {
17630 myfree (temp_input_buf);
17631
17632 return (PARSER_SEPARATOR_UNMATCHED);
17633 }
17634
17635 qop_pos[0] = 0;
17636 qop_pos++;
17637
17638 uint nonce_count_len = strlen (nonce_count_pos);
17639
17640 if (nonce_count_len > 50)
17641 {
17642 myfree (temp_input_buf);
17643
17644 return (PARSER_SALT_LENGTH);
17645 }
17646
17647 // qop:
17648
17649 char *directive_pos = strchr (qop_pos, '*');
17650
17651 if (directive_pos == NULL)
17652 {
17653 myfree (temp_input_buf);
17654
17655 return (PARSER_SEPARATOR_UNMATCHED);
17656 }
17657
17658 directive_pos[0] = 0;
17659 directive_pos++;
17660
17661 uint qop_len = strlen (qop_pos);
17662
17663 if (qop_len > 50)
17664 {
17665 myfree (temp_input_buf);
17666
17667 return (PARSER_SALT_LENGTH);
17668 }
17669
17670 // directive
17671
17672 char *digest_pos = strchr (directive_pos, '*');
17673
17674 if (digest_pos == NULL)
17675 {
17676 myfree (temp_input_buf);
17677
17678 return (PARSER_SEPARATOR_UNMATCHED);
17679 }
17680
17681 digest_pos[0] = 0;
17682 digest_pos++;
17683
17684 uint directive_len = strlen (directive_pos);
17685
17686 if (directive_len != 3)
17687 {
17688 myfree (temp_input_buf);
17689
17690 return (PARSER_SALT_LENGTH);
17691 }
17692
17693 if (memcmp (directive_pos, "MD5", 3))
17694 {
17695 log_info ("ERROR: only the MD5 directive is currently supported\n");
17696
17697 myfree (temp_input_buf);
17698
17699 return (PARSER_SIP_AUTH_DIRECTIVE);
17700 }
17701
17702 /*
17703 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17704 */
17705
17706 uint md5_len = 0;
17707
17708 uint md5_max_len = 4 * 64;
17709
17710 uint md5_remaining_len = md5_max_len;
17711
17712 uint tmp_md5_buf[64] = { 0 };
17713
17714 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17715
17716 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17717
17718 md5_len += method_len + 1;
17719 tmp_md5_ptr += method_len + 1;
17720
17721 if (URI_prefix_len > 0)
17722 {
17723 md5_remaining_len = md5_max_len - md5_len;
17724
17725 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17726
17727 md5_len += URI_prefix_len + 1;
17728 tmp_md5_ptr += URI_prefix_len + 1;
17729 }
17730
17731 md5_remaining_len = md5_max_len - md5_len;
17732
17733 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17734
17735 md5_len += URI_resource_len;
17736 tmp_md5_ptr += URI_resource_len;
17737
17738 if (URI_suffix_len > 0)
17739 {
17740 md5_remaining_len = md5_max_len - md5_len;
17741
17742 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17743
17744 md5_len += 1 + URI_suffix_len;
17745 }
17746
17747 uint tmp_digest[4] = { 0 };
17748
17749 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17750
17751 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17752 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17753 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17754 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17755
17756 /*
17757 * esalt
17758 */
17759
17760 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17761
17762 uint esalt_len = 0;
17763
17764 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17765
17766 // there are 2 possibilities for the esalt:
17767
17768 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17769 {
17770 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17771
17772 if (esalt_len > max_esalt_len)
17773 {
17774 myfree (temp_input_buf);
17775
17776 return (PARSER_SALT_LENGTH);
17777 }
17778
17779 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17780 nonce_pos,
17781 nonce_count_pos,
17782 nonce_client_pos,
17783 qop_pos,
17784 tmp_digest[0],
17785 tmp_digest[1],
17786 tmp_digest[2],
17787 tmp_digest[3]);
17788 }
17789 else
17790 {
17791 esalt_len = 1 + nonce_len + 1 + 32;
17792
17793 if (esalt_len > max_esalt_len)
17794 {
17795 myfree (temp_input_buf);
17796
17797 return (PARSER_SALT_LENGTH);
17798 }
17799
17800 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17801 nonce_pos,
17802 tmp_digest[0],
17803 tmp_digest[1],
17804 tmp_digest[2],
17805 tmp_digest[3]);
17806 }
17807
17808 // add 0x80 to esalt
17809
17810 esalt_buf_ptr[esalt_len] = 0x80;
17811
17812 sip->esalt_len = esalt_len;
17813
17814 /*
17815 * actual salt
17816 */
17817
17818 char *sip_salt_ptr = (char *) sip->salt_buf;
17819
17820 uint salt_len = user_len + 1 + realm_len + 1;
17821
17822 uint max_salt_len = 119;
17823
17824 if (salt_len > max_salt_len)
17825 {
17826 myfree (temp_input_buf);
17827
17828 return (PARSER_SALT_LENGTH);
17829 }
17830
17831 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17832
17833 sip->salt_len = salt_len;
17834
17835 /*
17836 * fake salt (for sorting)
17837 */
17838
17839 char *salt_buf_ptr = (char *) salt->salt_buf;
17840
17841 max_salt_len = 55;
17842
17843 uint fake_salt_len = salt_len;
17844
17845 if (fake_salt_len > max_salt_len)
17846 {
17847 fake_salt_len = max_salt_len;
17848 }
17849
17850 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17851
17852 salt->salt_len = fake_salt_len;
17853
17854 /*
17855 * digest
17856 */
17857
17858 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
17859 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
17860 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
17861 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
17862
17863 digest[0] = byte_swap_32 (digest[0]);
17864 digest[1] = byte_swap_32 (digest[1]);
17865 digest[2] = byte_swap_32 (digest[2]);
17866 digest[3] = byte_swap_32 (digest[3]);
17867
17868 myfree (temp_input_buf);
17869
17870 return (PARSER_OK);
17871 }
17872
17873 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17874 {
17875 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17876
17877 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17878
17879 u32 *digest = (u32 *) hash_buf->digest;
17880
17881 salt_t *salt = hash_buf->salt;
17882
17883 // digest
17884
17885 char *digest_pos = input_buf;
17886
17887 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
17888 digest[1] = 0;
17889 digest[2] = 0;
17890 digest[3] = 0;
17891
17892 // salt
17893
17894 char *salt_buf = input_buf + 8 + 1;
17895
17896 uint salt_len = 8;
17897
17898 char *salt_buf_ptr = (char *) salt->salt_buf;
17899
17900 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17901
17902 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17903
17904 salt->salt_len = salt_len;
17905
17906 return (PARSER_OK);
17907 }
17908
17909 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17910 {
17911 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17912
17913 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17914
17915 u32 *digest = (u32 *) hash_buf->digest;
17916
17917 salt_t *salt = hash_buf->salt;
17918
17919 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17920
17921 /**
17922 * parse line
17923 */
17924
17925 char *p_buf_pos = input_buf + 4;
17926
17927 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17928
17929 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17930
17931 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
17932
17933 NumCyclesPower_pos++;
17934
17935 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17936
17937 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17938
17939 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17940
17941 salt_len_pos++;
17942
17943 char *salt_buf_pos = strchr (salt_len_pos, '$');
17944
17945 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17946
17947 u32 salt_len_len = salt_buf_pos - salt_len_pos;
17948
17949 salt_buf_pos++;
17950
17951 char *iv_len_pos = strchr (salt_buf_pos, '$');
17952
17953 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17954
17955 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
17956
17957 iv_len_pos++;
17958
17959 char *iv_buf_pos = strchr (iv_len_pos, '$');
17960
17961 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17962
17963 u32 iv_len_len = iv_buf_pos - iv_len_pos;
17964
17965 iv_buf_pos++;
17966
17967 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17968
17969 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17970
17971 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
17972
17973 crc_buf_pos++;
17974
17975 char *data_len_pos = strchr (crc_buf_pos, '$');
17976
17977 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17978
17979 u32 crc_buf_len = data_len_pos - crc_buf_pos;
17980
17981 data_len_pos++;
17982
17983 char *unpack_size_pos = strchr (data_len_pos, '$');
17984
17985 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17986
17987 u32 data_len_len = unpack_size_pos - data_len_pos;
17988
17989 unpack_size_pos++;
17990
17991 char *data_buf_pos = strchr (unpack_size_pos, '$');
17992
17993 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17994
17995 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
17996
17997 data_buf_pos++;
17998
17999 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;
18000
18001 const uint iter = atoi (NumCyclesPower_pos);
18002 const uint crc = atoi (crc_buf_pos);
18003 const uint p_buf = atoi (p_buf_pos);
18004 const uint salt_len = atoi (salt_len_pos);
18005 const uint iv_len = atoi (iv_len_pos);
18006 const uint unpack_size = atoi (unpack_size_pos);
18007 const uint data_len = atoi (data_len_pos);
18008
18009 /**
18010 * verify some data
18011 */
18012
18013 if (p_buf != 0) return (PARSER_SALT_VALUE);
18014 if (salt_len != 0) return (PARSER_SALT_VALUE);
18015
18016 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18017
18018 if (data_len > 384) return (PARSER_SALT_VALUE);
18019
18020 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18021
18022 /**
18023 * store data
18024 */
18025
18026 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18027 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18028 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18029 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18030
18031 seven_zip->iv_len = iv_len;
18032
18033 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18034
18035 seven_zip->salt_len = 0;
18036
18037 seven_zip->crc = crc;
18038
18039 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18040 {
18041 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18042
18043 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18044 }
18045
18046 seven_zip->data_len = data_len;
18047
18048 seven_zip->unpack_size = unpack_size;
18049
18050 // real salt
18051
18052 salt->salt_buf[0] = seven_zip->data_buf[0];
18053 salt->salt_buf[1] = seven_zip->data_buf[1];
18054 salt->salt_buf[2] = seven_zip->data_buf[2];
18055 salt->salt_buf[3] = seven_zip->data_buf[3];
18056
18057 salt->salt_len = 16;
18058
18059 salt->salt_sign[0] = iter;
18060
18061 salt->salt_iter = 1 << iter;
18062
18063 /**
18064 * digest
18065 */
18066
18067 digest[0] = crc;
18068 digest[1] = 0;
18069 digest[2] = 0;
18070 digest[3] = 0;
18071
18072 return (PARSER_OK);
18073 }
18074
18075 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18076 {
18077 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18078
18079 u32 *digest = (u32 *) hash_buf->digest;
18080
18081 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18082 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18083 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18084 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18085 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18086 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18087 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18088 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18089
18090 digest[0] = byte_swap_32 (digest[0]);
18091 digest[1] = byte_swap_32 (digest[1]);
18092 digest[2] = byte_swap_32 (digest[2]);
18093 digest[3] = byte_swap_32 (digest[3]);
18094 digest[4] = byte_swap_32 (digest[4]);
18095 digest[5] = byte_swap_32 (digest[5]);
18096 digest[6] = byte_swap_32 (digest[6]);
18097 digest[7] = byte_swap_32 (digest[7]);
18098
18099 return (PARSER_OK);
18100 }
18101
18102 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18103 {
18104 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18105
18106 u32 *digest = (u32 *) hash_buf->digest;
18107
18108 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18109 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18110 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18111 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18112 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18113 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18114 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18115 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18116 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18117 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18118 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18119 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18120 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18121 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18122 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18123 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18124
18125 digest[ 0] = byte_swap_32 (digest[ 0]);
18126 digest[ 1] = byte_swap_32 (digest[ 1]);
18127 digest[ 2] = byte_swap_32 (digest[ 2]);
18128 digest[ 3] = byte_swap_32 (digest[ 3]);
18129 digest[ 4] = byte_swap_32 (digest[ 4]);
18130 digest[ 5] = byte_swap_32 (digest[ 5]);
18131 digest[ 6] = byte_swap_32 (digest[ 6]);
18132 digest[ 7] = byte_swap_32 (digest[ 7]);
18133 digest[ 8] = byte_swap_32 (digest[ 8]);
18134 digest[ 9] = byte_swap_32 (digest[ 9]);
18135 digest[10] = byte_swap_32 (digest[10]);
18136 digest[11] = byte_swap_32 (digest[11]);
18137 digest[12] = byte_swap_32 (digest[12]);
18138 digest[13] = byte_swap_32 (digest[13]);
18139 digest[14] = byte_swap_32 (digest[14]);
18140 digest[15] = byte_swap_32 (digest[15]);
18141
18142 return (PARSER_OK);
18143 }
18144
18145 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18146 {
18147 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18148
18149 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18150
18151 u32 *digest = (u32 *) hash_buf->digest;
18152
18153 salt_t *salt = hash_buf->salt;
18154
18155 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18156
18157 /**
18158 * parse line
18159 */
18160
18161 // iterations
18162
18163 char *iter_pos = input_buf + 4;
18164
18165 u32 iter = atoi (iter_pos);
18166
18167 if (iter < 1) return (PARSER_SALT_ITERATION);
18168 if (iter > 999999) return (PARSER_SALT_ITERATION);
18169
18170 // first is *raw* salt
18171
18172 char *salt_pos = strchr (iter_pos, ':');
18173
18174 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18175
18176 salt_pos++;
18177
18178 char *hash_pos = strchr (salt_pos, ':');
18179
18180 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18181
18182 u32 salt_len = hash_pos - salt_pos;
18183
18184 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18185
18186 hash_pos++;
18187
18188 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18189
18190 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18191
18192 // decode salt
18193
18194 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18195
18196 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18197
18198 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18199
18200 salt_buf_ptr[salt_len + 3] = 0x01;
18201 salt_buf_ptr[salt_len + 4] = 0x80;
18202
18203 salt->salt_len = salt_len;
18204 salt->salt_iter = iter - 1;
18205
18206 // decode hash
18207
18208 u8 tmp_buf[100] = { 0 };
18209
18210 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18211
18212 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18213
18214 memcpy (digest, tmp_buf, 16);
18215
18216 // add some stuff to normal salt to make sorted happy
18217
18218 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18219 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18220 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18221 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18222 salt->salt_buf[4] = salt->salt_iter;
18223
18224 return (PARSER_OK);
18225 }
18226
18227 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18228 {
18229 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18230
18231 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18232
18233 u32 *digest = (u32 *) hash_buf->digest;
18234
18235 salt_t *salt = hash_buf->salt;
18236
18237 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18238
18239 /**
18240 * parse line
18241 */
18242
18243 // iterations
18244
18245 char *iter_pos = input_buf + 5;
18246
18247 u32 iter = atoi (iter_pos);
18248
18249 if (iter < 1) return (PARSER_SALT_ITERATION);
18250 if (iter > 999999) return (PARSER_SALT_ITERATION);
18251
18252 // first is *raw* salt
18253
18254 char *salt_pos = strchr (iter_pos, ':');
18255
18256 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18257
18258 salt_pos++;
18259
18260 char *hash_pos = strchr (salt_pos, ':');
18261
18262 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18263
18264 u32 salt_len = hash_pos - salt_pos;
18265
18266 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18267
18268 hash_pos++;
18269
18270 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18271
18272 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18273
18274 // decode salt
18275
18276 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18277
18278 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18279
18280 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18281
18282 salt_buf_ptr[salt_len + 3] = 0x01;
18283 salt_buf_ptr[salt_len + 4] = 0x80;
18284
18285 salt->salt_len = salt_len;
18286 salt->salt_iter = iter - 1;
18287
18288 // decode hash
18289
18290 u8 tmp_buf[100] = { 0 };
18291
18292 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18293
18294 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18295
18296 memcpy (digest, tmp_buf, 16);
18297
18298 digest[0] = byte_swap_32 (digest[0]);
18299 digest[1] = byte_swap_32 (digest[1]);
18300 digest[2] = byte_swap_32 (digest[2]);
18301 digest[3] = byte_swap_32 (digest[3]);
18302
18303 // add some stuff to normal salt to make sorted happy
18304
18305 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18306 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18307 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18308 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18309 salt->salt_buf[4] = salt->salt_iter;
18310
18311 return (PARSER_OK);
18312 }
18313
18314 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18315 {
18316 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18317
18318 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18319
18320 u64 *digest = (u64 *) hash_buf->digest;
18321
18322 salt_t *salt = hash_buf->salt;
18323
18324 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18325
18326 /**
18327 * parse line
18328 */
18329
18330 // iterations
18331
18332 char *iter_pos = input_buf + 7;
18333
18334 u32 iter = atoi (iter_pos);
18335
18336 if (iter < 1) return (PARSER_SALT_ITERATION);
18337 if (iter > 999999) return (PARSER_SALT_ITERATION);
18338
18339 // first is *raw* salt
18340
18341 char *salt_pos = strchr (iter_pos, ':');
18342
18343 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18344
18345 salt_pos++;
18346
18347 char *hash_pos = strchr (salt_pos, ':');
18348
18349 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18350
18351 u32 salt_len = hash_pos - salt_pos;
18352
18353 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18354
18355 hash_pos++;
18356
18357 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18358
18359 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18360
18361 // decode salt
18362
18363 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18364
18365 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18366
18367 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18368
18369 salt_buf_ptr[salt_len + 3] = 0x01;
18370 salt_buf_ptr[salt_len + 4] = 0x80;
18371
18372 salt->salt_len = salt_len;
18373 salt->salt_iter = iter - 1;
18374
18375 // decode hash
18376
18377 u8 tmp_buf[100] = { 0 };
18378
18379 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18380
18381 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18382
18383 memcpy (digest, tmp_buf, 64);
18384
18385 digest[0] = byte_swap_64 (digest[0]);
18386 digest[1] = byte_swap_64 (digest[1]);
18387 digest[2] = byte_swap_64 (digest[2]);
18388 digest[3] = byte_swap_64 (digest[3]);
18389 digest[4] = byte_swap_64 (digest[4]);
18390 digest[5] = byte_swap_64 (digest[5]);
18391 digest[6] = byte_swap_64 (digest[6]);
18392 digest[7] = byte_swap_64 (digest[7]);
18393
18394 // add some stuff to normal salt to make sorted happy
18395
18396 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18397 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18398 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18399 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18400 salt->salt_buf[4] = salt->salt_iter;
18401
18402 return (PARSER_OK);
18403 }
18404
18405 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18406 {
18407 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18408
18409 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18410
18411 uint *digest = (uint *) hash_buf->digest;
18412
18413 salt_t *salt = hash_buf->salt;
18414
18415 /**
18416 * parse line
18417 */
18418
18419 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18420
18421 char *hash_pos = strchr (salt_pos, '$');
18422
18423 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18424
18425 u32 salt_len = hash_pos - salt_pos;
18426
18427 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18428
18429 hash_pos++;
18430
18431 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18432
18433 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18434
18435 // decode hash
18436
18437 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18438 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18439 digest[ 2] = 0;
18440 digest[ 3] = 0;
18441 digest[ 4] = 0;
18442 digest[ 5] = 0;
18443 digest[ 6] = 0;
18444 digest[ 7] = 0;
18445 digest[ 8] = 0;
18446 digest[ 9] = 0;
18447 digest[10] = 0;
18448 digest[11] = 0;
18449 digest[12] = 0;
18450 digest[13] = 0;
18451 digest[14] = 0;
18452 digest[15] = 0;
18453
18454 // decode salt
18455
18456 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18457 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18458
18459 salt->salt_iter = ROUNDS_ECRYPTFS;
18460 salt->salt_len = 8;
18461
18462 return (PARSER_OK);
18463 }
18464
18465 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18466 {
18467 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18468
18469 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18470
18471 unsigned char c19 = itoa64_to_int (input_buf[19]);
18472
18473 if (c19 & 3) return (PARSER_HASH_VALUE);
18474
18475 salt_t *salt = hash_buf->salt;
18476
18477 u32 *digest = (u32 *) hash_buf->digest;
18478
18479 // iteration count
18480
18481 salt->salt_iter = itoa64_to_int (input_buf[1])
18482 | itoa64_to_int (input_buf[2]) << 6
18483 | itoa64_to_int (input_buf[3]) << 12
18484 | itoa64_to_int (input_buf[4]) << 18;
18485
18486 // set salt
18487
18488 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18489 | itoa64_to_int (input_buf[6]) << 6
18490 | itoa64_to_int (input_buf[7]) << 12
18491 | itoa64_to_int (input_buf[8]) << 18;
18492
18493 salt->salt_len = 4;
18494
18495 u8 tmp_buf[100] = { 0 };
18496
18497 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18498
18499 memcpy (digest, tmp_buf, 8);
18500
18501 uint tt;
18502
18503 IP (digest[0], digest[1], tt);
18504
18505 digest[0] = rotr32 (digest[0], 31);
18506 digest[1] = rotr32 (digest[1], 31);
18507 digest[2] = 0;
18508 digest[3] = 0;
18509
18510 return (PARSER_OK);
18511 }
18512
18513 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18514 {
18515 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18516
18517 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18518
18519 u32 *digest = (u32 *) hash_buf->digest;
18520
18521 salt_t *salt = hash_buf->salt;
18522
18523 /**
18524 * parse line
18525 */
18526
18527 char *type_pos = input_buf + 6 + 1;
18528
18529 char *salt_pos = strchr (type_pos, '*');
18530
18531 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18532
18533 u32 type_len = salt_pos - type_pos;
18534
18535 if (type_len != 1) return (PARSER_SALT_LENGTH);
18536
18537 salt_pos++;
18538
18539 char *crypted_pos = strchr (salt_pos, '*');
18540
18541 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18542
18543 u32 salt_len = crypted_pos - salt_pos;
18544
18545 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18546
18547 crypted_pos++;
18548
18549 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18550
18551 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18552
18553 /**
18554 * copy data
18555 */
18556
18557 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18558 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18559
18560 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18561 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18562
18563 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18564 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18565 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18566 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18567
18568 salt->salt_len = 24;
18569 salt->salt_iter = ROUNDS_RAR3;
18570
18571 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18572 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18573
18574 digest[0] = 0xc43d7b00;
18575 digest[1] = 0x40070000;
18576 digest[2] = 0;
18577 digest[3] = 0;
18578
18579 return (PARSER_OK);
18580 }
18581
18582 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18583 {
18584 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18585
18586 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18587
18588 u32 *digest = (u32 *) hash_buf->digest;
18589
18590 salt_t *salt = hash_buf->salt;
18591
18592 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18593
18594 /**
18595 * parse line
18596 */
18597
18598 char *param0_pos = input_buf + 1 + 4 + 1;
18599
18600 char *param1_pos = strchr (param0_pos, '$');
18601
18602 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18603
18604 u32 param0_len = param1_pos - param0_pos;
18605
18606 param1_pos++;
18607
18608 char *param2_pos = strchr (param1_pos, '$');
18609
18610 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18611
18612 u32 param1_len = param2_pos - param1_pos;
18613
18614 param2_pos++;
18615
18616 char *param3_pos = strchr (param2_pos, '$');
18617
18618 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18619
18620 u32 param2_len = param3_pos - param2_pos;
18621
18622 param3_pos++;
18623
18624 char *param4_pos = strchr (param3_pos, '$');
18625
18626 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18627
18628 u32 param3_len = param4_pos - param3_pos;
18629
18630 param4_pos++;
18631
18632 char *param5_pos = strchr (param4_pos, '$');
18633
18634 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18635
18636 u32 param4_len = param5_pos - param4_pos;
18637
18638 param5_pos++;
18639
18640 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18641
18642 char *salt_buf = param1_pos;
18643 char *iv = param3_pos;
18644 char *pswcheck = param5_pos;
18645
18646 const uint salt_len = atoi (param0_pos);
18647 const uint iterations = atoi (param2_pos);
18648 const uint pswcheck_len = atoi (param4_pos);
18649
18650 /**
18651 * verify some data
18652 */
18653
18654 if (param1_len != 32) return (PARSER_SALT_VALUE);
18655 if (param3_len != 32) return (PARSER_SALT_VALUE);
18656 if (param5_len != 16) return (PARSER_SALT_VALUE);
18657
18658 if (salt_len != 16) return (PARSER_SALT_VALUE);
18659 if (iterations == 0) return (PARSER_SALT_VALUE);
18660 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18661
18662 /**
18663 * store data
18664 */
18665
18666 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18667 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18668 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18669 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18670
18671 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18672 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18673 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18674 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18675
18676 salt->salt_len = 16;
18677
18678 salt->salt_sign[0] = iterations;
18679
18680 salt->salt_iter = ((1 << iterations) + 32) - 1;
18681
18682 /**
18683 * digest buf
18684 */
18685
18686 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18687 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18688 digest[2] = 0;
18689 digest[3] = 0;
18690
18691 return (PARSER_OK);
18692 }
18693
18694 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18695 {
18696 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18697
18698 u32 *digest = (u32 *) hash_buf->digest;
18699
18700 salt_t *salt = hash_buf->salt;
18701
18702 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18703 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18704 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18705 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18706 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18707 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18708 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18709 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18710
18711 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18712
18713 uint salt_len = input_len - 64 - 1;
18714
18715 char *salt_buf = input_buf + 64 + 1;
18716
18717 char *salt_buf_ptr = (char *) salt->salt_buf;
18718
18719 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18720
18721 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18722
18723 salt->salt_len = salt_len;
18724
18725 /**
18726 * we can precompute the first sha256 transform
18727 */
18728
18729 uint w[16] = { 0 };
18730
18731 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18732 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18733 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18734 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18735 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18736 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18737 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18738 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18739 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18740 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18741 w[10] = byte_swap_32 (salt->salt_buf[10]);
18742 w[11] = byte_swap_32 (salt->salt_buf[11]);
18743 w[12] = byte_swap_32 (salt->salt_buf[12]);
18744 w[13] = byte_swap_32 (salt->salt_buf[13]);
18745 w[14] = byte_swap_32 (salt->salt_buf[14]);
18746 w[15] = byte_swap_32 (salt->salt_buf[15]);
18747
18748 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
18749
18750 sha256_64 (w, pc256);
18751
18752 salt->salt_buf_pc[0] = pc256[0];
18753 salt->salt_buf_pc[1] = pc256[1];
18754 salt->salt_buf_pc[2] = pc256[2];
18755 salt->salt_buf_pc[3] = pc256[3];
18756 salt->salt_buf_pc[4] = pc256[4];
18757 salt->salt_buf_pc[5] = pc256[5];
18758 salt->salt_buf_pc[6] = pc256[6];
18759 salt->salt_buf_pc[7] = pc256[7];
18760
18761 digest[0] -= pc256[0];
18762 digest[1] -= pc256[1];
18763 digest[2] -= pc256[2];
18764 digest[3] -= pc256[3];
18765 digest[4] -= pc256[4];
18766 digest[5] -= pc256[5];
18767 digest[6] -= pc256[6];
18768 digest[7] -= pc256[7];
18769
18770 return (PARSER_OK);
18771 }
18772
18773 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18774 {
18775 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18776
18777 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18778
18779 u32 *digest = (u32 *) hash_buf->digest;
18780
18781 salt_t *salt = hash_buf->salt;
18782
18783 /**
18784 * parse line
18785 */
18786
18787 char *data_len_pos = input_buf + 1 + 10 + 1;
18788
18789 char *data_buf_pos = strchr (data_len_pos, '$');
18790
18791 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18792
18793 u32 data_len_len = data_buf_pos - data_len_pos;
18794
18795 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18796 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18797
18798 data_buf_pos++;
18799
18800 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18801
18802 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18803
18804 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18805
18806 u32 data_len = atoi (data_len_pos);
18807
18808 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18809
18810 /**
18811 * salt
18812 */
18813
18814 char *salt_pos = data_buf_pos;
18815
18816 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18817 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18818 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
18819 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
18820
18821 // this is actually the CT, which is also the hash later (if matched)
18822
18823 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
18824 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
18825 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
18826 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
18827
18828 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18829
18830 salt->salt_iter = 10 - 1;
18831
18832 /**
18833 * digest buf
18834 */
18835
18836 digest[0] = salt->salt_buf[4];
18837 digest[1] = salt->salt_buf[5];
18838 digest[2] = salt->salt_buf[6];
18839 digest[3] = salt->salt_buf[7];
18840
18841 return (PARSER_OK);
18842 }
18843
18844 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18845 {
18846 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18847
18848 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18849
18850 u32 *digest = (u32 *) hash_buf->digest;
18851
18852 salt_t *salt = hash_buf->salt;
18853
18854 /**
18855 * parse line
18856 */
18857
18858 char *salt_pos = input_buf + 11 + 1;
18859
18860 char *iter_pos = strchr (salt_pos, ',');
18861
18862 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18863
18864 u32 salt_len = iter_pos - salt_pos;
18865
18866 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18867
18868 iter_pos++;
18869
18870 char *hash_pos = strchr (iter_pos, ',');
18871
18872 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18873
18874 u32 iter_len = hash_pos - iter_pos;
18875
18876 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18877
18878 hash_pos++;
18879
18880 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18881
18882 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18883
18884 /**
18885 * salt
18886 */
18887
18888 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18889 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18890 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
18891 salt->salt_buf[3] = 0x00018000;
18892
18893 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18894 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18895 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18896 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18897
18898 salt->salt_len = salt_len / 2;
18899
18900 salt->salt_iter = atoi (iter_pos) - 1;
18901
18902 /**
18903 * digest buf
18904 */
18905
18906 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18907 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18908 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18909 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18910 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18911 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18912 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
18913 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
18914
18915 return (PARSER_OK);
18916 }
18917
18918 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18919 {
18920 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
18921
18922 u32 *digest = (u32 *) hash_buf->digest;
18923
18924 salt_t *salt = hash_buf->salt;
18925
18926 /**
18927 * parse line
18928 */
18929
18930 char *hash_pos = input_buf + 64;
18931 char *salt1_pos = input_buf + 128;
18932 char *salt2_pos = input_buf;
18933
18934 /**
18935 * salt
18936 */
18937
18938 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
18939 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
18940 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
18941 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
18942
18943 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
18944 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
18945 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
18946 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
18947
18948 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
18949 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
18950 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
18951 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
18952
18953 salt->salt_len = 48;
18954
18955 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
18956
18957 /**
18958 * digest buf
18959 */
18960
18961 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18962 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18963 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18964 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18965 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18966 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18967 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
18968 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
18969
18970 return (PARSER_OK);
18971 }
18972
18973 /**
18974 * parallel running threads
18975 */
18976
18977 #ifdef WIN
18978
18979 BOOL WINAPI sigHandler_default (DWORD sig)
18980 {
18981 switch (sig)
18982 {
18983 case CTRL_CLOSE_EVENT:
18984
18985 /*
18986 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18987 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18988 * function otherwise it is too late (e.g. after returning from this function)
18989 */
18990
18991 myabort ();
18992
18993 SetConsoleCtrlHandler (NULL, TRUE);
18994
18995 hc_sleep (10);
18996
18997 return TRUE;
18998
18999 case CTRL_C_EVENT:
19000 case CTRL_LOGOFF_EVENT:
19001 case CTRL_SHUTDOWN_EVENT:
19002
19003 myabort ();
19004
19005 SetConsoleCtrlHandler (NULL, TRUE);
19006
19007 return TRUE;
19008 }
19009
19010 return FALSE;
19011 }
19012
19013 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19014 {
19015 switch (sig)
19016 {
19017 case CTRL_CLOSE_EVENT:
19018
19019 myabort ();
19020
19021 SetConsoleCtrlHandler (NULL, TRUE);
19022
19023 hc_sleep (10);
19024
19025 return TRUE;
19026
19027 case CTRL_C_EVENT:
19028 case CTRL_LOGOFF_EVENT:
19029 case CTRL_SHUTDOWN_EVENT:
19030
19031 myquit ();
19032
19033 SetConsoleCtrlHandler (NULL, TRUE);
19034
19035 return TRUE;
19036 }
19037
19038 return FALSE;
19039 }
19040
19041 void hc_signal (BOOL WINAPI (callback) (DWORD))
19042 {
19043 if (callback == NULL)
19044 {
19045 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19046 }
19047 else
19048 {
19049 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19050 }
19051 }
19052
19053 #else
19054
19055 void sigHandler_default (int sig)
19056 {
19057 myabort ();
19058
19059 signal (sig, NULL);
19060 }
19061
19062 void sigHandler_benchmark (int sig)
19063 {
19064 myquit ();
19065
19066 signal (sig, NULL);
19067 }
19068
19069 void hc_signal (void (callback) (int))
19070 {
19071 if (callback == NULL) callback = SIG_DFL;
19072
19073 signal (SIGINT, callback);
19074 signal (SIGTERM, callback);
19075 signal (SIGABRT, callback);
19076 }
19077
19078 #endif
19079
19080 void status_display ();
19081
19082 void *thread_keypress (void *p)
19083 {
19084 int benchmark = *((int *) p);
19085
19086 uint quiet = data.quiet;
19087
19088 tty_break();
19089
19090 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19091 {
19092 int ch = tty_getchar();
19093
19094 if (ch == -1) break;
19095
19096 if (ch == 0) continue;
19097
19098 #ifdef _POSIX
19099 if (ch != '\n')
19100 #endif
19101
19102 hc_thread_mutex_lock (mux_display);
19103
19104 log_info ("");
19105
19106 switch (ch)
19107 {
19108 case 's':
19109 case '\n':
19110
19111 log_info ("");
19112
19113 status_display ();
19114
19115 log_info ("");
19116
19117 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19118 if (quiet == 0) fflush (stdout);
19119
19120 break;
19121
19122 case 'b':
19123
19124 log_info ("");
19125
19126 bypass ();
19127
19128 log_info ("");
19129
19130 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19131 if (quiet == 0) fflush (stdout);
19132
19133 break;
19134
19135 case 'p':
19136
19137 log_info ("");
19138
19139 SuspendThreads ();
19140
19141 log_info ("");
19142
19143 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19144 if (quiet == 0) fflush (stdout);
19145
19146 break;
19147
19148 case 'r':
19149
19150 log_info ("");
19151
19152 ResumeThreads ();
19153
19154 log_info ("");
19155
19156 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19157 if (quiet == 0) fflush (stdout);
19158
19159 break;
19160
19161 case 'c':
19162
19163 log_info ("");
19164
19165 if (benchmark == 1) break;
19166
19167 stop_at_checkpoint ();
19168
19169 log_info ("");
19170
19171 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19172 if (quiet == 0) fflush (stdout);
19173
19174 break;
19175
19176 case 'q':
19177
19178 log_info ("");
19179
19180 if (benchmark == 1)
19181 {
19182 myquit ();
19183 }
19184 else
19185 {
19186 myabort ();
19187 }
19188
19189 break;
19190 }
19191
19192 hc_thread_mutex_unlock (mux_display);
19193 }
19194
19195 tty_fix();
19196
19197 return (p);
19198 }
19199
19200 /**
19201 * rules common
19202 */
19203
19204 bool class_num (const u8 c)
19205 {
19206 return ((c >= '0') && (c <= '9'));
19207 }
19208
19209 bool class_lower (const u8 c)
19210 {
19211 return ((c >= 'a') && (c <= 'z'));
19212 }
19213
19214 bool class_upper (const u8 c)
19215 {
19216 return ((c >= 'A') && (c <= 'Z'));
19217 }
19218
19219 bool class_alpha (const u8 c)
19220 {
19221 return (class_lower (c) || class_upper (c));
19222 }
19223
19224 int conv_ctoi (const u8 c)
19225 {
19226 if (class_num (c))
19227 {
19228 return c - '0';
19229 }
19230 else if (class_upper (c))
19231 {
19232 return c - 'A' + 10;
19233 }
19234
19235 return -1;
19236 }
19237
19238 int conv_itoc (const u8 c)
19239 {
19240 if (c < 10)
19241 {
19242 return c + '0';
19243 }
19244 else if (c < 37)
19245 {
19246 return c + 'A' - 10;
19247 }
19248
19249 return -1;
19250 }
19251
19252 /**
19253 * device rules
19254 */
19255
19256 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19257 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19258 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19259 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19260 #define MAX_KERNEL_RULES 255
19261 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19262 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19263 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19264
19265 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19266 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19267 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19268 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19269
19270 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19271 {
19272 uint rule_pos;
19273 uint rule_cnt;
19274
19275 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19276 {
19277 switch (rule_buf[rule_pos])
19278 {
19279 case ' ':
19280 rule_cnt--;
19281 break;
19282
19283 case RULE_OP_MANGLE_NOOP:
19284 SET_NAME (rule, rule_buf[rule_pos]);
19285 break;
19286
19287 case RULE_OP_MANGLE_LREST:
19288 SET_NAME (rule, rule_buf[rule_pos]);
19289 break;
19290
19291 case RULE_OP_MANGLE_UREST:
19292 SET_NAME (rule, rule_buf[rule_pos]);
19293 break;
19294
19295 case RULE_OP_MANGLE_LREST_UFIRST:
19296 SET_NAME (rule, rule_buf[rule_pos]);
19297 break;
19298
19299 case RULE_OP_MANGLE_UREST_LFIRST:
19300 SET_NAME (rule, rule_buf[rule_pos]);
19301 break;
19302
19303 case RULE_OP_MANGLE_TREST:
19304 SET_NAME (rule, rule_buf[rule_pos]);
19305 break;
19306
19307 case RULE_OP_MANGLE_TOGGLE_AT:
19308 SET_NAME (rule, rule_buf[rule_pos]);
19309 SET_P0_CONV (rule, rule_buf[rule_pos]);
19310 break;
19311
19312 case RULE_OP_MANGLE_REVERSE:
19313 SET_NAME (rule, rule_buf[rule_pos]);
19314 break;
19315
19316 case RULE_OP_MANGLE_DUPEWORD:
19317 SET_NAME (rule, rule_buf[rule_pos]);
19318 break;
19319
19320 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19321 SET_NAME (rule, rule_buf[rule_pos]);
19322 SET_P0_CONV (rule, rule_buf[rule_pos]);
19323 break;
19324
19325 case RULE_OP_MANGLE_REFLECT:
19326 SET_NAME (rule, rule_buf[rule_pos]);
19327 break;
19328
19329 case RULE_OP_MANGLE_ROTATE_LEFT:
19330 SET_NAME (rule, rule_buf[rule_pos]);
19331 break;
19332
19333 case RULE_OP_MANGLE_ROTATE_RIGHT:
19334 SET_NAME (rule, rule_buf[rule_pos]);
19335 break;
19336
19337 case RULE_OP_MANGLE_APPEND:
19338 SET_NAME (rule, rule_buf[rule_pos]);
19339 SET_P0 (rule, rule_buf[rule_pos]);
19340 break;
19341
19342 case RULE_OP_MANGLE_PREPEND:
19343 SET_NAME (rule, rule_buf[rule_pos]);
19344 SET_P0 (rule, rule_buf[rule_pos]);
19345 break;
19346
19347 case RULE_OP_MANGLE_DELETE_FIRST:
19348 SET_NAME (rule, rule_buf[rule_pos]);
19349 break;
19350
19351 case RULE_OP_MANGLE_DELETE_LAST:
19352 SET_NAME (rule, rule_buf[rule_pos]);
19353 break;
19354
19355 case RULE_OP_MANGLE_DELETE_AT:
19356 SET_NAME (rule, rule_buf[rule_pos]);
19357 SET_P0_CONV (rule, rule_buf[rule_pos]);
19358 break;
19359
19360 case RULE_OP_MANGLE_EXTRACT:
19361 SET_NAME (rule, rule_buf[rule_pos]);
19362 SET_P0_CONV (rule, rule_buf[rule_pos]);
19363 SET_P1_CONV (rule, rule_buf[rule_pos]);
19364 break;
19365
19366 case RULE_OP_MANGLE_OMIT:
19367 SET_NAME (rule, rule_buf[rule_pos]);
19368 SET_P0_CONV (rule, rule_buf[rule_pos]);
19369 SET_P1_CONV (rule, rule_buf[rule_pos]);
19370 break;
19371
19372 case RULE_OP_MANGLE_INSERT:
19373 SET_NAME (rule, rule_buf[rule_pos]);
19374 SET_P0_CONV (rule, rule_buf[rule_pos]);
19375 SET_P1 (rule, rule_buf[rule_pos]);
19376 break;
19377
19378 case RULE_OP_MANGLE_OVERSTRIKE:
19379 SET_NAME (rule, rule_buf[rule_pos]);
19380 SET_P0_CONV (rule, rule_buf[rule_pos]);
19381 SET_P1 (rule, rule_buf[rule_pos]);
19382 break;
19383
19384 case RULE_OP_MANGLE_TRUNCATE_AT:
19385 SET_NAME (rule, rule_buf[rule_pos]);
19386 SET_P0_CONV (rule, rule_buf[rule_pos]);
19387 break;
19388
19389 case RULE_OP_MANGLE_REPLACE:
19390 SET_NAME (rule, rule_buf[rule_pos]);
19391 SET_P0 (rule, rule_buf[rule_pos]);
19392 SET_P1 (rule, rule_buf[rule_pos]);
19393 break;
19394
19395 case RULE_OP_MANGLE_PURGECHAR:
19396 return (-1);
19397 break;
19398
19399 case RULE_OP_MANGLE_TOGGLECASE_REC:
19400 return (-1);
19401 break;
19402
19403 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19404 SET_NAME (rule, rule_buf[rule_pos]);
19405 SET_P0_CONV (rule, rule_buf[rule_pos]);
19406 break;
19407
19408 case RULE_OP_MANGLE_DUPECHAR_LAST:
19409 SET_NAME (rule, rule_buf[rule_pos]);
19410 SET_P0_CONV (rule, rule_buf[rule_pos]);
19411 break;
19412
19413 case RULE_OP_MANGLE_DUPECHAR_ALL:
19414 SET_NAME (rule, rule_buf[rule_pos]);
19415 break;
19416
19417 case RULE_OP_MANGLE_SWITCH_FIRST:
19418 SET_NAME (rule, rule_buf[rule_pos]);
19419 break;
19420
19421 case RULE_OP_MANGLE_SWITCH_LAST:
19422 SET_NAME (rule, rule_buf[rule_pos]);
19423 break;
19424
19425 case RULE_OP_MANGLE_SWITCH_AT:
19426 SET_NAME (rule, rule_buf[rule_pos]);
19427 SET_P0_CONV (rule, rule_buf[rule_pos]);
19428 SET_P1_CONV (rule, rule_buf[rule_pos]);
19429 break;
19430
19431 case RULE_OP_MANGLE_CHR_SHIFTL:
19432 SET_NAME (rule, rule_buf[rule_pos]);
19433 SET_P0_CONV (rule, rule_buf[rule_pos]);
19434 break;
19435
19436 case RULE_OP_MANGLE_CHR_SHIFTR:
19437 SET_NAME (rule, rule_buf[rule_pos]);
19438 SET_P0_CONV (rule, rule_buf[rule_pos]);
19439 break;
19440
19441 case RULE_OP_MANGLE_CHR_INCR:
19442 SET_NAME (rule, rule_buf[rule_pos]);
19443 SET_P0_CONV (rule, rule_buf[rule_pos]);
19444 break;
19445
19446 case RULE_OP_MANGLE_CHR_DECR:
19447 SET_NAME (rule, rule_buf[rule_pos]);
19448 SET_P0_CONV (rule, rule_buf[rule_pos]);
19449 break;
19450
19451 case RULE_OP_MANGLE_REPLACE_NP1:
19452 SET_NAME (rule, rule_buf[rule_pos]);
19453 SET_P0_CONV (rule, rule_buf[rule_pos]);
19454 break;
19455
19456 case RULE_OP_MANGLE_REPLACE_NM1:
19457 SET_NAME (rule, rule_buf[rule_pos]);
19458 SET_P0_CONV (rule, rule_buf[rule_pos]);
19459 break;
19460
19461 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19462 SET_NAME (rule, rule_buf[rule_pos]);
19463 SET_P0_CONV (rule, rule_buf[rule_pos]);
19464 break;
19465
19466 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19467 SET_NAME (rule, rule_buf[rule_pos]);
19468 SET_P0_CONV (rule, rule_buf[rule_pos]);
19469 break;
19470
19471 case RULE_OP_MANGLE_TITLE:
19472 SET_NAME (rule, rule_buf[rule_pos]);
19473 break;
19474
19475 default:
19476 return (-1);
19477 break;
19478 }
19479 }
19480
19481 if (rule_pos < rule_len) return (-1);
19482
19483 return (0);
19484 }
19485
19486 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19487 {
19488 uint rule_cnt;
19489 uint rule_pos;
19490 uint rule_len = BUFSIZ - 1; // maximum possible len
19491
19492 char rule_cmd;
19493
19494 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19495 {
19496 GET_NAME (rule);
19497
19498 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19499
19500 switch (rule_cmd)
19501 {
19502 case RULE_OP_MANGLE_NOOP:
19503 rule_buf[rule_pos] = rule_cmd;
19504 break;
19505
19506 case RULE_OP_MANGLE_LREST:
19507 rule_buf[rule_pos] = rule_cmd;
19508 break;
19509
19510 case RULE_OP_MANGLE_UREST:
19511 rule_buf[rule_pos] = rule_cmd;
19512 break;
19513
19514 case RULE_OP_MANGLE_LREST_UFIRST:
19515 rule_buf[rule_pos] = rule_cmd;
19516 break;
19517
19518 case RULE_OP_MANGLE_UREST_LFIRST:
19519 rule_buf[rule_pos] = rule_cmd;
19520 break;
19521
19522 case RULE_OP_MANGLE_TREST:
19523 rule_buf[rule_pos] = rule_cmd;
19524 break;
19525
19526 case RULE_OP_MANGLE_TOGGLE_AT:
19527 rule_buf[rule_pos] = rule_cmd;
19528 GET_P0_CONV (rule);
19529 break;
19530
19531 case RULE_OP_MANGLE_REVERSE:
19532 rule_buf[rule_pos] = rule_cmd;
19533 break;
19534
19535 case RULE_OP_MANGLE_DUPEWORD:
19536 rule_buf[rule_pos] = rule_cmd;
19537 break;
19538
19539 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19540 rule_buf[rule_pos] = rule_cmd;
19541 GET_P0_CONV (rule);
19542 break;
19543
19544 case RULE_OP_MANGLE_REFLECT:
19545 rule_buf[rule_pos] = rule_cmd;
19546 break;
19547
19548 case RULE_OP_MANGLE_ROTATE_LEFT:
19549 rule_buf[rule_pos] = rule_cmd;
19550 break;
19551
19552 case RULE_OP_MANGLE_ROTATE_RIGHT:
19553 rule_buf[rule_pos] = rule_cmd;
19554 break;
19555
19556 case RULE_OP_MANGLE_APPEND:
19557 rule_buf[rule_pos] = rule_cmd;
19558 GET_P0 (rule);
19559 break;
19560
19561 case RULE_OP_MANGLE_PREPEND:
19562 rule_buf[rule_pos] = rule_cmd;
19563 GET_P0 (rule);
19564 break;
19565
19566 case RULE_OP_MANGLE_DELETE_FIRST:
19567 rule_buf[rule_pos] = rule_cmd;
19568 break;
19569
19570 case RULE_OP_MANGLE_DELETE_LAST:
19571 rule_buf[rule_pos] = rule_cmd;
19572 break;
19573
19574 case RULE_OP_MANGLE_DELETE_AT:
19575 rule_buf[rule_pos] = rule_cmd;
19576 GET_P0_CONV (rule);
19577 break;
19578
19579 case RULE_OP_MANGLE_EXTRACT:
19580 rule_buf[rule_pos] = rule_cmd;
19581 GET_P0_CONV (rule);
19582 GET_P1_CONV (rule);
19583 break;
19584
19585 case RULE_OP_MANGLE_OMIT:
19586 rule_buf[rule_pos] = rule_cmd;
19587 GET_P0_CONV (rule);
19588 GET_P1_CONV (rule);
19589 break;
19590
19591 case RULE_OP_MANGLE_INSERT:
19592 rule_buf[rule_pos] = rule_cmd;
19593 GET_P0_CONV (rule);
19594 GET_P1 (rule);
19595 break;
19596
19597 case RULE_OP_MANGLE_OVERSTRIKE:
19598 rule_buf[rule_pos] = rule_cmd;
19599 GET_P0_CONV (rule);
19600 GET_P1 (rule);
19601 break;
19602
19603 case RULE_OP_MANGLE_TRUNCATE_AT:
19604 rule_buf[rule_pos] = rule_cmd;
19605 GET_P0_CONV (rule);
19606 break;
19607
19608 case RULE_OP_MANGLE_REPLACE:
19609 rule_buf[rule_pos] = rule_cmd;
19610 GET_P0 (rule);
19611 GET_P1 (rule);
19612 break;
19613
19614 case RULE_OP_MANGLE_PURGECHAR:
19615 return (-1);
19616 break;
19617
19618 case RULE_OP_MANGLE_TOGGLECASE_REC:
19619 return (-1);
19620 break;
19621
19622 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19623 rule_buf[rule_pos] = rule_cmd;
19624 GET_P0_CONV (rule);
19625 break;
19626
19627 case RULE_OP_MANGLE_DUPECHAR_LAST:
19628 rule_buf[rule_pos] = rule_cmd;
19629 GET_P0_CONV (rule);
19630 break;
19631
19632 case RULE_OP_MANGLE_DUPECHAR_ALL:
19633 rule_buf[rule_pos] = rule_cmd;
19634 break;
19635
19636 case RULE_OP_MANGLE_SWITCH_FIRST:
19637 rule_buf[rule_pos] = rule_cmd;
19638 break;
19639
19640 case RULE_OP_MANGLE_SWITCH_LAST:
19641 rule_buf[rule_pos] = rule_cmd;
19642 break;
19643
19644 case RULE_OP_MANGLE_SWITCH_AT:
19645 rule_buf[rule_pos] = rule_cmd;
19646 GET_P0_CONV (rule);
19647 GET_P1_CONV (rule);
19648 break;
19649
19650 case RULE_OP_MANGLE_CHR_SHIFTL:
19651 rule_buf[rule_pos] = rule_cmd;
19652 GET_P0_CONV (rule);
19653 break;
19654
19655 case RULE_OP_MANGLE_CHR_SHIFTR:
19656 rule_buf[rule_pos] = rule_cmd;
19657 GET_P0_CONV (rule);
19658 break;
19659
19660 case RULE_OP_MANGLE_CHR_INCR:
19661 rule_buf[rule_pos] = rule_cmd;
19662 GET_P0_CONV (rule);
19663 break;
19664
19665 case RULE_OP_MANGLE_CHR_DECR:
19666 rule_buf[rule_pos] = rule_cmd;
19667 GET_P0_CONV (rule);
19668 break;
19669
19670 case RULE_OP_MANGLE_REPLACE_NP1:
19671 rule_buf[rule_pos] = rule_cmd;
19672 GET_P0_CONV (rule);
19673 break;
19674
19675 case RULE_OP_MANGLE_REPLACE_NM1:
19676 rule_buf[rule_pos] = rule_cmd;
19677 GET_P0_CONV (rule);
19678 break;
19679
19680 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19681 rule_buf[rule_pos] = rule_cmd;
19682 GET_P0_CONV (rule);
19683 break;
19684
19685 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19686 rule_buf[rule_pos] = rule_cmd;
19687 GET_P0_CONV (rule);
19688 break;
19689
19690 case RULE_OP_MANGLE_TITLE:
19691 rule_buf[rule_pos] = rule_cmd;
19692 break;
19693
19694 case 0:
19695 return rule_pos - 1;
19696 break;
19697
19698 default:
19699 return (-1);
19700 break;
19701 }
19702 }
19703
19704 if (rule_cnt > 0)
19705 {
19706 return rule_pos;
19707 }
19708
19709 return (-1);
19710 }
19711
19712 /**
19713 * CPU rules : this is from hashcat sources, cpu based rules
19714 */
19715
19716 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19717 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19718
19719 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19720 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19721 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19722
19723 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19724 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19725 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19726
19727 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19728 {
19729 int pos;
19730
19731 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19732
19733 return (arr_len);
19734 }
19735
19736 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19737 {
19738 int pos;
19739
19740 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19741
19742 return (arr_len);
19743 }
19744
19745 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19746 {
19747 int pos;
19748
19749 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19750
19751 return (arr_len);
19752 }
19753
19754 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19755 {
19756 int l;
19757 int r;
19758
19759 for (l = 0; l < arr_len; l++)
19760 {
19761 r = arr_len - 1 - l;
19762
19763 if (l >= r) break;
19764
19765 MANGLE_SWITCH (arr, l, r);
19766 }
19767
19768 return (arr_len);
19769 }
19770
19771 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19772 {
19773 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19774
19775 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19776
19777 return (arr_len * 2);
19778 }
19779
19780 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19781 {
19782 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19783
19784 int orig_len = arr_len;
19785
19786 int i;
19787
19788 for (i = 0; i < times; i++)
19789 {
19790 memcpy (&arr[arr_len], arr, orig_len);
19791
19792 arr_len += orig_len;
19793 }
19794
19795 return (arr_len);
19796 }
19797
19798 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19799 {
19800 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19801
19802 mangle_double (arr, arr_len);
19803
19804 mangle_reverse (arr + arr_len, arr_len);
19805
19806 return (arr_len * 2);
19807 }
19808
19809 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19810 {
19811 int l;
19812 int r;
19813
19814 for (l = 0, r = arr_len - 1; r > 0; r--)
19815 {
19816 MANGLE_SWITCH (arr, l, r);
19817 }
19818
19819 return (arr_len);
19820 }
19821
19822 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19823 {
19824 int l;
19825 int r;
19826
19827 for (l = 0, r = arr_len - 1; l < r; l++)
19828 {
19829 MANGLE_SWITCH (arr, l, r);
19830 }
19831
19832 return (arr_len);
19833 }
19834
19835 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19836 {
19837 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19838
19839 arr[arr_len] = c;
19840
19841 return (arr_len + 1);
19842 }
19843
19844 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19845 {
19846 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19847
19848 int arr_pos;
19849
19850 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19851 {
19852 arr[arr_pos + 1] = arr[arr_pos];
19853 }
19854
19855 arr[0] = c;
19856
19857 return (arr_len + 1);
19858 }
19859
19860 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19861 {
19862 if (upos >= arr_len) return (arr_len);
19863
19864 int arr_pos;
19865
19866 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19867 {
19868 arr[arr_pos] = arr[arr_pos + 1];
19869 }
19870
19871 return (arr_len - 1);
19872 }
19873
19874 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19875 {
19876 if (upos >= arr_len) return (arr_len);
19877
19878 if ((upos + ulen) > arr_len) return (arr_len);
19879
19880 int arr_pos;
19881
19882 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19883 {
19884 arr[arr_pos] = arr[upos + arr_pos];
19885 }
19886
19887 return (ulen);
19888 }
19889
19890 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19891 {
19892 if (upos >= arr_len) return (arr_len);
19893
19894 if ((upos + ulen) >= arr_len) return (arr_len);
19895
19896 int arr_pos;
19897
19898 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19899 {
19900 arr[arr_pos] = arr[arr_pos + ulen];
19901 }
19902
19903 return (arr_len - ulen);
19904 }
19905
19906 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19907 {
19908 if (upos >= arr_len) return (arr_len);
19909
19910 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19911
19912 int arr_pos;
19913
19914 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19915 {
19916 arr[arr_pos + 1] = arr[arr_pos];
19917 }
19918
19919 arr[upos] = c;
19920
19921 return (arr_len + 1);
19922 }
19923
19924 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)
19925 {
19926 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19927
19928 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19929
19930 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19931
19932 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19933
19934 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19935
19936 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19937
19938 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19939
19940 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19941
19942 return (arr_len + arr2_cpy);
19943 }
19944
19945 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19946 {
19947 if (upos >= arr_len) return (arr_len);
19948
19949 arr[upos] = c;
19950
19951 return (arr_len);
19952 }
19953
19954 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19955 {
19956 if (upos >= arr_len) return (arr_len);
19957
19958 memset (arr + upos, 0, arr_len - upos);
19959
19960 return (upos);
19961 }
19962
19963 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19964 {
19965 int arr_pos;
19966
19967 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19968 {
19969 if (arr[arr_pos] != oldc) continue;
19970
19971 arr[arr_pos] = newc;
19972 }
19973
19974 return (arr_len);
19975 }
19976
19977 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19978 {
19979 int arr_pos;
19980
19981 int ret_len;
19982
19983 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19984 {
19985 if (arr[arr_pos] == c) continue;
19986
19987 arr[ret_len] = arr[arr_pos];
19988
19989 ret_len++;
19990 }
19991
19992 return (ret_len);
19993 }
19994
19995 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19996 {
19997 if (ulen > arr_len) return (arr_len);
19998
19999 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20000
20001 char cs[100] = { 0 };
20002
20003 memcpy (cs, arr, ulen);
20004
20005 int i;
20006
20007 for (i = 0; i < ulen; i++)
20008 {
20009 char c = cs[i];
20010
20011 arr_len = mangle_insert (arr, arr_len, i, c);
20012 }
20013
20014 return (arr_len);
20015 }
20016
20017 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20018 {
20019 if (ulen > arr_len) return (arr_len);
20020
20021 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20022
20023 int upos = arr_len - ulen;
20024
20025 int i;
20026
20027 for (i = 0; i < ulen; i++)
20028 {
20029 char c = arr[upos + i];
20030
20031 arr_len = mangle_append (arr, arr_len, c);
20032 }
20033
20034 return (arr_len);
20035 }
20036
20037 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20038 {
20039 if ( arr_len == 0) return (arr_len);
20040 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20041
20042 char c = arr[upos];
20043
20044 int i;
20045
20046 for (i = 0; i < ulen; i++)
20047 {
20048 arr_len = mangle_insert (arr, arr_len, upos, c);
20049 }
20050
20051 return (arr_len);
20052 }
20053
20054 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20055 {
20056 if ( arr_len == 0) return (arr_len);
20057 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20058
20059 int arr_pos;
20060
20061 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20062 {
20063 int new_pos = arr_pos * 2;
20064
20065 arr[new_pos] = arr[arr_pos];
20066
20067 arr[new_pos + 1] = arr[arr_pos];
20068 }
20069
20070 return (arr_len * 2);
20071 }
20072
20073 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20074 {
20075 if (upos >= arr_len) return (arr_len);
20076 if (upos2 >= arr_len) return (arr_len);
20077
20078 MANGLE_SWITCH (arr, upos, upos2);
20079
20080 return (arr_len);
20081 }
20082
20083 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20084 {
20085 MANGLE_SWITCH (arr, upos, upos2);
20086
20087 return (arr_len);
20088 }
20089
20090 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20091 {
20092 if (upos >= arr_len) return (arr_len);
20093
20094 arr[upos] <<= 1;
20095
20096 return (arr_len);
20097 }
20098
20099 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20100 {
20101 if (upos >= arr_len) return (arr_len);
20102
20103 arr[upos] >>= 1;
20104
20105 return (arr_len);
20106 }
20107
20108 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20109 {
20110 if (upos >= arr_len) return (arr_len);
20111
20112 arr[upos] += 1;
20113
20114 return (arr_len);
20115 }
20116
20117 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20118 {
20119 if (upos >= arr_len) return (arr_len);
20120
20121 arr[upos] -= 1;
20122
20123 return (arr_len);
20124 }
20125
20126 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20127 {
20128 int upper_next = 1;
20129
20130 int pos;
20131
20132 for (pos = 0; pos < arr_len; pos++)
20133 {
20134 if (arr[pos] == ' ')
20135 {
20136 upper_next = 1;
20137
20138 continue;
20139 }
20140
20141 if (upper_next)
20142 {
20143 upper_next = 0;
20144
20145 MANGLE_UPPER_AT (arr, pos);
20146 }
20147 else
20148 {
20149 MANGLE_LOWER_AT (arr, pos);
20150 }
20151 }
20152
20153 return (arr_len);
20154 }
20155
20156 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20157 {
20158 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20159
20160 u32 j;
20161
20162 u32 rule_pos = 0;
20163
20164 for (j = 0; j < rp_gen_num; j++)
20165 {
20166 u32 r = 0;
20167 u32 p1 = 0;
20168 u32 p2 = 0;
20169 u32 p3 = 0;
20170
20171 switch ((char) get_random_num (0, 9))
20172 {
20173 case 0:
20174 r = get_random_num (0, sizeof (grp_op_nop));
20175 rule_buf[rule_pos++] = grp_op_nop[r];
20176 break;
20177
20178 case 1:
20179 r = get_random_num (0, sizeof (grp_op_pos_p0));
20180 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20181 p1 = get_random_num (0, sizeof (grp_pos));
20182 rule_buf[rule_pos++] = grp_pos[p1];
20183 break;
20184
20185 case 2:
20186 r = get_random_num (0, sizeof (grp_op_pos_p1));
20187 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20188 p1 = get_random_num (1, 6);
20189 rule_buf[rule_pos++] = grp_pos[p1];
20190 break;
20191
20192 case 3:
20193 r = get_random_num (0, sizeof (grp_op_chr));
20194 rule_buf[rule_pos++] = grp_op_chr[r];
20195 p1 = get_random_num (0x20, 0x7e);
20196 rule_buf[rule_pos++] = (char) p1;
20197 break;
20198
20199 case 4:
20200 r = get_random_num (0, sizeof (grp_op_chr_chr));
20201 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20202 p1 = get_random_num (0x20, 0x7e);
20203 rule_buf[rule_pos++] = (char) p1;
20204 p2 = get_random_num (0x20, 0x7e);
20205 while (p1 == p2)
20206 p2 = get_random_num (0x20, 0x7e);
20207 rule_buf[rule_pos++] = (char) p2;
20208 break;
20209
20210 case 5:
20211 r = get_random_num (0, sizeof (grp_op_pos_chr));
20212 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20213 p1 = get_random_num (0, sizeof (grp_pos));
20214 rule_buf[rule_pos++] = grp_pos[p1];
20215 p2 = get_random_num (0x20, 0x7e);
20216 rule_buf[rule_pos++] = (char) p2;
20217 break;
20218
20219 case 6:
20220 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20221 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20222 p1 = get_random_num (0, sizeof (grp_pos));
20223 rule_buf[rule_pos++] = grp_pos[p1];
20224 p2 = get_random_num (0, sizeof (grp_pos));
20225 while (p1 == p2)
20226 p2 = get_random_num (0, sizeof (grp_pos));
20227 rule_buf[rule_pos++] = grp_pos[p2];
20228 break;
20229
20230 case 7:
20231 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20232 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20233 p1 = get_random_num (0, sizeof (grp_pos));
20234 rule_buf[rule_pos++] = grp_pos[p1];
20235 p2 = get_random_num (1, sizeof (grp_pos));
20236 while (p1 == p2)
20237 p2 = get_random_num (1, sizeof (grp_pos));
20238 rule_buf[rule_pos++] = grp_pos[p2];
20239 break;
20240
20241 case 8:
20242 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20243 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20244 p1 = get_random_num (0, sizeof (grp_pos));
20245 rule_buf[rule_pos++] = grp_pos[p1];
20246 p2 = get_random_num (1, sizeof (grp_pos));
20247 rule_buf[rule_pos++] = grp_pos[p1];
20248 p3 = get_random_num (0, sizeof (grp_pos));
20249 rule_buf[rule_pos++] = grp_pos[p3];
20250 break;
20251 }
20252 }
20253
20254 return (rule_pos);
20255 }
20256
20257 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20258 {
20259 char mem[BLOCK_SIZE] = { 0 };
20260
20261 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20262
20263 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20264
20265 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20266
20267 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20268
20269 int out_len = in_len;
20270 int mem_len = in_len;
20271
20272 memcpy (out, in, out_len);
20273
20274 int rule_pos;
20275
20276 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20277 {
20278 int upos, upos2;
20279 int ulen;
20280
20281 switch (rule[rule_pos])
20282 {
20283 case ' ':
20284 break;
20285
20286 case RULE_OP_MANGLE_NOOP:
20287 break;
20288
20289 case RULE_OP_MANGLE_LREST:
20290 out_len = mangle_lrest (out, out_len);
20291 break;
20292
20293 case RULE_OP_MANGLE_UREST:
20294 out_len = mangle_urest (out, out_len);
20295 break;
20296
20297 case RULE_OP_MANGLE_LREST_UFIRST:
20298 out_len = mangle_lrest (out, out_len);
20299 if (out_len) MANGLE_UPPER_AT (out, 0);
20300 break;
20301
20302 case RULE_OP_MANGLE_UREST_LFIRST:
20303 out_len = mangle_urest (out, out_len);
20304 if (out_len) MANGLE_LOWER_AT (out, 0);
20305 break;
20306
20307 case RULE_OP_MANGLE_TREST:
20308 out_len = mangle_trest (out, out_len);
20309 break;
20310
20311 case RULE_OP_MANGLE_TOGGLE_AT:
20312 NEXT_RULEPOS (rule_pos);
20313 NEXT_RPTOI (rule, rule_pos, upos);
20314 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20315 break;
20316
20317 case RULE_OP_MANGLE_REVERSE:
20318 out_len = mangle_reverse (out, out_len);
20319 break;
20320
20321 case RULE_OP_MANGLE_DUPEWORD:
20322 out_len = mangle_double (out, out_len);
20323 break;
20324
20325 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20326 NEXT_RULEPOS (rule_pos);
20327 NEXT_RPTOI (rule, rule_pos, ulen);
20328 out_len = mangle_double_times (out, out_len, ulen);
20329 break;
20330
20331 case RULE_OP_MANGLE_REFLECT:
20332 out_len = mangle_reflect (out, out_len);
20333 break;
20334
20335 case RULE_OP_MANGLE_ROTATE_LEFT:
20336 mangle_rotate_left (out, out_len);
20337 break;
20338
20339 case RULE_OP_MANGLE_ROTATE_RIGHT:
20340 mangle_rotate_right (out, out_len);
20341 break;
20342
20343 case RULE_OP_MANGLE_APPEND:
20344 NEXT_RULEPOS (rule_pos);
20345 out_len = mangle_append (out, out_len, rule[rule_pos]);
20346 break;
20347
20348 case RULE_OP_MANGLE_PREPEND:
20349 NEXT_RULEPOS (rule_pos);
20350 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20351 break;
20352
20353 case RULE_OP_MANGLE_DELETE_FIRST:
20354 out_len = mangle_delete_at (out, out_len, 0);
20355 break;
20356
20357 case RULE_OP_MANGLE_DELETE_LAST:
20358 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20359 break;
20360
20361 case RULE_OP_MANGLE_DELETE_AT:
20362 NEXT_RULEPOS (rule_pos);
20363 NEXT_RPTOI (rule, rule_pos, upos);
20364 out_len = mangle_delete_at (out, out_len, upos);
20365 break;
20366
20367 case RULE_OP_MANGLE_EXTRACT:
20368 NEXT_RULEPOS (rule_pos);
20369 NEXT_RPTOI (rule, rule_pos, upos);
20370 NEXT_RULEPOS (rule_pos);
20371 NEXT_RPTOI (rule, rule_pos, ulen);
20372 out_len = mangle_extract (out, out_len, upos, ulen);
20373 break;
20374
20375 case RULE_OP_MANGLE_OMIT:
20376 NEXT_RULEPOS (rule_pos);
20377 NEXT_RPTOI (rule, rule_pos, upos);
20378 NEXT_RULEPOS (rule_pos);
20379 NEXT_RPTOI (rule, rule_pos, ulen);
20380 out_len = mangle_omit (out, out_len, upos, ulen);
20381 break;
20382
20383 case RULE_OP_MANGLE_INSERT:
20384 NEXT_RULEPOS (rule_pos);
20385 NEXT_RPTOI (rule, rule_pos, upos);
20386 NEXT_RULEPOS (rule_pos);
20387 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20388 break;
20389
20390 case RULE_OP_MANGLE_OVERSTRIKE:
20391 NEXT_RULEPOS (rule_pos);
20392 NEXT_RPTOI (rule, rule_pos, upos);
20393 NEXT_RULEPOS (rule_pos);
20394 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20395 break;
20396
20397 case RULE_OP_MANGLE_TRUNCATE_AT:
20398 NEXT_RULEPOS (rule_pos);
20399 NEXT_RPTOI (rule, rule_pos, upos);
20400 out_len = mangle_truncate_at (out, out_len, upos);
20401 break;
20402
20403 case RULE_OP_MANGLE_REPLACE:
20404 NEXT_RULEPOS (rule_pos);
20405 NEXT_RULEPOS (rule_pos);
20406 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20407 break;
20408
20409 case RULE_OP_MANGLE_PURGECHAR:
20410 NEXT_RULEPOS (rule_pos);
20411 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20412 break;
20413
20414 case RULE_OP_MANGLE_TOGGLECASE_REC:
20415 /* todo */
20416 break;
20417
20418 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20419 NEXT_RULEPOS (rule_pos);
20420 NEXT_RPTOI (rule, rule_pos, ulen);
20421 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20422 break;
20423
20424 case RULE_OP_MANGLE_DUPECHAR_LAST:
20425 NEXT_RULEPOS (rule_pos);
20426 NEXT_RPTOI (rule, rule_pos, ulen);
20427 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20428 break;
20429
20430 case RULE_OP_MANGLE_DUPECHAR_ALL:
20431 out_len = mangle_dupechar (out, out_len);
20432 break;
20433
20434 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20435 NEXT_RULEPOS (rule_pos);
20436 NEXT_RPTOI (rule, rule_pos, ulen);
20437 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20438 break;
20439
20440 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20441 NEXT_RULEPOS (rule_pos);
20442 NEXT_RPTOI (rule, rule_pos, ulen);
20443 out_len = mangle_dupeblock_append (out, out_len, ulen);
20444 break;
20445
20446 case RULE_OP_MANGLE_SWITCH_FIRST:
20447 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20448 break;
20449
20450 case RULE_OP_MANGLE_SWITCH_LAST:
20451 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20452 break;
20453
20454 case RULE_OP_MANGLE_SWITCH_AT:
20455 NEXT_RULEPOS (rule_pos);
20456 NEXT_RPTOI (rule, rule_pos, upos);
20457 NEXT_RULEPOS (rule_pos);
20458 NEXT_RPTOI (rule, rule_pos, upos2);
20459 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20460 break;
20461
20462 case RULE_OP_MANGLE_CHR_SHIFTL:
20463 NEXT_RULEPOS (rule_pos);
20464 NEXT_RPTOI (rule, rule_pos, upos);
20465 mangle_chr_shiftl (out, out_len, upos);
20466 break;
20467
20468 case RULE_OP_MANGLE_CHR_SHIFTR:
20469 NEXT_RULEPOS (rule_pos);
20470 NEXT_RPTOI (rule, rule_pos, upos);
20471 mangle_chr_shiftr (out, out_len, upos);
20472 break;
20473
20474 case RULE_OP_MANGLE_CHR_INCR:
20475 NEXT_RULEPOS (rule_pos);
20476 NEXT_RPTOI (rule, rule_pos, upos);
20477 mangle_chr_incr (out, out_len, upos);
20478 break;
20479
20480 case RULE_OP_MANGLE_CHR_DECR:
20481 NEXT_RULEPOS (rule_pos);
20482 NEXT_RPTOI (rule, rule_pos, upos);
20483 mangle_chr_decr (out, out_len, upos);
20484 break;
20485
20486 case RULE_OP_MANGLE_REPLACE_NP1:
20487 NEXT_RULEPOS (rule_pos);
20488 NEXT_RPTOI (rule, rule_pos, upos);
20489 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20490 break;
20491
20492 case RULE_OP_MANGLE_REPLACE_NM1:
20493 NEXT_RULEPOS (rule_pos);
20494 NEXT_RPTOI (rule, rule_pos, upos);
20495 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20496 break;
20497
20498 case RULE_OP_MANGLE_TITLE:
20499 out_len = mangle_title (out, out_len);
20500 break;
20501
20502 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20503 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20504 NEXT_RULEPOS (rule_pos);
20505 NEXT_RPTOI (rule, rule_pos, upos);
20506 NEXT_RULEPOS (rule_pos);
20507 NEXT_RPTOI (rule, rule_pos, ulen);
20508 NEXT_RULEPOS (rule_pos);
20509 NEXT_RPTOI (rule, rule_pos, upos2);
20510 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20511 break;
20512
20513 case RULE_OP_MANGLE_APPEND_MEMORY:
20514 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20515 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20516 memcpy (out + out_len, mem, mem_len);
20517 out_len += mem_len;
20518 break;
20519
20520 case RULE_OP_MANGLE_PREPEND_MEMORY:
20521 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20522 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20523 memcpy (mem + mem_len, out, out_len);
20524 out_len += mem_len;
20525 memcpy (out, mem, out_len);
20526 break;
20527
20528 case RULE_OP_MEMORIZE_WORD:
20529 memcpy (mem, out, out_len);
20530 mem_len = out_len;
20531 break;
20532
20533 case RULE_OP_REJECT_LESS:
20534 NEXT_RULEPOS (rule_pos);
20535 NEXT_RPTOI (rule, rule_pos, upos);
20536 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20537 break;
20538
20539 case RULE_OP_REJECT_GREATER:
20540 NEXT_RULEPOS (rule_pos);
20541 NEXT_RPTOI (rule, rule_pos, upos);
20542 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20543 break;
20544
20545 case RULE_OP_REJECT_CONTAIN:
20546 NEXT_RULEPOS (rule_pos);
20547 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20548 break;
20549
20550 case RULE_OP_REJECT_NOT_CONTAIN:
20551 NEXT_RULEPOS (rule_pos);
20552 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20553 break;
20554
20555 case RULE_OP_REJECT_EQUAL_FIRST:
20556 NEXT_RULEPOS (rule_pos);
20557 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20558 break;
20559
20560 case RULE_OP_REJECT_EQUAL_LAST:
20561 NEXT_RULEPOS (rule_pos);
20562 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20563 break;
20564
20565 case RULE_OP_REJECT_EQUAL_AT:
20566 NEXT_RULEPOS (rule_pos);
20567 NEXT_RPTOI (rule, rule_pos, upos);
20568 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20569 NEXT_RULEPOS (rule_pos);
20570 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20571 break;
20572
20573 case RULE_OP_REJECT_CONTAINS:
20574 NEXT_RULEPOS (rule_pos);
20575 NEXT_RPTOI (rule, rule_pos, upos);
20576 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20577 NEXT_RULEPOS (rule_pos);
20578 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20579 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20580 break;
20581
20582 case RULE_OP_REJECT_MEMORY:
20583 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20584 break;
20585
20586 default:
20587 return (RULE_RC_SYNTAX_ERROR);
20588 break;
20589 }
20590 }
20591
20592 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20593
20594 return (out_len);
20595 }