Add missing pthread_setaffinity_np for osx
[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 #define GET_LOOPS_OSX(x) KERNEL_LOOPS_OSX_ ## x
23 #define GET_ACCEL_OSX(x) KERNEL_ACCEL_OSX_ ## x
24
25 /**
26 * basic bit handling
27 */
28
29 u32 rotl32 (const u32 a, const u32 n)
30 {
31 return ((a << n) | (a >> (32 - n)));
32 }
33
34 u32 rotr32 (const u32 a, const u32 n)
35 {
36 return ((a >> n) | (a << (32 - n)));
37 }
38
39 u64 rotl64 (const u64 a, const u64 n)
40 {
41 return ((a << n) | (a >> (64 - n)));
42 }
43
44 u64 rotr64 (const u64 a, const u64 n)
45 {
46 return ((a >> n) | (a << (64 - n)));
47 }
48
49 u32 byte_swap_32 (const u32 n)
50 {
51 return (n & 0xff000000) >> 24
52 | (n & 0x00ff0000) >> 8
53 | (n & 0x0000ff00) << 8
54 | (n & 0x000000ff) << 24;
55 }
56
57 u64 byte_swap_64 (const u64 n)
58 {
59 return (n & 0xff00000000000000ULL) >> 56
60 | (n & 0x00ff000000000000ULL) >> 40
61 | (n & 0x0000ff0000000000ULL) >> 24
62 | (n & 0x000000ff00000000ULL) >> 8
63 | (n & 0x00000000ff000000ULL) << 8
64 | (n & 0x0000000000ff0000ULL) << 24
65 | (n & 0x000000000000ff00ULL) << 40
66 | (n & 0x00000000000000ffULL) << 56;
67 }
68
69 /**
70 * ciphers for use on cpu
71 */
72
73 #include "cpu-des.c"
74 #include "cpu-aes.c"
75
76 /**
77 * hashes for use on cpu
78 */
79
80 #include "cpu-md5.c"
81 #include "cpu-sha256.c"
82
83 /**
84 * logging
85 */
86
87 int last_len = 0;
88
89 void log_final (FILE *fp, const char *fmt, va_list ap)
90 {
91 if (last_len)
92 {
93 fputc ('\r', fp);
94
95 for (int i = 0; i < last_len; i++)
96 {
97 fputc (' ', fp);
98 }
99
100 fputc ('\r', fp);
101 }
102
103 char s[4096] = { 0 };
104
105 int max_len = (int) sizeof (s);
106
107 int len = vsnprintf (s, max_len, fmt, ap);
108
109 if (len > max_len) len = max_len;
110
111 fwrite (s, len, 1, fp);
112
113 fflush (fp);
114
115 last_len = len;
116 }
117
118 void log_out_nn (FILE *fp, const char *fmt, ...)
119 {
120 if (SUPPRESS_OUTPUT) return;
121
122 va_list ap;
123
124 va_start (ap, fmt);
125
126 log_final (fp, fmt, ap);
127
128 va_end (ap);
129 }
130
131 void log_info_nn (const char *fmt, ...)
132 {
133 if (SUPPRESS_OUTPUT) return;
134
135 va_list ap;
136
137 va_start (ap, fmt);
138
139 log_final (stdout, fmt, ap);
140
141 va_end (ap);
142 }
143
144 void log_error_nn (const char *fmt, ...)
145 {
146 if (SUPPRESS_OUTPUT) return;
147
148 va_list ap;
149
150 va_start (ap, fmt);
151
152 log_final (stderr, fmt, ap);
153
154 va_end (ap);
155 }
156
157 void log_out (FILE *fp, const char *fmt, ...)
158 {
159 if (SUPPRESS_OUTPUT) return;
160
161 va_list ap;
162
163 va_start (ap, fmt);
164
165 log_final (fp, fmt, ap);
166
167 va_end (ap);
168
169 fputc ('\n', fp);
170
171 last_len = 0;
172 }
173
174 void log_info (const char *fmt, ...)
175 {
176 if (SUPPRESS_OUTPUT) return;
177
178 va_list ap;
179
180 va_start (ap, fmt);
181
182 log_final (stdout, fmt, ap);
183
184 va_end (ap);
185
186 fputc ('\n', stdout);
187
188 last_len = 0;
189 }
190
191 void log_error (const char *fmt, ...)
192 {
193 if (SUPPRESS_OUTPUT) return;
194
195 fputc ('\n', stderr);
196 fputc ('\n', stderr);
197
198 va_list ap;
199
200 va_start (ap, fmt);
201
202 log_final (stderr, fmt, ap);
203
204 va_end (ap);
205
206 fputc ('\n', stderr);
207 fputc ('\n', stderr);
208
209 last_len = 0;
210 }
211
212 /**
213 * converter
214 */
215
216 u8 int_to_base32 (const u8 c)
217 {
218 static const u8 tbl[0x20] =
219 {
220 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
221 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
222 };
223
224 return tbl[c];
225 }
226
227 u8 base32_to_int (const u8 c)
228 {
229 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
230 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
231
232 return 0;
233 }
234
235 u8 int_to_itoa32 (const u8 c)
236 {
237 static const u8 tbl[0x20] =
238 {
239 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
240 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
241 };
242
243 return tbl[c];
244 }
245
246 u8 itoa32_to_int (const u8 c)
247 {
248 if ((c >= '0') && (c <= '9')) return c - '0';
249 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
250
251 return 0;
252 }
253
254 u8 int_to_itoa64 (const u8 c)
255 {
256 static const u8 tbl[0x40] =
257 {
258 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
259 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
260 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
261 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
262 };
263
264 return tbl[c];
265 }
266
267 u8 itoa64_to_int (const u8 c)
268 {
269 static const u8 tbl[0x100] =
270 {
271 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
272 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
273 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
274 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
275 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
276 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
277 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
278 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
279 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
280 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
281 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
282 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
283 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
284 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
285 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
286 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
287 };
288
289 return tbl[c];
290 }
291
292 u8 int_to_base64 (const u8 c)
293 {
294 static const u8 tbl[0x40] =
295 {
296 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
297 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
298 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
299 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
300 };
301
302 return tbl[c];
303 }
304
305 u8 base64_to_int (const u8 c)
306 {
307 static const u8 tbl[0x100] =
308 {
309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
312 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
314 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
316 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
325 };
326
327 return tbl[c];
328 }
329
330 u8 int_to_bf64 (const u8 c)
331 {
332 static const u8 tbl[0x40] =
333 {
334 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
335 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
336 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
337 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
338 };
339
340 return tbl[c];
341 }
342
343 u8 bf64_to_int (const u8 c)
344 {
345 static const u8 tbl[0x100] =
346 {
347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
350 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
352 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
354 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 };
364
365 return tbl[c];
366 }
367
368 u8 int_to_lotus64 (const u8 c)
369 {
370 if (c < 10) return '0' + c;
371 else if (c < 36) return 'A' + c - 10;
372 else if (c < 62) return 'a' + c - 36;
373 else if (c == 62) return '+';
374 else if (c == 63) return '/';
375
376 return 0;
377 }
378
379 u8 lotus64_to_int (const u8 c)
380 {
381 if ((c >= '0') && (c <= '9')) return c - '0';
382 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
383 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
384 else if (c == '+') return 62;
385 else if (c == '/') return 63;
386 else
387
388 return 0;
389 }
390
391 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
392 {
393 const u8 *in_ptr = in_buf;
394
395 u8 *out_ptr = out_buf;
396
397 for (int i = 0; i < in_len; i += 8)
398 {
399 const u8 out_val0 = f (in_ptr[0] & 0x7f);
400 const u8 out_val1 = f (in_ptr[1] & 0x7f);
401 const u8 out_val2 = f (in_ptr[2] & 0x7f);
402 const u8 out_val3 = f (in_ptr[3] & 0x7f);
403 const u8 out_val4 = f (in_ptr[4] & 0x7f);
404 const u8 out_val5 = f (in_ptr[5] & 0x7f);
405 const u8 out_val6 = f (in_ptr[6] & 0x7f);
406 const u8 out_val7 = f (in_ptr[7] & 0x7f);
407
408 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
409 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
410 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
411 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
412 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
413
414 in_ptr += 8;
415 out_ptr += 5;
416 }
417
418 for (int i = 0; i < in_len; i++)
419 {
420 if (in_buf[i] != '=') continue;
421
422 in_len = i;
423 }
424
425 int out_len = (in_len * 5) / 8;
426
427 return out_len;
428 }
429
430 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
431 {
432 const u8 *in_ptr = in_buf;
433
434 u8 *out_ptr = out_buf;
435
436 for (int i = 0; i < in_len; i += 5)
437 {
438 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
439 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
440 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
441 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
442 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
443 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
444 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
445 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
446
447 out_ptr[0] = out_val0 & 0x7f;
448 out_ptr[1] = out_val1 & 0x7f;
449 out_ptr[2] = out_val2 & 0x7f;
450 out_ptr[3] = out_val3 & 0x7f;
451 out_ptr[4] = out_val4 & 0x7f;
452 out_ptr[5] = out_val5 & 0x7f;
453 out_ptr[6] = out_val6 & 0x7f;
454 out_ptr[7] = out_val7 & 0x7f;
455
456 in_ptr += 5;
457 out_ptr += 8;
458 }
459
460 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
461
462 while (out_len % 8)
463 {
464 out_buf[out_len] = '=';
465
466 out_len++;
467 }
468
469 return out_len;
470 }
471
472 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
473 {
474 const u8 *in_ptr = in_buf;
475
476 u8 *out_ptr = out_buf;
477
478 for (int i = 0; i < in_len; i += 4)
479 {
480 const u8 out_val0 = f (in_ptr[0] & 0x7f);
481 const u8 out_val1 = f (in_ptr[1] & 0x7f);
482 const u8 out_val2 = f (in_ptr[2] & 0x7f);
483 const u8 out_val3 = f (in_ptr[3] & 0x7f);
484
485 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
486 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
487 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
488
489 in_ptr += 4;
490 out_ptr += 3;
491 }
492
493 for (int i = 0; i < in_len; i++)
494 {
495 if (in_buf[i] != '=') continue;
496
497 in_len = i;
498 }
499
500 int out_len = (in_len * 6) / 8;
501
502 return out_len;
503 }
504
505 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
506 {
507 const u8 *in_ptr = in_buf;
508
509 u8 *out_ptr = out_buf;
510
511 for (int i = 0; i < in_len; i += 3)
512 {
513 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
514 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
515 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
516 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
517
518 out_ptr[0] = out_val0 & 0x7f;
519 out_ptr[1] = out_val1 & 0x7f;
520 out_ptr[2] = out_val2 & 0x7f;
521 out_ptr[3] = out_val3 & 0x7f;
522
523 in_ptr += 3;
524 out_ptr += 4;
525 }
526
527 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
528
529 while (out_len % 4)
530 {
531 out_buf[out_len] = '=';
532
533 out_len++;
534 }
535
536 return out_len;
537 }
538
539 int is_valid_hex_char (const u8 c)
540 {
541 if ((c >= '0') && (c <= '9')) return 1;
542 if ((c >= 'A') && (c <= 'F')) return 1;
543 if ((c >= 'a') && (c <= 'f')) return 1;
544
545 return 0;
546 }
547
548 u8 hex_convert (const u8 c)
549 {
550 return (c & 15) + (c >> 6) * 9;
551 }
552
553 u8 hex_to_u8 (const u8 hex[2])
554 {
555 u8 v = 0;
556
557 v |= (hex_convert (hex[1]) << 0);
558 v |= (hex_convert (hex[0]) << 4);
559
560 return (v);
561 }
562
563 u32 hex_to_u32 (const u8 hex[8])
564 {
565 u32 v = 0;
566
567 v |= ((u32) hex_convert (hex[7])) << 0;
568 v |= ((u32) hex_convert (hex[6])) << 4;
569 v |= ((u32) hex_convert (hex[5])) << 8;
570 v |= ((u32) hex_convert (hex[4])) << 12;
571 v |= ((u32) hex_convert (hex[3])) << 16;
572 v |= ((u32) hex_convert (hex[2])) << 20;
573 v |= ((u32) hex_convert (hex[1])) << 24;
574 v |= ((u32) hex_convert (hex[0])) << 28;
575
576 return (v);
577 }
578
579 u64 hex_to_u64 (const u8 hex[16])
580 {
581 u64 v = 0;
582
583 v |= ((u64) hex_convert (hex[15]) << 0);
584 v |= ((u64) hex_convert (hex[14]) << 4);
585 v |= ((u64) hex_convert (hex[13]) << 8);
586 v |= ((u64) hex_convert (hex[12]) << 12);
587 v |= ((u64) hex_convert (hex[11]) << 16);
588 v |= ((u64) hex_convert (hex[10]) << 20);
589 v |= ((u64) hex_convert (hex[ 9]) << 24);
590 v |= ((u64) hex_convert (hex[ 8]) << 28);
591 v |= ((u64) hex_convert (hex[ 7]) << 32);
592 v |= ((u64) hex_convert (hex[ 6]) << 36);
593 v |= ((u64) hex_convert (hex[ 5]) << 40);
594 v |= ((u64) hex_convert (hex[ 4]) << 44);
595 v |= ((u64) hex_convert (hex[ 3]) << 48);
596 v |= ((u64) hex_convert (hex[ 2]) << 52);
597 v |= ((u64) hex_convert (hex[ 1]) << 56);
598 v |= ((u64) hex_convert (hex[ 0]) << 60);
599
600 return (v);
601 }
602
603 void bin_to_hex_lower (const u32 v, u8 hex[8])
604 {
605 hex[0] = v >> 28 & 15;
606 hex[1] = v >> 24 & 15;
607 hex[2] = v >> 20 & 15;
608 hex[3] = v >> 16 & 15;
609 hex[4] = v >> 12 & 15;
610 hex[5] = v >> 8 & 15;
611 hex[6] = v >> 4 & 15;
612 hex[7] = v >> 0 & 15;
613
614 u32 add;
615
616 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
617 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
618 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
619 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
620 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
621 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
622 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
623 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
624 }
625
626 /**
627 * decoder
628 */
629
630 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
631 {
632 AES_KEY skey;
633
634 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
635
636 u32 _iv[4] = { 0 };
637
638 _iv[0] = iv[0];
639 _iv[1] = iv[1];
640 _iv[2] = iv[2];
641 _iv[3] = iv[3];
642
643 for (int i = 0; i < 16; i += 4)
644 {
645 u32 _in[4] = { 0 };
646 u32 _out[4] = { 0 };
647
648 _in[0] = in[i + 0];
649 _in[1] = in[i + 1];
650 _in[2] = in[i + 2];
651 _in[3] = in[i + 3];
652
653 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
654
655 _out[0] ^= _iv[0];
656 _out[1] ^= _iv[1];
657 _out[2] ^= _iv[2];
658 _out[3] ^= _iv[3];
659
660 out[i + 0] = _out[0];
661 out[i + 1] = _out[1];
662 out[i + 2] = _out[2];
663 out[i + 3] = _out[3];
664
665 _iv[0] = _in[0];
666 _iv[1] = _in[1];
667 _iv[2] = _in[2];
668 _iv[3] = _in[3];
669 }
670 }
671
672 static void juniper_decrypt_hash (char *in, char *out)
673 {
674 // base64 decode
675
676 u8 base64_buf[100] = { 0 };
677
678 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
679
680 // iv stuff
681
682 u32 juniper_iv[4] = { 0 };
683
684 memcpy (juniper_iv, base64_buf, 12);
685
686 memcpy (out, juniper_iv, 12);
687
688 // reversed key
689
690 u32 juniper_key[4] = { 0 };
691
692 juniper_key[0] = byte_swap_32 (0xa6707a7e);
693 juniper_key[1] = byte_swap_32 (0x8df91059);
694 juniper_key[2] = byte_swap_32 (0xdea70ae5);
695 juniper_key[3] = byte_swap_32 (0x2f9c2442);
696
697 // AES decrypt
698
699 u32 *in_ptr = (u32 *) (base64_buf + 12);
700 u32 *out_ptr = (u32 *) (out + 12);
701
702 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
703 }
704
705 void phpass_decode (u8 digest[16], u8 buf[22])
706 {
707 int l;
708
709 l = itoa64_to_int (buf[ 0]) << 0;
710 l |= itoa64_to_int (buf[ 1]) << 6;
711 l |= itoa64_to_int (buf[ 2]) << 12;
712 l |= itoa64_to_int (buf[ 3]) << 18;
713
714 digest[ 0] = (l >> 0) & 0xff;
715 digest[ 1] = (l >> 8) & 0xff;
716 digest[ 2] = (l >> 16) & 0xff;
717
718 l = itoa64_to_int (buf[ 4]) << 0;
719 l |= itoa64_to_int (buf[ 5]) << 6;
720 l |= itoa64_to_int (buf[ 6]) << 12;
721 l |= itoa64_to_int (buf[ 7]) << 18;
722
723 digest[ 3] = (l >> 0) & 0xff;
724 digest[ 4] = (l >> 8) & 0xff;
725 digest[ 5] = (l >> 16) & 0xff;
726
727 l = itoa64_to_int (buf[ 8]) << 0;
728 l |= itoa64_to_int (buf[ 9]) << 6;
729 l |= itoa64_to_int (buf[10]) << 12;
730 l |= itoa64_to_int (buf[11]) << 18;
731
732 digest[ 6] = (l >> 0) & 0xff;
733 digest[ 7] = (l >> 8) & 0xff;
734 digest[ 8] = (l >> 16) & 0xff;
735
736 l = itoa64_to_int (buf[12]) << 0;
737 l |= itoa64_to_int (buf[13]) << 6;
738 l |= itoa64_to_int (buf[14]) << 12;
739 l |= itoa64_to_int (buf[15]) << 18;
740
741 digest[ 9] = (l >> 0) & 0xff;
742 digest[10] = (l >> 8) & 0xff;
743 digest[11] = (l >> 16) & 0xff;
744
745 l = itoa64_to_int (buf[16]) << 0;
746 l |= itoa64_to_int (buf[17]) << 6;
747 l |= itoa64_to_int (buf[18]) << 12;
748 l |= itoa64_to_int (buf[19]) << 18;
749
750 digest[12] = (l >> 0) & 0xff;
751 digest[13] = (l >> 8) & 0xff;
752 digest[14] = (l >> 16) & 0xff;
753
754 l = itoa64_to_int (buf[20]) << 0;
755 l |= itoa64_to_int (buf[21]) << 6;
756
757 digest[15] = (l >> 0) & 0xff;
758 }
759
760 void phpass_encode (u8 digest[16], u8 buf[22])
761 {
762 int l;
763
764 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
765
766 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
767 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
768 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
769 buf[ 3] = int_to_itoa64 (l & 0x3f);
770
771 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
772
773 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
774 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
775 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
776 buf[ 7] = int_to_itoa64 (l & 0x3f);
777
778 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
779
780 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
781 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
782 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
783 buf[11] = int_to_itoa64 (l & 0x3f);
784
785 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
786
787 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
788 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
789 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
790 buf[15] = int_to_itoa64 (l & 0x3f);
791
792 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
793
794 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
795 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
796 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
797 buf[19] = int_to_itoa64 (l & 0x3f);
798
799 l = (digest[15] << 0);
800
801 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
802 buf[21] = int_to_itoa64 (l & 0x3f);
803 }
804
805 void md5crypt_decode (u8 digest[16], u8 buf[22])
806 {
807 int l;
808
809 l = itoa64_to_int (buf[ 0]) << 0;
810 l |= itoa64_to_int (buf[ 1]) << 6;
811 l |= itoa64_to_int (buf[ 2]) << 12;
812 l |= itoa64_to_int (buf[ 3]) << 18;
813
814 digest[ 0] = (l >> 16) & 0xff;
815 digest[ 6] = (l >> 8) & 0xff;
816 digest[12] = (l >> 0) & 0xff;
817
818 l = itoa64_to_int (buf[ 4]) << 0;
819 l |= itoa64_to_int (buf[ 5]) << 6;
820 l |= itoa64_to_int (buf[ 6]) << 12;
821 l |= itoa64_to_int (buf[ 7]) << 18;
822
823 digest[ 1] = (l >> 16) & 0xff;
824 digest[ 7] = (l >> 8) & 0xff;
825 digest[13] = (l >> 0) & 0xff;
826
827 l = itoa64_to_int (buf[ 8]) << 0;
828 l |= itoa64_to_int (buf[ 9]) << 6;
829 l |= itoa64_to_int (buf[10]) << 12;
830 l |= itoa64_to_int (buf[11]) << 18;
831
832 digest[ 2] = (l >> 16) & 0xff;
833 digest[ 8] = (l >> 8) & 0xff;
834 digest[14] = (l >> 0) & 0xff;
835
836 l = itoa64_to_int (buf[12]) << 0;
837 l |= itoa64_to_int (buf[13]) << 6;
838 l |= itoa64_to_int (buf[14]) << 12;
839 l |= itoa64_to_int (buf[15]) << 18;
840
841 digest[ 3] = (l >> 16) & 0xff;
842 digest[ 9] = (l >> 8) & 0xff;
843 digest[15] = (l >> 0) & 0xff;
844
845 l = itoa64_to_int (buf[16]) << 0;
846 l |= itoa64_to_int (buf[17]) << 6;
847 l |= itoa64_to_int (buf[18]) << 12;
848 l |= itoa64_to_int (buf[19]) << 18;
849
850 digest[ 4] = (l >> 16) & 0xff;
851 digest[10] = (l >> 8) & 0xff;
852 digest[ 5] = (l >> 0) & 0xff;
853
854 l = itoa64_to_int (buf[20]) << 0;
855 l |= itoa64_to_int (buf[21]) << 6;
856
857 digest[11] = (l >> 0) & 0xff;
858 }
859
860 void md5crypt_encode (u8 digest[16], u8 buf[22])
861 {
862 int l;
863
864 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
865
866 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
867 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
868 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
869 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
870
871 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
872
873 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
874 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
875 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
876 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
877
878 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
879
880 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
881 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
882 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
883 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
884
885 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
886
887 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
888 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
889 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
890 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
891
892 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
893
894 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
895 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
896 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
897 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
898
899 l = (digest[11] << 0);
900
901 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
902 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
903 }
904
905 void sha512crypt_decode (u8 digest[64], u8 buf[86])
906 {
907 int l;
908
909 l = itoa64_to_int (buf[ 0]) << 0;
910 l |= itoa64_to_int (buf[ 1]) << 6;
911 l |= itoa64_to_int (buf[ 2]) << 12;
912 l |= itoa64_to_int (buf[ 3]) << 18;
913
914 digest[ 0] = (l >> 16) & 0xff;
915 digest[21] = (l >> 8) & 0xff;
916 digest[42] = (l >> 0) & 0xff;
917
918 l = itoa64_to_int (buf[ 4]) << 0;
919 l |= itoa64_to_int (buf[ 5]) << 6;
920 l |= itoa64_to_int (buf[ 6]) << 12;
921 l |= itoa64_to_int (buf[ 7]) << 18;
922
923 digest[22] = (l >> 16) & 0xff;
924 digest[43] = (l >> 8) & 0xff;
925 digest[ 1] = (l >> 0) & 0xff;
926
927 l = itoa64_to_int (buf[ 8]) << 0;
928 l |= itoa64_to_int (buf[ 9]) << 6;
929 l |= itoa64_to_int (buf[10]) << 12;
930 l |= itoa64_to_int (buf[11]) << 18;
931
932 digest[44] = (l >> 16) & 0xff;
933 digest[ 2] = (l >> 8) & 0xff;
934 digest[23] = (l >> 0) & 0xff;
935
936 l = itoa64_to_int (buf[12]) << 0;
937 l |= itoa64_to_int (buf[13]) << 6;
938 l |= itoa64_to_int (buf[14]) << 12;
939 l |= itoa64_to_int (buf[15]) << 18;
940
941 digest[ 3] = (l >> 16) & 0xff;
942 digest[24] = (l >> 8) & 0xff;
943 digest[45] = (l >> 0) & 0xff;
944
945 l = itoa64_to_int (buf[16]) << 0;
946 l |= itoa64_to_int (buf[17]) << 6;
947 l |= itoa64_to_int (buf[18]) << 12;
948 l |= itoa64_to_int (buf[19]) << 18;
949
950 digest[25] = (l >> 16) & 0xff;
951 digest[46] = (l >> 8) & 0xff;
952 digest[ 4] = (l >> 0) & 0xff;
953
954 l = itoa64_to_int (buf[20]) << 0;
955 l |= itoa64_to_int (buf[21]) << 6;
956 l |= itoa64_to_int (buf[22]) << 12;
957 l |= itoa64_to_int (buf[23]) << 18;
958
959 digest[47] = (l >> 16) & 0xff;
960 digest[ 5] = (l >> 8) & 0xff;
961 digest[26] = (l >> 0) & 0xff;
962
963 l = itoa64_to_int (buf[24]) << 0;
964 l |= itoa64_to_int (buf[25]) << 6;
965 l |= itoa64_to_int (buf[26]) << 12;
966 l |= itoa64_to_int (buf[27]) << 18;
967
968 digest[ 6] = (l >> 16) & 0xff;
969 digest[27] = (l >> 8) & 0xff;
970 digest[48] = (l >> 0) & 0xff;
971
972 l = itoa64_to_int (buf[28]) << 0;
973 l |= itoa64_to_int (buf[29]) << 6;
974 l |= itoa64_to_int (buf[30]) << 12;
975 l |= itoa64_to_int (buf[31]) << 18;
976
977 digest[28] = (l >> 16) & 0xff;
978 digest[49] = (l >> 8) & 0xff;
979 digest[ 7] = (l >> 0) & 0xff;
980
981 l = itoa64_to_int (buf[32]) << 0;
982 l |= itoa64_to_int (buf[33]) << 6;
983 l |= itoa64_to_int (buf[34]) << 12;
984 l |= itoa64_to_int (buf[35]) << 18;
985
986 digest[50] = (l >> 16) & 0xff;
987 digest[ 8] = (l >> 8) & 0xff;
988 digest[29] = (l >> 0) & 0xff;
989
990 l = itoa64_to_int (buf[36]) << 0;
991 l |= itoa64_to_int (buf[37]) << 6;
992 l |= itoa64_to_int (buf[38]) << 12;
993 l |= itoa64_to_int (buf[39]) << 18;
994
995 digest[ 9] = (l >> 16) & 0xff;
996 digest[30] = (l >> 8) & 0xff;
997 digest[51] = (l >> 0) & 0xff;
998
999 l = itoa64_to_int (buf[40]) << 0;
1000 l |= itoa64_to_int (buf[41]) << 6;
1001 l |= itoa64_to_int (buf[42]) << 12;
1002 l |= itoa64_to_int (buf[43]) << 18;
1003
1004 digest[31] = (l >> 16) & 0xff;
1005 digest[52] = (l >> 8) & 0xff;
1006 digest[10] = (l >> 0) & 0xff;
1007
1008 l = itoa64_to_int (buf[44]) << 0;
1009 l |= itoa64_to_int (buf[45]) << 6;
1010 l |= itoa64_to_int (buf[46]) << 12;
1011 l |= itoa64_to_int (buf[47]) << 18;
1012
1013 digest[53] = (l >> 16) & 0xff;
1014 digest[11] = (l >> 8) & 0xff;
1015 digest[32] = (l >> 0) & 0xff;
1016
1017 l = itoa64_to_int (buf[48]) << 0;
1018 l |= itoa64_to_int (buf[49]) << 6;
1019 l |= itoa64_to_int (buf[50]) << 12;
1020 l |= itoa64_to_int (buf[51]) << 18;
1021
1022 digest[12] = (l >> 16) & 0xff;
1023 digest[33] = (l >> 8) & 0xff;
1024 digest[54] = (l >> 0) & 0xff;
1025
1026 l = itoa64_to_int (buf[52]) << 0;
1027 l |= itoa64_to_int (buf[53]) << 6;
1028 l |= itoa64_to_int (buf[54]) << 12;
1029 l |= itoa64_to_int (buf[55]) << 18;
1030
1031 digest[34] = (l >> 16) & 0xff;
1032 digest[55] = (l >> 8) & 0xff;
1033 digest[13] = (l >> 0) & 0xff;
1034
1035 l = itoa64_to_int (buf[56]) << 0;
1036 l |= itoa64_to_int (buf[57]) << 6;
1037 l |= itoa64_to_int (buf[58]) << 12;
1038 l |= itoa64_to_int (buf[59]) << 18;
1039
1040 digest[56] = (l >> 16) & 0xff;
1041 digest[14] = (l >> 8) & 0xff;
1042 digest[35] = (l >> 0) & 0xff;
1043
1044 l = itoa64_to_int (buf[60]) << 0;
1045 l |= itoa64_to_int (buf[61]) << 6;
1046 l |= itoa64_to_int (buf[62]) << 12;
1047 l |= itoa64_to_int (buf[63]) << 18;
1048
1049 digest[15] = (l >> 16) & 0xff;
1050 digest[36] = (l >> 8) & 0xff;
1051 digest[57] = (l >> 0) & 0xff;
1052
1053 l = itoa64_to_int (buf[64]) << 0;
1054 l |= itoa64_to_int (buf[65]) << 6;
1055 l |= itoa64_to_int (buf[66]) << 12;
1056 l |= itoa64_to_int (buf[67]) << 18;
1057
1058 digest[37] = (l >> 16) & 0xff;
1059 digest[58] = (l >> 8) & 0xff;
1060 digest[16] = (l >> 0) & 0xff;
1061
1062 l = itoa64_to_int (buf[68]) << 0;
1063 l |= itoa64_to_int (buf[69]) << 6;
1064 l |= itoa64_to_int (buf[70]) << 12;
1065 l |= itoa64_to_int (buf[71]) << 18;
1066
1067 digest[59] = (l >> 16) & 0xff;
1068 digest[17] = (l >> 8) & 0xff;
1069 digest[38] = (l >> 0) & 0xff;
1070
1071 l = itoa64_to_int (buf[72]) << 0;
1072 l |= itoa64_to_int (buf[73]) << 6;
1073 l |= itoa64_to_int (buf[74]) << 12;
1074 l |= itoa64_to_int (buf[75]) << 18;
1075
1076 digest[18] = (l >> 16) & 0xff;
1077 digest[39] = (l >> 8) & 0xff;
1078 digest[60] = (l >> 0) & 0xff;
1079
1080 l = itoa64_to_int (buf[76]) << 0;
1081 l |= itoa64_to_int (buf[77]) << 6;
1082 l |= itoa64_to_int (buf[78]) << 12;
1083 l |= itoa64_to_int (buf[79]) << 18;
1084
1085 digest[40] = (l >> 16) & 0xff;
1086 digest[61] = (l >> 8) & 0xff;
1087 digest[19] = (l >> 0) & 0xff;
1088
1089 l = itoa64_to_int (buf[80]) << 0;
1090 l |= itoa64_to_int (buf[81]) << 6;
1091 l |= itoa64_to_int (buf[82]) << 12;
1092 l |= itoa64_to_int (buf[83]) << 18;
1093
1094 digest[62] = (l >> 16) & 0xff;
1095 digest[20] = (l >> 8) & 0xff;
1096 digest[41] = (l >> 0) & 0xff;
1097
1098 l = itoa64_to_int (buf[84]) << 0;
1099 l |= itoa64_to_int (buf[85]) << 6;
1100
1101 digest[63] = (l >> 0) & 0xff;
1102 }
1103
1104 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1105 {
1106 int l;
1107
1108 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1109
1110 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1112 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1113 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1114
1115 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1116
1117 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1119 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1120 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1121
1122 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1123
1124 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1126 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1127 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1128
1129 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1130
1131 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1133 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1134 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1135
1136 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1137
1138 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1140 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1141 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1142
1143 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1144
1145 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1147 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1148 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1149
1150 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1151
1152 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1154 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1155 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1156
1157 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1158
1159 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1161 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1162 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1163
1164 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1165
1166 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1168 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1169 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1170
1171 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1172
1173 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1175 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1176 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1177
1178 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1179
1180 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1182 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1183 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1184
1185 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1186
1187 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1189 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1190 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1191
1192 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1193
1194 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1196 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1197 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1198
1199 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1200
1201 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1203 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1204 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1205
1206 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1207
1208 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1210 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1211 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1212
1213 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1214
1215 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1217 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1218 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1219
1220 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1221
1222 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1224 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1225 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1226
1227 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1228
1229 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1231 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1232 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1233
1234 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1235
1236 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1238 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1239 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1240
1241 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1242
1243 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1245 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1246 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1247
1248 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1249
1250 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1252 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1253 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1254
1255 l = 0 | 0 | (digest[63] << 0);
1256
1257 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1258 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1259 }
1260
1261 void sha1aix_decode (u8 digest[20], u8 buf[27])
1262 {
1263 int l;
1264
1265 l = itoa64_to_int (buf[ 0]) << 0;
1266 l |= itoa64_to_int (buf[ 1]) << 6;
1267 l |= itoa64_to_int (buf[ 2]) << 12;
1268 l |= itoa64_to_int (buf[ 3]) << 18;
1269
1270 digest[ 2] = (l >> 0) & 0xff;
1271 digest[ 1] = (l >> 8) & 0xff;
1272 digest[ 0] = (l >> 16) & 0xff;
1273
1274 l = itoa64_to_int (buf[ 4]) << 0;
1275 l |= itoa64_to_int (buf[ 5]) << 6;
1276 l |= itoa64_to_int (buf[ 6]) << 12;
1277 l |= itoa64_to_int (buf[ 7]) << 18;
1278
1279 digest[ 5] = (l >> 0) & 0xff;
1280 digest[ 4] = (l >> 8) & 0xff;
1281 digest[ 3] = (l >> 16) & 0xff;
1282
1283 l = itoa64_to_int (buf[ 8]) << 0;
1284 l |= itoa64_to_int (buf[ 9]) << 6;
1285 l |= itoa64_to_int (buf[10]) << 12;
1286 l |= itoa64_to_int (buf[11]) << 18;
1287
1288 digest[ 8] = (l >> 0) & 0xff;
1289 digest[ 7] = (l >> 8) & 0xff;
1290 digest[ 6] = (l >> 16) & 0xff;
1291
1292 l = itoa64_to_int (buf[12]) << 0;
1293 l |= itoa64_to_int (buf[13]) << 6;
1294 l |= itoa64_to_int (buf[14]) << 12;
1295 l |= itoa64_to_int (buf[15]) << 18;
1296
1297 digest[11] = (l >> 0) & 0xff;
1298 digest[10] = (l >> 8) & 0xff;
1299 digest[ 9] = (l >> 16) & 0xff;
1300
1301 l = itoa64_to_int (buf[16]) << 0;
1302 l |= itoa64_to_int (buf[17]) << 6;
1303 l |= itoa64_to_int (buf[18]) << 12;
1304 l |= itoa64_to_int (buf[19]) << 18;
1305
1306 digest[14] = (l >> 0) & 0xff;
1307 digest[13] = (l >> 8) & 0xff;
1308 digest[12] = (l >> 16) & 0xff;
1309
1310 l = itoa64_to_int (buf[20]) << 0;
1311 l |= itoa64_to_int (buf[21]) << 6;
1312 l |= itoa64_to_int (buf[22]) << 12;
1313 l |= itoa64_to_int (buf[23]) << 18;
1314
1315 digest[17] = (l >> 0) & 0xff;
1316 digest[16] = (l >> 8) & 0xff;
1317 digest[15] = (l >> 16) & 0xff;
1318
1319 l = itoa64_to_int (buf[24]) << 0;
1320 l |= itoa64_to_int (buf[25]) << 6;
1321 l |= itoa64_to_int (buf[26]) << 12;
1322
1323 digest[19] = (l >> 8) & 0xff;
1324 digest[18] = (l >> 16) & 0xff;
1325 }
1326
1327 void sha1aix_encode (u8 digest[20], u8 buf[27])
1328 {
1329 int l;
1330
1331 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1332
1333 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1334 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1335 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1336 buf[ 3] = int_to_itoa64 (l & 0x3f);
1337
1338 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1339
1340 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1341 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1342 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1343 buf[ 7] = int_to_itoa64 (l & 0x3f);
1344
1345 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1346
1347 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1348 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1349 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1350 buf[11] = int_to_itoa64 (l & 0x3f);
1351
1352 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1353
1354 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1355 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1356 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1357 buf[15] = int_to_itoa64 (l & 0x3f);
1358
1359 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1360
1361 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1362 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1363 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1364 buf[19] = int_to_itoa64 (l & 0x3f);
1365
1366 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1367
1368 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1369 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1370 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1371 buf[23] = int_to_itoa64 (l & 0x3f);
1372
1373 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1374
1375 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1376 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1377 buf[26] = int_to_itoa64 (l & 0x3f);
1378 }
1379
1380 void sha256aix_decode (u8 digest[32], u8 buf[43])
1381 {
1382 int l;
1383
1384 l = itoa64_to_int (buf[ 0]) << 0;
1385 l |= itoa64_to_int (buf[ 1]) << 6;
1386 l |= itoa64_to_int (buf[ 2]) << 12;
1387 l |= itoa64_to_int (buf[ 3]) << 18;
1388
1389 digest[ 2] = (l >> 0) & 0xff;
1390 digest[ 1] = (l >> 8) & 0xff;
1391 digest[ 0] = (l >> 16) & 0xff;
1392
1393 l = itoa64_to_int (buf[ 4]) << 0;
1394 l |= itoa64_to_int (buf[ 5]) << 6;
1395 l |= itoa64_to_int (buf[ 6]) << 12;
1396 l |= itoa64_to_int (buf[ 7]) << 18;
1397
1398 digest[ 5] = (l >> 0) & 0xff;
1399 digest[ 4] = (l >> 8) & 0xff;
1400 digest[ 3] = (l >> 16) & 0xff;
1401
1402 l = itoa64_to_int (buf[ 8]) << 0;
1403 l |= itoa64_to_int (buf[ 9]) << 6;
1404 l |= itoa64_to_int (buf[10]) << 12;
1405 l |= itoa64_to_int (buf[11]) << 18;
1406
1407 digest[ 8] = (l >> 0) & 0xff;
1408 digest[ 7] = (l >> 8) & 0xff;
1409 digest[ 6] = (l >> 16) & 0xff;
1410
1411 l = itoa64_to_int (buf[12]) << 0;
1412 l |= itoa64_to_int (buf[13]) << 6;
1413 l |= itoa64_to_int (buf[14]) << 12;
1414 l |= itoa64_to_int (buf[15]) << 18;
1415
1416 digest[11] = (l >> 0) & 0xff;
1417 digest[10] = (l >> 8) & 0xff;
1418 digest[ 9] = (l >> 16) & 0xff;
1419
1420 l = itoa64_to_int (buf[16]) << 0;
1421 l |= itoa64_to_int (buf[17]) << 6;
1422 l |= itoa64_to_int (buf[18]) << 12;
1423 l |= itoa64_to_int (buf[19]) << 18;
1424
1425 digest[14] = (l >> 0) & 0xff;
1426 digest[13] = (l >> 8) & 0xff;
1427 digest[12] = (l >> 16) & 0xff;
1428
1429 l = itoa64_to_int (buf[20]) << 0;
1430 l |= itoa64_to_int (buf[21]) << 6;
1431 l |= itoa64_to_int (buf[22]) << 12;
1432 l |= itoa64_to_int (buf[23]) << 18;
1433
1434 digest[17] = (l >> 0) & 0xff;
1435 digest[16] = (l >> 8) & 0xff;
1436 digest[15] = (l >> 16) & 0xff;
1437
1438 l = itoa64_to_int (buf[24]) << 0;
1439 l |= itoa64_to_int (buf[25]) << 6;
1440 l |= itoa64_to_int (buf[26]) << 12;
1441 l |= itoa64_to_int (buf[27]) << 18;
1442
1443 digest[20] = (l >> 0) & 0xff;
1444 digest[19] = (l >> 8) & 0xff;
1445 digest[18] = (l >> 16) & 0xff;
1446
1447 l = itoa64_to_int (buf[28]) << 0;
1448 l |= itoa64_to_int (buf[29]) << 6;
1449 l |= itoa64_to_int (buf[30]) << 12;
1450 l |= itoa64_to_int (buf[31]) << 18;
1451
1452 digest[23] = (l >> 0) & 0xff;
1453 digest[22] = (l >> 8) & 0xff;
1454 digest[21] = (l >> 16) & 0xff;
1455
1456 l = itoa64_to_int (buf[32]) << 0;
1457 l |= itoa64_to_int (buf[33]) << 6;
1458 l |= itoa64_to_int (buf[34]) << 12;
1459 l |= itoa64_to_int (buf[35]) << 18;
1460
1461 digest[26] = (l >> 0) & 0xff;
1462 digest[25] = (l >> 8) & 0xff;
1463 digest[24] = (l >> 16) & 0xff;
1464
1465 l = itoa64_to_int (buf[36]) << 0;
1466 l |= itoa64_to_int (buf[37]) << 6;
1467 l |= itoa64_to_int (buf[38]) << 12;
1468 l |= itoa64_to_int (buf[39]) << 18;
1469
1470 digest[29] = (l >> 0) & 0xff;
1471 digest[28] = (l >> 8) & 0xff;
1472 digest[27] = (l >> 16) & 0xff;
1473
1474 l = itoa64_to_int (buf[40]) << 0;
1475 l |= itoa64_to_int (buf[41]) << 6;
1476 l |= itoa64_to_int (buf[42]) << 12;
1477
1478 //digest[32] = (l >> 0) & 0xff;
1479 digest[31] = (l >> 8) & 0xff;
1480 digest[30] = (l >> 16) & 0xff;
1481 }
1482
1483 void sha256aix_encode (u8 digest[32], u8 buf[43])
1484 {
1485 int l;
1486
1487 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1488
1489 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1490 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1491 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1492 buf[ 3] = int_to_itoa64 (l & 0x3f);
1493
1494 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1495
1496 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1497 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1498 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1499 buf[ 7] = int_to_itoa64 (l & 0x3f);
1500
1501 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1502
1503 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1504 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1505 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1506 buf[11] = int_to_itoa64 (l & 0x3f);
1507
1508 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1509
1510 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1511 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1512 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1513 buf[15] = int_to_itoa64 (l & 0x3f);
1514
1515 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1516
1517 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1518 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1519 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1520 buf[19] = int_to_itoa64 (l & 0x3f);
1521
1522 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1523
1524 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1525 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1526 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1527 buf[23] = int_to_itoa64 (l & 0x3f);
1528
1529 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1530
1531 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1532 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1533 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1534 buf[27] = int_to_itoa64 (l & 0x3f);
1535
1536 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1537
1538 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1539 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1540 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1541 buf[31] = int_to_itoa64 (l & 0x3f);
1542
1543 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1544
1545 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1546 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1547 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1548 buf[35] = int_to_itoa64 (l & 0x3f);
1549
1550 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1551
1552 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1553 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1554 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1555 buf[39] = int_to_itoa64 (l & 0x3f);
1556
1557 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1558
1559 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1560 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1561 buf[42] = int_to_itoa64 (l & 0x3f);
1562 }
1563
1564 void sha512aix_decode (u8 digest[64], u8 buf[86])
1565 {
1566 int l;
1567
1568 l = itoa64_to_int (buf[ 0]) << 0;
1569 l |= itoa64_to_int (buf[ 1]) << 6;
1570 l |= itoa64_to_int (buf[ 2]) << 12;
1571 l |= itoa64_to_int (buf[ 3]) << 18;
1572
1573 digest[ 2] = (l >> 0) & 0xff;
1574 digest[ 1] = (l >> 8) & 0xff;
1575 digest[ 0] = (l >> 16) & 0xff;
1576
1577 l = itoa64_to_int (buf[ 4]) << 0;
1578 l |= itoa64_to_int (buf[ 5]) << 6;
1579 l |= itoa64_to_int (buf[ 6]) << 12;
1580 l |= itoa64_to_int (buf[ 7]) << 18;
1581
1582 digest[ 5] = (l >> 0) & 0xff;
1583 digest[ 4] = (l >> 8) & 0xff;
1584 digest[ 3] = (l >> 16) & 0xff;
1585
1586 l = itoa64_to_int (buf[ 8]) << 0;
1587 l |= itoa64_to_int (buf[ 9]) << 6;
1588 l |= itoa64_to_int (buf[10]) << 12;
1589 l |= itoa64_to_int (buf[11]) << 18;
1590
1591 digest[ 8] = (l >> 0) & 0xff;
1592 digest[ 7] = (l >> 8) & 0xff;
1593 digest[ 6] = (l >> 16) & 0xff;
1594
1595 l = itoa64_to_int (buf[12]) << 0;
1596 l |= itoa64_to_int (buf[13]) << 6;
1597 l |= itoa64_to_int (buf[14]) << 12;
1598 l |= itoa64_to_int (buf[15]) << 18;
1599
1600 digest[11] = (l >> 0) & 0xff;
1601 digest[10] = (l >> 8) & 0xff;
1602 digest[ 9] = (l >> 16) & 0xff;
1603
1604 l = itoa64_to_int (buf[16]) << 0;
1605 l |= itoa64_to_int (buf[17]) << 6;
1606 l |= itoa64_to_int (buf[18]) << 12;
1607 l |= itoa64_to_int (buf[19]) << 18;
1608
1609 digest[14] = (l >> 0) & 0xff;
1610 digest[13] = (l >> 8) & 0xff;
1611 digest[12] = (l >> 16) & 0xff;
1612
1613 l = itoa64_to_int (buf[20]) << 0;
1614 l |= itoa64_to_int (buf[21]) << 6;
1615 l |= itoa64_to_int (buf[22]) << 12;
1616 l |= itoa64_to_int (buf[23]) << 18;
1617
1618 digest[17] = (l >> 0) & 0xff;
1619 digest[16] = (l >> 8) & 0xff;
1620 digest[15] = (l >> 16) & 0xff;
1621
1622 l = itoa64_to_int (buf[24]) << 0;
1623 l |= itoa64_to_int (buf[25]) << 6;
1624 l |= itoa64_to_int (buf[26]) << 12;
1625 l |= itoa64_to_int (buf[27]) << 18;
1626
1627 digest[20] = (l >> 0) & 0xff;
1628 digest[19] = (l >> 8) & 0xff;
1629 digest[18] = (l >> 16) & 0xff;
1630
1631 l = itoa64_to_int (buf[28]) << 0;
1632 l |= itoa64_to_int (buf[29]) << 6;
1633 l |= itoa64_to_int (buf[30]) << 12;
1634 l |= itoa64_to_int (buf[31]) << 18;
1635
1636 digest[23] = (l >> 0) & 0xff;
1637 digest[22] = (l >> 8) & 0xff;
1638 digest[21] = (l >> 16) & 0xff;
1639
1640 l = itoa64_to_int (buf[32]) << 0;
1641 l |= itoa64_to_int (buf[33]) << 6;
1642 l |= itoa64_to_int (buf[34]) << 12;
1643 l |= itoa64_to_int (buf[35]) << 18;
1644
1645 digest[26] = (l >> 0) & 0xff;
1646 digest[25] = (l >> 8) & 0xff;
1647 digest[24] = (l >> 16) & 0xff;
1648
1649 l = itoa64_to_int (buf[36]) << 0;
1650 l |= itoa64_to_int (buf[37]) << 6;
1651 l |= itoa64_to_int (buf[38]) << 12;
1652 l |= itoa64_to_int (buf[39]) << 18;
1653
1654 digest[29] = (l >> 0) & 0xff;
1655 digest[28] = (l >> 8) & 0xff;
1656 digest[27] = (l >> 16) & 0xff;
1657
1658 l = itoa64_to_int (buf[40]) << 0;
1659 l |= itoa64_to_int (buf[41]) << 6;
1660 l |= itoa64_to_int (buf[42]) << 12;
1661 l |= itoa64_to_int (buf[43]) << 18;
1662
1663 digest[32] = (l >> 0) & 0xff;
1664 digest[31] = (l >> 8) & 0xff;
1665 digest[30] = (l >> 16) & 0xff;
1666
1667 l = itoa64_to_int (buf[44]) << 0;
1668 l |= itoa64_to_int (buf[45]) << 6;
1669 l |= itoa64_to_int (buf[46]) << 12;
1670 l |= itoa64_to_int (buf[47]) << 18;
1671
1672 digest[35] = (l >> 0) & 0xff;
1673 digest[34] = (l >> 8) & 0xff;
1674 digest[33] = (l >> 16) & 0xff;
1675
1676 l = itoa64_to_int (buf[48]) << 0;
1677 l |= itoa64_to_int (buf[49]) << 6;
1678 l |= itoa64_to_int (buf[50]) << 12;
1679 l |= itoa64_to_int (buf[51]) << 18;
1680
1681 digest[38] = (l >> 0) & 0xff;
1682 digest[37] = (l >> 8) & 0xff;
1683 digest[36] = (l >> 16) & 0xff;
1684
1685 l = itoa64_to_int (buf[52]) << 0;
1686 l |= itoa64_to_int (buf[53]) << 6;
1687 l |= itoa64_to_int (buf[54]) << 12;
1688 l |= itoa64_to_int (buf[55]) << 18;
1689
1690 digest[41] = (l >> 0) & 0xff;
1691 digest[40] = (l >> 8) & 0xff;
1692 digest[39] = (l >> 16) & 0xff;
1693
1694 l = itoa64_to_int (buf[56]) << 0;
1695 l |= itoa64_to_int (buf[57]) << 6;
1696 l |= itoa64_to_int (buf[58]) << 12;
1697 l |= itoa64_to_int (buf[59]) << 18;
1698
1699 digest[44] = (l >> 0) & 0xff;
1700 digest[43] = (l >> 8) & 0xff;
1701 digest[42] = (l >> 16) & 0xff;
1702
1703 l = itoa64_to_int (buf[60]) << 0;
1704 l |= itoa64_to_int (buf[61]) << 6;
1705 l |= itoa64_to_int (buf[62]) << 12;
1706 l |= itoa64_to_int (buf[63]) << 18;
1707
1708 digest[47] = (l >> 0) & 0xff;
1709 digest[46] = (l >> 8) & 0xff;
1710 digest[45] = (l >> 16) & 0xff;
1711
1712 l = itoa64_to_int (buf[64]) << 0;
1713 l |= itoa64_to_int (buf[65]) << 6;
1714 l |= itoa64_to_int (buf[66]) << 12;
1715 l |= itoa64_to_int (buf[67]) << 18;
1716
1717 digest[50] = (l >> 0) & 0xff;
1718 digest[49] = (l >> 8) & 0xff;
1719 digest[48] = (l >> 16) & 0xff;
1720
1721 l = itoa64_to_int (buf[68]) << 0;
1722 l |= itoa64_to_int (buf[69]) << 6;
1723 l |= itoa64_to_int (buf[70]) << 12;
1724 l |= itoa64_to_int (buf[71]) << 18;
1725
1726 digest[53] = (l >> 0) & 0xff;
1727 digest[52] = (l >> 8) & 0xff;
1728 digest[51] = (l >> 16) & 0xff;
1729
1730 l = itoa64_to_int (buf[72]) << 0;
1731 l |= itoa64_to_int (buf[73]) << 6;
1732 l |= itoa64_to_int (buf[74]) << 12;
1733 l |= itoa64_to_int (buf[75]) << 18;
1734
1735 digest[56] = (l >> 0) & 0xff;
1736 digest[55] = (l >> 8) & 0xff;
1737 digest[54] = (l >> 16) & 0xff;
1738
1739 l = itoa64_to_int (buf[76]) << 0;
1740 l |= itoa64_to_int (buf[77]) << 6;
1741 l |= itoa64_to_int (buf[78]) << 12;
1742 l |= itoa64_to_int (buf[79]) << 18;
1743
1744 digest[59] = (l >> 0) & 0xff;
1745 digest[58] = (l >> 8) & 0xff;
1746 digest[57] = (l >> 16) & 0xff;
1747
1748 l = itoa64_to_int (buf[80]) << 0;
1749 l |= itoa64_to_int (buf[81]) << 6;
1750 l |= itoa64_to_int (buf[82]) << 12;
1751 l |= itoa64_to_int (buf[83]) << 18;
1752
1753 digest[62] = (l >> 0) & 0xff;
1754 digest[61] = (l >> 8) & 0xff;
1755 digest[60] = (l >> 16) & 0xff;
1756
1757 l = itoa64_to_int (buf[84]) << 0;
1758 l |= itoa64_to_int (buf[85]) << 6;
1759
1760 digest[63] = (l >> 16) & 0xff;
1761 }
1762
1763 void sha512aix_encode (u8 digest[64], u8 buf[86])
1764 {
1765 int l;
1766
1767 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1768
1769 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1770 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1771 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1772 buf[ 3] = int_to_itoa64 (l & 0x3f);
1773
1774 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1775
1776 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1777 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1778 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1779 buf[ 7] = int_to_itoa64 (l & 0x3f);
1780
1781 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1782
1783 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1784 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1785 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1786 buf[11] = int_to_itoa64 (l & 0x3f);
1787
1788 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1789
1790 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1791 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1792 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1793 buf[15] = int_to_itoa64 (l & 0x3f);
1794
1795 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1796
1797 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1798 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1799 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1800 buf[19] = int_to_itoa64 (l & 0x3f);
1801
1802 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1803
1804 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1805 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1806 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1807 buf[23] = int_to_itoa64 (l & 0x3f);
1808
1809 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1810
1811 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1812 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1813 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1814 buf[27] = int_to_itoa64 (l & 0x3f);
1815
1816 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1817
1818 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1819 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1820 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1821 buf[31] = int_to_itoa64 (l & 0x3f);
1822
1823 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1824
1825 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1826 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1827 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1828 buf[35] = int_to_itoa64 (l & 0x3f);
1829
1830 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1831
1832 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1833 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1834 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1835 buf[39] = int_to_itoa64 (l & 0x3f);
1836
1837 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1838
1839 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1840 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1841 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1842 buf[43] = int_to_itoa64 (l & 0x3f);
1843
1844 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1845
1846 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1847 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1848 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1849 buf[47] = int_to_itoa64 (l & 0x3f);
1850
1851 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1852
1853 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1854 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1855 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1856 buf[51] = int_to_itoa64 (l & 0x3f);
1857
1858 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1859
1860 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1861 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1862 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1863 buf[55] = int_to_itoa64 (l & 0x3f);
1864
1865 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1866
1867 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1868 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1869 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1870 buf[59] = int_to_itoa64 (l & 0x3f);
1871
1872 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1873
1874 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1875 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1876 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1877 buf[63] = int_to_itoa64 (l & 0x3f);
1878
1879 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1880
1881 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1882 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1883 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1884 buf[67] = int_to_itoa64 (l & 0x3f);
1885
1886 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1887
1888 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1889 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1890 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1891 buf[71] = int_to_itoa64 (l & 0x3f);
1892
1893 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1894
1895 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1896 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1897 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1898 buf[75] = int_to_itoa64 (l & 0x3f);
1899
1900 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1901
1902 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1903 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1904 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1905 buf[79] = int_to_itoa64 (l & 0x3f);
1906
1907 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1908
1909 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1910 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1911 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1912 buf[83] = int_to_itoa64 (l & 0x3f);
1913
1914 l = 0 | 0 | (digest[63] << 16);
1915
1916 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1917 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1918 }
1919
1920 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1921 {
1922 int l;
1923
1924 l = itoa64_to_int (buf[ 0]) << 0;
1925 l |= itoa64_to_int (buf[ 1]) << 6;
1926 l |= itoa64_to_int (buf[ 2]) << 12;
1927 l |= itoa64_to_int (buf[ 3]) << 18;
1928
1929 digest[ 0] = (l >> 16) & 0xff;
1930 digest[10] = (l >> 8) & 0xff;
1931 digest[20] = (l >> 0) & 0xff;
1932
1933 l = itoa64_to_int (buf[ 4]) << 0;
1934 l |= itoa64_to_int (buf[ 5]) << 6;
1935 l |= itoa64_to_int (buf[ 6]) << 12;
1936 l |= itoa64_to_int (buf[ 7]) << 18;
1937
1938 digest[21] = (l >> 16) & 0xff;
1939 digest[ 1] = (l >> 8) & 0xff;
1940 digest[11] = (l >> 0) & 0xff;
1941
1942 l = itoa64_to_int (buf[ 8]) << 0;
1943 l |= itoa64_to_int (buf[ 9]) << 6;
1944 l |= itoa64_to_int (buf[10]) << 12;
1945 l |= itoa64_to_int (buf[11]) << 18;
1946
1947 digest[12] = (l >> 16) & 0xff;
1948 digest[22] = (l >> 8) & 0xff;
1949 digest[ 2] = (l >> 0) & 0xff;
1950
1951 l = itoa64_to_int (buf[12]) << 0;
1952 l |= itoa64_to_int (buf[13]) << 6;
1953 l |= itoa64_to_int (buf[14]) << 12;
1954 l |= itoa64_to_int (buf[15]) << 18;
1955
1956 digest[ 3] = (l >> 16) & 0xff;
1957 digest[13] = (l >> 8) & 0xff;
1958 digest[23] = (l >> 0) & 0xff;
1959
1960 l = itoa64_to_int (buf[16]) << 0;
1961 l |= itoa64_to_int (buf[17]) << 6;
1962 l |= itoa64_to_int (buf[18]) << 12;
1963 l |= itoa64_to_int (buf[19]) << 18;
1964
1965 digest[24] = (l >> 16) & 0xff;
1966 digest[ 4] = (l >> 8) & 0xff;
1967 digest[14] = (l >> 0) & 0xff;
1968
1969 l = itoa64_to_int (buf[20]) << 0;
1970 l |= itoa64_to_int (buf[21]) << 6;
1971 l |= itoa64_to_int (buf[22]) << 12;
1972 l |= itoa64_to_int (buf[23]) << 18;
1973
1974 digest[15] = (l >> 16) & 0xff;
1975 digest[25] = (l >> 8) & 0xff;
1976 digest[ 5] = (l >> 0) & 0xff;
1977
1978 l = itoa64_to_int (buf[24]) << 0;
1979 l |= itoa64_to_int (buf[25]) << 6;
1980 l |= itoa64_to_int (buf[26]) << 12;
1981 l |= itoa64_to_int (buf[27]) << 18;
1982
1983 digest[ 6] = (l >> 16) & 0xff;
1984 digest[16] = (l >> 8) & 0xff;
1985 digest[26] = (l >> 0) & 0xff;
1986
1987 l = itoa64_to_int (buf[28]) << 0;
1988 l |= itoa64_to_int (buf[29]) << 6;
1989 l |= itoa64_to_int (buf[30]) << 12;
1990 l |= itoa64_to_int (buf[31]) << 18;
1991
1992 digest[27] = (l >> 16) & 0xff;
1993 digest[ 7] = (l >> 8) & 0xff;
1994 digest[17] = (l >> 0) & 0xff;
1995
1996 l = itoa64_to_int (buf[32]) << 0;
1997 l |= itoa64_to_int (buf[33]) << 6;
1998 l |= itoa64_to_int (buf[34]) << 12;
1999 l |= itoa64_to_int (buf[35]) << 18;
2000
2001 digest[18] = (l >> 16) & 0xff;
2002 digest[28] = (l >> 8) & 0xff;
2003 digest[ 8] = (l >> 0) & 0xff;
2004
2005 l = itoa64_to_int (buf[36]) << 0;
2006 l |= itoa64_to_int (buf[37]) << 6;
2007 l |= itoa64_to_int (buf[38]) << 12;
2008 l |= itoa64_to_int (buf[39]) << 18;
2009
2010 digest[ 9] = (l >> 16) & 0xff;
2011 digest[19] = (l >> 8) & 0xff;
2012 digest[29] = (l >> 0) & 0xff;
2013
2014 l = itoa64_to_int (buf[40]) << 0;
2015 l |= itoa64_to_int (buf[41]) << 6;
2016 l |= itoa64_to_int (buf[42]) << 12;
2017
2018 digest[31] = (l >> 8) & 0xff;
2019 digest[30] = (l >> 0) & 0xff;
2020 }
2021
2022 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2023 {
2024 int l;
2025
2026 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2027
2028 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2030 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2031 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2032
2033 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2034
2035 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2037 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2038 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2039
2040 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2041
2042 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2044 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2045 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2046
2047 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2048
2049 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2051 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2052 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2053
2054 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2055
2056 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2058 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2059 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2060
2061 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2062
2063 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2065 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2066 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2067
2068 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2069
2070 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2072 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2073 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2074
2075 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2076
2077 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2079 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2080 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2081
2082 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2083
2084 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2086 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2087 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2088
2089 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2090
2091 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2093 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2094 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2095
2096 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2097
2098 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2099 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2100 buf[42] = int_to_itoa64 (l & 0x3f);
2101 }
2102
2103 void drupal7_decode (u8 digest[64], u8 buf[44])
2104 {
2105 int l;
2106
2107 l = itoa64_to_int (buf[ 0]) << 0;
2108 l |= itoa64_to_int (buf[ 1]) << 6;
2109 l |= itoa64_to_int (buf[ 2]) << 12;
2110 l |= itoa64_to_int (buf[ 3]) << 18;
2111
2112 digest[ 0] = (l >> 0) & 0xff;
2113 digest[ 1] = (l >> 8) & 0xff;
2114 digest[ 2] = (l >> 16) & 0xff;
2115
2116 l = itoa64_to_int (buf[ 4]) << 0;
2117 l |= itoa64_to_int (buf[ 5]) << 6;
2118 l |= itoa64_to_int (buf[ 6]) << 12;
2119 l |= itoa64_to_int (buf[ 7]) << 18;
2120
2121 digest[ 3] = (l >> 0) & 0xff;
2122 digest[ 4] = (l >> 8) & 0xff;
2123 digest[ 5] = (l >> 16) & 0xff;
2124
2125 l = itoa64_to_int (buf[ 8]) << 0;
2126 l |= itoa64_to_int (buf[ 9]) << 6;
2127 l |= itoa64_to_int (buf[10]) << 12;
2128 l |= itoa64_to_int (buf[11]) << 18;
2129
2130 digest[ 6] = (l >> 0) & 0xff;
2131 digest[ 7] = (l >> 8) & 0xff;
2132 digest[ 8] = (l >> 16) & 0xff;
2133
2134 l = itoa64_to_int (buf[12]) << 0;
2135 l |= itoa64_to_int (buf[13]) << 6;
2136 l |= itoa64_to_int (buf[14]) << 12;
2137 l |= itoa64_to_int (buf[15]) << 18;
2138
2139 digest[ 9] = (l >> 0) & 0xff;
2140 digest[10] = (l >> 8) & 0xff;
2141 digest[11] = (l >> 16) & 0xff;
2142
2143 l = itoa64_to_int (buf[16]) << 0;
2144 l |= itoa64_to_int (buf[17]) << 6;
2145 l |= itoa64_to_int (buf[18]) << 12;
2146 l |= itoa64_to_int (buf[19]) << 18;
2147
2148 digest[12] = (l >> 0) & 0xff;
2149 digest[13] = (l >> 8) & 0xff;
2150 digest[14] = (l >> 16) & 0xff;
2151
2152 l = itoa64_to_int (buf[20]) << 0;
2153 l |= itoa64_to_int (buf[21]) << 6;
2154 l |= itoa64_to_int (buf[22]) << 12;
2155 l |= itoa64_to_int (buf[23]) << 18;
2156
2157 digest[15] = (l >> 0) & 0xff;
2158 digest[16] = (l >> 8) & 0xff;
2159 digest[17] = (l >> 16) & 0xff;
2160
2161 l = itoa64_to_int (buf[24]) << 0;
2162 l |= itoa64_to_int (buf[25]) << 6;
2163 l |= itoa64_to_int (buf[26]) << 12;
2164 l |= itoa64_to_int (buf[27]) << 18;
2165
2166 digest[18] = (l >> 0) & 0xff;
2167 digest[19] = (l >> 8) & 0xff;
2168 digest[20] = (l >> 16) & 0xff;
2169
2170 l = itoa64_to_int (buf[28]) << 0;
2171 l |= itoa64_to_int (buf[29]) << 6;
2172 l |= itoa64_to_int (buf[30]) << 12;
2173 l |= itoa64_to_int (buf[31]) << 18;
2174
2175 digest[21] = (l >> 0) & 0xff;
2176 digest[22] = (l >> 8) & 0xff;
2177 digest[23] = (l >> 16) & 0xff;
2178
2179 l = itoa64_to_int (buf[32]) << 0;
2180 l |= itoa64_to_int (buf[33]) << 6;
2181 l |= itoa64_to_int (buf[34]) << 12;
2182 l |= itoa64_to_int (buf[35]) << 18;
2183
2184 digest[24] = (l >> 0) & 0xff;
2185 digest[25] = (l >> 8) & 0xff;
2186 digest[26] = (l >> 16) & 0xff;
2187
2188 l = itoa64_to_int (buf[36]) << 0;
2189 l |= itoa64_to_int (buf[37]) << 6;
2190 l |= itoa64_to_int (buf[38]) << 12;
2191 l |= itoa64_to_int (buf[39]) << 18;
2192
2193 digest[27] = (l >> 0) & 0xff;
2194 digest[28] = (l >> 8) & 0xff;
2195 digest[29] = (l >> 16) & 0xff;
2196
2197 l = itoa64_to_int (buf[40]) << 0;
2198 l |= itoa64_to_int (buf[41]) << 6;
2199 l |= itoa64_to_int (buf[42]) << 12;
2200 l |= itoa64_to_int (buf[43]) << 18;
2201
2202 digest[30] = (l >> 0) & 0xff;
2203 digest[31] = (l >> 8) & 0xff;
2204 digest[32] = (l >> 16) & 0xff;
2205
2206 digest[33] = 0;
2207 digest[34] = 0;
2208 digest[35] = 0;
2209 digest[36] = 0;
2210 digest[37] = 0;
2211 digest[38] = 0;
2212 digest[39] = 0;
2213 digest[40] = 0;
2214 digest[41] = 0;
2215 digest[42] = 0;
2216 digest[43] = 0;
2217 digest[44] = 0;
2218 digest[45] = 0;
2219 digest[46] = 0;
2220 digest[47] = 0;
2221 digest[48] = 0;
2222 digest[49] = 0;
2223 digest[50] = 0;
2224 digest[51] = 0;
2225 digest[52] = 0;
2226 digest[53] = 0;
2227 digest[54] = 0;
2228 digest[55] = 0;
2229 digest[56] = 0;
2230 digest[57] = 0;
2231 digest[58] = 0;
2232 digest[59] = 0;
2233 digest[60] = 0;
2234 digest[61] = 0;
2235 digest[62] = 0;
2236 digest[63] = 0;
2237 }
2238
2239 void drupal7_encode (u8 digest[64], u8 buf[43])
2240 {
2241 int l;
2242
2243 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2244
2245 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2246 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2247 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2248 buf[ 3] = int_to_itoa64 (l & 0x3f);
2249
2250 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2251
2252 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2253 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2254 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2255 buf[ 7] = int_to_itoa64 (l & 0x3f);
2256
2257 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2258
2259 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2260 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2261 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2262 buf[11] = int_to_itoa64 (l & 0x3f);
2263
2264 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2265
2266 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2267 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2268 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2269 buf[15] = int_to_itoa64 (l & 0x3f);
2270
2271 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2272
2273 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2274 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2275 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2276 buf[19] = int_to_itoa64 (l & 0x3f);
2277
2278 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2279
2280 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2281 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2282 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2283 buf[23] = int_to_itoa64 (l & 0x3f);
2284
2285 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2286
2287 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2288 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2289 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2290 buf[27] = int_to_itoa64 (l & 0x3f);
2291
2292 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2293
2294 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2295 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2296 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2297 buf[31] = int_to_itoa64 (l & 0x3f);
2298
2299 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2300
2301 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2302 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2303 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2304 buf[35] = int_to_itoa64 (l & 0x3f);
2305
2306 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2307
2308 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2309 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2310 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2311 buf[39] = int_to_itoa64 (l & 0x3f);
2312
2313 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2314
2315 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2316 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2317 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2318 //buf[43] = int_to_itoa64 (l & 0x3f);
2319 }
2320
2321 /**
2322 * tty
2323 */
2324
2325 #ifdef LINUX
2326 static struct termio savemodes;
2327 static int havemodes = 0;
2328
2329 int tty_break()
2330 {
2331 struct termio modmodes;
2332
2333 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2334
2335 havemodes = 1;
2336
2337 modmodes = savemodes;
2338 modmodes.c_lflag &= ~ICANON;
2339 modmodes.c_cc[VMIN] = 1;
2340 modmodes.c_cc[VTIME] = 0;
2341
2342 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2343 }
2344
2345 int tty_getchar()
2346 {
2347 fd_set rfds;
2348
2349 FD_ZERO (&rfds);
2350
2351 FD_SET (fileno (stdin), &rfds);
2352
2353 struct timeval tv;
2354
2355 tv.tv_sec = 1;
2356 tv.tv_usec = 0;
2357
2358 int retval = select (1, &rfds, NULL, NULL, &tv);
2359
2360 if (retval == 0) return 0;
2361 if (retval == -1) return -1;
2362
2363 return getchar();
2364 }
2365
2366 int tty_fix()
2367 {
2368 if (!havemodes) return 0;
2369
2370 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2371 }
2372 #endif
2373
2374 #ifdef OSX
2375 static struct termios savemodes;
2376 static int havemodes = 0;
2377
2378 int tty_break()
2379 {
2380 struct termios modmodes;
2381
2382 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2383
2384 havemodes = 1;
2385
2386 modmodes = savemodes;
2387 modmodes.c_lflag &= ~ICANON;
2388 modmodes.c_cc[VMIN] = 1;
2389 modmodes.c_cc[VTIME] = 0;
2390
2391 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2392 }
2393
2394 int tty_getchar()
2395 {
2396 fd_set rfds;
2397
2398 FD_ZERO (&rfds);
2399
2400 FD_SET (fileno (stdin), &rfds);
2401
2402 struct timeval tv;
2403
2404 tv.tv_sec = 1;
2405 tv.tv_usec = 0;
2406
2407 int retval = select (1, &rfds, NULL, NULL, &tv);
2408
2409 if (retval == 0) return 0;
2410 if (retval == -1) return -1;
2411
2412 return getchar();
2413 }
2414
2415 int tty_fix()
2416 {
2417 if (!havemodes) return 0;
2418
2419 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2420 }
2421 #endif
2422
2423 #ifdef WIN
2424 static DWORD saveMode = 0;
2425
2426 int tty_break()
2427 {
2428 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2429
2430 GetConsoleMode (stdinHandle, &saveMode);
2431 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2432
2433 return 0;
2434 }
2435
2436 int tty_getchar()
2437 {
2438 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2439
2440 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2441
2442 if (rc == WAIT_TIMEOUT) return 0;
2443 if (rc == WAIT_ABANDONED) return -1;
2444 if (rc == WAIT_FAILED) return -1;
2445
2446 // The whole ReadConsoleInput () part is a workaround.
2447 // For some unknown reason, maybe a mingw bug, a random signal
2448 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2449 // Then it wants to read with getche () a keyboard input
2450 // which has never been made.
2451
2452 INPUT_RECORD buf[100];
2453
2454 DWORD num = 0;
2455
2456 memset (buf, 0, sizeof (buf));
2457
2458 ReadConsoleInput (stdinHandle, buf, 100, &num);
2459
2460 FlushConsoleInputBuffer (stdinHandle);
2461
2462 for (uint i = 0; i < num; i++)
2463 {
2464 if (buf[i].EventType != KEY_EVENT) continue;
2465
2466 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2467
2468 if (KeyEvent.bKeyDown != TRUE) continue;
2469
2470 return KeyEvent.uChar.AsciiChar;
2471 }
2472
2473 return 0;
2474 }
2475
2476 int tty_fix()
2477 {
2478 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2479
2480 SetConsoleMode (stdinHandle, saveMode);
2481
2482 return 0;
2483 }
2484 #endif
2485
2486 /**
2487 * mem alloc
2488 */
2489
2490 #define MSG_ENOMEM "Insufficient memory available"
2491
2492 void *mycalloc (size_t nmemb, size_t size)
2493 {
2494 void *p = calloc (nmemb, size);
2495
2496 if (p == NULL)
2497 {
2498 log_error ("ERROR: %s", MSG_ENOMEM);
2499
2500 exit (-1);
2501 }
2502
2503 return (p);
2504 }
2505
2506 void *mymalloc (size_t size)
2507 {
2508 void *p = malloc (size);
2509
2510 if (p == NULL)
2511 {
2512 log_error ("ERROR: %s", MSG_ENOMEM);
2513
2514 exit (-1);
2515 }
2516
2517 memset (p, 0, size);
2518
2519 return (p);
2520 }
2521
2522 void myfree (void *ptr)
2523 {
2524 if (ptr == NULL) return;
2525
2526 free (ptr);
2527 }
2528
2529 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2530 {
2531 void *p = realloc (ptr, oldsz + add);
2532
2533 if (p == NULL)
2534 {
2535 log_error ("ERROR: %s", MSG_ENOMEM);
2536
2537 exit (-1);
2538 }
2539
2540 memset ((char *) p + oldsz, 0, add);
2541
2542 return (p);
2543 }
2544
2545 char *mystrdup (const char *s)
2546 {
2547 const size_t len = strlen (s);
2548
2549 char *b = (char *) mymalloc (len + 1);
2550
2551 memcpy (b, s, len);
2552
2553 return (b);
2554 }
2555
2556 FILE *logfile_open (char *logfile)
2557 {
2558 FILE *fp = fopen (logfile, "ab");
2559
2560 if (fp == NULL)
2561 {
2562 fp = stdout;
2563 }
2564
2565 return fp;
2566 }
2567
2568 void logfile_close (FILE *fp)
2569 {
2570 if (fp == stdout) return;
2571
2572 fclose (fp);
2573 }
2574
2575 void logfile_append (const char *fmt, ...)
2576 {
2577 if (data.logfile_disable == 1) return;
2578
2579 FILE *fp = logfile_open (data.logfile);
2580
2581 va_list ap;
2582
2583 va_start (ap, fmt);
2584
2585 vfprintf (fp, fmt, ap);
2586
2587 va_end (ap);
2588
2589 fputc ('\n', fp);
2590
2591 fflush (fp);
2592
2593 logfile_close (fp);
2594 }
2595
2596 int logfile_generate_id ()
2597 {
2598 const int n = rand ();
2599
2600 time_t t;
2601
2602 time (&t);
2603
2604 return t + n;
2605 }
2606
2607 char *logfile_generate_topid ()
2608 {
2609 const int id = logfile_generate_id ();
2610
2611 char *topid = (char *) mymalloc (1 + 16 + 1);
2612
2613 snprintf (topid, 1 + 16, "TOP%08x", id);
2614
2615 return topid;
2616 }
2617
2618 char *logfile_generate_subid ()
2619 {
2620 const int id = logfile_generate_id ();
2621
2622 char *subid = (char *) mymalloc (1 + 16 + 1);
2623
2624 snprintf (subid, 1 + 16, "SUB%08x", id);
2625
2626 return subid;
2627 }
2628
2629 /**
2630 * system
2631 */
2632
2633 #if F_SETLKW
2634 void lock_file (FILE *fp)
2635 {
2636 struct flock lock;
2637
2638 memset (&lock, 0, sizeof (struct flock));
2639
2640 lock.l_type = F_WRLCK;
2641 while (fcntl(fileno(fp), F_SETLKW, &lock))
2642 {
2643 if (errno != EINTR)
2644 {
2645 log_error ("ERROR: failed acquiring write lock: %s", strerror (errno));
2646
2647 exit (-1);
2648 }
2649 }
2650 }
2651
2652 void unlock_file (FILE *fp)
2653 {
2654 struct flock lock;
2655
2656 memset (&lock, 0, sizeof (struct flock));
2657
2658 lock.l_type = F_UNLCK;
2659 fcntl(fileno(fp), F_SETLK, &lock);
2660 }
2661 #endif // F_SETLKW
2662
2663 #ifdef _WIN
2664 void fsync (int fd)
2665 {
2666 HANDLE h = (HANDLE) _get_osfhandle (fd);
2667
2668 FlushFileBuffers (h);
2669 }
2670 #endif
2671
2672 /**
2673 * thermal
2674 */
2675
2676 #ifdef HAVE_HWMON
2677 #if defined(_WIN) && defined(HAVE_NVAPI)
2678 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2679 {
2680 NvU32 pGpuCount;
2681
2682 if (hm_NvAPI_EnumPhysicalGPUs (data.hm_nv, nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2683
2684 if (pGpuCount == 0)
2685 {
2686 log_info ("WARN: No NvAPI adapters found");
2687
2688 return (0);
2689 }
2690
2691 return (pGpuCount);
2692 }
2693 #endif // _WIN && HAVE_NVAPI
2694
2695 #if defined(LINUX) && defined(HAVE_NVML)
2696 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2697 {
2698 int pGpuCount = 0;
2699
2700 for (uint i = 0; i < DEVICES_MAX; i++)
2701 {
2702 if (hm_NVML_nvmlDeviceGetHandleByIndex (data.hm_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2703
2704 // can be used to determine if the device by index matches the cuda device by index
2705 // char name[100]; memset (name, 0, sizeof (name));
2706 // hm_NVML_nvmlDeviceGetName (data.hm_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2707
2708 pGpuCount++;
2709 }
2710
2711 if (pGpuCount == 0)
2712 {
2713 log_info ("WARN: No NVML adapters found");
2714
2715 return (0);
2716 }
2717
2718 return (pGpuCount);
2719 }
2720 #endif // LINUX && HAVE_NVML
2721
2722 #ifdef HAVE_ADL
2723 int get_adapters_num_amd (void *adl, int *iNumberAdapters)
2724 {
2725 if (hm_ADL_Adapter_NumberOfAdapters_Get ((ADL_PTR *) adl, iNumberAdapters) != ADL_OK) return -1;
2726
2727 if (iNumberAdapters == 0)
2728 {
2729 log_info ("WARN: No ADL adapters found.");
2730
2731 return -1;
2732 }
2733
2734 return 0;
2735 }
2736
2737 /*
2738 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2739 {
2740 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2741 ADLODParameters lpOdParameters;
2742
2743 lpOdParameters.iSize = sizeof (ADLODParameters);
2744 size_t plevels_size = 0;
2745
2746 if (hm_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2747
2748 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2749 __func__, iAdapterIndex,
2750 lpOdParameters.iNumberOfPerformanceLevels,
2751 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2752 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2753
2754 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2755
2756 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2757
2758 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2759
2760 if (hm_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2761
2762 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2763 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2764 __func__, iAdapterIndex, j,
2765 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2766
2767 myfree (lpOdPerformanceLevels);
2768
2769 return 0;
2770 }
2771 */
2772
2773 LPAdapterInfo hm_get_adapter_info_amd (void *adl, int iNumberAdapters)
2774 {
2775 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2776
2777 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2778
2779 if (hm_ADL_Adapter_AdapterInfo_Get ((ADL_PTR *) adl, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2780
2781 return lpAdapterInfo;
2782 }
2783
2784 /*
2785 //
2786 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2787 //
2788
2789 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2790 {
2791 u32 idx = -1;
2792
2793 for (uint i = 0; i < num_adl_adapters; i++)
2794 {
2795 int opencl_bus_num = hm_device[i].busid;
2796 int opencl_dev_num = hm_device[i].devid;
2797
2798 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2799 {
2800 idx = i;
2801
2802 break;
2803 }
2804 }
2805
2806 if (idx >= DEVICES_MAX) return -1;
2807
2808 return idx;
2809 }
2810
2811 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2812 {
2813 for (uint i = 0; i < opencl_num_devices; i++)
2814 {
2815 cl_device_topology_amd device_topology;
2816
2817 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2818
2819 hm_device[i].busid = device_topology.pcie.bus;
2820 hm_device[i].devid = device_topology.pcie.device;
2821 }
2822 }
2823 */
2824
2825 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2826 {
2827 // basically bubble sort
2828
2829 for (int i = 0; i < num_adl_adapters; i++)
2830 {
2831 for (int j = 0; j < num_adl_adapters - 1; j++)
2832 {
2833 // get info of adapter [x]
2834
2835 u32 adapter_index_x = valid_adl_device_list[j];
2836 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2837
2838 u32 bus_num_x = info_x.iBusNumber;
2839 u32 dev_num_x = info_x.iDeviceNumber;
2840
2841 // get info of adapter [y]
2842
2843 u32 adapter_index_y = valid_adl_device_list[j + 1];
2844 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2845
2846 u32 bus_num_y = info_y.iBusNumber;
2847 u32 dev_num_y = info_y.iDeviceNumber;
2848
2849 uint need_swap = 0;
2850
2851 if (bus_num_y < bus_num_x)
2852 {
2853 need_swap = 1;
2854 }
2855 else if (bus_num_y == bus_num_x)
2856 {
2857 if (dev_num_y < dev_num_x)
2858 {
2859 need_swap = 1;
2860 }
2861 }
2862
2863 if (need_swap == 1)
2864 {
2865 u32 temp = valid_adl_device_list[j + 1];
2866
2867 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2868 valid_adl_device_list[j + 0] = temp;
2869 }
2870 }
2871 }
2872 }
2873
2874 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2875 {
2876 *num_adl_adapters = 0;
2877
2878 u32 *adl_adapters = NULL;
2879
2880 int *bus_numbers = NULL;
2881 int *device_numbers = NULL;
2882
2883 for (int i = 0; i < iNumberAdapters; i++)
2884 {
2885 AdapterInfo info = lpAdapterInfo[i];
2886
2887 if (strlen (info.strUDID) < 1) continue;
2888
2889 #ifdef WIN
2890 if (info.iVendorID != 1002) continue;
2891 #else
2892 if (info.iVendorID != 0x1002) continue;
2893 #endif
2894
2895 if (info.iBusNumber < 0) continue;
2896 if (info.iDeviceNumber < 0) continue;
2897
2898 int found = 0;
2899
2900 for (int pos = 0; pos < *num_adl_adapters; pos++)
2901 {
2902 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2903 {
2904 found = 1;
2905 break;
2906 }
2907 }
2908
2909 if (found) continue;
2910
2911 // add it to the list
2912
2913 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2914
2915 adl_adapters[*num_adl_adapters] = i;
2916
2917 // rest is just bookkeeping
2918
2919 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2920 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2921
2922 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2923 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2924
2925 (*num_adl_adapters)++;
2926 }
2927
2928 myfree (bus_numbers);
2929 myfree (device_numbers);
2930
2931 // sort the list by increasing bus id, device id number
2932
2933 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2934
2935 return adl_adapters;
2936 }
2937
2938 int hm_check_fanspeed_control (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2939 {
2940 // loop through all valid devices
2941
2942 for (int i = 0; i < num_adl_adapters; i++)
2943 {
2944 u32 adapter_index = valid_adl_device_list[i];
2945
2946 // get AdapterInfo
2947
2948 AdapterInfo info = lpAdapterInfo[adapter_index];
2949
2950 // unfortunately this doesn't work since bus id and dev id are not unique
2951 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2952 // if (opencl_device_index == -1) continue;
2953
2954 int opencl_device_index = i;
2955
2956 // if (hm_show_performance_level (adl, info.iAdapterIndex) != 0) return -1;
2957
2958 // get fanspeed info
2959
2960 if (hm_device[opencl_device_index].od_version == 5)
2961 {
2962 ADLFanSpeedInfo FanSpeedInfo;
2963
2964 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2965
2966 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2967
2968 if (hm_ADL_Overdrive5_FanSpeedInfo_Get (adl, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2969
2970 // check read and write capability in fanspeedinfo
2971
2972 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2973 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2974 {
2975 hm_device[opencl_device_index].fan_supported = 1;
2976 }
2977 else
2978 {
2979 hm_device[opencl_device_index].fan_supported = 0;
2980 }
2981 }
2982 else // od_version == 6
2983 {
2984 ADLOD6FanSpeedInfo faninfo;
2985
2986 memset (&faninfo, 0, sizeof (faninfo));
2987
2988 if (hm_ADL_Overdrive6_FanSpeed_Get (adl, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2989
2990 // check read capability in fanspeedinfo
2991
2992 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2993 {
2994 hm_device[opencl_device_index].fan_supported = 1;
2995 }
2996 else
2997 {
2998 hm_device[opencl_device_index].fan_supported = 0;
2999 }
3000 }
3001 }
3002
3003 return 0;
3004 }
3005
3006 int hm_get_overdrive_version (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3007 {
3008 for (int i = 0; i < num_adl_adapters; i++)
3009 {
3010 u32 adapter_index = valid_adl_device_list[i];
3011
3012 // get AdapterInfo
3013
3014 AdapterInfo info = lpAdapterInfo[adapter_index];
3015
3016 // get overdrive version
3017
3018 int od_supported = 0;
3019 int od_enabled = 0;
3020 int od_version = 0;
3021
3022 if (hm_ADL_Overdrive_Caps (adl, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3023
3024 // store the overdrive version in hm_device
3025
3026 // unfortunately this doesn't work since bus id and dev id are not unique
3027 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3028 // if (opencl_device_index == -1) continue;
3029
3030 int opencl_device_index = i;
3031
3032 hm_device[opencl_device_index].od_version = od_version;
3033 }
3034
3035 return 0;
3036 }
3037
3038 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3039 {
3040 for (int i = 0; i < num_adl_adapters; i++)
3041 {
3042 u32 adapter_index = valid_adl_device_list[i];
3043
3044 // get AdapterInfo
3045
3046 AdapterInfo info = lpAdapterInfo[adapter_index];
3047
3048 // store the iAdapterIndex in hm_device
3049
3050 // unfortunately this doesn't work since bus id and dev id are not unique
3051 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3052 // if (opencl_device_index == -1) continue;
3053
3054 int opencl_device_index = i;
3055
3056 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3057 }
3058
3059 return num_adl_adapters;
3060 }
3061 #endif // HAVE_ADL
3062
3063 int hm_get_temperature_with_device_id (const uint device_id)
3064 {
3065 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3066
3067 #ifdef HAVE_ADL
3068 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3069 {
3070 if (data.hm_amd)
3071 {
3072 if (data.hm_device[device_id].od_version == 5)
3073 {
3074 ADLTemperature Temperature;
3075
3076 Temperature.iSize = sizeof (ADLTemperature);
3077
3078 if (hm_ADL_Overdrive5_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3079
3080 return Temperature.iTemperature / 1000;
3081 }
3082 else if (data.hm_device[device_id].od_version == 6)
3083 {
3084 int Temperature = 0;
3085
3086 if (hm_ADL_Overdrive6_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3087
3088 return Temperature / 1000;
3089 }
3090 }
3091 }
3092 #endif
3093
3094 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3095 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3096 {
3097 #if defined(LINUX) && defined(HAVE_NVML)
3098 int temperature = 0;
3099
3100 hm_NVML_nvmlDeviceGetTemperature (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3101
3102 return temperature;
3103 #endif
3104
3105 #if defined(WIN) && defined(HAVE_NVAPI)
3106 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3107
3108 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3109 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3110 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3111 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3112
3113 if (hm_NvAPI_GPU_GetThermalSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3114
3115 return pThermalSettings.sensor[0].currentTemp;
3116 #endif // WIN && HAVE_NVAPI
3117 }
3118 #endif // HAVE_NVML || HAVE_NVAPI
3119
3120 return -1;
3121 }
3122
3123 int hm_get_fanspeed_with_device_id (const uint device_id)
3124 {
3125 // we shouldn't really need this extra CL_DEVICE_TYPE_GPU check, because fan_supported should not be set w/ CPUs
3126 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3127
3128 if (data.hm_device[device_id].fan_supported == 1)
3129 {
3130 #ifdef HAVE_ADL
3131 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3132 {
3133 if (data.hm_amd)
3134 {
3135 if (data.hm_device[device_id].od_version == 5)
3136 {
3137 ADLFanSpeedValue lpFanSpeedValue;
3138
3139 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3140
3141 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3142 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3143 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3144
3145 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3146
3147 return lpFanSpeedValue.iFanSpeed;
3148 }
3149 else // od_version == 6
3150 {
3151 ADLOD6FanSpeedInfo faninfo;
3152
3153 memset (&faninfo, 0, sizeof (faninfo));
3154
3155 if (hm_ADL_Overdrive6_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3156
3157 return faninfo.iFanSpeedPercent;
3158 }
3159 }
3160 }
3161 #endif // HAVE_ADL
3162
3163 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3164 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3165 {
3166 #if defined(LINUX) && defined(HAVE_NVML)
3167 int speed = 0;
3168
3169 hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, (unsigned int *) &speed);
3170
3171 return speed;
3172 #endif
3173
3174 #if defined(WIN) && defined(HAVE_NVAPI)
3175
3176 NV_GPU_COOLER_SETTINGS pCoolerSettings;
3177
3178 pCoolerSettings.Version = GPU_COOLER_SETTINGS_VER | sizeof (NV_GPU_COOLER_SETTINGS);
3179
3180 hm_NvAPI_GPU_GetCoolerSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pCoolerSettings);
3181
3182 return pCoolerSettings.Cooler[0].CurrentLevel;
3183 #endif
3184 }
3185 #endif // HAVE_NVML || HAVE_NVAPI
3186 }
3187
3188 return -1;
3189 }
3190
3191 int hm_get_utilization_with_device_id (const uint device_id)
3192 {
3193 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3194
3195 #ifdef HAVE_ADL
3196 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3197 {
3198 if (data.hm_amd)
3199 {
3200 ADLPMActivity PMActivity;
3201
3202 PMActivity.iSize = sizeof (ADLPMActivity);
3203
3204 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3205
3206 return PMActivity.iActivityPercent;
3207 }
3208 }
3209 #endif // HAVE_ADL
3210
3211 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3212 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3213 {
3214 #if defined(LINUX) && defined(HAVE_NVML)
3215 nvmlUtilization_t utilization;
3216
3217 hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3218
3219 return utilization.gpu;
3220 #endif
3221
3222 #if defined(WIN) && defined(HAVE_NVAPI)
3223 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3224
3225 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3226
3227 if (hm_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3228
3229 return pDynamicPstatesInfoEx.utilization[0].percentage;
3230 #endif
3231 }
3232 #endif // HAVE_NVML || HAVE_NVAPI
3233
3234 return -1;
3235 }
3236
3237 #ifdef HAVE_ADL
3238 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3239 {
3240 if (data.hm_device[device_id].fan_supported == 1)
3241 {
3242 if (data.hm_amd)
3243 {
3244 if (data.hm_device[device_id].od_version == 5)
3245 {
3246 ADLFanSpeedValue lpFanSpeedValue;
3247
3248 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3249
3250 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3251 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3252 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3253 lpFanSpeedValue.iFanSpeed = fanspeed;
3254
3255 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3256
3257 return 0;
3258 }
3259 else // od_version == 6
3260 {
3261 ADLOD6FanSpeedValue fan_speed_value;
3262
3263 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3264
3265 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3266 fan_speed_value.iFanSpeed = fanspeed;
3267
3268 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3269
3270 return 0;
3271 }
3272 }
3273 }
3274
3275 return -1;
3276 }
3277 #endif
3278
3279 // helper function for status display
3280
3281 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3282 {
3283 #define VALUE_NOT_AVAILABLE "N/A"
3284
3285 if (value == -1)
3286 {
3287 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3288 }
3289 else
3290 {
3291 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3292 }
3293 }
3294 #endif // HAVE_HWMON
3295
3296 /**
3297 * maskprocessor
3298 */
3299
3300 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3301 {
3302 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3303
3304 if (css_cnt > SP_PW_MAX)
3305 {
3306 log_error ("ERROR: mask length is too long");
3307
3308 exit (-1);
3309 }
3310
3311 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3312 {
3313 uint *uniq_tbl = uniq_tbls[css_pos];
3314
3315 uint *cs_buf = css[css_pos].cs_buf;
3316 uint cs_len = css[css_pos].cs_len;
3317
3318 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3319 {
3320 uint c = cs_buf[cs_pos] & 0xff;
3321
3322 uniq_tbl[c] = 1;
3323 }
3324 }
3325 }
3326
3327 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3328 {
3329 cs_t *cs = &css[css_cnt];
3330
3331 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3332
3333 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3334
3335 size_t i;
3336
3337 for (i = 0; i < cs->cs_len; i++)
3338 {
3339 const uint u = cs->cs_buf[i];
3340
3341 css_uniq[u] = 1;
3342 }
3343
3344 for (i = 0; i < in_len; i++)
3345 {
3346 uint u = in_buf[i] & 0xff;
3347
3348 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3349
3350 if (css_uniq[u] == 1) continue;
3351
3352 css_uniq[u] = 1;
3353
3354 cs->cs_buf[cs->cs_len] = u;
3355
3356 cs->cs_len++;
3357 }
3358
3359 myfree (css_uniq);
3360 }
3361
3362 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3363 {
3364 size_t in_pos;
3365
3366 for (in_pos = 0; in_pos < in_len; in_pos++)
3367 {
3368 uint p0 = in_buf[in_pos] & 0xff;
3369
3370 if (interpret == 1 && p0 == '?')
3371 {
3372 in_pos++;
3373
3374 if (in_pos == in_len) break;
3375
3376 uint p1 = in_buf[in_pos] & 0xff;
3377
3378 switch (p1)
3379 {
3380 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3381 break;
3382 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3383 break;
3384 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3385 break;
3386 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3387 break;
3388 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3389 break;
3390 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3391 break;
3392 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3393 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3394 break;
3395 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3396 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3397 break;
3398 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3399 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3400 break;
3401 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3402 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3403 break;
3404 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3405 break;
3406 default: log_error ("Syntax error: %s", in_buf);
3407 exit (-1);
3408 }
3409 }
3410 else
3411 {
3412 if (data.hex_charset)
3413 {
3414 in_pos++;
3415
3416 if (in_pos == in_len)
3417 {
3418 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3419
3420 exit (-1);
3421 }
3422
3423 uint p1 = in_buf[in_pos] & 0xff;
3424
3425 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3426 {
3427 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3428
3429 exit (-1);
3430 }
3431
3432 uint chr = 0;
3433
3434 chr = hex_convert (p1) << 0;
3435 chr |= hex_convert (p0) << 4;
3436
3437 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3438 }
3439 else
3440 {
3441 uint chr = p0;
3442
3443 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3444 }
3445 }
3446 }
3447 }
3448
3449 u64 mp_get_sum (uint css_cnt, cs_t *css)
3450 {
3451 u64 sum = 1;
3452
3453 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3454 {
3455 sum *= css[css_pos].cs_len;
3456 }
3457
3458 return (sum);
3459 }
3460
3461 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3462 {
3463 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3464
3465 uint mask_pos;
3466 uint css_pos;
3467
3468 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3469 {
3470 char p0 = mask_buf[mask_pos];
3471
3472 if (p0 == '?')
3473 {
3474 mask_pos++;
3475
3476 if (mask_pos == mask_len) break;
3477
3478 char p1 = mask_buf[mask_pos];
3479
3480 uint chr = p1;
3481
3482 switch (p1)
3483 {
3484 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3485 break;
3486 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3487 break;
3488 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3489 break;
3490 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3491 break;
3492 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3493 break;
3494 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3495 break;
3496 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3497 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3498 break;
3499 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3500 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3501 break;
3502 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3503 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3504 break;
3505 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3506 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3507 break;
3508 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3509 break;
3510 default: log_error ("ERROR: syntax error: %s", mask_buf);
3511 exit (-1);
3512 }
3513 }
3514 else
3515 {
3516 if (data.hex_charset)
3517 {
3518 mask_pos++;
3519
3520 // if there is no 2nd hex character, show an error:
3521
3522 if (mask_pos == mask_len)
3523 {
3524 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3525
3526 exit (-1);
3527 }
3528
3529 char p1 = mask_buf[mask_pos];
3530
3531 // if they are not valid hex character, show an error:
3532
3533 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3534 {
3535 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3536
3537 exit (-1);
3538 }
3539
3540 uint chr = 0;
3541
3542 chr |= hex_convert (p1) << 0;
3543 chr |= hex_convert (p0) << 4;
3544
3545 mp_add_cs_buf (&chr, 1, css, css_pos);
3546 }
3547 else
3548 {
3549 uint chr = p0;
3550
3551 mp_add_cs_buf (&chr, 1, css, css_pos);
3552 }
3553 }
3554 }
3555
3556 if (css_pos == 0)
3557 {
3558 log_error ("ERROR: invalid mask length (0)");
3559
3560 exit (-1);
3561 }
3562
3563 *css_cnt = css_pos;
3564
3565 return (css);
3566 }
3567
3568 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3569 {
3570 for (int i = 0; i < css_cnt; i++)
3571 {
3572 uint len = css[i].cs_len;
3573 u64 next = val / len;
3574 uint pos = val % len;
3575 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3576 val = next;
3577 }
3578 }
3579
3580 void mp_cut_at (char *mask, uint max)
3581 {
3582 uint i;
3583 uint j;
3584 uint mask_len = strlen (mask);
3585
3586 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3587 {
3588 if (mask[i] == '?') i++;
3589 }
3590
3591 mask[i] = 0;
3592 }
3593
3594 void mp_setup_sys (cs_t *mp_sys)
3595 {
3596 uint pos;
3597 uint chr;
3598 uint donec[CHARSIZ] = { 0 };
3599
3600 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3601 mp_sys[0].cs_buf[pos++] = chr;
3602 mp_sys[0].cs_len = pos; }
3603
3604 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3605 mp_sys[1].cs_buf[pos++] = chr;
3606 mp_sys[1].cs_len = pos; }
3607
3608 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3609 mp_sys[2].cs_buf[pos++] = chr;
3610 mp_sys[2].cs_len = pos; }
3611
3612 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3613 mp_sys[3].cs_buf[pos++] = chr;
3614 mp_sys[3].cs_len = pos; }
3615
3616 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3617 mp_sys[4].cs_len = pos; }
3618
3619 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3620 mp_sys[5].cs_len = pos; }
3621 }
3622
3623 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3624 {
3625 FILE *fp = fopen (buf, "rb");
3626
3627 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3628 {
3629 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3630 }
3631 else
3632 {
3633 char mp_file[1024] = { 0 };
3634
3635 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3636
3637 fclose (fp);
3638
3639 len = in_superchop (mp_file);
3640
3641 if (len == 0)
3642 {
3643 log_info ("WARNING: charset file corrupted");
3644
3645 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3646 }
3647 else
3648 {
3649 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3650 }
3651 }
3652 }
3653
3654 void mp_reset_usr (cs_t *mp_usr, uint index)
3655 {
3656 mp_usr[index].cs_len = 0;
3657
3658 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3659 }
3660
3661 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3662 {
3663 char *new_mask_buf = (char *) mymalloc (256);
3664
3665 uint mask_pos;
3666
3667 uint css_pos;
3668
3669 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3670 {
3671 if (css_pos == len) break;
3672
3673 char p0 = mask_buf[mask_pos];
3674
3675 new_mask_buf[mask_pos] = p0;
3676
3677 if (p0 == '?')
3678 {
3679 mask_pos++;
3680
3681 if (mask_pos == mask_len) break;
3682
3683 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3684 }
3685 else
3686 {
3687 if (data.hex_charset)
3688 {
3689 mask_pos++;
3690
3691 if (mask_pos == mask_len)
3692 {
3693 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3694
3695 exit (-1);
3696 }
3697
3698 char p1 = mask_buf[mask_pos];
3699
3700 // if they are not valid hex character, show an error:
3701
3702 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3703 {
3704 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3705
3706 exit (-1);
3707 }
3708
3709 new_mask_buf[mask_pos] = p1;
3710 }
3711 }
3712 }
3713
3714 if (css_pos == len) return (new_mask_buf);
3715
3716 myfree (new_mask_buf);
3717
3718 return (NULL);
3719 }
3720
3721 /**
3722 * statprocessor
3723 */
3724
3725 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3726 {
3727 u64 sum = 1;
3728
3729 uint i;
3730
3731 for (i = start; i < stop; i++)
3732 {
3733 sum *= root_css_buf[i].cs_len;
3734 }
3735
3736 return (sum);
3737 }
3738
3739 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3740 {
3741 u64 v = ctx;
3742
3743 cs_t *cs = &root_css_buf[start];
3744
3745 uint i;
3746
3747 for (i = start; i < stop; i++)
3748 {
3749 const u64 m = v % cs->cs_len;
3750 const u64 d = v / cs->cs_len;
3751
3752 v = d;
3753
3754 const uint k = cs->cs_buf[m];
3755
3756 pw_buf[i - start] = (char) k;
3757
3758 cs = &markov_css_buf[(i * CHARSIZ) + k];
3759 }
3760 }
3761
3762 int sp_comp_val (const void *p1, const void *p2)
3763 {
3764 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3765 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3766
3767 return b2->val - b1->val;
3768 }
3769
3770 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)
3771 {
3772 uint i;
3773 uint j;
3774 uint k;
3775
3776 /**
3777 * Initialize hcstats
3778 */
3779
3780 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3781
3782 u64 *root_stats_ptr = root_stats_buf;
3783
3784 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3785
3786 for (i = 0; i < SP_PW_MAX; i++)
3787 {
3788 root_stats_buf_by_pos[i] = root_stats_ptr;
3789
3790 root_stats_ptr += CHARSIZ;
3791 }
3792
3793 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3794
3795 u64 *markov_stats_ptr = markov_stats_buf;
3796
3797 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3798
3799 for (i = 0; i < SP_PW_MAX; i++)
3800 {
3801 for (j = 0; j < CHARSIZ; j++)
3802 {
3803 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3804
3805 markov_stats_ptr += CHARSIZ;
3806 }
3807 }
3808
3809 /**
3810 * Load hcstats File
3811 */
3812
3813 if (hcstat == NULL)
3814 {
3815 char hcstat_tmp[256] = { 0 };
3816
3817 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3818
3819 hcstat = hcstat_tmp;
3820 }
3821
3822 FILE *fd = fopen (hcstat, "rb");
3823
3824 if (fd == NULL)
3825 {
3826 log_error ("%s: %s", hcstat, strerror (errno));
3827
3828 exit (-1);
3829 }
3830
3831 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3832 {
3833 log_error ("%s: Could not load data", hcstat);
3834
3835 fclose (fd);
3836
3837 exit (-1);
3838 }
3839
3840 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3841 {
3842 log_error ("%s: Could not load data", hcstat);
3843
3844 fclose (fd);
3845
3846 exit (-1);
3847 }
3848
3849 fclose (fd);
3850
3851 /**
3852 * Markov modifier of hcstat_table on user request
3853 */
3854
3855 if (disable)
3856 {
3857 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3858 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3859 }
3860
3861 if (classic)
3862 {
3863 /* Add all stats to first position */
3864
3865 for (i = 1; i < SP_PW_MAX; i++)
3866 {
3867 u64 *out = root_stats_buf_by_pos[0];
3868 u64 *in = root_stats_buf_by_pos[i];
3869
3870 for (j = 0; j < CHARSIZ; j++)
3871 {
3872 *out++ += *in++;
3873 }
3874 }
3875
3876 for (i = 1; i < SP_PW_MAX; i++)
3877 {
3878 u64 *out = markov_stats_buf_by_key[0][0];
3879 u64 *in = markov_stats_buf_by_key[i][0];
3880
3881 for (j = 0; j < CHARSIZ; j++)
3882 {
3883 for (k = 0; k < CHARSIZ; k++)
3884 {
3885 *out++ += *in++;
3886 }
3887 }
3888 }
3889
3890 /* copy them to all pw_positions */
3891
3892 for (i = 1; i < SP_PW_MAX; i++)
3893 {
3894 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
3895 }
3896
3897 for (i = 1; i < SP_PW_MAX; i++)
3898 {
3899 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
3900 }
3901 }
3902
3903 /**
3904 * Initialize tables
3905 */
3906
3907 hcstat_table_t *root_table_ptr = root_table_buf;
3908
3909 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3910
3911 for (i = 0; i < SP_PW_MAX; i++)
3912 {
3913 root_table_buf_by_pos[i] = root_table_ptr;
3914
3915 root_table_ptr += CHARSIZ;
3916 }
3917
3918 hcstat_table_t *markov_table_ptr = markov_table_buf;
3919
3920 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3921
3922 for (i = 0; i < SP_PW_MAX; i++)
3923 {
3924 for (j = 0; j < CHARSIZ; j++)
3925 {
3926 markov_table_buf_by_key[i][j] = markov_table_ptr;
3927
3928 markov_table_ptr += CHARSIZ;
3929 }
3930 }
3931
3932 /**
3933 * Convert hcstat to tables
3934 */
3935
3936 for (i = 0; i < SP_ROOT_CNT; i++)
3937 {
3938 uint key = i % CHARSIZ;
3939
3940 root_table_buf[i].key = key;
3941 root_table_buf[i].val = root_stats_buf[i];
3942 }
3943
3944 for (i = 0; i < SP_MARKOV_CNT; i++)
3945 {
3946 uint key = i % CHARSIZ;
3947
3948 markov_table_buf[i].key = key;
3949 markov_table_buf[i].val = markov_stats_buf[i];
3950 }
3951
3952 myfree (root_stats_buf);
3953 myfree (markov_stats_buf);
3954
3955 /**
3956 * Finally sort them
3957 */
3958
3959 for (i = 0; i < SP_PW_MAX; i++)
3960 {
3961 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3962 }
3963
3964 for (i = 0; i < SP_PW_MAX; i++)
3965 {
3966 for (j = 0; j < CHARSIZ; j++)
3967 {
3968 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3969 }
3970 }
3971 }
3972
3973 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])
3974 {
3975 /**
3976 * Convert tables to css
3977 */
3978
3979 for (uint i = 0; i < SP_ROOT_CNT; i++)
3980 {
3981 uint pw_pos = i / CHARSIZ;
3982
3983 cs_t *cs = &root_css_buf[pw_pos];
3984
3985 if (cs->cs_len == threshold) continue;
3986
3987 uint key = root_table_buf[i].key;
3988
3989 if (uniq_tbls[pw_pos][key] == 0) continue;
3990
3991 cs->cs_buf[cs->cs_len] = key;
3992
3993 cs->cs_len++;
3994 }
3995
3996 /**
3997 * Convert table to css
3998 */
3999
4000 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4001 {
4002 uint c = i / CHARSIZ;
4003
4004 cs_t *cs = &markov_css_buf[c];
4005
4006 if (cs->cs_len == threshold) continue;
4007
4008 uint pw_pos = c / CHARSIZ;
4009
4010 uint key = markov_table_buf[i].key;
4011
4012 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4013
4014 cs->cs_buf[cs->cs_len] = key;
4015
4016 cs->cs_len++;
4017 }
4018
4019 /*
4020 for (uint i = 0; i < 8; i++)
4021 {
4022 for (uint j = 0x20; j < 0x80; j++)
4023 {
4024 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4025
4026 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4027
4028 for (uint k = 0; k < 10; k++)
4029 {
4030 printf (" %u\n", ptr->cs_buf[k]);
4031 }
4032 }
4033 }
4034 */
4035 }
4036
4037 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4038 {
4039 for (uint i = 0; i < SP_PW_MAX; i += 2)
4040 {
4041 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4042
4043 out += CHARSIZ;
4044 in += CHARSIZ;
4045
4046 out->key = 0;
4047 out->val = 1;
4048
4049 out++;
4050
4051 for (uint j = 1; j < CHARSIZ; j++)
4052 {
4053 out->key = j;
4054 out->val = 0;
4055
4056 out++;
4057 }
4058 }
4059 }
4060
4061 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4062 {
4063 for (uint i = 0; i < SP_PW_MAX; i += 2)
4064 {
4065 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4066
4067 out += CHARSIZ * CHARSIZ;
4068 in += CHARSIZ * CHARSIZ;
4069
4070 for (uint j = 0; j < CHARSIZ; j++)
4071 {
4072 out->key = 0;
4073 out->val = 1;
4074
4075 out++;
4076
4077 for (uint k = 1; k < CHARSIZ; k++)
4078 {
4079 out->key = k;
4080 out->val = 0;
4081
4082 out++;
4083 }
4084 }
4085 }
4086 }
4087
4088 /**
4089 * mixed shared functions
4090 */
4091
4092 void dump_hex (const u8 *s, const int sz)
4093 {
4094 for (int i = 0; i < sz; i++)
4095 {
4096 log_info_nn ("%02x ", s[i]);
4097 }
4098
4099 log_info ("");
4100 }
4101
4102 void usage_mini_print (const char *progname)
4103 {
4104 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4105 }
4106
4107 void usage_big_print (const char *progname)
4108 {
4109 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4110 }
4111
4112 char *get_exec_path ()
4113 {
4114 int exec_path_len = 1024;
4115
4116 char *exec_path = (char *) mymalloc (exec_path_len);
4117
4118 #ifdef LINUX
4119
4120 char tmp[32] = { 0 };
4121
4122 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4123
4124 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4125
4126 #elif WIN
4127
4128 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4129
4130 #elif OSX
4131
4132 uint size = exec_path_len;
4133
4134 if (_NSGetExecutablePath (exec_path, &size) != 0)
4135 {
4136 log_error("! executable path buffer too small\n");
4137
4138 exit (-1);
4139 }
4140
4141 const int len = strlen (exec_path);
4142
4143 #else
4144 #error Your Operating System is not supported or detected
4145 #endif
4146
4147 exec_path[len] = 0;
4148
4149 return exec_path;
4150 }
4151
4152 char *get_install_dir (const char *progname)
4153 {
4154 char *install_dir = mystrdup (progname);
4155 char *last_slash = NULL;
4156
4157 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4158 {
4159 *last_slash = 0;
4160 }
4161 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4162 {
4163 *last_slash = 0;
4164 }
4165 else
4166 {
4167 install_dir[0] = '.';
4168 install_dir[1] = 0;
4169 }
4170
4171 return (install_dir);
4172 }
4173
4174 char *get_profile_dir (const char *homedir)
4175 {
4176 #define DOT_HASHCAT ".hashcat"
4177
4178 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4179
4180 char *profile_dir = (char *) mymalloc (len + 1);
4181
4182 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4183
4184 return profile_dir;
4185 }
4186
4187 char *get_session_dir (const char *profile_dir)
4188 {
4189 #define SESSIONS_FOLDER "sessions"
4190
4191 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4192
4193 char *session_dir = (char *) mymalloc (len + 1);
4194
4195 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4196
4197 return session_dir;
4198 }
4199
4200 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4201 {
4202 uint crc = ~0;
4203
4204 FILE *fd = fopen (filename, "rb");
4205
4206 if (fd == NULL)
4207 {
4208 log_error ("%s: %s", filename, strerror (errno));
4209
4210 exit (-1);
4211 }
4212
4213 #define MAX_KEY_SIZE (1024 * 1024)
4214
4215 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4216
4217 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4218
4219 fclose (fd);
4220
4221 int kpos = 0;
4222
4223 for (int fpos = 0; fpos < nread; fpos++)
4224 {
4225 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4226
4227 keytab[kpos++] += (crc >> 24) & 0xff;
4228 keytab[kpos++] += (crc >> 16) & 0xff;
4229 keytab[kpos++] += (crc >> 8) & 0xff;
4230 keytab[kpos++] += (crc >> 0) & 0xff;
4231
4232 if (kpos >= 64) kpos = 0;
4233 }
4234
4235 myfree (buf);
4236 }
4237
4238 #ifdef OSX
4239 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4240 {
4241 int core;
4242
4243 for (core = 0; core < (8 * (int)cpu_size); core++)
4244 if (CPU_ISSET(core, cpu_set)) break;
4245
4246 thread_affinity_policy_data_t policy = { core };
4247
4248 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4249
4250 if (data.quiet == 0)
4251 {
4252 if (rc != KERN_SUCCESS)
4253 {
4254 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4255 }
4256 }
4257
4258 return rc;
4259 }
4260 #endif
4261
4262 void set_cpu_affinity (char *cpu_affinity)
4263 {
4264 #ifdef WIN
4265 DWORD_PTR aff_mask = 0;
4266 #elif _POSIX
4267 cpu_set_t cpuset;
4268 CPU_ZERO (&cpuset);
4269 #endif
4270
4271 if (cpu_affinity)
4272 {
4273 char *devices = strdup (cpu_affinity);
4274
4275 char *next = strtok (devices, ",");
4276
4277 do
4278 {
4279 uint cpu_id = atoi (next);
4280
4281 if (cpu_id == 0)
4282 {
4283 #ifdef WIN
4284 aff_mask = 0;
4285 #elif _POSIX
4286 CPU_ZERO (&cpuset);
4287 #endif
4288
4289 break;
4290 }
4291
4292 if (cpu_id > 32)
4293 {
4294 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4295
4296 exit (-1);
4297 }
4298
4299 #ifdef WIN
4300 aff_mask |= 1 << (cpu_id - 1);
4301 #elif _POSIX
4302 CPU_SET ((cpu_id - 1), &cpuset);
4303 #endif
4304
4305 } while ((next = strtok (NULL, ",")) != NULL);
4306
4307 free (devices);
4308 }
4309
4310 #ifdef WIN
4311 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4312 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4313 #elif _POSIX
4314 pthread_t thread = pthread_self ();
4315 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4316 #endif
4317 }
4318
4319 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4320 {
4321 char *element, *end;
4322
4323 end = (char *) base + nmemb * size;
4324
4325 for (element = (char *) base; element < end; element += size)
4326 if (!compar (element, key))
4327 return element;
4328
4329 return NULL;
4330 }
4331
4332 int sort_by_salt (const void *v1, const void *v2)
4333 {
4334 const salt_t *s1 = (const salt_t *) v1;
4335 const salt_t *s2 = (const salt_t *) v2;
4336
4337 const int res1 = s1->salt_len - s2->salt_len;
4338
4339 if (res1 != 0) return (res1);
4340
4341 const int res2 = s1->salt_iter - s2->salt_iter;
4342
4343 if (res2 != 0) return (res2);
4344
4345 uint n;
4346
4347 n = 12;
4348
4349 while (n--)
4350 {
4351 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4352 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4353 }
4354
4355 n = 8;
4356
4357 while (n--)
4358 {
4359 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4360 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4361 }
4362
4363 return (0);
4364 }
4365
4366 int sort_by_salt_buf (const void *v1, const void *v2)
4367 {
4368 const pot_t *p1 = (const pot_t *) v1;
4369 const pot_t *p2 = (const pot_t *) v2;
4370
4371 const hash_t *h1 = &p1->hash;
4372 const hash_t *h2 = &p2->hash;
4373
4374 const salt_t *s1 = h1->salt;
4375 const salt_t *s2 = h2->salt;
4376
4377 uint n = 12;
4378
4379 while (n--)
4380 {
4381 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4382 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4383 }
4384
4385 return 0;
4386 }
4387
4388 int sort_by_hash_t_salt (const void *v1, const void *v2)
4389 {
4390 const hash_t *h1 = (const hash_t *) v1;
4391 const hash_t *h2 = (const hash_t *) v2;
4392
4393 const salt_t *s1 = h1->salt;
4394 const salt_t *s2 = h2->salt;
4395
4396 // testphase: this should work
4397 uint n = 12;
4398
4399 while (n--)
4400 {
4401 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4402 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4403 }
4404
4405 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4406 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4407 if (s1->salt_len > s2->salt_len) return ( 1);
4408 if (s1->salt_len < s2->salt_len) return (-1);
4409
4410 uint n = s1->salt_len;
4411
4412 while (n--)
4413 {
4414 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4415 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4416 }
4417 */
4418
4419 return 0;
4420 }
4421
4422 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4423 {
4424 const hash_t *h1 = (const hash_t *) v1;
4425 const hash_t *h2 = (const hash_t *) v2;
4426
4427 const salt_t *s1 = h1->salt;
4428 const salt_t *s2 = h2->salt;
4429
4430 // 12 - 2 (since last 2 uints contain the digest)
4431 uint n = 10;
4432
4433 while (n--)
4434 {
4435 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4436 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4437 }
4438
4439 return 0;
4440 }
4441
4442 int sort_by_hash_no_salt (const void *v1, const void *v2)
4443 {
4444 const hash_t *h1 = (const hash_t *) v1;
4445 const hash_t *h2 = (const hash_t *) v2;
4446
4447 const void *d1 = h1->digest;
4448 const void *d2 = h2->digest;
4449
4450 return data.sort_by_digest (d1, d2);
4451 }
4452
4453 int sort_by_hash (const void *v1, const void *v2)
4454 {
4455 const hash_t *h1 = (const hash_t *) v1;
4456 const hash_t *h2 = (const hash_t *) v2;
4457
4458 if (data.isSalted)
4459 {
4460 const salt_t *s1 = h1->salt;
4461 const salt_t *s2 = h2->salt;
4462
4463 int res = sort_by_salt (s1, s2);
4464
4465 if (res != 0) return (res);
4466 }
4467
4468 const void *d1 = h1->digest;
4469 const void *d2 = h2->digest;
4470
4471 return data.sort_by_digest (d1, d2);
4472 }
4473
4474 int sort_by_pot (const void *v1, const void *v2)
4475 {
4476 const pot_t *p1 = (const pot_t *) v1;
4477 const pot_t *p2 = (const pot_t *) v2;
4478
4479 const hash_t *h1 = &p1->hash;
4480 const hash_t *h2 = &p2->hash;
4481
4482 return sort_by_hash (h1, h2);
4483 }
4484
4485 int sort_by_mtime (const void *p1, const void *p2)
4486 {
4487 const char **f1 = (const char **) p1;
4488 const char **f2 = (const char **) p2;
4489
4490 struct stat s1; stat (*f1, &s1);
4491 struct stat s2; stat (*f2, &s2);
4492
4493 return s2.st_mtime - s1.st_mtime;
4494 }
4495
4496 int sort_by_cpu_rule (const void *p1, const void *p2)
4497 {
4498 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4499 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4500
4501 return memcmp (r1, r2, sizeof (cpu_rule_t));
4502 }
4503
4504 int sort_by_kernel_rule (const void *p1, const void *p2)
4505 {
4506 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4507 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4508
4509 return memcmp (r1, r2, sizeof (kernel_rule_t));
4510 }
4511
4512 int sort_by_stringptr (const void *p1, const void *p2)
4513 {
4514 const char **s1 = (const char **) p1;
4515 const char **s2 = (const char **) p2;
4516
4517 return strcmp (*s1, *s2);
4518 }
4519
4520 int sort_by_dictstat (const void *s1, const void *s2)
4521 {
4522 dictstat_t *d1 = (dictstat_t *) s1;
4523 dictstat_t *d2 = (dictstat_t *) s2;
4524
4525 #ifdef LINUX
4526 d2->stat.st_atim = d1->stat.st_atim;
4527 #else
4528 d2->stat.st_atime = d1->stat.st_atime;
4529 #endif
4530
4531 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4532 }
4533
4534 int sort_by_bitmap (const void *p1, const void *p2)
4535 {
4536 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4537 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4538
4539 return b1->collisions - b2->collisions;
4540 }
4541
4542 int sort_by_digest_4_2 (const void *v1, const void *v2)
4543 {
4544 const u32 *d1 = (const u32 *) v1;
4545 const u32 *d2 = (const u32 *) v2;
4546
4547 uint n = 2;
4548
4549 while (n--)
4550 {
4551 if (d1[n] > d2[n]) return ( 1);
4552 if (d1[n] < d2[n]) return (-1);
4553 }
4554
4555 return (0);
4556 }
4557
4558 int sort_by_digest_4_4 (const void *v1, const void *v2)
4559 {
4560 const u32 *d1 = (const u32 *) v1;
4561 const u32 *d2 = (const u32 *) v2;
4562
4563 uint n = 4;
4564
4565 while (n--)
4566 {
4567 if (d1[n] > d2[n]) return ( 1);
4568 if (d1[n] < d2[n]) return (-1);
4569 }
4570
4571 return (0);
4572 }
4573
4574 int sort_by_digest_4_5 (const void *v1, const void *v2)
4575 {
4576 const u32 *d1 = (const u32 *) v1;
4577 const u32 *d2 = (const u32 *) v2;
4578
4579 uint n = 5;
4580
4581 while (n--)
4582 {
4583 if (d1[n] > d2[n]) return ( 1);
4584 if (d1[n] < d2[n]) return (-1);
4585 }
4586
4587 return (0);
4588 }
4589
4590 int sort_by_digest_4_6 (const void *v1, const void *v2)
4591 {
4592 const u32 *d1 = (const u32 *) v1;
4593 const u32 *d2 = (const u32 *) v2;
4594
4595 uint n = 6;
4596
4597 while (n--)
4598 {
4599 if (d1[n] > d2[n]) return ( 1);
4600 if (d1[n] < d2[n]) return (-1);
4601 }
4602
4603 return (0);
4604 }
4605
4606 int sort_by_digest_4_8 (const void *v1, const void *v2)
4607 {
4608 const u32 *d1 = (const u32 *) v1;
4609 const u32 *d2 = (const u32 *) v2;
4610
4611 uint n = 8;
4612
4613 while (n--)
4614 {
4615 if (d1[n] > d2[n]) return ( 1);
4616 if (d1[n] < d2[n]) return (-1);
4617 }
4618
4619 return (0);
4620 }
4621
4622 int sort_by_digest_4_16 (const void *v1, const void *v2)
4623 {
4624 const u32 *d1 = (const u32 *) v1;
4625 const u32 *d2 = (const u32 *) v2;
4626
4627 uint n = 16;
4628
4629 while (n--)
4630 {
4631 if (d1[n] > d2[n]) return ( 1);
4632 if (d1[n] < d2[n]) return (-1);
4633 }
4634
4635 return (0);
4636 }
4637
4638 int sort_by_digest_4_32 (const void *v1, const void *v2)
4639 {
4640 const u32 *d1 = (const u32 *) v1;
4641 const u32 *d2 = (const u32 *) v2;
4642
4643 uint n = 32;
4644
4645 while (n--)
4646 {
4647 if (d1[n] > d2[n]) return ( 1);
4648 if (d1[n] < d2[n]) return (-1);
4649 }
4650
4651 return (0);
4652 }
4653
4654 int sort_by_digest_4_64 (const void *v1, const void *v2)
4655 {
4656 const u32 *d1 = (const u32 *) v1;
4657 const u32 *d2 = (const u32 *) v2;
4658
4659 uint n = 64;
4660
4661 while (n--)
4662 {
4663 if (d1[n] > d2[n]) return ( 1);
4664 if (d1[n] < d2[n]) return (-1);
4665 }
4666
4667 return (0);
4668 }
4669
4670 int sort_by_digest_8_8 (const void *v1, const void *v2)
4671 {
4672 const u64 *d1 = (const u64 *) v1;
4673 const u64 *d2 = (const u64 *) v2;
4674
4675 uint n = 8;
4676
4677 while (n--)
4678 {
4679 if (d1[n] > d2[n]) return ( 1);
4680 if (d1[n] < d2[n]) return (-1);
4681 }
4682
4683 return (0);
4684 }
4685
4686 int sort_by_digest_8_16 (const void *v1, const void *v2)
4687 {
4688 const u64 *d1 = (const u64 *) v1;
4689 const u64 *d2 = (const u64 *) v2;
4690
4691 uint n = 16;
4692
4693 while (n--)
4694 {
4695 if (d1[n] > d2[n]) return ( 1);
4696 if (d1[n] < d2[n]) return (-1);
4697 }
4698
4699 return (0);
4700 }
4701
4702 int sort_by_digest_8_25 (const void *v1, const void *v2)
4703 {
4704 const u64 *d1 = (const u64 *) v1;
4705 const u64 *d2 = (const u64 *) v2;
4706
4707 uint n = 25;
4708
4709 while (n--)
4710 {
4711 if (d1[n] > d2[n]) return ( 1);
4712 if (d1[n] < d2[n]) return (-1);
4713 }
4714
4715 return (0);
4716 }
4717
4718 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4719 {
4720 const u32 *d1 = (const u32 *) v1;
4721 const u32 *d2 = (const u32 *) v2;
4722
4723 const uint dgst_pos0 = data.dgst_pos0;
4724 const uint dgst_pos1 = data.dgst_pos1;
4725 const uint dgst_pos2 = data.dgst_pos2;
4726 const uint dgst_pos3 = data.dgst_pos3;
4727
4728 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4729 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4730 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4731 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4732 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4733 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4734 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4735 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4736
4737 return (0);
4738 }
4739
4740 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)
4741 {
4742 uint outfile_autohex = data.outfile_autohex;
4743
4744 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4745
4746 FILE *debug_fp = NULL;
4747
4748 if (debug_file != NULL)
4749 {
4750 debug_fp = fopen (debug_file, "ab");
4751
4752 lock_file (debug_fp);
4753 }
4754 else
4755 {
4756 debug_fp = stderr;
4757 }
4758
4759 if (debug_fp == NULL)
4760 {
4761 log_info ("WARNING: Could not open debug-file for writing");
4762 }
4763 else
4764 {
4765 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4766 {
4767 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4768
4769 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4770 }
4771
4772 fwrite (rule_ptr, rule_len, 1, debug_fp);
4773
4774 if (debug_mode == 4)
4775 {
4776 fputc (':', debug_fp);
4777
4778 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4779 }
4780
4781 fputc ('\n', debug_fp);
4782
4783 if (debug_file != NULL) fclose (debug_fp);
4784 }
4785 }
4786
4787 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4788 {
4789 int needs_hexify = 0;
4790
4791 if (outfile_autohex == 1)
4792 {
4793 for (uint i = 0; i < plain_len; i++)
4794 {
4795 if (plain_ptr[i] < 0x20)
4796 {
4797 needs_hexify = 1;
4798
4799 break;
4800 }
4801
4802 if (plain_ptr[i] > 0x7f)
4803 {
4804 needs_hexify = 1;
4805
4806 break;
4807 }
4808 }
4809 }
4810
4811 if (needs_hexify == 1)
4812 {
4813 fprintf (fp, "$HEX[");
4814
4815 for (uint i = 0; i < plain_len; i++)
4816 {
4817 fprintf (fp, "%02x", plain_ptr[i]);
4818 }
4819
4820 fprintf (fp, "]");
4821 }
4822 else
4823 {
4824 fwrite (plain_ptr, plain_len, 1, fp);
4825 }
4826 }
4827
4828 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)
4829 {
4830 uint outfile_format = data.outfile_format;
4831
4832 char separator = data.separator;
4833
4834 if (outfile_format & OUTFILE_FMT_HASH)
4835 {
4836 fprintf (out_fp, "%s", out_buf);
4837
4838 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4839 {
4840 fputc (separator, out_fp);
4841 }
4842 }
4843 else if (data.username)
4844 {
4845 if (username != NULL)
4846 {
4847 for (uint i = 0; i < user_len; i++)
4848 {
4849 fprintf (out_fp, "%c", username[i]);
4850 }
4851
4852 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4853 {
4854 fputc (separator, out_fp);
4855 }
4856 }
4857 }
4858
4859 if (outfile_format & OUTFILE_FMT_PLAIN)
4860 {
4861 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4862
4863 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4864 {
4865 fputc (separator, out_fp);
4866 }
4867 }
4868
4869 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4870 {
4871 for (uint i = 0; i < plain_len; i++)
4872 {
4873 fprintf (out_fp, "%02x", plain_ptr[i]);
4874 }
4875
4876 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4877 {
4878 fputc (separator, out_fp);
4879 }
4880 }
4881
4882 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4883 {
4884 #ifdef _WIN
4885 __mingw_fprintf (out_fp, "%llu", crackpos);
4886 #endif
4887
4888 #ifdef _POSIX
4889 #ifdef __x86_64__
4890 fprintf (out_fp, "%lu", (unsigned long) crackpos);
4891 #else
4892 fprintf (out_fp, "%llu", crackpos);
4893 #endif
4894 #endif
4895 }
4896
4897 fputc ('\n', out_fp);
4898 }
4899
4900 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)
4901 {
4902 pot_t pot_key;
4903
4904 pot_key.hash.salt = hashes_buf->salt;
4905 pot_key.hash.digest = hashes_buf->digest;
4906
4907 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4908
4909 if (pot_ptr)
4910 {
4911 log_info_nn ("");
4912
4913 input_buf[input_len] = 0;
4914
4915 // user
4916 unsigned char *username = NULL;
4917 uint user_len = 0;
4918
4919 if (data.username)
4920 {
4921 user_t *user = hashes_buf->hash_info->user;
4922
4923 if (user)
4924 {
4925 username = (unsigned char *) (user->user_name);
4926
4927 user_len = user->user_len;
4928 }
4929 }
4930
4931 // do output the line
4932 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4933 }
4934 }
4935
4936 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4937 #define LM_MASKED_PLAIN "[notfound]"
4938
4939 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)
4940 {
4941 // left
4942
4943 pot_t pot_left_key;
4944
4945 pot_left_key.hash.salt = hash_left->salt;
4946 pot_left_key.hash.digest = hash_left->digest;
4947
4948 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4949
4950 // right
4951
4952 uint weak_hash_found = 0;
4953
4954 pot_t pot_right_key;
4955
4956 pot_right_key.hash.salt = hash_right->salt;
4957 pot_right_key.hash.digest = hash_right->digest;
4958
4959 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4960
4961 if (pot_right_ptr == NULL)
4962 {
4963 // special case, if "weak hash"
4964
4965 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4966 {
4967 weak_hash_found = 1;
4968
4969 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4970
4971 // in theory this is not needed, but we are paranoia:
4972
4973 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4974 pot_right_ptr->plain_len = 0;
4975 }
4976 }
4977
4978 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4979 {
4980 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
4981
4982 return;
4983 }
4984
4985 // at least one half was found:
4986
4987 log_info_nn ("");
4988
4989 input_buf[input_len] = 0;
4990
4991 // user
4992
4993 unsigned char *username = NULL;
4994 uint user_len = 0;
4995
4996 if (data.username)
4997 {
4998 user_t *user = hash_left->hash_info->user;
4999
5000 if (user)
5001 {
5002 username = (unsigned char *) (user->user_name);
5003
5004 user_len = user->user_len;
5005 }
5006 }
5007
5008 // mask the part which was not found
5009
5010 uint left_part_masked = 0;
5011 uint right_part_masked = 0;
5012
5013 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5014
5015 if (pot_left_ptr == NULL)
5016 {
5017 left_part_masked = 1;
5018
5019 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5020
5021 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5022
5023 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5024 pot_left_ptr->plain_len = mask_plain_len;
5025 }
5026
5027 if (pot_right_ptr == NULL)
5028 {
5029 right_part_masked = 1;
5030
5031 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5032
5033 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5034
5035 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5036 pot_right_ptr->plain_len = mask_plain_len;
5037 }
5038
5039 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5040
5041 pot_t pot_ptr;
5042
5043 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5044
5045 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5046
5047 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5048
5049 // do output the line
5050
5051 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5052
5053 if (weak_hash_found == 1) myfree (pot_right_ptr);
5054
5055 if (left_part_masked == 1) myfree (pot_left_ptr);
5056 if (right_part_masked == 1) myfree (pot_right_ptr);
5057 }
5058
5059 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)
5060 {
5061 pot_t pot_key;
5062
5063 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5064
5065 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5066
5067 if (pot_ptr == NULL)
5068 {
5069 log_info_nn ("");
5070
5071 input_buf[input_len] = 0;
5072
5073 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5074 }
5075 }
5076
5077 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)
5078 {
5079 // left
5080
5081 pot_t pot_left_key;
5082
5083 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5084
5085 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5086
5087 // right
5088
5089 pot_t pot_right_key;
5090
5091 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5092
5093 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5094
5095 uint weak_hash_found = 0;
5096
5097 if (pot_right_ptr == NULL)
5098 {
5099 // special case, if "weak hash"
5100
5101 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5102 {
5103 weak_hash_found = 1;
5104
5105 // we just need that pot_right_ptr is not a NULL pointer
5106
5107 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5108 }
5109 }
5110
5111 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5112 {
5113 if (weak_hash_found == 1) myfree (pot_right_ptr);
5114
5115 return;
5116 }
5117
5118 // ... at least one part was not cracked
5119
5120 log_info_nn ("");
5121
5122 input_buf[input_len] = 0;
5123
5124 // only show the hash part which is still not cracked
5125
5126 uint user_len = input_len - 32;
5127
5128 char *hash_output = (char *) mymalloc (33);
5129
5130 memcpy (hash_output, input_buf, input_len);
5131
5132 if (pot_left_ptr != NULL)
5133 {
5134 // only show right part (because left part was already found)
5135
5136 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5137
5138 hash_output[user_len + 16] = 0;
5139 }
5140
5141 if (pot_right_ptr != NULL)
5142 {
5143 // only show left part (because right part was already found)
5144
5145 memcpy (hash_output + user_len, input_buf + user_len, 16);
5146
5147 hash_output[user_len + 16] = 0;
5148 }
5149
5150 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5151
5152 myfree (hash_output);
5153
5154 if (weak_hash_found == 1) myfree (pot_right_ptr);
5155 }
5156
5157 uint setup_opencl_platforms_filter (char *opencl_platforms)
5158 {
5159 uint opencl_platforms_filter = 0;
5160
5161 if (opencl_platforms)
5162 {
5163 char *platforms = strdup (opencl_platforms);
5164
5165 char *next = strtok (platforms, ",");
5166
5167 do
5168 {
5169 int platform = atoi (next);
5170
5171 if (platform < 1 || platform > 32)
5172 {
5173 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5174
5175 exit (-1);
5176 }
5177
5178 opencl_platforms_filter |= 1 << (platform - 1);
5179
5180 } while ((next = strtok (NULL, ",")) != NULL);
5181
5182 free (platforms);
5183 }
5184 else
5185 {
5186 opencl_platforms_filter = -1;
5187 }
5188
5189 return opencl_platforms_filter;
5190 }
5191
5192 u32 setup_devices_filter (char *opencl_devices)
5193 {
5194 u32 devices_filter = 0;
5195
5196 if (opencl_devices)
5197 {
5198 char *devices = strdup (opencl_devices);
5199
5200 char *next = strtok (devices, ",");
5201
5202 do
5203 {
5204 int device_id = atoi (next);
5205
5206 if (device_id < 1 || device_id > 32)
5207 {
5208 log_error ("ERROR: invalid device_id %u specified", device_id);
5209
5210 exit (-1);
5211 }
5212
5213 devices_filter |= 1 << (device_id - 1);
5214
5215 } while ((next = strtok (NULL, ",")) != NULL);
5216
5217 free (devices);
5218 }
5219 else
5220 {
5221 devices_filter = -1;
5222 }
5223
5224 return devices_filter;
5225 }
5226
5227 cl_device_type setup_device_types_filter (char *opencl_device_types)
5228 {
5229 cl_device_type device_types_filter = 0;
5230
5231 if (opencl_device_types)
5232 {
5233 char *device_types = strdup (opencl_device_types);
5234
5235 char *next = strtok (device_types, ",");
5236
5237 do
5238 {
5239 int device_type = atoi (next);
5240
5241 if (device_type < 1 || device_type > 3)
5242 {
5243 log_error ("ERROR: invalid device_type %u specified", device_type);
5244
5245 exit (-1);
5246 }
5247
5248 device_types_filter |= 1 << device_type;
5249
5250 } while ((next = strtok (NULL, ",")) != NULL);
5251
5252 free (device_types);
5253 }
5254 else
5255 {
5256 // Do not use CPU by default, this often reduces GPU performance because
5257 // the CPU is too busy to handle GPU synchronization
5258
5259 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5260 }
5261
5262 return device_types_filter;
5263 }
5264
5265 u32 get_random_num (const u32 min, const u32 max)
5266 {
5267 if (min == max) return (min);
5268
5269 return ((rand () % (max - min)) + min);
5270 }
5271
5272 u32 mydivc32 (const u32 dividend, const u32 divisor)
5273 {
5274 u32 quotient = dividend / divisor;
5275
5276 if (dividend % divisor) quotient++;
5277
5278 return quotient;
5279 }
5280
5281 u64 mydivc64 (const u64 dividend, const u64 divisor)
5282 {
5283 u64 quotient = dividend / divisor;
5284
5285 if (dividend % divisor) quotient++;
5286
5287 return quotient;
5288 }
5289
5290 void format_timer_display (struct tm *tm, char *buf, size_t len)
5291 {
5292 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5293 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5294
5295 if (tm->tm_year - 70)
5296 {
5297 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5298 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5299
5300 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5301 }
5302 else if (tm->tm_yday)
5303 {
5304 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5305 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5306
5307 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5308 }
5309 else if (tm->tm_hour)
5310 {
5311 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5312 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5313
5314 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5315 }
5316 else if (tm->tm_min)
5317 {
5318 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5319 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5320
5321 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5322 }
5323 else
5324 {
5325 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5326
5327 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5328 }
5329 }
5330
5331 void format_speed_display (float val, char *buf, size_t len)
5332 {
5333 if (val <= 0)
5334 {
5335 buf[0] = '0';
5336 buf[1] = ' ';
5337 buf[2] = 0;
5338
5339 return;
5340 }
5341
5342 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5343
5344 uint level = 0;
5345
5346 while (val > 99999)
5347 {
5348 val /= 1000;
5349
5350 level++;
5351 }
5352
5353 /* generate output */
5354
5355 if (level == 0)
5356 {
5357 snprintf (buf, len - 1, "%.0f ", val);
5358 }
5359 else
5360 {
5361 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5362 }
5363 }
5364
5365 void lowercase (u8 *buf, int len)
5366 {
5367 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5368 }
5369
5370 void uppercase (u8 *buf, int len)
5371 {
5372 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5373 }
5374
5375 int fgetl (FILE *fp, char *line_buf)
5376 {
5377 int line_len = 0;
5378
5379 while (!feof (fp))
5380 {
5381 const int c = fgetc (fp);
5382
5383 if (c == EOF) break;
5384
5385 line_buf[line_len] = (char) c;
5386
5387 line_len++;
5388
5389 if (line_len == BUFSIZ) line_len--;
5390
5391 if (c == '\n') break;
5392 }
5393
5394 if (line_len == 0) return 0;
5395
5396 if (line_buf[line_len - 1] == '\n')
5397 {
5398 line_len--;
5399
5400 line_buf[line_len] = 0;
5401 }
5402
5403 if (line_len == 0) return 0;
5404
5405 if (line_buf[line_len - 1] == '\r')
5406 {
5407 line_len--;
5408
5409 line_buf[line_len] = 0;
5410 }
5411
5412 return (line_len);
5413 }
5414
5415 int in_superchop (char *buf)
5416 {
5417 int len = strlen (buf);
5418
5419 while (len)
5420 {
5421 if (buf[len - 1] == '\n')
5422 {
5423 len--;
5424
5425 continue;
5426 }
5427
5428 if (buf[len - 1] == '\r')
5429 {
5430 len--;
5431
5432 continue;
5433 }
5434
5435 break;
5436 }
5437
5438 buf[len] = 0;
5439
5440 return len;
5441 }
5442
5443 char **scan_directory (const char *path)
5444 {
5445 char *tmp_path = mystrdup (path);
5446
5447 size_t tmp_path_len = strlen (tmp_path);
5448
5449 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5450 {
5451 tmp_path[tmp_path_len - 1] = 0;
5452
5453 tmp_path_len = strlen (tmp_path);
5454 }
5455
5456 char **files = NULL;
5457
5458 int num_files = 0;
5459
5460 DIR *d = NULL;
5461
5462 if ((d = opendir (tmp_path)) != NULL)
5463 {
5464 #ifdef OSX
5465 struct dirent e;
5466
5467 for (;;) {
5468 memset (&e, 0, sizeof (e));
5469 struct dirent *de = NULL;
5470
5471 if (readdir_r (d, &e, &de) != 0)
5472 {
5473 log_error ("ERROR: readdir_r() failed");
5474
5475 break;
5476 }
5477
5478 if (de == NULL) break;
5479 #else
5480 struct dirent *de;
5481
5482 while ((de = readdir (d)) != NULL)
5483 {
5484 #endif
5485 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5486
5487 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5488
5489 char *path_file = (char *) mymalloc (path_size + 1);
5490
5491 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5492
5493 path_file[path_size] = 0;
5494
5495 DIR *d_test;
5496
5497 if ((d_test = opendir (path_file)) != NULL)
5498 {
5499 closedir (d_test);
5500
5501 myfree (path_file);
5502 }
5503 else
5504 {
5505 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5506
5507 num_files++;
5508
5509 files[num_files - 1] = path_file;
5510 }
5511 }
5512
5513 closedir (d);
5514 }
5515 else if (errno == ENOTDIR)
5516 {
5517 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5518
5519 num_files++;
5520
5521 files[num_files - 1] = mystrdup (path);
5522 }
5523
5524 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5525
5526 num_files++;
5527
5528 files[num_files - 1] = NULL;
5529
5530 myfree (tmp_path);
5531
5532 return (files);
5533 }
5534
5535 int count_dictionaries (char **dictionary_files)
5536 {
5537 if (dictionary_files == NULL) return 0;
5538
5539 int cnt = 0;
5540
5541 for (int d = 0; dictionary_files[d] != NULL; d++)
5542 {
5543 cnt++;
5544 }
5545
5546 return (cnt);
5547 }
5548
5549 char *stroptitype (const uint opti_type)
5550 {
5551 switch (opti_type)
5552 {
5553 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5554 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5555 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5556 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5557 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5558 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5559 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5560 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5561 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5562 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5563 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5564 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5565 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5566 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5567 }
5568
5569 return (NULL);
5570 }
5571
5572 char *strparser (const uint parser_status)
5573 {
5574 switch (parser_status)
5575 {
5576 case PARSER_OK: return ((char *) PA_000); break;
5577 case PARSER_COMMENT: return ((char *) PA_001); break;
5578 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5579 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5580 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5581 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5582 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5583 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5584 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5585 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5586 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5587 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5588 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5589 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5590 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5591 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5592 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5593 }
5594
5595 return ((char *) PA_255);
5596 }
5597
5598 char *strhashtype (const uint hash_mode)
5599 {
5600 switch (hash_mode)
5601 {
5602 case 0: return ((char *) HT_00000); break;
5603 case 10: return ((char *) HT_00010); break;
5604 case 11: return ((char *) HT_00011); break;
5605 case 12: return ((char *) HT_00012); break;
5606 case 20: return ((char *) HT_00020); break;
5607 case 21: return ((char *) HT_00021); break;
5608 case 22: return ((char *) HT_00022); break;
5609 case 23: return ((char *) HT_00023); break;
5610 case 30: return ((char *) HT_00030); break;
5611 case 40: return ((char *) HT_00040); break;
5612 case 50: return ((char *) HT_00050); break;
5613 case 60: return ((char *) HT_00060); break;
5614 case 100: return ((char *) HT_00100); break;
5615 case 101: return ((char *) HT_00101); break;
5616 case 110: return ((char *) HT_00110); break;
5617 case 111: return ((char *) HT_00111); break;
5618 case 112: return ((char *) HT_00112); break;
5619 case 120: return ((char *) HT_00120); break;
5620 case 121: return ((char *) HT_00121); break;
5621 case 122: return ((char *) HT_00122); break;
5622 case 124: return ((char *) HT_00124); break;
5623 case 130: return ((char *) HT_00130); break;
5624 case 131: return ((char *) HT_00131); break;
5625 case 132: return ((char *) HT_00132); break;
5626 case 133: return ((char *) HT_00133); break;
5627 case 140: return ((char *) HT_00140); break;
5628 case 141: return ((char *) HT_00141); break;
5629 case 150: return ((char *) HT_00150); break;
5630 case 160: return ((char *) HT_00160); break;
5631 case 190: return ((char *) HT_00190); break;
5632 case 200: return ((char *) HT_00200); break;
5633 case 300: return ((char *) HT_00300); break;
5634 case 400: return ((char *) HT_00400); break;
5635 case 500: return ((char *) HT_00500); break;
5636 case 501: return ((char *) HT_00501); break;
5637 case 900: return ((char *) HT_00900); break;
5638 case 910: return ((char *) HT_00910); break;
5639 case 1000: return ((char *) HT_01000); break;
5640 case 1100: return ((char *) HT_01100); break;
5641 case 1400: return ((char *) HT_01400); break;
5642 case 1410: return ((char *) HT_01410); break;
5643 case 1420: return ((char *) HT_01420); break;
5644 case 1421: return ((char *) HT_01421); break;
5645 case 1430: return ((char *) HT_01430); break;
5646 case 1440: return ((char *) HT_01440); break;
5647 case 1441: return ((char *) HT_01441); break;
5648 case 1450: return ((char *) HT_01450); break;
5649 case 1460: return ((char *) HT_01460); break;
5650 case 1500: return ((char *) HT_01500); break;
5651 case 1600: return ((char *) HT_01600); break;
5652 case 1700: return ((char *) HT_01700); break;
5653 case 1710: return ((char *) HT_01710); break;
5654 case 1711: return ((char *) HT_01711); break;
5655 case 1720: return ((char *) HT_01720); break;
5656 case 1722: return ((char *) HT_01722); break;
5657 case 1730: return ((char *) HT_01730); break;
5658 case 1731: return ((char *) HT_01731); break;
5659 case 1740: return ((char *) HT_01740); break;
5660 case 1750: return ((char *) HT_01750); break;
5661 case 1760: return ((char *) HT_01760); break;
5662 case 1800: return ((char *) HT_01800); break;
5663 case 2100: return ((char *) HT_02100); break;
5664 case 2400: return ((char *) HT_02400); break;
5665 case 2410: return ((char *) HT_02410); break;
5666 case 2500: return ((char *) HT_02500); break;
5667 case 2600: return ((char *) HT_02600); break;
5668 case 2611: return ((char *) HT_02611); break;
5669 case 2612: return ((char *) HT_02612); break;
5670 case 2711: return ((char *) HT_02711); break;
5671 case 2811: return ((char *) HT_02811); break;
5672 case 3000: return ((char *) HT_03000); break;
5673 case 3100: return ((char *) HT_03100); break;
5674 case 3200: return ((char *) HT_03200); break;
5675 case 3710: return ((char *) HT_03710); break;
5676 case 3711: return ((char *) HT_03711); break;
5677 case 3800: return ((char *) HT_03800); break;
5678 case 4300: return ((char *) HT_04300); break;
5679 case 4400: return ((char *) HT_04400); break;
5680 case 4500: return ((char *) HT_04500); break;
5681 case 4700: return ((char *) HT_04700); break;
5682 case 4800: return ((char *) HT_04800); break;
5683 case 4900: return ((char *) HT_04900); break;
5684 case 5000: return ((char *) HT_05000); break;
5685 case 5100: return ((char *) HT_05100); break;
5686 case 5200: return ((char *) HT_05200); break;
5687 case 5300: return ((char *) HT_05300); break;
5688 case 5400: return ((char *) HT_05400); break;
5689 case 5500: return ((char *) HT_05500); break;
5690 case 5600: return ((char *) HT_05600); break;
5691 case 5700: return ((char *) HT_05700); break;
5692 case 5800: return ((char *) HT_05800); break;
5693 case 6000: return ((char *) HT_06000); break;
5694 case 6100: return ((char *) HT_06100); break;
5695 case 6211: return ((char *) HT_06211); break;
5696 case 6212: return ((char *) HT_06212); break;
5697 case 6213: return ((char *) HT_06213); break;
5698 case 6221: return ((char *) HT_06221); break;
5699 case 6222: return ((char *) HT_06222); break;
5700 case 6223: return ((char *) HT_06223); break;
5701 case 6231: return ((char *) HT_06231); break;
5702 case 6232: return ((char *) HT_06232); break;
5703 case 6233: return ((char *) HT_06233); break;
5704 case 6241: return ((char *) HT_06241); break;
5705 case 6242: return ((char *) HT_06242); break;
5706 case 6243: return ((char *) HT_06243); break;
5707 case 6300: return ((char *) HT_06300); break;
5708 case 6400: return ((char *) HT_06400); break;
5709 case 6500: return ((char *) HT_06500); break;
5710 case 6600: return ((char *) HT_06600); break;
5711 case 6700: return ((char *) HT_06700); break;
5712 case 6800: return ((char *) HT_06800); break;
5713 case 6900: return ((char *) HT_06900); break;
5714 case 7100: return ((char *) HT_07100); break;
5715 case 7200: return ((char *) HT_07200); break;
5716 case 7300: return ((char *) HT_07300); break;
5717 case 7400: return ((char *) HT_07400); break;
5718 case 7500: return ((char *) HT_07500); break;
5719 case 7600: return ((char *) HT_07600); break;
5720 case 7700: return ((char *) HT_07700); break;
5721 case 7800: return ((char *) HT_07800); break;
5722 case 7900: return ((char *) HT_07900); break;
5723 case 8000: return ((char *) HT_08000); break;
5724 case 8100: return ((char *) HT_08100); break;
5725 case 8200: return ((char *) HT_08200); break;
5726 case 8300: return ((char *) HT_08300); break;
5727 case 8400: return ((char *) HT_08400); break;
5728 case 8500: return ((char *) HT_08500); break;
5729 case 8600: return ((char *) HT_08600); break;
5730 case 8700: return ((char *) HT_08700); break;
5731 case 8800: return ((char *) HT_08800); break;
5732 case 8900: return ((char *) HT_08900); break;
5733 case 9000: return ((char *) HT_09000); break;
5734 case 9100: return ((char *) HT_09100); break;
5735 case 9200: return ((char *) HT_09200); break;
5736 case 9300: return ((char *) HT_09300); break;
5737 case 9400: return ((char *) HT_09400); break;
5738 case 9500: return ((char *) HT_09500); break;
5739 case 9600: return ((char *) HT_09600); break;
5740 case 9700: return ((char *) HT_09700); break;
5741 case 9710: return ((char *) HT_09710); break;
5742 case 9720: return ((char *) HT_09720); break;
5743 case 9800: return ((char *) HT_09800); break;
5744 case 9810: return ((char *) HT_09810); break;
5745 case 9820: return ((char *) HT_09820); break;
5746 case 9900: return ((char *) HT_09900); break;
5747 case 10000: return ((char *) HT_10000); break;
5748 case 10100: return ((char *) HT_10100); break;
5749 case 10200: return ((char *) HT_10200); break;
5750 case 10300: return ((char *) HT_10300); break;
5751 case 10400: return ((char *) HT_10400); break;
5752 case 10410: return ((char *) HT_10410); break;
5753 case 10420: return ((char *) HT_10420); break;
5754 case 10500: return ((char *) HT_10500); break;
5755 case 10600: return ((char *) HT_10600); break;
5756 case 10700: return ((char *) HT_10700); break;
5757 case 10800: return ((char *) HT_10800); break;
5758 case 10900: return ((char *) HT_10900); break;
5759 case 11000: return ((char *) HT_11000); break;
5760 case 11100: return ((char *) HT_11100); break;
5761 case 11200: return ((char *) HT_11200); break;
5762 case 11300: return ((char *) HT_11300); break;
5763 case 11400: return ((char *) HT_11400); break;
5764 case 11500: return ((char *) HT_11500); break;
5765 case 11600: return ((char *) HT_11600); break;
5766 case 11700: return ((char *) HT_11700); break;
5767 case 11800: return ((char *) HT_11800); break;
5768 case 11900: return ((char *) HT_11900); break;
5769 case 12000: return ((char *) HT_12000); break;
5770 case 12100: return ((char *) HT_12100); break;
5771 case 12200: return ((char *) HT_12200); break;
5772 case 12300: return ((char *) HT_12300); break;
5773 case 12400: return ((char *) HT_12400); break;
5774 case 12500: return ((char *) HT_12500); break;
5775 case 12600: return ((char *) HT_12600); break;
5776 case 12700: return ((char *) HT_12700); break;
5777 case 12800: return ((char *) HT_12800); break;
5778 case 12900: return ((char *) HT_12900); break;
5779 case 13000: return ((char *) HT_13000); break;
5780 }
5781
5782 return ((char *) "Unknown");
5783 }
5784
5785 char *strstatus (const uint devices_status)
5786 {
5787 switch (devices_status)
5788 {
5789 case STATUS_INIT: return ((char *) ST_0000); break;
5790 case STATUS_STARTING: return ((char *) ST_0001); break;
5791 case STATUS_RUNNING: return ((char *) ST_0002); break;
5792 case STATUS_PAUSED: return ((char *) ST_0003); break;
5793 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5794 case STATUS_CRACKED: return ((char *) ST_0005); break;
5795 case STATUS_ABORTED: return ((char *) ST_0006); break;
5796 case STATUS_QUIT: return ((char *) ST_0007); break;
5797 case STATUS_BYPASS: return ((char *) ST_0008); break;
5798 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5799 }
5800
5801 return ((char *) "Unknown");
5802 }
5803
5804 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5805 {
5806 uint hash_type = data.hash_type;
5807 uint hash_mode = data.hash_mode;
5808 uint salt_type = data.salt_type;
5809 uint opts_type = data.opts_type;
5810 uint opti_type = data.opti_type;
5811 uint dgst_size = data.dgst_size;
5812
5813 char *hashfile = data.hashfile;
5814
5815 uint len = 4096;
5816
5817 uint digest_buf[64] = { 0 };
5818
5819 u64 *digest_buf64 = (u64 *) digest_buf;
5820
5821 char *digests_buf_ptr = (char *) data.digests_buf;
5822
5823 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5824
5825 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5826 {
5827 uint tt;
5828
5829 switch (hash_type)
5830 {
5831 case HASH_TYPE_DESCRYPT:
5832 FP (digest_buf[1], digest_buf[0], tt);
5833 break;
5834
5835 case HASH_TYPE_DESRACF:
5836 digest_buf[0] = rotl32 (digest_buf[0], 29);
5837 digest_buf[1] = rotl32 (digest_buf[1], 29);
5838
5839 FP (digest_buf[1], digest_buf[0], tt);
5840 break;
5841
5842 case HASH_TYPE_LM:
5843 FP (digest_buf[1], digest_buf[0], tt);
5844 break;
5845
5846 case HASH_TYPE_NETNTLM:
5847 digest_buf[0] = rotl32 (digest_buf[0], 29);
5848 digest_buf[1] = rotl32 (digest_buf[1], 29);
5849 digest_buf[2] = rotl32 (digest_buf[2], 29);
5850 digest_buf[3] = rotl32 (digest_buf[3], 29);
5851
5852 FP (digest_buf[1], digest_buf[0], tt);
5853 FP (digest_buf[3], digest_buf[2], tt);
5854 break;
5855
5856 case HASH_TYPE_BSDICRYPT:
5857 digest_buf[0] = rotl32 (digest_buf[0], 31);
5858 digest_buf[1] = rotl32 (digest_buf[1], 31);
5859
5860 FP (digest_buf[1], digest_buf[0], tt);
5861 break;
5862 }
5863 }
5864
5865 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5866 {
5867 switch (hash_type)
5868 {
5869 case HASH_TYPE_MD4:
5870 digest_buf[0] += MD4M_A;
5871 digest_buf[1] += MD4M_B;
5872 digest_buf[2] += MD4M_C;
5873 digest_buf[3] += MD4M_D;
5874 break;
5875
5876 case HASH_TYPE_MD5:
5877 digest_buf[0] += MD5M_A;
5878 digest_buf[1] += MD5M_B;
5879 digest_buf[2] += MD5M_C;
5880 digest_buf[3] += MD5M_D;
5881 break;
5882
5883 case HASH_TYPE_SHA1:
5884 digest_buf[0] += SHA1M_A;
5885 digest_buf[1] += SHA1M_B;
5886 digest_buf[2] += SHA1M_C;
5887 digest_buf[3] += SHA1M_D;
5888 digest_buf[4] += SHA1M_E;
5889 break;
5890
5891 case HASH_TYPE_SHA256:
5892 digest_buf[0] += SHA256M_A;
5893 digest_buf[1] += SHA256M_B;
5894 digest_buf[2] += SHA256M_C;
5895 digest_buf[3] += SHA256M_D;
5896 digest_buf[4] += SHA256M_E;
5897 digest_buf[5] += SHA256M_F;
5898 digest_buf[6] += SHA256M_G;
5899 digest_buf[7] += SHA256M_H;
5900 break;
5901
5902 case HASH_TYPE_SHA384:
5903 digest_buf64[0] += SHA384M_A;
5904 digest_buf64[1] += SHA384M_B;
5905 digest_buf64[2] += SHA384M_C;
5906 digest_buf64[3] += SHA384M_D;
5907 digest_buf64[4] += SHA384M_E;
5908 digest_buf64[5] += SHA384M_F;
5909 digest_buf64[6] += 0;
5910 digest_buf64[7] += 0;
5911 break;
5912
5913 case HASH_TYPE_SHA512:
5914 digest_buf64[0] += SHA512M_A;
5915 digest_buf64[1] += SHA512M_B;
5916 digest_buf64[2] += SHA512M_C;
5917 digest_buf64[3] += SHA512M_D;
5918 digest_buf64[4] += SHA512M_E;
5919 digest_buf64[5] += SHA512M_F;
5920 digest_buf64[6] += SHA512M_G;
5921 digest_buf64[7] += SHA512M_H;
5922 break;
5923 }
5924 }
5925
5926 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5927 {
5928 if (dgst_size == DGST_SIZE_4_2)
5929 {
5930 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5931 }
5932 else if (dgst_size == DGST_SIZE_4_4)
5933 {
5934 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5935 }
5936 else if (dgst_size == DGST_SIZE_4_5)
5937 {
5938 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5939 }
5940 else if (dgst_size == DGST_SIZE_4_6)
5941 {
5942 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5943 }
5944 else if (dgst_size == DGST_SIZE_4_8)
5945 {
5946 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5947 }
5948 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5949 {
5950 if (hash_type == HASH_TYPE_WHIRLPOOL)
5951 {
5952 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5953 }
5954 else if (hash_type == HASH_TYPE_SHA384)
5955 {
5956 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5957 }
5958 else if (hash_type == HASH_TYPE_SHA512)
5959 {
5960 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5961 }
5962 else if (hash_type == HASH_TYPE_GOST)
5963 {
5964 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5965 }
5966 }
5967 else if (dgst_size == DGST_SIZE_4_64)
5968 {
5969 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5970 }
5971 else if (dgst_size == DGST_SIZE_8_25)
5972 {
5973 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5974 }
5975 }
5976
5977 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5978 | (data.salt_type == SALT_TYPE_EXTERN)
5979 | (data.salt_type == SALT_TYPE_EMBEDDED));
5980
5981 salt_t salt;
5982
5983 if (isSalted)
5984 {
5985 memset (&salt, 0, sizeof (salt_t));
5986
5987 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5988
5989 char *ptr = (char *) salt.salt_buf;
5990
5991 uint len = salt.salt_len;
5992
5993 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5994 {
5995 uint tt;
5996
5997 switch (hash_type)
5998 {
5999 case HASH_TYPE_NETNTLM:
6000
6001 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6002 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6003
6004 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6005
6006 break;
6007 }
6008 }
6009
6010 if (opts_type & OPTS_TYPE_ST_UNICODE)
6011 {
6012 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6013 {
6014 ptr[i] = ptr[j];
6015 }
6016
6017 len = len / 2;
6018 }
6019
6020 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6021 {
6022 uint max = salt.salt_len / 4;
6023
6024 if (len % 4) max++;
6025
6026 for (uint i = 0; i < max; i++)
6027 {
6028 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6029 }
6030 }
6031
6032 if (opts_type & OPTS_TYPE_ST_HEX)
6033 {
6034 char tmp[64] = { 0 };
6035
6036 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6037 {
6038 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6039 }
6040
6041 len = len * 2;
6042
6043 memcpy (ptr, tmp, len);
6044 }
6045
6046 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6047
6048 memset (ptr + len, 0, memset_size);
6049
6050 salt.salt_len = len;
6051 }
6052
6053 //
6054 // some modes require special encoding
6055 //
6056
6057 uint out_buf_plain[256] = { 0 };
6058 uint out_buf_salt[256] = { 0 };
6059
6060 char tmp_buf[1024] = { 0 };
6061
6062 char *ptr_plain = (char *) out_buf_plain;
6063 char *ptr_salt = (char *) out_buf_salt;
6064
6065 if (hash_mode == 22)
6066 {
6067 char username[30] = { 0 };
6068
6069 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6070
6071 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6072
6073 u16 *ptr = (u16 *) digest_buf;
6074
6075 tmp_buf[ 0] = sig[0];
6076 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6077 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6078 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6079 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6080 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6081 tmp_buf[ 6] = sig[1];
6082 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6083 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6084 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6085 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6086 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6087 tmp_buf[12] = sig[2];
6088 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6089 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6090 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6091 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6092 tmp_buf[17] = sig[3];
6093 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6094 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6095 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6096 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6097 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6098 tmp_buf[23] = sig[4];
6099 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6100 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6101 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6102 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6103 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6104 tmp_buf[29] = sig[5];
6105
6106 snprintf (out_buf, len-1, "%s:%s",
6107 tmp_buf,
6108 username);
6109 }
6110 else if (hash_mode == 23)
6111 {
6112 // do not show the \nskyper\n part in output
6113
6114 char *salt_buf_ptr = (char *) salt.salt_buf;
6115
6116 salt_buf_ptr[salt.salt_len - 8] = 0;
6117
6118 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6119 digest_buf[0],
6120 digest_buf[1],
6121 digest_buf[2],
6122 digest_buf[3],
6123 salt_buf_ptr);
6124 }
6125 else if (hash_mode == 101)
6126 {
6127 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6128
6129 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6130 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6131 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6132 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6133 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6134
6135 memcpy (tmp_buf, digest_buf, 20);
6136
6137 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6138
6139 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6140 }
6141 else if (hash_mode == 111)
6142 {
6143 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6144
6145 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6146 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6147 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6148 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6149 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6150
6151 memcpy (tmp_buf, digest_buf, 20);
6152 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6153
6154 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6155
6156 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6157 }
6158 else if (hash_mode == 122)
6159 {
6160 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6161 (char *) salt.salt_buf,
6162 digest_buf[0],
6163 digest_buf[1],
6164 digest_buf[2],
6165 digest_buf[3],
6166 digest_buf[4]);
6167 }
6168 else if (hash_mode == 124)
6169 {
6170 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6171 (char *) salt.salt_buf,
6172 digest_buf[0],
6173 digest_buf[1],
6174 digest_buf[2],
6175 digest_buf[3],
6176 digest_buf[4]);
6177 }
6178 else if (hash_mode == 131)
6179 {
6180 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6181 (char *) salt.salt_buf,
6182 0, 0, 0, 0, 0,
6183 digest_buf[0],
6184 digest_buf[1],
6185 digest_buf[2],
6186 digest_buf[3],
6187 digest_buf[4]);
6188 }
6189 else if (hash_mode == 132)
6190 {
6191 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6192 (char *) salt.salt_buf,
6193 digest_buf[0],
6194 digest_buf[1],
6195 digest_buf[2],
6196 digest_buf[3],
6197 digest_buf[4]);
6198 }
6199 else if (hash_mode == 133)
6200 {
6201 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6202
6203 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6204 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6205 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6206 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6207 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6208
6209 memcpy (tmp_buf, digest_buf, 20);
6210
6211 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6212
6213 snprintf (out_buf, len-1, "%s", ptr_plain);
6214 }
6215 else if (hash_mode == 141)
6216 {
6217 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6218
6219 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6220
6221 memset (tmp_buf, 0, sizeof (tmp_buf));
6222
6223 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6224
6225 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6226 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6227 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6228 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6229 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6230
6231 memcpy (tmp_buf, digest_buf, 20);
6232
6233 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6234
6235 ptr_plain[27] = 0;
6236
6237 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6238 }
6239 else if (hash_mode == 400)
6240 {
6241 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6242
6243 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6244 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6245 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6246 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6247
6248 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6249
6250 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6251 }
6252 else if (hash_mode == 500)
6253 {
6254 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6255
6256 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6257 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6258 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6259 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6260
6261 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6262
6263 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6264 {
6265 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6266 }
6267 else
6268 {
6269 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6270 }
6271 }
6272 else if (hash_mode == 501)
6273 {
6274 uint digest_idx = salt.digests_offset + digest_pos;
6275
6276 hashinfo_t **hashinfo_ptr = data.hash_info;
6277 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6278
6279 snprintf (out_buf, len-1, "%s", hash_buf);
6280 }
6281 else if (hash_mode == 1421)
6282 {
6283 u8 *salt_ptr = (u8 *) salt.salt_buf;
6284
6285 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6286 salt_ptr[0],
6287 salt_ptr[1],
6288 salt_ptr[2],
6289 salt_ptr[3],
6290 salt_ptr[4],
6291 salt_ptr[5],
6292 digest_buf[0],
6293 digest_buf[1],
6294 digest_buf[2],
6295 digest_buf[3],
6296 digest_buf[4],
6297 digest_buf[5],
6298 digest_buf[6],
6299 digest_buf[7]);
6300 }
6301 else if (hash_mode == 1441)
6302 {
6303 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6304
6305 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6306
6307 memset (tmp_buf, 0, sizeof (tmp_buf));
6308
6309 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6310
6311 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6312 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6313 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6314 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6315 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6316 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6317 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6318 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6319
6320 memcpy (tmp_buf, digest_buf, 32);
6321
6322 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6323
6324 ptr_plain[43] = 0;
6325
6326 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6327 }
6328 else if (hash_mode == 1500)
6329 {
6330 out_buf[0] = salt.salt_sign[0] & 0xff;
6331 out_buf[1] = salt.salt_sign[1] & 0xff;
6332 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6333 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6334 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6335
6336 memset (tmp_buf, 0, sizeof (tmp_buf));
6337
6338 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6339
6340 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6341 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6342
6343 memcpy (tmp_buf, digest_buf, 8);
6344
6345 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6346
6347 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6348
6349 out_buf[13] = 0;
6350 }
6351 else if (hash_mode == 1600)
6352 {
6353 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6354
6355 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6356 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6357 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6358 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6359
6360 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6361
6362 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6363 {
6364 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6365 }
6366 else
6367 {
6368 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6369 }
6370 }
6371 else if (hash_mode == 1711)
6372 {
6373 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6374
6375 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6376 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6377 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6378 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6379 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6380 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6381 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6382 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6383
6384 memcpy (tmp_buf, digest_buf, 64);
6385 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6386
6387 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6388
6389 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6390 }
6391 else if (hash_mode == 1722)
6392 {
6393 uint *ptr = digest_buf;
6394
6395 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6396 (unsigned char *) salt.salt_buf,
6397 ptr[ 1], ptr[ 0],
6398 ptr[ 3], ptr[ 2],
6399 ptr[ 5], ptr[ 4],
6400 ptr[ 7], ptr[ 6],
6401 ptr[ 9], ptr[ 8],
6402 ptr[11], ptr[10],
6403 ptr[13], ptr[12],
6404 ptr[15], ptr[14]);
6405 }
6406 else if (hash_mode == 1731)
6407 {
6408 uint *ptr = digest_buf;
6409
6410 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6411 (unsigned char *) salt.salt_buf,
6412 ptr[ 1], ptr[ 0],
6413 ptr[ 3], ptr[ 2],
6414 ptr[ 5], ptr[ 4],
6415 ptr[ 7], ptr[ 6],
6416 ptr[ 9], ptr[ 8],
6417 ptr[11], ptr[10],
6418 ptr[13], ptr[12],
6419 ptr[15], ptr[14]);
6420 }
6421 else if (hash_mode == 1800)
6422 {
6423 // temp workaround
6424
6425 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6426 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6427 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6428 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6429 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6430 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6431 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6432 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6433
6434 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6435
6436 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6437 {
6438 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6439 }
6440 else
6441 {
6442 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6443 }
6444 }
6445 else if (hash_mode == 2100)
6446 {
6447 uint pos = 0;
6448
6449 snprintf (out_buf + pos, len-1, "%s%i#",
6450 SIGNATURE_DCC2,
6451 salt.salt_iter + 1);
6452
6453 uint signature_len = strlen (out_buf);
6454
6455 pos += signature_len;
6456 len -= signature_len;
6457
6458 char *salt_ptr = (char *) salt.salt_buf;
6459
6460 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6461
6462 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6463 byte_swap_32 (digest_buf[0]),
6464 byte_swap_32 (digest_buf[1]),
6465 byte_swap_32 (digest_buf[2]),
6466 byte_swap_32 (digest_buf[3]));
6467 }
6468 else if ((hash_mode == 2400) || (hash_mode == 2410))
6469 {
6470 memcpy (tmp_buf, digest_buf, 16);
6471
6472 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6473
6474 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6475 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6476 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6477 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6478
6479 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6480 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6481 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6482 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6483
6484 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6485 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6486 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6487 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6488
6489 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6490 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6491 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6492 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6493
6494 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6495 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6496 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6497 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6498
6499 out_buf[16] = 0;
6500 }
6501 else if (hash_mode == 2500)
6502 {
6503 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6504
6505 wpa_t *wpa = &wpas[salt_pos];
6506
6507 uint pke[25] = { 0 };
6508
6509 char *pke_ptr = (char *) pke;
6510
6511 for (uint i = 0; i < 25; i++)
6512 {
6513 pke[i] = byte_swap_32 (wpa->pke[i]);
6514 }
6515
6516 unsigned char mac1[6] = { 0 };
6517 unsigned char mac2[6] = { 0 };
6518
6519 memcpy (mac1, pke_ptr + 23, 6);
6520 memcpy (mac2, pke_ptr + 29, 6);
6521
6522 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6523 (char *) salt.salt_buf,
6524 mac1[0],
6525 mac1[1],
6526 mac1[2],
6527 mac1[3],
6528 mac1[4],
6529 mac1[5],
6530 mac2[0],
6531 mac2[1],
6532 mac2[2],
6533 mac2[3],
6534 mac2[4],
6535 mac2[5]);
6536 }
6537 else if (hash_mode == 4400)
6538 {
6539 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6540 byte_swap_32 (digest_buf[0]),
6541 byte_swap_32 (digest_buf[1]),
6542 byte_swap_32 (digest_buf[2]),
6543 byte_swap_32 (digest_buf[3]));
6544 }
6545 else if (hash_mode == 4700)
6546 {
6547 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6548 byte_swap_32 (digest_buf[0]),
6549 byte_swap_32 (digest_buf[1]),
6550 byte_swap_32 (digest_buf[2]),
6551 byte_swap_32 (digest_buf[3]),
6552 byte_swap_32 (digest_buf[4]));
6553 }
6554 else if (hash_mode == 4800)
6555 {
6556 u8 chap_id_byte = (u8) salt.salt_buf[4];
6557
6558 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6559 digest_buf[0],
6560 digest_buf[1],
6561 digest_buf[2],
6562 digest_buf[3],
6563 byte_swap_32 (salt.salt_buf[0]),
6564 byte_swap_32 (salt.salt_buf[1]),
6565 byte_swap_32 (salt.salt_buf[2]),
6566 byte_swap_32 (salt.salt_buf[3]),
6567 chap_id_byte);
6568 }
6569 else if (hash_mode == 4900)
6570 {
6571 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6572 byte_swap_32 (digest_buf[0]),
6573 byte_swap_32 (digest_buf[1]),
6574 byte_swap_32 (digest_buf[2]),
6575 byte_swap_32 (digest_buf[3]),
6576 byte_swap_32 (digest_buf[4]));
6577 }
6578 else if (hash_mode == 5100)
6579 {
6580 snprintf (out_buf, len-1, "%08x%08x",
6581 digest_buf[0],
6582 digest_buf[1]);
6583 }
6584 else if (hash_mode == 5200)
6585 {
6586 snprintf (out_buf, len-1, "%s", hashfile);
6587 }
6588 else if (hash_mode == 5300)
6589 {
6590 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6591
6592 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6593
6594 int buf_len = len -1;
6595
6596 // msg_buf
6597
6598 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6599
6600 for (uint i = 0; i < ikepsk_msg_len; i++)
6601 {
6602 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6603 {
6604 snprintf (out_buf, buf_len, ":");
6605
6606 buf_len--;
6607 out_buf++;
6608 }
6609
6610 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6611
6612 buf_len -= 8;
6613 out_buf += 8;
6614 }
6615
6616 // nr_buf
6617
6618 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6619
6620 for (uint i = 0; i < ikepsk_nr_len; i++)
6621 {
6622 if ((i == 0) || (i == 5))
6623 {
6624 snprintf (out_buf, buf_len, ":");
6625
6626 buf_len--;
6627 out_buf++;
6628 }
6629
6630 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6631
6632 buf_len -= 8;
6633 out_buf += 8;
6634 }
6635
6636 // digest_buf
6637
6638 for (uint i = 0; i < 4; i++)
6639 {
6640 if (i == 0)
6641 {
6642 snprintf (out_buf, buf_len, ":");
6643
6644 buf_len--;
6645 out_buf++;
6646 }
6647
6648 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6649
6650 buf_len -= 8;
6651 out_buf += 8;
6652 }
6653 }
6654 else if (hash_mode == 5400)
6655 {
6656 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6657
6658 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6659
6660 int buf_len = len -1;
6661
6662 // msg_buf
6663
6664 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6665
6666 for (uint i = 0; i < ikepsk_msg_len; i++)
6667 {
6668 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6669 {
6670 snprintf (out_buf, buf_len, ":");
6671
6672 buf_len--;
6673 out_buf++;
6674 }
6675
6676 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6677
6678 buf_len -= 8;
6679 out_buf += 8;
6680 }
6681
6682 // nr_buf
6683
6684 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6685
6686 for (uint i = 0; i < ikepsk_nr_len; i++)
6687 {
6688 if ((i == 0) || (i == 5))
6689 {
6690 snprintf (out_buf, buf_len, ":");
6691
6692 buf_len--;
6693 out_buf++;
6694 }
6695
6696 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6697
6698 buf_len -= 8;
6699 out_buf += 8;
6700 }
6701
6702 // digest_buf
6703
6704 for (uint i = 0; i < 5; i++)
6705 {
6706 if (i == 0)
6707 {
6708 snprintf (out_buf, buf_len, ":");
6709
6710 buf_len--;
6711 out_buf++;
6712 }
6713
6714 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6715
6716 buf_len -= 8;
6717 out_buf += 8;
6718 }
6719 }
6720 else if (hash_mode == 5500)
6721 {
6722 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6723
6724 netntlm_t *netntlm = &netntlms[salt_pos];
6725
6726 char user_buf[64] = { 0 };
6727 char domain_buf[64] = { 0 };
6728 char srvchall_buf[1024] = { 0 };
6729 char clichall_buf[1024] = { 0 };
6730
6731 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6732 {
6733 char *ptr = (char *) netntlm->userdomain_buf;
6734
6735 user_buf[i] = ptr[j];
6736 }
6737
6738 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6739 {
6740 char *ptr = (char *) netntlm->userdomain_buf;
6741
6742 domain_buf[i] = ptr[netntlm->user_len + j];
6743 }
6744
6745 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6746 {
6747 u8 *ptr = (u8 *) netntlm->chall_buf;
6748
6749 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6750 }
6751
6752 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6753 {
6754 u8 *ptr = (u8 *) netntlm->chall_buf;
6755
6756 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6757 }
6758
6759 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6760 user_buf,
6761 domain_buf,
6762 srvchall_buf,
6763 digest_buf[0],
6764 digest_buf[1],
6765 digest_buf[2],
6766 digest_buf[3],
6767 byte_swap_32 (salt.salt_buf_pc[0]),
6768 byte_swap_32 (salt.salt_buf_pc[1]),
6769 clichall_buf);
6770 }
6771 else if (hash_mode == 5600)
6772 {
6773 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6774
6775 netntlm_t *netntlm = &netntlms[salt_pos];
6776
6777 char user_buf[64] = { 0 };
6778 char domain_buf[64] = { 0 };
6779 char srvchall_buf[1024] = { 0 };
6780 char clichall_buf[1024] = { 0 };
6781
6782 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6783 {
6784 char *ptr = (char *) netntlm->userdomain_buf;
6785
6786 user_buf[i] = ptr[j];
6787 }
6788
6789 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6790 {
6791 char *ptr = (char *) netntlm->userdomain_buf;
6792
6793 domain_buf[i] = ptr[netntlm->user_len + j];
6794 }
6795
6796 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6797 {
6798 u8 *ptr = (u8 *) netntlm->chall_buf;
6799
6800 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6801 }
6802
6803 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6804 {
6805 u8 *ptr = (u8 *) netntlm->chall_buf;
6806
6807 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6808 }
6809
6810 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6811 user_buf,
6812 domain_buf,
6813 srvchall_buf,
6814 digest_buf[0],
6815 digest_buf[1],
6816 digest_buf[2],
6817 digest_buf[3],
6818 clichall_buf);
6819 }
6820 else if (hash_mode == 5700)
6821 {
6822 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6823
6824 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6825 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6826 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6827 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6828 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6829 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6830 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6831 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6832
6833 memcpy (tmp_buf, digest_buf, 32);
6834
6835 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6836
6837 ptr_plain[43] = 0;
6838
6839 snprintf (out_buf, len-1, "%s", ptr_plain);
6840 }
6841 else if (hash_mode == 5800)
6842 {
6843 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6844 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6845 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6846 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6847 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6848
6849 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6850 digest_buf[0],
6851 digest_buf[1],
6852 digest_buf[2],
6853 digest_buf[3],
6854 digest_buf[4]);
6855 }
6856 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6857 {
6858 snprintf (out_buf, len-1, "%s", hashfile);
6859 }
6860 else if (hash_mode == 6300)
6861 {
6862 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6863
6864 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6865 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6866 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6867 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6868
6869 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6870
6871 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6872 }
6873 else if (hash_mode == 6400)
6874 {
6875 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6876
6877 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6878 }
6879 else if (hash_mode == 6500)
6880 {
6881 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6882
6883 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6884 }
6885 else if (hash_mode == 6600)
6886 {
6887 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6888
6889 agilekey_t *agilekey = &agilekeys[salt_pos];
6890
6891 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6892 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6893
6894 uint buf_len = len - 1;
6895
6896 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6897 buf_len -= 22;
6898
6899 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6900 {
6901 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6902
6903 buf_len -= 2;
6904 }
6905 }
6906 else if (hash_mode == 6700)
6907 {
6908 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6909
6910 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6911 }
6912 else if (hash_mode == 6800)
6913 {
6914 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6915 }
6916 else if (hash_mode == 7100)
6917 {
6918 uint *ptr = digest_buf;
6919
6920 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6921
6922 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6923
6924 uint esalt[8] = { 0 };
6925
6926 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6927 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6928 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6929 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6930 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6931 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6932 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6933 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6934
6935 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",
6936 SIGNATURE_SHA512OSX,
6937 salt.salt_iter + 1,
6938 esalt[ 0], esalt[ 1],
6939 esalt[ 2], esalt[ 3],
6940 esalt[ 4], esalt[ 5],
6941 esalt[ 6], esalt[ 7],
6942 ptr [ 1], ptr [ 0],
6943 ptr [ 3], ptr [ 2],
6944 ptr [ 5], ptr [ 4],
6945 ptr [ 7], ptr [ 6],
6946 ptr [ 9], ptr [ 8],
6947 ptr [11], ptr [10],
6948 ptr [13], ptr [12],
6949 ptr [15], ptr [14]);
6950 }
6951 else if (hash_mode == 7200)
6952 {
6953 uint *ptr = digest_buf;
6954
6955 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6956
6957 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6958
6959 uint len_used = 0;
6960
6961 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6962
6963 len_used = strlen (out_buf);
6964
6965 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6966
6967 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6968 {
6969 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6970 }
6971
6972 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",
6973 ptr [ 1], ptr [ 0],
6974 ptr [ 3], ptr [ 2],
6975 ptr [ 5], ptr [ 4],
6976 ptr [ 7], ptr [ 6],
6977 ptr [ 9], ptr [ 8],
6978 ptr [11], ptr [10],
6979 ptr [13], ptr [12],
6980 ptr [15], ptr [14]);
6981 }
6982 else if (hash_mode == 7300)
6983 {
6984 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6985
6986 rakp_t *rakp = &rakps[salt_pos];
6987
6988 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6989 {
6990 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6991 }
6992
6993 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6994 digest_buf[0],
6995 digest_buf[1],
6996 digest_buf[2],
6997 digest_buf[3],
6998 digest_buf[4]);
6999 }
7000 else if (hash_mode == 7400)
7001 {
7002 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7003
7004 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7005 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7006 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7007 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7008 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7009 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7010 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7011 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7012
7013 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7014
7015 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7016 {
7017 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7018 }
7019 else
7020 {
7021 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7022 }
7023 }
7024 else if (hash_mode == 7500)
7025 {
7026 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7027
7028 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7029
7030 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7031 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7032
7033 char data[128] = { 0 };
7034
7035 char *ptr_data = data;
7036
7037 for (uint i = 0; i < 36; i++, ptr_data += 2)
7038 {
7039 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7040 }
7041
7042 for (uint i = 0; i < 16; i++, ptr_data += 2)
7043 {
7044 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7045 }
7046
7047 *ptr_data = 0;
7048
7049 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7050 SIGNATURE_KRB5PA,
7051 (char *) krb5pa->user,
7052 (char *) krb5pa->realm,
7053 (char *) krb5pa->salt,
7054 data);
7055 }
7056 else if (hash_mode == 7700)
7057 {
7058 snprintf (out_buf, len-1, "%s$%08X%08X",
7059 (char *) salt.salt_buf,
7060 digest_buf[0],
7061 digest_buf[1]);
7062 }
7063 else if (hash_mode == 7800)
7064 {
7065 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7066 (char *) salt.salt_buf,
7067 digest_buf[0],
7068 digest_buf[1],
7069 digest_buf[2],
7070 digest_buf[3],
7071 digest_buf[4]);
7072 }
7073 else if (hash_mode == 7900)
7074 {
7075 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7076
7077 // ugly hack start
7078
7079 char *tmp = (char *) salt.salt_buf_pc;
7080
7081 ptr_plain[42] = tmp[0];
7082
7083 // ugly hack end
7084
7085 ptr_plain[43] = 0;
7086
7087 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7088 }
7089 else if (hash_mode == 8000)
7090 {
7091 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7092 (unsigned char *) salt.salt_buf,
7093 digest_buf[0],
7094 digest_buf[1],
7095 digest_buf[2],
7096 digest_buf[3],
7097 digest_buf[4],
7098 digest_buf[5],
7099 digest_buf[6],
7100 digest_buf[7]);
7101 }
7102 else if (hash_mode == 8100)
7103 {
7104 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7105 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7106
7107 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7108 (unsigned char *) salt.salt_buf,
7109 digest_buf[0],
7110 digest_buf[1],
7111 digest_buf[2],
7112 digest_buf[3],
7113 digest_buf[4]);
7114 }
7115 else if (hash_mode == 8200)
7116 {
7117 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7118
7119 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7120
7121 char data_buf[4096] = { 0 };
7122
7123 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7124 {
7125 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7126 }
7127
7128 data_buf[cloudkey->data_len * 2] = 0;
7129
7130 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7131 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7132 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7133 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7134 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7135 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7136 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7137 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7138
7139 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7140 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7141 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7142 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7143
7144 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7145 digest_buf[0],
7146 digest_buf[1],
7147 digest_buf[2],
7148 digest_buf[3],
7149 digest_buf[4],
7150 digest_buf[5],
7151 digest_buf[6],
7152 digest_buf[7],
7153 salt.salt_buf[0],
7154 salt.salt_buf[1],
7155 salt.salt_buf[2],
7156 salt.salt_buf[3],
7157 salt.salt_iter + 1,
7158 data_buf);
7159 }
7160 else if (hash_mode == 8300)
7161 {
7162 char digest_buf_c[34] = { 0 };
7163
7164 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7165
7166 digest_buf_c[32] = 0;
7167
7168 // domain
7169
7170 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7171
7172 char domain_buf_c[33] = { 0 };
7173
7174 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7175
7176 for (uint i = 0; i < salt_pc_len; i++)
7177 {
7178 const char next = domain_buf_c[i];
7179
7180 domain_buf_c[i] = '.';
7181
7182 i += next;
7183 }
7184
7185 domain_buf_c[salt_pc_len] = 0;
7186
7187 // final
7188
7189 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7190 }
7191 else if (hash_mode == 8500)
7192 {
7193 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7194 }
7195 else if (hash_mode == 2612)
7196 {
7197 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7198 SIGNATURE_PHPS,
7199 (char *) salt.salt_buf,
7200 digest_buf[0],
7201 digest_buf[1],
7202 digest_buf[2],
7203 digest_buf[3]);
7204 }
7205 else if (hash_mode == 3711)
7206 {
7207 char *salt_ptr = (char *) salt.salt_buf;
7208
7209 salt_ptr[salt.salt_len - 1] = 0;
7210
7211 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7212 SIGNATURE_MEDIAWIKI_B,
7213 salt_ptr,
7214 digest_buf[0],
7215 digest_buf[1],
7216 digest_buf[2],
7217 digest_buf[3]);
7218 }
7219 else if (hash_mode == 8800)
7220 {
7221 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7222
7223 androidfde_t *androidfde = &androidfdes[salt_pos];
7224
7225 char tmp[3073] = { 0 };
7226
7227 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7228 {
7229 sprintf (tmp + j, "%08x", androidfde->data[i]);
7230 }
7231
7232 tmp[3072] = 0;
7233
7234 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7235 SIGNATURE_ANDROIDFDE,
7236 byte_swap_32 (salt.salt_buf[0]),
7237 byte_swap_32 (salt.salt_buf[1]),
7238 byte_swap_32 (salt.salt_buf[2]),
7239 byte_swap_32 (salt.salt_buf[3]),
7240 byte_swap_32 (digest_buf[0]),
7241 byte_swap_32 (digest_buf[1]),
7242 byte_swap_32 (digest_buf[2]),
7243 byte_swap_32 (digest_buf[3]),
7244 tmp);
7245 }
7246 else if (hash_mode == 8900)
7247 {
7248 uint N = salt.scrypt_N;
7249 uint r = salt.scrypt_r;
7250 uint p = salt.scrypt_p;
7251
7252 char base64_salt[32] = { 0 };
7253
7254 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7255
7256 memset (tmp_buf, 0, 46);
7257
7258 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7259 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7260 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7261 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7262 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7263 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7264 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7265 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7266 digest_buf[8] = 0; // needed for base64_encode ()
7267
7268 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7269
7270 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7271 SIGNATURE_SCRYPT,
7272 N,
7273 r,
7274 p,
7275 base64_salt,
7276 tmp_buf);
7277 }
7278 else if (hash_mode == 9000)
7279 {
7280 snprintf (out_buf, len-1, "%s", hashfile);
7281 }
7282 else if (hash_mode == 9200)
7283 {
7284 // salt
7285
7286 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7287
7288 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7289
7290 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7291
7292 // hash
7293
7294 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7295 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7296 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7297 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7298 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7299 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7300 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7301 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7302 digest_buf[8] = 0; // needed for base64_encode ()
7303
7304 char tmp_buf[64] = { 0 };
7305
7306 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7307 tmp_buf[43] = 0; // cut it here
7308
7309 // output
7310
7311 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7312 }
7313 else if (hash_mode == 9300)
7314 {
7315 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7316 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7317 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7318 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7319 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7320 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7321 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7322 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7323 digest_buf[8] = 0; // needed for base64_encode ()
7324
7325 char tmp_buf[64] = { 0 };
7326
7327 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7328 tmp_buf[43] = 0; // cut it here
7329
7330 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7331
7332 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7333 }
7334 else if (hash_mode == 9400)
7335 {
7336 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7337
7338 office2007_t *office2007 = &office2007s[salt_pos];
7339
7340 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7341 SIGNATURE_OFFICE2007,
7342 2007,
7343 20,
7344 office2007->keySize,
7345 16,
7346 salt.salt_buf[0],
7347 salt.salt_buf[1],
7348 salt.salt_buf[2],
7349 salt.salt_buf[3],
7350 office2007->encryptedVerifier[0],
7351 office2007->encryptedVerifier[1],
7352 office2007->encryptedVerifier[2],
7353 office2007->encryptedVerifier[3],
7354 office2007->encryptedVerifierHash[0],
7355 office2007->encryptedVerifierHash[1],
7356 office2007->encryptedVerifierHash[2],
7357 office2007->encryptedVerifierHash[3],
7358 office2007->encryptedVerifierHash[4]);
7359 }
7360 else if (hash_mode == 9500)
7361 {
7362 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7363
7364 office2010_t *office2010 = &office2010s[salt_pos];
7365
7366 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,
7367
7368 salt.salt_buf[0],
7369 salt.salt_buf[1],
7370 salt.salt_buf[2],
7371 salt.salt_buf[3],
7372 office2010->encryptedVerifier[0],
7373 office2010->encryptedVerifier[1],
7374 office2010->encryptedVerifier[2],
7375 office2010->encryptedVerifier[3],
7376 office2010->encryptedVerifierHash[0],
7377 office2010->encryptedVerifierHash[1],
7378 office2010->encryptedVerifierHash[2],
7379 office2010->encryptedVerifierHash[3],
7380 office2010->encryptedVerifierHash[4],
7381 office2010->encryptedVerifierHash[5],
7382 office2010->encryptedVerifierHash[6],
7383 office2010->encryptedVerifierHash[7]);
7384 }
7385 else if (hash_mode == 9600)
7386 {
7387 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7388
7389 office2013_t *office2013 = &office2013s[salt_pos];
7390
7391 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,
7392
7393 salt.salt_buf[0],
7394 salt.salt_buf[1],
7395 salt.salt_buf[2],
7396 salt.salt_buf[3],
7397 office2013->encryptedVerifier[0],
7398 office2013->encryptedVerifier[1],
7399 office2013->encryptedVerifier[2],
7400 office2013->encryptedVerifier[3],
7401 office2013->encryptedVerifierHash[0],
7402 office2013->encryptedVerifierHash[1],
7403 office2013->encryptedVerifierHash[2],
7404 office2013->encryptedVerifierHash[3],
7405 office2013->encryptedVerifierHash[4],
7406 office2013->encryptedVerifierHash[5],
7407 office2013->encryptedVerifierHash[6],
7408 office2013->encryptedVerifierHash[7]);
7409 }
7410 else if (hash_mode == 9700)
7411 {
7412 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7413
7414 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7415
7416 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7417 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7418 byte_swap_32 (salt.salt_buf[0]),
7419 byte_swap_32 (salt.salt_buf[1]),
7420 byte_swap_32 (salt.salt_buf[2]),
7421 byte_swap_32 (salt.salt_buf[3]),
7422 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7423 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7424 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7425 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7426 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7427 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7428 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7429 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7430 }
7431 else if (hash_mode == 9710)
7432 {
7433 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7434
7435 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7436
7437 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7438 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7439 byte_swap_32 (salt.salt_buf[0]),
7440 byte_swap_32 (salt.salt_buf[1]),
7441 byte_swap_32 (salt.salt_buf[2]),
7442 byte_swap_32 (salt.salt_buf[3]),
7443 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7444 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7445 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7446 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7447 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7448 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7449 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7450 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7451 }
7452 else if (hash_mode == 9720)
7453 {
7454 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7455
7456 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7457
7458 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7459
7460 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7461 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7462 byte_swap_32 (salt.salt_buf[0]),
7463 byte_swap_32 (salt.salt_buf[1]),
7464 byte_swap_32 (salt.salt_buf[2]),
7465 byte_swap_32 (salt.salt_buf[3]),
7466 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7467 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7468 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7469 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7470 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7471 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7472 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7473 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7474 rc4key[0],
7475 rc4key[1],
7476 rc4key[2],
7477 rc4key[3],
7478 rc4key[4]);
7479 }
7480 else if (hash_mode == 9800)
7481 {
7482 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7483
7484 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7485
7486 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7487 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7488 salt.salt_buf[0],
7489 salt.salt_buf[1],
7490 salt.salt_buf[2],
7491 salt.salt_buf[3],
7492 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7493 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7494 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7495 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7496 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7497 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7498 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7499 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7500 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7501 }
7502 else if (hash_mode == 9810)
7503 {
7504 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7505
7506 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7507
7508 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7509 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7510 salt.salt_buf[0],
7511 salt.salt_buf[1],
7512 salt.salt_buf[2],
7513 salt.salt_buf[3],
7514 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7515 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7516 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7517 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7518 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7519 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7520 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7521 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7522 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7523 }
7524 else if (hash_mode == 9820)
7525 {
7526 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7527
7528 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7529
7530 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7531
7532 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7533 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7534 salt.salt_buf[0],
7535 salt.salt_buf[1],
7536 salt.salt_buf[2],
7537 salt.salt_buf[3],
7538 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7539 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7540 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7541 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7542 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7543 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7544 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7545 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7546 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7547 rc4key[0],
7548 rc4key[1],
7549 rc4key[2],
7550 rc4key[3],
7551 rc4key[4]);
7552 }
7553 else if (hash_mode == 10000)
7554 {
7555 // salt
7556
7557 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7558
7559 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7560
7561 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7562
7563 // hash
7564
7565 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7566 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7567 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7568 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7569 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7570 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7571 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7572 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7573 digest_buf[8] = 0; // needed for base64_encode ()
7574
7575 char tmp_buf[64] = { 0 };
7576
7577 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7578
7579 // output
7580
7581 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7582 }
7583 else if (hash_mode == 10100)
7584 {
7585 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7586 digest_buf[0],
7587 digest_buf[1],
7588 2,
7589 4,
7590 byte_swap_32 (salt.salt_buf[0]),
7591 byte_swap_32 (salt.salt_buf[1]),
7592 byte_swap_32 (salt.salt_buf[2]),
7593 byte_swap_32 (salt.salt_buf[3]));
7594 }
7595 else if (hash_mode == 10200)
7596 {
7597 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7598
7599 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7600
7601 // challenge
7602
7603 char challenge[100] = { 0 };
7604
7605 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7606
7607 // response
7608
7609 char tmp_buf[100] = { 0 };
7610
7611 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7612 (char *) cram_md5->user,
7613 digest_buf[0],
7614 digest_buf[1],
7615 digest_buf[2],
7616 digest_buf[3]);
7617
7618 char response[100] = { 0 };
7619
7620 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7621
7622 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7623 }
7624 else if (hash_mode == 10300)
7625 {
7626 char tmp_buf[100] = { 0 };
7627
7628 memcpy (tmp_buf + 0, digest_buf, 20);
7629 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7630
7631 uint tmp_len = 20 + salt.salt_len;
7632
7633 // base64 encode it
7634
7635 char base64_encoded[100] = { 0 };
7636
7637 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7638
7639 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7640 }
7641 else if (hash_mode == 10400)
7642 {
7643 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7644
7645 pdf_t *pdf = &pdfs[salt_pos];
7646
7647 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",
7648
7649 pdf->V,
7650 pdf->R,
7651 40,
7652 pdf->P,
7653 pdf->enc_md,
7654 pdf->id_len,
7655 byte_swap_32 (pdf->id_buf[0]),
7656 byte_swap_32 (pdf->id_buf[1]),
7657 byte_swap_32 (pdf->id_buf[2]),
7658 byte_swap_32 (pdf->id_buf[3]),
7659 pdf->u_len,
7660 byte_swap_32 (pdf->u_buf[0]),
7661 byte_swap_32 (pdf->u_buf[1]),
7662 byte_swap_32 (pdf->u_buf[2]),
7663 byte_swap_32 (pdf->u_buf[3]),
7664 byte_swap_32 (pdf->u_buf[4]),
7665 byte_swap_32 (pdf->u_buf[5]),
7666 byte_swap_32 (pdf->u_buf[6]),
7667 byte_swap_32 (pdf->u_buf[7]),
7668 pdf->o_len,
7669 byte_swap_32 (pdf->o_buf[0]),
7670 byte_swap_32 (pdf->o_buf[1]),
7671 byte_swap_32 (pdf->o_buf[2]),
7672 byte_swap_32 (pdf->o_buf[3]),
7673 byte_swap_32 (pdf->o_buf[4]),
7674 byte_swap_32 (pdf->o_buf[5]),
7675 byte_swap_32 (pdf->o_buf[6]),
7676 byte_swap_32 (pdf->o_buf[7])
7677 );
7678 }
7679 else if (hash_mode == 10410)
7680 {
7681 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7682
7683 pdf_t *pdf = &pdfs[salt_pos];
7684
7685 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",
7686
7687 pdf->V,
7688 pdf->R,
7689 40,
7690 pdf->P,
7691 pdf->enc_md,
7692 pdf->id_len,
7693 byte_swap_32 (pdf->id_buf[0]),
7694 byte_swap_32 (pdf->id_buf[1]),
7695 byte_swap_32 (pdf->id_buf[2]),
7696 byte_swap_32 (pdf->id_buf[3]),
7697 pdf->u_len,
7698 byte_swap_32 (pdf->u_buf[0]),
7699 byte_swap_32 (pdf->u_buf[1]),
7700 byte_swap_32 (pdf->u_buf[2]),
7701 byte_swap_32 (pdf->u_buf[3]),
7702 byte_swap_32 (pdf->u_buf[4]),
7703 byte_swap_32 (pdf->u_buf[5]),
7704 byte_swap_32 (pdf->u_buf[6]),
7705 byte_swap_32 (pdf->u_buf[7]),
7706 pdf->o_len,
7707 byte_swap_32 (pdf->o_buf[0]),
7708 byte_swap_32 (pdf->o_buf[1]),
7709 byte_swap_32 (pdf->o_buf[2]),
7710 byte_swap_32 (pdf->o_buf[3]),
7711 byte_swap_32 (pdf->o_buf[4]),
7712 byte_swap_32 (pdf->o_buf[5]),
7713 byte_swap_32 (pdf->o_buf[6]),
7714 byte_swap_32 (pdf->o_buf[7])
7715 );
7716 }
7717 else if (hash_mode == 10420)
7718 {
7719 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7720
7721 pdf_t *pdf = &pdfs[salt_pos];
7722
7723 u8 *rc4key = (u8 *) pdf->rc4key;
7724
7725 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",
7726
7727 pdf->V,
7728 pdf->R,
7729 40,
7730 pdf->P,
7731 pdf->enc_md,
7732 pdf->id_len,
7733 byte_swap_32 (pdf->id_buf[0]),
7734 byte_swap_32 (pdf->id_buf[1]),
7735 byte_swap_32 (pdf->id_buf[2]),
7736 byte_swap_32 (pdf->id_buf[3]),
7737 pdf->u_len,
7738 byte_swap_32 (pdf->u_buf[0]),
7739 byte_swap_32 (pdf->u_buf[1]),
7740 byte_swap_32 (pdf->u_buf[2]),
7741 byte_swap_32 (pdf->u_buf[3]),
7742 byte_swap_32 (pdf->u_buf[4]),
7743 byte_swap_32 (pdf->u_buf[5]),
7744 byte_swap_32 (pdf->u_buf[6]),
7745 byte_swap_32 (pdf->u_buf[7]),
7746 pdf->o_len,
7747 byte_swap_32 (pdf->o_buf[0]),
7748 byte_swap_32 (pdf->o_buf[1]),
7749 byte_swap_32 (pdf->o_buf[2]),
7750 byte_swap_32 (pdf->o_buf[3]),
7751 byte_swap_32 (pdf->o_buf[4]),
7752 byte_swap_32 (pdf->o_buf[5]),
7753 byte_swap_32 (pdf->o_buf[6]),
7754 byte_swap_32 (pdf->o_buf[7]),
7755 rc4key[0],
7756 rc4key[1],
7757 rc4key[2],
7758 rc4key[3],
7759 rc4key[4]
7760 );
7761 }
7762 else if (hash_mode == 10500)
7763 {
7764 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7765
7766 pdf_t *pdf = &pdfs[salt_pos];
7767
7768 if (pdf->id_len == 32)
7769 {
7770 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",
7771
7772 pdf->V,
7773 pdf->R,
7774 128,
7775 pdf->P,
7776 pdf->enc_md,
7777 pdf->id_len,
7778 byte_swap_32 (pdf->id_buf[0]),
7779 byte_swap_32 (pdf->id_buf[1]),
7780 byte_swap_32 (pdf->id_buf[2]),
7781 byte_swap_32 (pdf->id_buf[3]),
7782 byte_swap_32 (pdf->id_buf[4]),
7783 byte_swap_32 (pdf->id_buf[5]),
7784 byte_swap_32 (pdf->id_buf[6]),
7785 byte_swap_32 (pdf->id_buf[7]),
7786 pdf->u_len,
7787 byte_swap_32 (pdf->u_buf[0]),
7788 byte_swap_32 (pdf->u_buf[1]),
7789 byte_swap_32 (pdf->u_buf[2]),
7790 byte_swap_32 (pdf->u_buf[3]),
7791 byte_swap_32 (pdf->u_buf[4]),
7792 byte_swap_32 (pdf->u_buf[5]),
7793 byte_swap_32 (pdf->u_buf[6]),
7794 byte_swap_32 (pdf->u_buf[7]),
7795 pdf->o_len,
7796 byte_swap_32 (pdf->o_buf[0]),
7797 byte_swap_32 (pdf->o_buf[1]),
7798 byte_swap_32 (pdf->o_buf[2]),
7799 byte_swap_32 (pdf->o_buf[3]),
7800 byte_swap_32 (pdf->o_buf[4]),
7801 byte_swap_32 (pdf->o_buf[5]),
7802 byte_swap_32 (pdf->o_buf[6]),
7803 byte_swap_32 (pdf->o_buf[7])
7804 );
7805 }
7806 else
7807 {
7808 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",
7809
7810 pdf->V,
7811 pdf->R,
7812 128,
7813 pdf->P,
7814 pdf->enc_md,
7815 pdf->id_len,
7816 byte_swap_32 (pdf->id_buf[0]),
7817 byte_swap_32 (pdf->id_buf[1]),
7818 byte_swap_32 (pdf->id_buf[2]),
7819 byte_swap_32 (pdf->id_buf[3]),
7820 pdf->u_len,
7821 byte_swap_32 (pdf->u_buf[0]),
7822 byte_swap_32 (pdf->u_buf[1]),
7823 byte_swap_32 (pdf->u_buf[2]),
7824 byte_swap_32 (pdf->u_buf[3]),
7825 byte_swap_32 (pdf->u_buf[4]),
7826 byte_swap_32 (pdf->u_buf[5]),
7827 byte_swap_32 (pdf->u_buf[6]),
7828 byte_swap_32 (pdf->u_buf[7]),
7829 pdf->o_len,
7830 byte_swap_32 (pdf->o_buf[0]),
7831 byte_swap_32 (pdf->o_buf[1]),
7832 byte_swap_32 (pdf->o_buf[2]),
7833 byte_swap_32 (pdf->o_buf[3]),
7834 byte_swap_32 (pdf->o_buf[4]),
7835 byte_swap_32 (pdf->o_buf[5]),
7836 byte_swap_32 (pdf->o_buf[6]),
7837 byte_swap_32 (pdf->o_buf[7])
7838 );
7839 }
7840 }
7841 else if (hash_mode == 10600)
7842 {
7843 uint digest_idx = salt.digests_offset + digest_pos;
7844
7845 hashinfo_t **hashinfo_ptr = data.hash_info;
7846 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7847
7848 snprintf (out_buf, len-1, "%s", hash_buf);
7849 }
7850 else if (hash_mode == 10700)
7851 {
7852 uint digest_idx = salt.digests_offset + digest_pos;
7853
7854 hashinfo_t **hashinfo_ptr = data.hash_info;
7855 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7856
7857 snprintf (out_buf, len-1, "%s", hash_buf);
7858 }
7859 else if (hash_mode == 10900)
7860 {
7861 uint digest_idx = salt.digests_offset + digest_pos;
7862
7863 hashinfo_t **hashinfo_ptr = data.hash_info;
7864 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7865
7866 snprintf (out_buf, len-1, "%s", hash_buf);
7867 }
7868 else if (hash_mode == 11100)
7869 {
7870 u32 salt_challenge = salt.salt_buf[0];
7871
7872 salt_challenge = byte_swap_32 (salt_challenge);
7873
7874 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7875
7876 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7877 SIGNATURE_POSTGRESQL_AUTH,
7878 user_name,
7879 salt_challenge,
7880 digest_buf[0],
7881 digest_buf[1],
7882 digest_buf[2],
7883 digest_buf[3]);
7884 }
7885 else if (hash_mode == 11200)
7886 {
7887 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7888 SIGNATURE_MYSQL_AUTH,
7889 (unsigned char *) salt.salt_buf,
7890 digest_buf[0],
7891 digest_buf[1],
7892 digest_buf[2],
7893 digest_buf[3],
7894 digest_buf[4]);
7895 }
7896 else if (hash_mode == 11300)
7897 {
7898 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7899
7900 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7901
7902 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7903 const uint ckey_len = bitcoin_wallet->ckey_len;
7904 const uint public_key_len = bitcoin_wallet->public_key_len;
7905
7906 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7907 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7908 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7909
7910 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7911 {
7912 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7913
7914 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7915 }
7916
7917 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7918 {
7919 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7920
7921 sprintf (ckey_buf + j, "%02x", ptr[i]);
7922 }
7923
7924 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7925 {
7926 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
7927
7928 sprintf (public_key_buf + j, "%02x", ptr[i]);
7929 }
7930
7931 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7932 SIGNATURE_BITCOIN_WALLET,
7933 cry_master_len * 2,
7934 cry_master_buf,
7935 salt.salt_len,
7936 (unsigned char *) salt.salt_buf,
7937 salt.salt_iter + 1,
7938 ckey_len * 2,
7939 ckey_buf,
7940 public_key_len * 2,
7941 public_key_buf
7942 );
7943
7944 free (cry_master_buf);
7945 free (ckey_buf);
7946 free (public_key_buf);
7947 }
7948 else if (hash_mode == 11400)
7949 {
7950 uint digest_idx = salt.digests_offset + digest_pos;
7951
7952 hashinfo_t **hashinfo_ptr = data.hash_info;
7953 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7954
7955 snprintf (out_buf, len-1, "%s", hash_buf);
7956 }
7957 else if (hash_mode == 11600)
7958 {
7959 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7960
7961 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7962
7963 const uint data_len = seven_zip->data_len;
7964
7965 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7966
7967 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7968 {
7969 const u8 *ptr = (const u8 *) seven_zip->data_buf;
7970
7971 sprintf (data_buf + j, "%02x", ptr[i]);
7972 }
7973
7974 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7975 SIGNATURE_SEVEN_ZIP,
7976 0,
7977 salt.salt_sign[0],
7978 0,
7979 (char *) seven_zip->salt_buf,
7980 seven_zip->iv_len,
7981 seven_zip->iv_buf[0],
7982 seven_zip->iv_buf[1],
7983 seven_zip->iv_buf[2],
7984 seven_zip->iv_buf[3],
7985 seven_zip->crc,
7986 seven_zip->data_len,
7987 seven_zip->unpack_size,
7988 data_buf);
7989
7990 free (data_buf);
7991 }
7992 else if (hash_mode == 11700)
7993 {
7994 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7995 digest_buf[0],
7996 digest_buf[1],
7997 digest_buf[2],
7998 digest_buf[3],
7999 digest_buf[4],
8000 digest_buf[5],
8001 digest_buf[6],
8002 digest_buf[7]);
8003 }
8004 else if (hash_mode == 11800)
8005 {
8006 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8007 digest_buf[ 0],
8008 digest_buf[ 1],
8009 digest_buf[ 2],
8010 digest_buf[ 3],
8011 digest_buf[ 4],
8012 digest_buf[ 5],
8013 digest_buf[ 6],
8014 digest_buf[ 7],
8015 digest_buf[ 8],
8016 digest_buf[ 9],
8017 digest_buf[10],
8018 digest_buf[11],
8019 digest_buf[12],
8020 digest_buf[13],
8021 digest_buf[14],
8022 digest_buf[15]);
8023 }
8024 else if (hash_mode == 11900)
8025 {
8026 uint digest_idx = salt.digests_offset + digest_pos;
8027
8028 hashinfo_t **hashinfo_ptr = data.hash_info;
8029 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8030
8031 snprintf (out_buf, len-1, "%s", hash_buf);
8032 }
8033 else if (hash_mode == 12000)
8034 {
8035 uint digest_idx = salt.digests_offset + digest_pos;
8036
8037 hashinfo_t **hashinfo_ptr = data.hash_info;
8038 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8039
8040 snprintf (out_buf, len-1, "%s", hash_buf);
8041 }
8042 else if (hash_mode == 12100)
8043 {
8044 uint digest_idx = salt.digests_offset + digest_pos;
8045
8046 hashinfo_t **hashinfo_ptr = data.hash_info;
8047 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8048
8049 snprintf (out_buf, len-1, "%s", hash_buf);
8050 }
8051 else if (hash_mode == 12200)
8052 {
8053 uint *ptr_digest = digest_buf;
8054 uint *ptr_salt = salt.salt_buf;
8055
8056 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8057 SIGNATURE_ECRYPTFS,
8058 ptr_salt[0],
8059 ptr_salt[1],
8060 ptr_digest[0],
8061 ptr_digest[1]);
8062 }
8063 else if (hash_mode == 12300)
8064 {
8065 uint *ptr_digest = digest_buf;
8066 uint *ptr_salt = salt.salt_buf;
8067
8068 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",
8069 ptr_digest[ 0], ptr_digest[ 1],
8070 ptr_digest[ 2], ptr_digest[ 3],
8071 ptr_digest[ 4], ptr_digest[ 5],
8072 ptr_digest[ 6], ptr_digest[ 7],
8073 ptr_digest[ 8], ptr_digest[ 9],
8074 ptr_digest[10], ptr_digest[11],
8075 ptr_digest[12], ptr_digest[13],
8076 ptr_digest[14], ptr_digest[15],
8077 ptr_salt[0],
8078 ptr_salt[1],
8079 ptr_salt[2],
8080 ptr_salt[3]);
8081 }
8082 else if (hash_mode == 12400)
8083 {
8084 // encode iteration count
8085
8086 char salt_iter[5] = { 0 };
8087
8088 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8089 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8090 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8091 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8092 salt_iter[4] = 0;
8093
8094 // encode salt
8095
8096 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8097 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8098 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8099 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8100 ptr_salt[4] = 0;
8101
8102 // encode digest
8103
8104 memset (tmp_buf, 0, sizeof (tmp_buf));
8105
8106 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8107 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8108
8109 memcpy (tmp_buf, digest_buf, 8);
8110
8111 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8112
8113 ptr_plain[11] = 0;
8114
8115 // fill the resulting buffer
8116
8117 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8118 }
8119 else if (hash_mode == 12500)
8120 {
8121 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8122 SIGNATURE_RAR3,
8123 byte_swap_32 (salt.salt_buf[0]),
8124 byte_swap_32 (salt.salt_buf[1]),
8125 salt.salt_buf[2],
8126 salt.salt_buf[3],
8127 salt.salt_buf[4],
8128 salt.salt_buf[5]);
8129 }
8130 else if (hash_mode == 12600)
8131 {
8132 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8133 digest_buf[0] + salt.salt_buf_pc[0],
8134 digest_buf[1] + salt.salt_buf_pc[1],
8135 digest_buf[2] + salt.salt_buf_pc[2],
8136 digest_buf[3] + salt.salt_buf_pc[3],
8137 digest_buf[4] + salt.salt_buf_pc[4],
8138 digest_buf[5] + salt.salt_buf_pc[5],
8139 digest_buf[6] + salt.salt_buf_pc[6],
8140 digest_buf[7] + salt.salt_buf_pc[7]);
8141 }
8142 else if (hash_mode == 12700)
8143 {
8144 uint digest_idx = salt.digests_offset + digest_pos;
8145
8146 hashinfo_t **hashinfo_ptr = data.hash_info;
8147 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8148
8149 snprintf (out_buf, len-1, "%s", hash_buf);
8150 }
8151 else if (hash_mode == 12800)
8152 {
8153 const u8 *ptr = (const u8 *) salt.salt_buf;
8154
8155 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",
8156 SIGNATURE_MS_DRSR,
8157 ptr[0],
8158 ptr[1],
8159 ptr[2],
8160 ptr[3],
8161 ptr[4],
8162 ptr[5],
8163 ptr[6],
8164 ptr[7],
8165 ptr[8],
8166 ptr[9],
8167 salt.salt_iter + 1,
8168 byte_swap_32 (digest_buf[0]),
8169 byte_swap_32 (digest_buf[1]),
8170 byte_swap_32 (digest_buf[2]),
8171 byte_swap_32 (digest_buf[3]),
8172 byte_swap_32 (digest_buf[4]),
8173 byte_swap_32 (digest_buf[5]),
8174 byte_swap_32 (digest_buf[6]),
8175 byte_swap_32 (digest_buf[7])
8176 );
8177 }
8178 else if (hash_mode == 12900)
8179 {
8180 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",
8181 salt.salt_buf[ 4],
8182 salt.salt_buf[ 5],
8183 salt.salt_buf[ 6],
8184 salt.salt_buf[ 7],
8185 salt.salt_buf[ 8],
8186 salt.salt_buf[ 9],
8187 salt.salt_buf[10],
8188 salt.salt_buf[11],
8189 byte_swap_32 (digest_buf[0]),
8190 byte_swap_32 (digest_buf[1]),
8191 byte_swap_32 (digest_buf[2]),
8192 byte_swap_32 (digest_buf[3]),
8193 byte_swap_32 (digest_buf[4]),
8194 byte_swap_32 (digest_buf[5]),
8195 byte_swap_32 (digest_buf[6]),
8196 byte_swap_32 (digest_buf[7]),
8197 salt.salt_buf[ 0],
8198 salt.salt_buf[ 1],
8199 salt.salt_buf[ 2],
8200 salt.salt_buf[ 3]
8201 );
8202 }
8203 else if (hash_mode == 13000)
8204 {
8205 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8206
8207 rar5_t *rar5 = &rar5s[salt_pos];
8208
8209 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8210 salt.salt_buf[0],
8211 salt.salt_buf[1],
8212 salt.salt_buf[2],
8213 salt.salt_buf[3],
8214 salt.salt_sign[0],
8215 rar5->iv[0],
8216 rar5->iv[1],
8217 rar5->iv[2],
8218 rar5->iv[3],
8219 byte_swap_32 (digest_buf[0]),
8220 byte_swap_32 (digest_buf[1])
8221 );
8222 }
8223 else
8224 {
8225 if (hash_type == HASH_TYPE_MD4)
8226 {
8227 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8228 digest_buf[0],
8229 digest_buf[1],
8230 digest_buf[2],
8231 digest_buf[3]);
8232 }
8233 else if (hash_type == HASH_TYPE_MD5)
8234 {
8235 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8236 digest_buf[0],
8237 digest_buf[1],
8238 digest_buf[2],
8239 digest_buf[3]);
8240 }
8241 else if (hash_type == HASH_TYPE_SHA1)
8242 {
8243 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8244 digest_buf[0],
8245 digest_buf[1],
8246 digest_buf[2],
8247 digest_buf[3],
8248 digest_buf[4]);
8249 }
8250 else if (hash_type == HASH_TYPE_SHA256)
8251 {
8252 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8253 digest_buf[0],
8254 digest_buf[1],
8255 digest_buf[2],
8256 digest_buf[3],
8257 digest_buf[4],
8258 digest_buf[5],
8259 digest_buf[6],
8260 digest_buf[7]);
8261 }
8262 else if (hash_type == HASH_TYPE_SHA384)
8263 {
8264 uint *ptr = digest_buf;
8265
8266 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8267 ptr[ 1], ptr[ 0],
8268 ptr[ 3], ptr[ 2],
8269 ptr[ 5], ptr[ 4],
8270 ptr[ 7], ptr[ 6],
8271 ptr[ 9], ptr[ 8],
8272 ptr[11], ptr[10]);
8273 }
8274 else if (hash_type == HASH_TYPE_SHA512)
8275 {
8276 uint *ptr = digest_buf;
8277
8278 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8279 ptr[ 1], ptr[ 0],
8280 ptr[ 3], ptr[ 2],
8281 ptr[ 5], ptr[ 4],
8282 ptr[ 7], ptr[ 6],
8283 ptr[ 9], ptr[ 8],
8284 ptr[11], ptr[10],
8285 ptr[13], ptr[12],
8286 ptr[15], ptr[14]);
8287 }
8288 else if (hash_type == HASH_TYPE_LM)
8289 {
8290 snprintf (out_buf, len-1, "%08x%08x",
8291 digest_buf[0],
8292 digest_buf[1]);
8293 }
8294 else if (hash_type == HASH_TYPE_ORACLEH)
8295 {
8296 snprintf (out_buf, len-1, "%08X%08X",
8297 digest_buf[0],
8298 digest_buf[1]);
8299 }
8300 else if (hash_type == HASH_TYPE_BCRYPT)
8301 {
8302 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8303 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8304
8305 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8306
8307 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8308 }
8309 else if (hash_type == HASH_TYPE_KECCAK)
8310 {
8311 uint *ptr = digest_buf;
8312
8313 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",
8314 ptr[ 1], ptr[ 0],
8315 ptr[ 3], ptr[ 2],
8316 ptr[ 5], ptr[ 4],
8317 ptr[ 7], ptr[ 6],
8318 ptr[ 9], ptr[ 8],
8319 ptr[11], ptr[10],
8320 ptr[13], ptr[12],
8321 ptr[15], ptr[14],
8322 ptr[17], ptr[16],
8323 ptr[19], ptr[18],
8324 ptr[21], ptr[20],
8325 ptr[23], ptr[22],
8326 ptr[25], ptr[24],
8327 ptr[27], ptr[26],
8328 ptr[29], ptr[28],
8329 ptr[31], ptr[30],
8330 ptr[33], ptr[32],
8331 ptr[35], ptr[34],
8332 ptr[37], ptr[36],
8333 ptr[39], ptr[38],
8334 ptr[41], ptr[30],
8335 ptr[43], ptr[42],
8336 ptr[45], ptr[44],
8337 ptr[47], ptr[46],
8338 ptr[49], ptr[48]
8339 );
8340
8341 out_buf[salt.keccak_mdlen * 2] = 0;
8342 }
8343 else if (hash_type == HASH_TYPE_RIPEMD160)
8344 {
8345 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8346 digest_buf[0],
8347 digest_buf[1],
8348 digest_buf[2],
8349 digest_buf[3],
8350 digest_buf[4]);
8351 }
8352 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8353 {
8354 digest_buf[ 0] = digest_buf[ 0];
8355 digest_buf[ 1] = digest_buf[ 1];
8356 digest_buf[ 2] = digest_buf[ 2];
8357 digest_buf[ 3] = digest_buf[ 3];
8358 digest_buf[ 4] = digest_buf[ 4];
8359 digest_buf[ 5] = digest_buf[ 5];
8360 digest_buf[ 6] = digest_buf[ 6];
8361 digest_buf[ 7] = digest_buf[ 7];
8362 digest_buf[ 8] = digest_buf[ 8];
8363 digest_buf[ 9] = digest_buf[ 9];
8364 digest_buf[10] = digest_buf[10];
8365 digest_buf[11] = digest_buf[11];
8366 digest_buf[12] = digest_buf[12];
8367 digest_buf[13] = digest_buf[13];
8368 digest_buf[14] = digest_buf[14];
8369 digest_buf[15] = digest_buf[15];
8370
8371 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8372 digest_buf[ 0],
8373 digest_buf[ 1],
8374 digest_buf[ 2],
8375 digest_buf[ 3],
8376 digest_buf[ 4],
8377 digest_buf[ 5],
8378 digest_buf[ 6],
8379 digest_buf[ 7],
8380 digest_buf[ 8],
8381 digest_buf[ 9],
8382 digest_buf[10],
8383 digest_buf[11],
8384 digest_buf[12],
8385 digest_buf[13],
8386 digest_buf[14],
8387 digest_buf[15]);
8388 }
8389 else if (hash_type == HASH_TYPE_GOST)
8390 {
8391 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8392 digest_buf[0],
8393 digest_buf[1],
8394 digest_buf[2],
8395 digest_buf[3],
8396 digest_buf[4],
8397 digest_buf[5],
8398 digest_buf[6],
8399 digest_buf[7]);
8400 }
8401 else if (hash_type == HASH_TYPE_MYSQL)
8402 {
8403 snprintf (out_buf, len-1, "%08x%08x",
8404 digest_buf[0],
8405 digest_buf[1]);
8406 }
8407 else if (hash_type == HASH_TYPE_LOTUS5)
8408 {
8409 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8410 digest_buf[0],
8411 digest_buf[1],
8412 digest_buf[2],
8413 digest_buf[3]);
8414 }
8415 else if (hash_type == HASH_TYPE_LOTUS6)
8416 {
8417 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8418 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8419 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8420 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8421
8422 char buf[16] = { 0 };
8423
8424 memcpy (buf + 0, salt.salt_buf, 5);
8425 memcpy (buf + 5, digest_buf, 9);
8426
8427 buf[3] -= -4;
8428
8429 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8430
8431 tmp_buf[18] = salt.salt_buf_pc[7];
8432 tmp_buf[19] = 0;
8433
8434 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8435 }
8436 else if (hash_type == HASH_TYPE_LOTUS8)
8437 {
8438 char buf[52] = { 0 };
8439
8440 // salt
8441
8442 memcpy (buf + 0, salt.salt_buf, 16);
8443
8444 buf[3] -= -4;
8445
8446 // iteration
8447
8448 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8449
8450 // chars
8451
8452 buf[26] = salt.salt_buf_pc[0];
8453 buf[27] = salt.salt_buf_pc[1];
8454
8455 // digest
8456
8457 memcpy (buf + 28, digest_buf, 8);
8458
8459 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8460
8461 tmp_buf[49] = 0;
8462
8463 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8464 }
8465 else if (hash_type == HASH_TYPE_CRC32)
8466 {
8467 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8468 }
8469 }
8470
8471 if (salt_type == SALT_TYPE_INTERN)
8472 {
8473 size_t pos = strlen (out_buf);
8474
8475 out_buf[pos] = data.separator;
8476
8477 char *ptr = (char *) salt.salt_buf;
8478
8479 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8480
8481 out_buf[pos + 1 + salt.salt_len] = 0;
8482 }
8483 }
8484
8485 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8486 {
8487 memset (hccap, 0, sizeof (hccap_t));
8488
8489 salt_t *salt = &data.salts_buf[salt_pos];
8490
8491 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8492
8493 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8494 wpa_t *wpa = &wpas[salt_pos];
8495
8496 hccap->keyver = wpa->keyver;
8497
8498 hccap->eapol_size = wpa->eapol_size;
8499
8500 if (wpa->keyver != 1)
8501 {
8502 uint eapol_tmp[64] = { 0 };
8503
8504 for (uint i = 0; i < 64; i++)
8505 {
8506 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8507 }
8508
8509 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8510 }
8511 else
8512 {
8513 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8514 }
8515
8516 uint pke_tmp[25] = { 0 };
8517
8518 for (int i = 5; i < 25; i++)
8519 {
8520 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8521 }
8522
8523 char *pke_ptr = (char *) pke_tmp;
8524
8525 memcpy (hccap->mac1, pke_ptr + 23, 6);
8526 memcpy (hccap->mac2, pke_ptr + 29, 6);
8527 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8528 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8529
8530 char *digests_buf_ptr = (char *) data.digests_buf;
8531
8532 uint dgst_size = data.dgst_size;
8533
8534 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8535
8536 if (wpa->keyver != 1)
8537 {
8538 uint digest_tmp[4] = { 0 };
8539
8540 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8541 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8542 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8543 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8544
8545 memcpy (hccap->keymic, digest_tmp, 16);
8546 }
8547 else
8548 {
8549 memcpy (hccap->keymic, digest_ptr, 16);
8550 }
8551 }
8552
8553 void SuspendThreads ()
8554 {
8555 if (data.devices_status == STATUS_RUNNING)
8556 {
8557 hc_timer_set (&data.timer_paused);
8558
8559 data.devices_status = STATUS_PAUSED;
8560
8561 log_info ("Paused");
8562 }
8563 }
8564
8565 void ResumeThreads ()
8566 {
8567 if (data.devices_status == STATUS_PAUSED)
8568 {
8569 float ms_paused;
8570
8571 hc_timer_get (data.timer_paused, ms_paused);
8572
8573 data.ms_paused += ms_paused;
8574
8575 data.devices_status = STATUS_RUNNING;
8576
8577 log_info ("Resumed");
8578 }
8579 }
8580
8581 void bypass ()
8582 {
8583 if (data.devices_status != STATUS_RUNNING) return;
8584
8585 data.devices_status = STATUS_BYPASS;
8586
8587 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8588 }
8589
8590 void stop_at_checkpoint ()
8591 {
8592 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8593 {
8594 if (data.devices_status != STATUS_RUNNING) return;
8595 }
8596
8597 // this feature only makes sense if --restore-disable was not specified
8598
8599 if (data.restore_disable == 1)
8600 {
8601 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8602
8603 return;
8604 }
8605
8606 // check if monitoring of Restore Point updates should be enabled or disabled
8607
8608 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8609 {
8610 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8611
8612 // save the current restore point value
8613
8614 data.checkpoint_cur_words = get_lowest_words_done ();
8615
8616 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8617 }
8618 else
8619 {
8620 data.devices_status = STATUS_RUNNING;
8621
8622 // reset the global value for checkpoint checks
8623
8624 data.checkpoint_cur_words = 0;
8625
8626 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8627 }
8628 }
8629
8630 void myabort ()
8631 {
8632 if (data.devices_status == STATUS_INIT) return;
8633 if (data.devices_status == STATUS_STARTING) return;
8634
8635 data.devices_status = STATUS_ABORTED;
8636 }
8637
8638 void myquit ()
8639 {
8640 if (data.devices_status == STATUS_INIT) return;
8641 if (data.devices_status == STATUS_STARTING) return;
8642
8643 data.devices_status = STATUS_QUIT;
8644 }
8645
8646 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8647 {
8648 FILE *fp = fopen (kernel_file, "rb");
8649
8650 if (fp != NULL)
8651 {
8652 struct stat st;
8653
8654 memset (&st, 0, sizeof (st));
8655
8656 stat (kernel_file, &st);
8657
8658 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8659
8660 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8661
8662 if (num_read != (size_t) st.st_size)
8663 {
8664 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8665
8666 exit (-1);
8667 }
8668
8669 fclose (fp);
8670
8671 buf[st.st_size] = 0;
8672
8673 for (int i = 0; i < num_devices; i++)
8674 {
8675 kernel_lengths[i] = (size_t) st.st_size;
8676
8677 kernel_sources[i] = buf;
8678 }
8679 }
8680 else
8681 {
8682 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8683
8684 exit (-1);
8685 }
8686
8687 return;
8688 }
8689
8690 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8691 {
8692 if (binary_size > 0)
8693 {
8694 FILE *fp = fopen (dst, "wb");
8695
8696 lock_file (fp);
8697 fwrite (binary, sizeof (u8), binary_size, fp);
8698
8699 fflush (fp);
8700 fclose (fp);
8701 }
8702 }
8703
8704 /**
8705 * restore
8706 */
8707
8708 restore_data_t *init_restore (int argc, char **argv)
8709 {
8710 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8711
8712 if (data.restore_disable == 0)
8713 {
8714 FILE *fp = fopen (data.eff_restore_file, "rb");
8715
8716 if (fp)
8717 {
8718 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8719
8720 if (nread != 1)
8721 {
8722 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8723
8724 exit (-1);
8725 }
8726
8727 fclose (fp);
8728
8729 if (rd->pid)
8730 {
8731 char pidbin[BUFSIZ] = { 0 };
8732
8733 int pidbin_len = -1;
8734
8735 #ifdef _POSIX
8736 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8737
8738 FILE *fd = fopen (pidbin, "rb");
8739
8740 if (fd)
8741 {
8742 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8743
8744 pidbin[pidbin_len] = 0;
8745
8746 fclose (fd);
8747
8748 char *argv0_r = strrchr (argv[0], '/');
8749
8750 char *pidbin_r = strrchr (pidbin, '/');
8751
8752 if (argv0_r == NULL) argv0_r = argv[0];
8753
8754 if (pidbin_r == NULL) pidbin_r = pidbin;
8755
8756 if (strcmp (argv0_r, pidbin_r) == 0)
8757 {
8758 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8759
8760 exit (-1);
8761 }
8762 }
8763
8764 #elif _WIN
8765 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8766
8767 char pidbin2[BUFSIZ] = { 0 };
8768
8769 int pidbin2_len = -1;
8770
8771 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8772 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8773
8774 pidbin[pidbin_len] = 0;
8775 pidbin2[pidbin2_len] = 0;
8776
8777 if (pidbin2_len)
8778 {
8779 if (strcmp (pidbin, pidbin2) == 0)
8780 {
8781 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8782
8783 exit (-1);
8784 }
8785 }
8786 #endif
8787 }
8788
8789 if (rd->version_bin < RESTORE_MIN)
8790 {
8791 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8792
8793 exit (-1);
8794 }
8795 }
8796 }
8797
8798 memset (rd, 0, sizeof (restore_data_t));
8799
8800 rd->version_bin = VERSION_BIN;
8801
8802 #ifdef _POSIX
8803 rd->pid = getpid ();
8804 #elif _WIN
8805 rd->pid = GetCurrentProcessId ();
8806 #endif
8807
8808 if (getcwd (rd->cwd, 255) == NULL)
8809 {
8810 myfree (rd);
8811
8812 return (NULL);
8813 }
8814
8815 rd->argc = argc;
8816 rd->argv = argv;
8817
8818 return (rd);
8819 }
8820
8821 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8822 {
8823 FILE *fp = fopen (eff_restore_file, "rb");
8824
8825 if (fp == NULL)
8826 {
8827 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8828
8829 exit (-1);
8830 }
8831
8832 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8833 {
8834 log_error ("ERROR: cannot read %s", eff_restore_file);
8835
8836 exit (-1);
8837 }
8838
8839 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8840
8841 for (uint i = 0; i < rd->argc; i++)
8842 {
8843 char buf[BUFSIZ] = { 0 };
8844
8845 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8846 {
8847 log_error ("ERROR: cannot read %s", eff_restore_file);
8848
8849 exit (-1);
8850 }
8851
8852 size_t len = strlen (buf);
8853
8854 if (len) buf[len - 1] = 0;
8855
8856 rd->argv[i] = mystrdup (buf);
8857 }
8858
8859 fclose (fp);
8860
8861 char new_cwd[1024] = { 0 };
8862
8863 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8864
8865 if (nwd == NULL)
8866 {
8867 log_error ("Restore file is corrupted");
8868 }
8869
8870 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8871 {
8872 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8873 {
8874 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8875
8876 exit (-1);
8877 }
8878
8879 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8880 }
8881
8882 if (chdir (rd->cwd))
8883 {
8884 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8885
8886 exit (-1);
8887 }
8888 }
8889
8890 u64 get_lowest_words_done ()
8891 {
8892 u64 words_cur = -1;
8893
8894 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8895 {
8896 hc_device_param_t *device_param = &data.devices_param[device_id];
8897
8898 if (device_param->skipped) continue;
8899
8900 const u64 words_done = device_param->words_done;
8901
8902 if (words_done < words_cur) words_cur = words_done;
8903 }
8904
8905 // It's possible that a device's workload isn't finished right after a restore-case.
8906 // In that case, this function would return 0 and overwrite the real restore point
8907 // There's also data.words_cur which is set to rd->words_cur but it changes while
8908 // the attack is running therefore we should stick to rd->words_cur.
8909 // Note that -s influences rd->words_cur we should keep a close look on that.
8910
8911 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8912
8913 return words_cur;
8914 }
8915
8916 void write_restore (const char *new_restore_file, restore_data_t *rd)
8917 {
8918 u64 words_cur = get_lowest_words_done ();
8919
8920 rd->words_cur = words_cur;
8921
8922 FILE *fp = fopen (new_restore_file, "wb");
8923
8924 if (fp == NULL)
8925 {
8926 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8927
8928 exit (-1);
8929 }
8930
8931 if (setvbuf (fp, NULL, _IONBF, 0))
8932 {
8933 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8934
8935 exit (-1);
8936 }
8937
8938 fwrite (rd, sizeof (restore_data_t), 1, fp);
8939
8940 for (uint i = 0; i < rd->argc; i++)
8941 {
8942 fprintf (fp, "%s", rd->argv[i]);
8943 fputc ('\n', fp);
8944 }
8945
8946 fflush (fp);
8947
8948 fsync (fileno (fp));
8949
8950 fclose (fp);
8951 }
8952
8953 void cycle_restore ()
8954 {
8955 const char *eff_restore_file = data.eff_restore_file;
8956 const char *new_restore_file = data.new_restore_file;
8957
8958 restore_data_t *rd = data.rd;
8959
8960 write_restore (new_restore_file, rd);
8961
8962 struct stat st;
8963
8964 memset (&st, 0, sizeof(st));
8965
8966 if (stat (eff_restore_file, &st) == 0)
8967 {
8968 if (unlink (eff_restore_file))
8969 {
8970 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8971 }
8972 }
8973
8974 if (rename (new_restore_file, eff_restore_file))
8975 {
8976 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8977 }
8978 }
8979
8980 void check_checkpoint ()
8981 {
8982 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8983
8984 u64 words_cur = get_lowest_words_done ();
8985
8986 if (words_cur != data.checkpoint_cur_words)
8987 {
8988 myabort ();
8989 }
8990 }
8991
8992 /**
8993 * adjustments
8994 */
8995
8996 #ifdef OSX
8997 uint set_kernel_accel_osx (uint hash_mode)
8998 {
8999 switch (hash_mode)
9000 {
9001 case 1800: return GET_ACCEL_OSX (1800);
9002 case 2500: return GET_ACCEL_OSX (2500);
9003 case 5000: return GET_ACCEL_OSX (5000);
9004 case 6100: return GET_ACCEL_OSX (6100);
9005 case 6211: return GET_ACCEL_OSX (6211);
9006 case 6231: return GET_ACCEL_OSX (6231);
9007 case 6241: return GET_ACCEL_OSX (6241);
9008 case 6800: return GET_ACCEL_OSX (6800);
9009 case 7100: return GET_ACCEL_OSX (7100);
9010 case 7200: return GET_ACCEL_OSX (7200);
9011 case 7900: return GET_ACCEL_OSX (7900);
9012 case 8200: return GET_ACCEL_OSX (8200);
9013 case 8700: return GET_ACCEL_OSX (8700);
9014 case 9100: return GET_ACCEL_OSX (9100);
9015 case 9200: return GET_ACCEL_OSX (9200);
9016 case 9300: return GET_ACCEL_OSX (9300);
9017 case 9400: return GET_ACCEL_OSX (9400);
9018 case 9500: return GET_ACCEL_OSX (9500);
9019 case 9600: return GET_ACCEL_OSX (9600);
9020 case 10000: return GET_ACCEL_OSX (10000);
9021 case 10500: return GET_ACCEL_OSX (10500);
9022 case 11300: return GET_ACCEL_OSX (11300);
9023 case 11600: return GET_ACCEL_OSX (11600);
9024 case 11700: return GET_ACCEL_OSX (11700);
9025 case 11800: return GET_ACCEL_OSX (11800);
9026 case 12200: return GET_ACCEL_OSX (12200);
9027 case 12400: return GET_ACCEL_OSX (12400);
9028 case 12500: return GET_ACCEL_OSX (12500);
9029 case 13000: return GET_ACCEL_OSX (13000);
9030 }
9031
9032 return (-1);
9033 }
9034
9035 uint set_kernel_accel (uint hash_mode, bool isGpu)
9036 {
9037 int accel = -1;
9038
9039 if (isGpu)
9040 accel = set_kernel_accel_osx (hash_mode);
9041
9042 if (accel != -1)
9043 return accel;
9044 #else
9045
9046 uint set_kernel_accel (uint hash_mode)
9047 {
9048
9049 #endif
9050
9051 switch (hash_mode)
9052 {
9053 case 0: return GET_ACCEL (0);
9054 case 10: return GET_ACCEL (10);
9055 case 11: return GET_ACCEL (11);
9056 case 12: return GET_ACCEL (12);
9057 case 20: return GET_ACCEL (20);
9058 case 21: return GET_ACCEL (21);
9059 case 22: return GET_ACCEL (22);
9060 case 23: return GET_ACCEL (23);
9061 case 30: return GET_ACCEL (30);
9062 case 40: return GET_ACCEL (40);
9063 case 50: return GET_ACCEL (50);
9064 case 60: return GET_ACCEL (60);
9065 case 100: return GET_ACCEL (100);
9066 case 101: return GET_ACCEL (101);
9067 case 110: return GET_ACCEL (110);
9068 case 111: return GET_ACCEL (111);
9069 case 112: return GET_ACCEL (112);
9070 case 120: return GET_ACCEL (120);
9071 case 121: return GET_ACCEL (121);
9072 case 122: return GET_ACCEL (122);
9073 case 124: return GET_ACCEL (124);
9074 case 130: return GET_ACCEL (130);
9075 case 131: return GET_ACCEL (131);
9076 case 132: return GET_ACCEL (132);
9077 case 133: return GET_ACCEL (133);
9078 case 140: return GET_ACCEL (140);
9079 case 141: return GET_ACCEL (141);
9080 case 150: return GET_ACCEL (150);
9081 case 160: return GET_ACCEL (160);
9082 case 190: return GET_ACCEL (190);
9083 case 200: return GET_ACCEL (200);
9084 case 300: return GET_ACCEL (300);
9085 case 400: return GET_ACCEL (400);
9086 case 500: return GET_ACCEL (500);
9087 case 501: return GET_ACCEL (501);
9088 case 900: return GET_ACCEL (900);
9089 case 910: return GET_ACCEL (910);
9090 case 1000: return GET_ACCEL (1000);
9091 case 1100: return GET_ACCEL (1100);
9092 case 1400: return GET_ACCEL (1400);
9093 case 1410: return GET_ACCEL (1410);
9094 case 1420: return GET_ACCEL (1420);
9095 case 1421: return GET_ACCEL (1421);
9096 case 1430: return GET_ACCEL (1430);
9097 case 1440: return GET_ACCEL (1440);
9098 case 1441: return GET_ACCEL (1441);
9099 case 1450: return GET_ACCEL (1450);
9100 case 1460: return GET_ACCEL (1460);
9101 case 1500: return GET_ACCEL (1500);
9102 case 1600: return GET_ACCEL (1600);
9103 case 1700: return GET_ACCEL (1700);
9104 case 1710: return GET_ACCEL (1710);
9105 case 1711: return GET_ACCEL (1711);
9106 case 1720: return GET_ACCEL (1720);
9107 case 1722: return GET_ACCEL (1722);
9108 case 1730: return GET_ACCEL (1730);
9109 case 1731: return GET_ACCEL (1731);
9110 case 1740: return GET_ACCEL (1740);
9111 case 1750: return GET_ACCEL (1750);
9112 case 1760: return GET_ACCEL (1760);
9113 case 1800: return GET_ACCEL (1800);
9114 case 2100: return GET_ACCEL (2100);
9115 case 2400: return GET_ACCEL (2400);
9116 case 2410: return GET_ACCEL (2410);
9117 case 2500: return GET_ACCEL (2500);
9118 case 2600: return GET_ACCEL (2600);
9119 case 2611: return GET_ACCEL (2611);
9120 case 2612: return GET_ACCEL (2612);
9121 case 2711: return GET_ACCEL (2711);
9122 case 2811: return GET_ACCEL (2811);
9123 case 3000: return GET_ACCEL (3000);
9124 case 3100: return GET_ACCEL (3100);
9125 case 3200: return GET_ACCEL (3200);
9126 case 3710: return GET_ACCEL (3710);
9127 case 3711: return GET_ACCEL (3711);
9128 case 3800: return GET_ACCEL (3800);
9129 case 4300: return GET_ACCEL (4300);
9130 case 4400: return GET_ACCEL (4400);
9131 case 4500: return GET_ACCEL (4500);
9132 case 4700: return GET_ACCEL (4700);
9133 case 4800: return GET_ACCEL (4800);
9134 case 4900: return GET_ACCEL (4900);
9135 case 5000: return GET_ACCEL (5000);
9136 case 5100: return GET_ACCEL (5100);
9137 case 5200: return GET_ACCEL (5200);
9138 case 5300: return GET_ACCEL (5300);
9139 case 5400: return GET_ACCEL (5400);
9140 case 5500: return GET_ACCEL (5500);
9141 case 5600: return GET_ACCEL (5600);
9142 case 5700: return GET_ACCEL (5700);
9143 case 5800: return GET_ACCEL (5800);
9144 case 6000: return GET_ACCEL (6000);
9145 case 6100: return GET_ACCEL (6100);
9146 case 6211: return GET_ACCEL (6211);
9147 case 6212: return GET_ACCEL (6212);
9148 case 6213: return GET_ACCEL (6213);
9149 case 6221: return GET_ACCEL (6221);
9150 case 6222: return GET_ACCEL (6222);
9151 case 6223: return GET_ACCEL (6223);
9152 case 6231: return GET_ACCEL (6231);
9153 case 6232: return GET_ACCEL (6232);
9154 case 6233: return GET_ACCEL (6233);
9155 case 6241: return GET_ACCEL (6241);
9156 case 6242: return GET_ACCEL (6242);
9157 case 6243: return GET_ACCEL (6243);
9158 case 6300: return GET_ACCEL (6300);
9159 case 6400: return GET_ACCEL (6400);
9160 case 6500: return GET_ACCEL (6500);
9161 case 6600: return GET_ACCEL (6600);
9162 case 6700: return GET_ACCEL (6700);
9163 case 6800: return GET_ACCEL (6800);
9164 case 6900: return GET_ACCEL (6900);
9165 case 7100: return GET_ACCEL (7100);
9166 case 7200: return GET_ACCEL (7200);
9167 case 7300: return GET_ACCEL (7300);
9168 case 7400: return GET_ACCEL (7400);
9169 case 7500: return GET_ACCEL (7500);
9170 case 7600: return GET_ACCEL (7600);
9171 case 7700: return GET_ACCEL (7700);
9172 case 7800: return GET_ACCEL (7800);
9173 case 7900: return GET_ACCEL (7900);
9174 case 8000: return GET_ACCEL (8000);
9175 case 8100: return GET_ACCEL (8100);
9176 case 8200: return GET_ACCEL (8200);
9177 case 8300: return GET_ACCEL (8300);
9178 case 8400: return GET_ACCEL (8400);
9179 case 8500: return GET_ACCEL (8500);
9180 case 8600: return GET_ACCEL (8600);
9181 case 8700: return GET_ACCEL (8700);
9182 case 8800: return GET_ACCEL (8800);
9183 case 8900: return GET_ACCEL (8900);
9184 case 9000: return GET_ACCEL (9000);
9185 case 9100: return GET_ACCEL (9100);
9186 case 9200: return GET_ACCEL (9200);
9187 case 9300: return GET_ACCEL (9300);
9188 case 9400: return GET_ACCEL (9400);
9189 case 9500: return GET_ACCEL (9500);
9190 case 9600: return GET_ACCEL (9600);
9191 case 9700: return GET_ACCEL (9700);
9192 case 9710: return GET_ACCEL (9710);
9193 case 9720: return GET_ACCEL (9720);
9194 case 9800: return GET_ACCEL (9800);
9195 case 9810: return GET_ACCEL (9810);
9196 case 9820: return GET_ACCEL (9820);
9197 case 9900: return GET_ACCEL (9900);
9198 case 10000: return GET_ACCEL (10000);
9199 case 10100: return GET_ACCEL (10100);
9200 case 10200: return GET_ACCEL (10200);
9201 case 10300: return GET_ACCEL (10300);
9202 case 10400: return GET_ACCEL (10400);
9203 case 10410: return GET_ACCEL (10410);
9204 case 10420: return GET_ACCEL (10420);
9205 case 10500: return GET_ACCEL (10500);
9206 case 10600: return GET_ACCEL (10600);
9207 case 10700: return GET_ACCEL (10700);
9208 case 10800: return GET_ACCEL (10800);
9209 case 10900: return GET_ACCEL (10900);
9210 case 11000: return GET_ACCEL (11000);
9211 case 11100: return GET_ACCEL (11100);
9212 case 11200: return GET_ACCEL (11200);
9213 case 11300: return GET_ACCEL (11300);
9214 case 11400: return GET_ACCEL (11400);
9215 case 11500: return GET_ACCEL (11500);
9216 case 11600: return GET_ACCEL (11600);
9217 case 11700: return GET_ACCEL (11700);
9218 case 11800: return GET_ACCEL (11800);
9219 case 11900: return GET_ACCEL (11900);
9220 case 12000: return GET_ACCEL (12000);
9221 case 12100: return GET_ACCEL (12100);
9222 case 12200: return GET_ACCEL (12200);
9223 case 12300: return GET_ACCEL (12300);
9224 case 12400: return GET_ACCEL (12400);
9225 case 12500: return GET_ACCEL (12500);
9226 case 12600: return GET_ACCEL (12600);
9227 case 12700: return GET_ACCEL (12700);
9228 case 12800: return GET_ACCEL (12800);
9229 case 12900: return GET_ACCEL (12900);
9230 case 13000: return GET_ACCEL (13000);
9231 }
9232
9233 return 0;
9234 }
9235
9236 #ifdef OSX
9237 uint set_kernel_loops_osx (uint hash_mode)
9238 {
9239 switch (hash_mode)
9240 {
9241 case 0: return GET_LOOPS_OSX (0);
9242 case 10: return GET_LOOPS_OSX (10);
9243 case 11: return GET_LOOPS_OSX (11);
9244 case 12: return GET_LOOPS_OSX (12);
9245 case 20: return GET_LOOPS_OSX (20);
9246 case 21: return GET_LOOPS_OSX (21);
9247 case 22: return GET_LOOPS_OSX (22);
9248 case 23: return GET_LOOPS_OSX (23);
9249 case 30: return GET_LOOPS_OSX (30);
9250 case 40: return GET_LOOPS_OSX (40);
9251 case 50: return GET_LOOPS_OSX (50);
9252 case 60: return GET_LOOPS_OSX (60);
9253 case 100: return GET_LOOPS_OSX (100);
9254 case 101: return GET_LOOPS_OSX (101);
9255 case 110: return GET_LOOPS_OSX (110);
9256 case 111: return GET_LOOPS_OSX (111);
9257 case 112: return GET_LOOPS_OSX (112);
9258 case 120: return GET_LOOPS_OSX (120);
9259 case 121: return GET_LOOPS_OSX (121);
9260 case 122: return GET_LOOPS_OSX (122);
9261 case 124: return GET_LOOPS_OSX (124);
9262 case 130: return GET_LOOPS_OSX (130);
9263 case 131: return GET_LOOPS_OSX (131);
9264 case 132: return GET_LOOPS_OSX (132);
9265 case 133: return GET_LOOPS_OSX (133);
9266 case 140: return GET_LOOPS_OSX (140);
9267 case 141: return GET_LOOPS_OSX (141);
9268 case 150: return GET_LOOPS_OSX (150);
9269 case 160: return GET_LOOPS_OSX (160);
9270 case 190: return GET_LOOPS_OSX (190);
9271 case 200: return GET_LOOPS_OSX (200);
9272 case 300: return GET_LOOPS_OSX (300);
9273 case 900: return GET_LOOPS_OSX (900);
9274 case 1000: return GET_LOOPS_OSX (1000);
9275 case 1100: return GET_LOOPS_OSX (1100);
9276 case 1400: return GET_LOOPS_OSX (1400);
9277 case 1410: return GET_LOOPS_OSX (1410);
9278 case 1420: return GET_LOOPS_OSX (1420);
9279 case 1421: return GET_LOOPS_OSX (1421);
9280 case 1430: return GET_LOOPS_OSX (1430);
9281 case 1440: return GET_LOOPS_OSX (1440);
9282 case 1441: return GET_LOOPS_OSX (1441);
9283 case 1450: return GET_LOOPS_OSX (1450);
9284 case 1460: return GET_LOOPS_OSX (1460);
9285 case 1700: return GET_LOOPS_OSX (1700);
9286 case 1710: return GET_LOOPS_OSX (1710);
9287 case 1711: return GET_LOOPS_OSX (1711);
9288 case 1720: return GET_LOOPS_OSX (1720);
9289 case 1722: return GET_LOOPS_OSX (1722);
9290 case 1730: return GET_LOOPS_OSX (1730);
9291 case 1731: return GET_LOOPS_OSX (1731);
9292 case 1740: return GET_LOOPS_OSX (1740);
9293 case 1750: return GET_LOOPS_OSX (1750);
9294 case 1760: return GET_LOOPS_OSX (1760);
9295 case 2400: return GET_LOOPS_OSX (2400);
9296 case 2410: return GET_LOOPS_OSX (2410);
9297 case 2600: return GET_LOOPS_OSX (2600);
9298 case 2611: return GET_LOOPS_OSX (2611);
9299 case 2612: return GET_LOOPS_OSX (2612);
9300 case 2711: return GET_LOOPS_OSX (2711);
9301 case 2811: return GET_LOOPS_OSX (2811);
9302 case 3100: return GET_LOOPS_OSX (3100);
9303 case 3200: return GET_LOOPS_OSX (3200);
9304 case 3710: return GET_LOOPS_OSX (3710);
9305 case 3711: return GET_LOOPS_OSX (3711);
9306 case 3800: return GET_LOOPS_OSX (3800);
9307 case 4300: return GET_LOOPS_OSX (4300);
9308 case 4400: return GET_LOOPS_OSX (4400);
9309 case 4500: return GET_LOOPS_OSX (4500);
9310 case 4700: return GET_LOOPS_OSX (4700);
9311 case 4800: return GET_LOOPS_OSX (4800);
9312 case 4900: return GET_LOOPS_OSX (4900);
9313 case 5000: return GET_LOOPS_OSX (5000);
9314 case 5100: return GET_LOOPS_OSX (5100);
9315 case 5300: return GET_LOOPS_OSX (5300);
9316 case 5400: return GET_LOOPS_OSX (5400);
9317 case 5500: return GET_LOOPS_OSX (5500);
9318 case 5600: return GET_LOOPS_OSX (5600);
9319 case 5700: return GET_LOOPS_OSX (5700);
9320 case 6000: return GET_LOOPS_OSX (6000);
9321 case 6100: return GET_LOOPS_OSX (6100);
9322 case 6231: return GET_LOOPS_OSX (6231);
9323 case 6232: return GET_LOOPS_OSX (6232);
9324 case 6233: return GET_LOOPS_OSX (6233);
9325 case 6900: return GET_LOOPS_OSX (6900);
9326 case 7300: return GET_LOOPS_OSX (7300);
9327 case 7500: return GET_LOOPS_OSX (7500);
9328 case 7600: return GET_LOOPS_OSX (7600);
9329 case 7700: return GET_LOOPS_OSX (7700);
9330 case 7800: return GET_LOOPS_OSX (7800);
9331 case 8000: return GET_LOOPS_OSX (8000);
9332 case 8100: return GET_LOOPS_OSX (8100);
9333 case 8200: return GET_LOOPS_OSX (8200);
9334 case 8300: return GET_LOOPS_OSX (8300);
9335 case 8400: return GET_LOOPS_OSX (8400);
9336 case 8500: return GET_LOOPS_OSX (8500);
9337 case 8600: return GET_LOOPS_OSX (8600);
9338 case 8700: return GET_LOOPS_OSX (8700);
9339 case 9700: return GET_LOOPS_OSX (9700);
9340 case 9710: return GET_LOOPS_OSX (9710);
9341 case 9720: return GET_LOOPS_OSX (9720);
9342 case 9800: return GET_LOOPS_OSX (9800);
9343 case 9810: return GET_LOOPS_OSX (9810);
9344 case 9820: return GET_LOOPS_OSX (9820);
9345 case 9900: return GET_LOOPS_OSX (9900);
9346 case 10100: return GET_LOOPS_OSX (10100);
9347 case 10200: return GET_LOOPS_OSX (10200);
9348 case 10400: return GET_LOOPS_OSX (10400);
9349 case 10410: return GET_LOOPS_OSX (10410);
9350 case 10420: return GET_LOOPS_OSX (10420);
9351 case 10600: return GET_LOOPS_OSX (10600);
9352 case 10700: return GET_LOOPS_OSX (10700);
9353 case 10800: return GET_LOOPS_OSX (10800);
9354 case 11000: return GET_LOOPS_OSX (11000);
9355 case 11100: return GET_LOOPS_OSX (11100);
9356 case 11200: return GET_LOOPS_OSX (11200);
9357 case 11300: return GET_LOOPS_OSX (11300);
9358 case 11400: return GET_LOOPS_OSX (11400);
9359 case 11500: return GET_LOOPS_OSX (11500);
9360 case 11700: return GET_LOOPS_OSX (11700);
9361 case 11800: return GET_LOOPS_OSX (11800);
9362 case 12600: return GET_LOOPS_OSX (12600);
9363 }
9364
9365 return (-1);
9366 }
9367
9368 uint set_kernel_loops (uint hash_mode, bool isGpu)
9369 {
9370 int loops = -1;
9371 if (isGpu)
9372 loops = set_kernel_loops_osx (hash_mode);
9373
9374 if (loops != -1)
9375 return loops;
9376
9377 #else
9378
9379 uint set_kernel_loops (uint hash_mode)
9380 {
9381
9382 #endif // OSX
9383
9384 switch (hash_mode)
9385 {
9386 case 0: return GET_LOOPS (0);
9387 case 10: return GET_LOOPS (10);
9388 case 11: return GET_LOOPS (11);
9389 case 12: return GET_LOOPS (12);
9390 case 20: return GET_LOOPS (20);
9391 case 21: return GET_LOOPS (21);
9392 case 22: return GET_LOOPS (22);
9393 case 23: return GET_LOOPS (23);
9394 case 30: return GET_LOOPS (30);
9395 case 40: return GET_LOOPS (40);
9396 case 50: return GET_LOOPS (50);
9397 case 60: return GET_LOOPS (60);
9398 case 100: return GET_LOOPS (100);
9399 case 101: return GET_LOOPS (101);
9400 case 110: return GET_LOOPS (110);
9401 case 111: return GET_LOOPS (111);
9402 case 112: return GET_LOOPS (112);
9403 case 120: return GET_LOOPS (120);
9404 case 121: return GET_LOOPS (121);
9405 case 122: return GET_LOOPS (122);
9406 case 124: return GET_LOOPS (124);
9407 case 130: return GET_LOOPS (130);
9408 case 131: return GET_LOOPS (131);
9409 case 132: return GET_LOOPS (132);
9410 case 133: return GET_LOOPS (133);
9411 case 140: return GET_LOOPS (140);
9412 case 141: return GET_LOOPS (141);
9413 case 150: return GET_LOOPS (150);
9414 case 160: return GET_LOOPS (160);
9415 case 190: return GET_LOOPS (190);
9416 case 200: return GET_LOOPS (200);
9417 case 300: return GET_LOOPS (300);
9418 case 400: return GET_LOOPS (400);
9419 case 500: return GET_LOOPS (500);
9420 case 501: return GET_LOOPS (501);
9421 case 900: return GET_LOOPS (900);
9422 case 910: return GET_LOOPS (910);
9423 case 1000: return GET_LOOPS (1000);
9424 case 1100: return GET_LOOPS (1100);
9425 case 1400: return GET_LOOPS (1400);
9426 case 1410: return GET_LOOPS (1410);
9427 case 1420: return GET_LOOPS (1420);
9428 case 1421: return GET_LOOPS (1421);
9429 case 1430: return GET_LOOPS (1430);
9430 case 1440: return GET_LOOPS (1440);
9431 case 1441: return GET_LOOPS (1441);
9432 case 1450: return GET_LOOPS (1450);
9433 case 1460: return GET_LOOPS (1460);
9434 case 1500: return GET_LOOPS (1500);
9435 case 1600: return GET_LOOPS (1600);
9436 case 1700: return GET_LOOPS (1700);
9437 case 1710: return GET_LOOPS (1710);
9438 case 1711: return GET_LOOPS (1711);
9439 case 1720: return GET_LOOPS (1720);
9440 case 1722: return GET_LOOPS (1722);
9441 case 1730: return GET_LOOPS (1730);
9442 case 1731: return GET_LOOPS (1731);
9443 case 1740: return GET_LOOPS (1740);
9444 case 1750: return GET_LOOPS (1750);
9445 case 1760: return GET_LOOPS (1760);
9446 case 1800: return GET_LOOPS (1800);
9447 case 2100: return GET_LOOPS (2100);
9448 case 2400: return GET_LOOPS (2400);
9449 case 2410: return GET_LOOPS (2410);
9450 case 2500: return GET_LOOPS (2500);
9451 case 2600: return GET_LOOPS (2600);
9452 case 2611: return GET_LOOPS (2611);
9453 case 2612: return GET_LOOPS (2612);
9454 case 2711: return GET_LOOPS (2711);
9455 case 2811: return GET_LOOPS (2811);
9456 case 3000: return GET_LOOPS (3000);
9457 case 3100: return GET_LOOPS (3100);
9458 case 3200: return GET_LOOPS (3200);
9459 case 3710: return GET_LOOPS (3710);
9460 case 3711: return GET_LOOPS (3711);
9461 case 3800: return GET_LOOPS (3800);
9462 case 4300: return GET_LOOPS (4300);
9463 case 4400: return GET_LOOPS (4400);
9464 case 4500: return GET_LOOPS (4500);
9465 case 4700: return GET_LOOPS (4700);
9466 case 4800: return GET_LOOPS (4800);
9467 case 4900: return GET_LOOPS (4900);
9468 case 5000: return GET_LOOPS (5000);
9469 case 5100: return GET_LOOPS (5100);
9470 case 5200: return GET_LOOPS (5200);
9471 case 5300: return GET_LOOPS (5300);
9472 case 5400: return GET_LOOPS (5400);
9473 case 5500: return GET_LOOPS (5500);
9474 case 5600: return GET_LOOPS (5600);
9475 case 5700: return GET_LOOPS (5700);
9476 case 5800: return GET_LOOPS (5800);
9477 case 6000: return GET_LOOPS (6000);
9478 case 6100: return GET_LOOPS (6100);
9479 case 6211: return GET_LOOPS (6211);
9480 case 6212: return GET_LOOPS (6212);
9481 case 6213: return GET_LOOPS (6213);
9482 case 6221: return GET_LOOPS (6221);
9483 case 6222: return GET_LOOPS (6222);
9484 case 6223: return GET_LOOPS (6223);
9485 case 6231: return GET_LOOPS (6231);
9486 case 6232: return GET_LOOPS (6232);
9487 case 6233: return GET_LOOPS (6233);
9488 case 6241: return GET_LOOPS (6241);
9489 case 6242: return GET_LOOPS (6242);
9490 case 6243: return GET_LOOPS (6243);
9491 case 6300: return GET_LOOPS (6300);
9492 case 6400: return GET_LOOPS (6400);
9493 case 6500: return GET_LOOPS (6500);
9494 case 6600: return GET_LOOPS (6600);
9495 case 6700: return GET_LOOPS (6700);
9496 case 6800: return GET_LOOPS (6800);
9497 case 6900: return GET_LOOPS (6900);
9498 case 7100: return GET_LOOPS (7100);
9499 case 7200: return GET_LOOPS (7200);
9500 case 7300: return GET_LOOPS (7300);
9501 case 7400: return GET_LOOPS (7400);
9502 case 7500: return GET_LOOPS (7500);
9503 case 7600: return GET_LOOPS (7600);
9504 case 7700: return GET_LOOPS (7700);
9505 case 7800: return GET_LOOPS (7800);
9506 case 7900: return GET_LOOPS (7900);
9507 case 8000: return GET_LOOPS (8000);
9508 case 8100: return GET_LOOPS (8100);
9509 case 8200: return GET_LOOPS (8200);
9510 case 8300: return GET_LOOPS (8300);
9511 case 8400: return GET_LOOPS (8400);
9512 case 8500: return GET_LOOPS (8500);
9513 case 8600: return GET_LOOPS (8600);
9514 case 8700: return GET_LOOPS (8700);
9515 case 8800: return GET_LOOPS (8800);
9516 case 8900: return GET_LOOPS (8900);
9517 case 9000: return GET_LOOPS (9000);
9518 case 9100: return GET_LOOPS (9100);
9519 case 9200: return GET_LOOPS (9200);
9520 case 9300: return GET_LOOPS (9300);
9521 case 9400: return GET_LOOPS (9400);
9522 case 9500: return GET_LOOPS (9500);
9523 case 9600: return GET_LOOPS (9600);
9524 case 9700: return GET_LOOPS (9700);
9525 case 9710: return GET_LOOPS (9710);
9526 case 9720: return GET_LOOPS (9720);
9527 case 9800: return GET_LOOPS (9800);
9528 case 9810: return GET_LOOPS (9810);
9529 case 9820: return GET_LOOPS (9820);
9530 case 9900: return GET_LOOPS (9900);
9531 case 10000: return GET_LOOPS (10000);
9532 case 10100: return GET_LOOPS (10100);
9533 case 10200: return GET_LOOPS (10200);
9534 case 10300: return GET_LOOPS (10300);
9535 case 10400: return GET_LOOPS (10400);
9536 case 10410: return GET_LOOPS (10410);
9537 case 10420: return GET_LOOPS (10420);
9538 case 10500: return GET_LOOPS (10500);
9539 case 10600: return GET_LOOPS (10600);
9540 case 10700: return GET_LOOPS (10700);
9541 case 10800: return GET_LOOPS (10800);
9542 case 10900: return GET_LOOPS (10900);
9543 case 11000: return GET_LOOPS (11000);
9544 case 11100: return GET_LOOPS (11100);
9545 case 11200: return GET_LOOPS (11200);
9546 case 11300: return GET_LOOPS (11300);
9547 case 11400: return GET_LOOPS (11400);
9548 case 11500: return GET_LOOPS (11500);
9549 case 11600: return GET_LOOPS (11600);
9550 case 11700: return GET_LOOPS (11700);
9551 case 11800: return GET_LOOPS (11800);
9552 case 11900: return GET_LOOPS (11900);
9553 case 12000: return GET_LOOPS (12000);
9554 case 12100: return GET_LOOPS (12100);
9555 case 12200: return GET_LOOPS (12200);
9556 case 12300: return GET_LOOPS (12300);
9557 case 12400: return GET_LOOPS (12400);
9558 case 12500: return GET_LOOPS (12500);
9559 case 12600: return GET_LOOPS (12600);
9560 case 12700: return GET_LOOPS (12700);
9561 case 12800: return GET_LOOPS (12800);
9562 case 12900: return GET_LOOPS (12900);
9563 case 13000: return GET_LOOPS (13000);
9564 }
9565
9566 return 0;
9567 }
9568
9569 /**
9570 * parser
9571 */
9572
9573 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9574 {
9575 u8 tmp[256] = { 0 };
9576
9577 if (salt_len > sizeof (tmp))
9578 {
9579 return UINT_MAX;
9580 }
9581
9582 memcpy (tmp, in, salt_len);
9583
9584 if (data.opts_type & OPTS_TYPE_ST_HEX)
9585 {
9586 if ((salt_len % 2) == 0)
9587 {
9588 u32 new_salt_len = salt_len / 2;
9589
9590 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9591 {
9592 u8 p0 = tmp[j + 0];
9593 u8 p1 = tmp[j + 1];
9594
9595 tmp[i] = hex_convert (p1) << 0;
9596 tmp[i] |= hex_convert (p0) << 4;
9597 }
9598
9599 salt_len = new_salt_len;
9600 }
9601 else
9602 {
9603 return UINT_MAX;
9604 }
9605 }
9606 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9607 {
9608 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9609 }
9610
9611 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9612
9613 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9614 {
9615 if (salt_len < 20)
9616 {
9617 u32 *tmp_uint = (u32 *) tmp;
9618
9619 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9620 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9621 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9622 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9623 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9624 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9625 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9626 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9627 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9628 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9629
9630 salt_len = salt_len * 2;
9631 }
9632 else
9633 {
9634 return UINT_MAX;
9635 }
9636 }
9637
9638 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9639 {
9640 lowercase (tmp, salt_len);
9641 }
9642
9643 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9644 {
9645 uppercase (tmp, salt_len);
9646 }
9647
9648 u32 len = salt_len;
9649
9650 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9651 {
9652 tmp[len++] = 0x80;
9653 }
9654
9655 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9656 {
9657 tmp[len++] = 0x01;
9658 }
9659
9660 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9661 {
9662 u32 *tmp_uint = (uint *) tmp;
9663
9664 u32 max = len / 4;
9665
9666 if (len % 4) max++;
9667
9668 for (u32 i = 0; i < max; i++)
9669 {
9670 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9671 }
9672
9673 // Important: we may need to increase the length of memcpy since
9674 // we don't want to "loose" some swapped bytes (could happen if
9675 // they do not perfectly fit in the 4-byte blocks)
9676 // Memcpy does always copy the bytes in the BE order, but since
9677 // we swapped them, some important bytes could be in positions
9678 // we normally skip with the original len
9679
9680 if (len % 4) len += 4 - (len % 4);
9681 }
9682
9683 memcpy (out, tmp, len);
9684
9685 return (salt_len);
9686 }
9687
9688 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9689 {
9690 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9691
9692 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9693
9694 u32 *digest = (u32 *) hash_buf->digest;
9695
9696 salt_t *salt = hash_buf->salt;
9697
9698 memcpy ((char *) salt->salt_sign, input_buf, 6);
9699
9700 char *iter_pos = input_buf + 4;
9701
9702 salt->salt_iter = 1 << atoi (iter_pos);
9703
9704 char *salt_pos = strchr (iter_pos, '$');
9705
9706 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9707
9708 salt_pos++;
9709
9710 uint salt_len = 16;
9711
9712 salt->salt_len = salt_len;
9713
9714 u8 tmp_buf[100] = { 0 };
9715
9716 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9717
9718 char *salt_buf_ptr = (char *) salt->salt_buf;
9719
9720 memcpy (salt_buf_ptr, tmp_buf, 16);
9721
9722 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9723 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9724 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9725 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9726
9727 char *hash_pos = salt_pos + 22;
9728
9729 memset (tmp_buf, 0, sizeof (tmp_buf));
9730
9731 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9732
9733 memcpy (digest, tmp_buf, 24);
9734
9735 digest[0] = byte_swap_32 (digest[0]);
9736 digest[1] = byte_swap_32 (digest[1]);
9737 digest[2] = byte_swap_32 (digest[2]);
9738 digest[3] = byte_swap_32 (digest[3]);
9739 digest[4] = byte_swap_32 (digest[4]);
9740 digest[5] = byte_swap_32 (digest[5]);
9741
9742 digest[5] &= ~0xff; // its just 23 not 24 !
9743
9744 return (PARSER_OK);
9745 }
9746
9747 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9748 {
9749 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9750
9751 u32 *digest = (u32 *) hash_buf->digest;
9752
9753 u8 tmp_buf[100] = { 0 };
9754
9755 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9756
9757 memcpy (digest, tmp_buf, 32);
9758
9759 digest[0] = byte_swap_32 (digest[0]);
9760 digest[1] = byte_swap_32 (digest[1]);
9761 digest[2] = byte_swap_32 (digest[2]);
9762 digest[3] = byte_swap_32 (digest[3]);
9763 digest[4] = byte_swap_32 (digest[4]);
9764 digest[5] = byte_swap_32 (digest[5]);
9765 digest[6] = byte_swap_32 (digest[6]);
9766 digest[7] = byte_swap_32 (digest[7]);
9767
9768 digest[0] -= SHA256M_A;
9769 digest[1] -= SHA256M_B;
9770 digest[2] -= SHA256M_C;
9771 digest[3] -= SHA256M_D;
9772 digest[4] -= SHA256M_E;
9773 digest[5] -= SHA256M_F;
9774 digest[6] -= SHA256M_G;
9775 digest[7] -= SHA256M_H;
9776
9777 return (PARSER_OK);
9778 }
9779
9780 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9781 {
9782 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9783
9784 u32 *digest = (u32 *) hash_buf->digest;
9785
9786 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9787 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9788
9789 digest[0] = byte_swap_32 (digest[0]);
9790 digest[1] = byte_swap_32 (digest[1]);
9791
9792 uint tt;
9793
9794 IP (digest[0], digest[1], tt);
9795
9796 digest[0] = digest[0];
9797 digest[1] = digest[1];
9798 digest[2] = 0;
9799 digest[3] = 0;
9800
9801 return (PARSER_OK);
9802 }
9803
9804 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9805 {
9806 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9807
9808 u32 *digest = (u32 *) hash_buf->digest;
9809
9810 salt_t *salt = hash_buf->salt;
9811
9812 char *hash_pos = input_buf + 8;
9813
9814 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9815 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9816 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9817 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9818 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9819
9820 digest[0] -= SHA1M_A;
9821 digest[1] -= SHA1M_B;
9822 digest[2] -= SHA1M_C;
9823 digest[3] -= SHA1M_D;
9824 digest[4] -= SHA1M_E;
9825
9826 uint salt_len = 8;
9827
9828 char *salt_buf_ptr = (char *) salt->salt_buf;
9829
9830 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9831
9832 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9833
9834 salt->salt_len = salt_len;
9835
9836 return (PARSER_OK);
9837 }
9838
9839 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9840 {
9841 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9842
9843 u64 *digest = (u64 *) hash_buf->digest;
9844
9845 salt_t *salt = hash_buf->salt;
9846
9847 char *hash_pos = input_buf + 8;
9848
9849 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9850 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9851 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9852 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9853 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9854 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9855 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9856 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9857
9858 digest[0] -= SHA512M_A;
9859 digest[1] -= SHA512M_B;
9860 digest[2] -= SHA512M_C;
9861 digest[3] -= SHA512M_D;
9862 digest[4] -= SHA512M_E;
9863 digest[5] -= SHA512M_F;
9864 digest[6] -= SHA512M_G;
9865 digest[7] -= SHA512M_H;
9866
9867 uint salt_len = 8;
9868
9869 char *salt_buf_ptr = (char *) salt->salt_buf;
9870
9871 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9872
9873 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9874
9875 salt->salt_len = salt_len;
9876
9877 return (PARSER_OK);
9878 }
9879
9880 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9881 {
9882 if (data.opts_type & OPTS_TYPE_ST_HEX)
9883 {
9884 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9885 }
9886 else
9887 {
9888 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9889 }
9890
9891 u32 *digest = (u32 *) hash_buf->digest;
9892
9893 salt_t *salt = hash_buf->salt;
9894
9895 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9896 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9897 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9898 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9899
9900 digest[0] = byte_swap_32 (digest[0]);
9901 digest[1] = byte_swap_32 (digest[1]);
9902 digest[2] = byte_swap_32 (digest[2]);
9903 digest[3] = byte_swap_32 (digest[3]);
9904
9905 digest[0] -= MD5M_A;
9906 digest[1] -= MD5M_B;
9907 digest[2] -= MD5M_C;
9908 digest[3] -= MD5M_D;
9909
9910 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9911
9912 uint salt_len = input_len - 32 - 1;
9913
9914 char *salt_buf = input_buf + 32 + 1;
9915
9916 char *salt_buf_ptr = (char *) salt->salt_buf;
9917
9918 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9919
9920 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9921
9922 salt->salt_len = salt_len;
9923
9924 return (PARSER_OK);
9925 }
9926
9927 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9928 {
9929 if (data.opts_type & OPTS_TYPE_ST_HEX)
9930 {
9931 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9932 }
9933 else
9934 {
9935 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9936 }
9937
9938 // unscramble
9939
9940 char clean_input_buf[32] = { 0 };
9941
9942 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9943 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9944
9945 for (int i = 0, j = 0, k = 0; i < 30; i++)
9946 {
9947 if (i == pos[j])
9948 {
9949 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9950
9951 j++;
9952 }
9953 else
9954 {
9955 clean_input_buf[k] = input_buf[i];
9956
9957 k++;
9958 }
9959 }
9960
9961 // base64 decode
9962
9963 u32 *digest = (u32 *) hash_buf->digest;
9964
9965 salt_t *salt = hash_buf->salt;
9966
9967 u32 a, b, c, d, e, f;
9968
9969 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9970 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9971 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9972 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9973 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9974 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9975
9976 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9977 | (((d << 12) | (e << 6) | (f)) << 0);
9978
9979 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9980 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9981 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9982 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9983 e = base64_to_int (clean_input_buf[10] & 0x7f);
9984 f = base64_to_int (clean_input_buf[11] & 0x7f);
9985
9986 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9987 | (((d << 12) | (e << 6) | (f)) << 0);
9988
9989 a = base64_to_int (clean_input_buf[12] & 0x7f);
9990 b = base64_to_int (clean_input_buf[13] & 0x7f);
9991 c = base64_to_int (clean_input_buf[14] & 0x7f);
9992 d = base64_to_int (clean_input_buf[15] & 0x7f);
9993 e = base64_to_int (clean_input_buf[16] & 0x7f);
9994 f = base64_to_int (clean_input_buf[17] & 0x7f);
9995
9996 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9997 | (((d << 12) | (e << 6) | (f)) << 0);
9998
9999 a = base64_to_int (clean_input_buf[18] & 0x7f);
10000 b = base64_to_int (clean_input_buf[19] & 0x7f);
10001 c = base64_to_int (clean_input_buf[20] & 0x7f);
10002 d = base64_to_int (clean_input_buf[21] & 0x7f);
10003 e = base64_to_int (clean_input_buf[22] & 0x7f);
10004 f = base64_to_int (clean_input_buf[23] & 0x7f);
10005
10006 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10007 | (((d << 12) | (e << 6) | (f)) << 0);
10008
10009 digest[0] = byte_swap_32 (digest[0]);
10010 digest[1] = byte_swap_32 (digest[1]);
10011 digest[2] = byte_swap_32 (digest[2]);
10012 digest[3] = byte_swap_32 (digest[3]);
10013
10014 digest[0] -= MD5M_A;
10015 digest[1] -= MD5M_B;
10016 digest[2] -= MD5M_C;
10017 digest[3] -= MD5M_D;
10018
10019 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10020
10021 uint salt_len = input_len - 30 - 1;
10022
10023 char *salt_buf = input_buf + 30 + 1;
10024
10025 char *salt_buf_ptr = (char *) salt->salt_buf;
10026
10027 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10028
10029 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
10030 if (salt_len > 10) return (PARSER_SALT_LENGTH);
10031
10032 salt->salt_len = salt_len;
10033
10034 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10035
10036 salt->salt_len += 22;
10037
10038 return (PARSER_OK);
10039 }
10040
10041 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10042 {
10043 if (data.opts_type & OPTS_TYPE_ST_HEX)
10044 {
10045 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10046 }
10047 else
10048 {
10049 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10050 }
10051
10052 u32 *digest = (u32 *) hash_buf->digest;
10053
10054 salt_t *salt = hash_buf->salt;
10055
10056 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10057 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10058 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10059 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10060 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10061
10062 digest[0] -= SHA1M_A;
10063 digest[1] -= SHA1M_B;
10064 digest[2] -= SHA1M_C;
10065 digest[3] -= SHA1M_D;
10066 digest[4] -= SHA1M_E;
10067
10068 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10069
10070 uint salt_len = input_len - 40 - 1;
10071
10072 char *salt_buf = input_buf + 40 + 1;
10073
10074 char *salt_buf_ptr = (char *) salt->salt_buf;
10075
10076 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10077
10078 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10079
10080 salt->salt_len = salt_len;
10081
10082 return (PARSER_OK);
10083 }
10084
10085 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10086 {
10087 if (data.opts_type & OPTS_TYPE_ST_HEX)
10088 {
10089 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10090 }
10091 else
10092 {
10093 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10094 }
10095
10096 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10097
10098 char *iter_pos = input_buf + 6;
10099
10100 salt_t *salt = hash_buf->salt;
10101
10102 uint iter = atoi (iter_pos);
10103
10104 if (iter < 1)
10105 {
10106 iter = ROUNDS_DCC2;
10107 }
10108
10109 salt->salt_iter = iter - 1;
10110
10111 char *salt_pos = strchr (iter_pos, '#');
10112
10113 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10114
10115 salt_pos++;
10116
10117 char *digest_pos = strchr (salt_pos, '#');
10118
10119 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10120
10121 digest_pos++;
10122
10123 uint salt_len = digest_pos - salt_pos - 1;
10124
10125 u32 *digest = (u32 *) hash_buf->digest;
10126
10127 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10128 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10129 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10130 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10131
10132 char *salt_buf_ptr = (char *) salt->salt_buf;
10133
10134 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10135
10136 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10137
10138 salt->salt_len = salt_len;
10139
10140 return (PARSER_OK);
10141 }
10142
10143 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10144 {
10145 u32 *digest = (u32 *) hash_buf->digest;
10146
10147 salt_t *salt = hash_buf->salt;
10148
10149 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10150
10151 hccap_t in;
10152
10153 memcpy (&in, input_buf, input_len);
10154
10155 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10156
10157 memcpy (digest, in.keymic, 16);
10158
10159 /*
10160 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10161 The phrase "Pairwise key expansion"
10162 Access Point Address (referred to as Authenticator Address AA)
10163 Supplicant Address (referred to as Supplicant Address SA)
10164 Access Point Nonce (referred to as Authenticator Anonce)
10165 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10166 */
10167
10168 uint salt_len = strlen (in.essid);
10169
10170 memcpy (salt->salt_buf, in.essid, salt_len);
10171
10172 salt->salt_len = salt_len;
10173
10174 salt->salt_iter = ROUNDS_WPA2 - 1;
10175
10176 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10177
10178 memcpy (pke_ptr, "Pairwise key expansion", 23);
10179
10180 if (memcmp (in.mac1, in.mac2, 6) < 0)
10181 {
10182 memcpy (pke_ptr + 23, in.mac1, 6);
10183 memcpy (pke_ptr + 29, in.mac2, 6);
10184 }
10185 else
10186 {
10187 memcpy (pke_ptr + 23, in.mac2, 6);
10188 memcpy (pke_ptr + 29, in.mac1, 6);
10189 }
10190
10191 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10192 {
10193 memcpy (pke_ptr + 35, in.nonce1, 32);
10194 memcpy (pke_ptr + 67, in.nonce2, 32);
10195 }
10196 else
10197 {
10198 memcpy (pke_ptr + 35, in.nonce2, 32);
10199 memcpy (pke_ptr + 67, in.nonce1, 32);
10200 }
10201
10202 for (int i = 0; i < 25; i++)
10203 {
10204 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10205 }
10206
10207 wpa->keyver = in.keyver;
10208
10209 if (wpa->keyver > 255)
10210 {
10211 log_info ("ATTENTION!");
10212 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10213 log_info (" This could be due to a recent aircrack-ng bug.");
10214 log_info (" The key version was automatically reset to a reasonable value.");
10215 log_info ("");
10216
10217 wpa->keyver &= 0xff;
10218 }
10219
10220 wpa->eapol_size = in.eapol_size;
10221
10222 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10223
10224 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10225
10226 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10227
10228 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10229
10230 if (wpa->keyver == 1)
10231 {
10232 // nothing to do
10233 }
10234 else
10235 {
10236 digest[0] = byte_swap_32 (digest[0]);
10237 digest[1] = byte_swap_32 (digest[1]);
10238 digest[2] = byte_swap_32 (digest[2]);
10239 digest[3] = byte_swap_32 (digest[3]);
10240
10241 for (int i = 0; i < 64; i++)
10242 {
10243 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10244 }
10245 }
10246
10247 salt->salt_buf[10] = digest[1];
10248 salt->salt_buf[11] = digest[2];
10249
10250 return (PARSER_OK);
10251 }
10252
10253 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10254 {
10255 u32 *digest = (u32 *) hash_buf->digest;
10256
10257 salt_t *salt = hash_buf->salt;
10258
10259 if (input_len == 0)
10260 {
10261 log_error ("Password Safe v2 container not specified");
10262
10263 exit (-1);
10264 }
10265
10266 FILE *fp = fopen (input_buf, "rb");
10267
10268 if (fp == NULL)
10269 {
10270 log_error ("%s: %s", input_buf, strerror (errno));
10271
10272 exit (-1);
10273 }
10274
10275 psafe2_hdr buf;
10276
10277 memset (&buf, 0, sizeof (psafe2_hdr));
10278
10279 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10280
10281 fclose (fp);
10282
10283 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10284
10285 salt->salt_buf[0] = buf.random[0];
10286 salt->salt_buf[1] = buf.random[1];
10287
10288 salt->salt_len = 8;
10289 salt->salt_iter = 1000;
10290
10291 digest[0] = byte_swap_32 (buf.hash[0]);
10292 digest[1] = byte_swap_32 (buf.hash[1]);
10293 digest[2] = byte_swap_32 (buf.hash[2]);
10294 digest[3] = byte_swap_32 (buf.hash[3]);
10295 digest[4] = byte_swap_32 (buf.hash[4]);
10296
10297 return (PARSER_OK);
10298 }
10299
10300 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10301 {
10302 u32 *digest = (u32 *) hash_buf->digest;
10303
10304 salt_t *salt = hash_buf->salt;
10305
10306 if (input_len == 0)
10307 {
10308 log_error (".psafe3 not specified");
10309
10310 exit (-1);
10311 }
10312
10313 FILE *fp = fopen (input_buf, "rb");
10314
10315 if (fp == NULL)
10316 {
10317 log_error ("%s: %s", input_buf, strerror (errno));
10318
10319 exit (-1);
10320 }
10321
10322 psafe3_t in;
10323
10324 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10325
10326 fclose (fp);
10327
10328 data.hashfile = input_buf; // we will need this in case it gets cracked
10329
10330 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10331
10332 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10333
10334 salt->salt_iter = in.iterations + 1;
10335
10336 salt->salt_buf[0] = in.salt_buf[0];
10337 salt->salt_buf[1] = in.salt_buf[1];
10338 salt->salt_buf[2] = in.salt_buf[2];
10339 salt->salt_buf[3] = in.salt_buf[3];
10340 salt->salt_buf[4] = in.salt_buf[4];
10341 salt->salt_buf[5] = in.salt_buf[5];
10342 salt->salt_buf[6] = in.salt_buf[6];
10343 salt->salt_buf[7] = in.salt_buf[7];
10344
10345 salt->salt_len = 32;
10346
10347 digest[0] = in.hash_buf[0];
10348 digest[1] = in.hash_buf[1];
10349 digest[2] = in.hash_buf[2];
10350 digest[3] = in.hash_buf[3];
10351 digest[4] = in.hash_buf[4];
10352 digest[5] = in.hash_buf[5];
10353 digest[6] = in.hash_buf[6];
10354 digest[7] = in.hash_buf[7];
10355
10356 digest[0] = byte_swap_32 (digest[0]);
10357 digest[1] = byte_swap_32 (digest[1]);
10358 digest[2] = byte_swap_32 (digest[2]);
10359 digest[3] = byte_swap_32 (digest[3]);
10360 digest[4] = byte_swap_32 (digest[4]);
10361 digest[5] = byte_swap_32 (digest[5]);
10362 digest[6] = byte_swap_32 (digest[6]);
10363 digest[7] = byte_swap_32 (digest[7]);
10364
10365 return (PARSER_OK);
10366 }
10367
10368 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10369 {
10370 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10371
10372 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10373
10374 u32 *digest = (u32 *) hash_buf->digest;
10375
10376 salt_t *salt = hash_buf->salt;
10377
10378 char *iter_pos = input_buf + 3;
10379
10380 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10381
10382 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10383
10384 memcpy ((char *) salt->salt_sign, input_buf, 4);
10385
10386 salt->salt_iter = salt_iter;
10387
10388 char *salt_pos = iter_pos + 1;
10389
10390 uint salt_len = 8;
10391
10392 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10393
10394 salt->salt_len = salt_len;
10395
10396 char *hash_pos = salt_pos + salt_len;
10397
10398 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10399
10400 return (PARSER_OK);
10401 }
10402
10403 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10404 {
10405 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10406
10407 u32 *digest = (u32 *) hash_buf->digest;
10408
10409 salt_t *salt = hash_buf->salt;
10410
10411 char *salt_pos = input_buf + 3;
10412
10413 uint iterations_len = 0;
10414
10415 if (memcmp (salt_pos, "rounds=", 7) == 0)
10416 {
10417 salt_pos += 7;
10418
10419 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10420
10421 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10422 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10423
10424 salt_pos[0] = 0x0;
10425
10426 salt->salt_iter = atoi (salt_pos - iterations_len);
10427
10428 salt_pos += 1;
10429
10430 iterations_len += 8;
10431 }
10432 else
10433 {
10434 salt->salt_iter = ROUNDS_MD5CRYPT;
10435 }
10436
10437 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10438
10439 char *hash_pos = strchr (salt_pos, '$');
10440
10441 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10442
10443 uint salt_len = hash_pos - salt_pos;
10444
10445 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10446
10447 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10448
10449 salt->salt_len = salt_len;
10450
10451 hash_pos++;
10452
10453 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10454
10455 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10456
10457 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10458
10459 return (PARSER_OK);
10460 }
10461
10462 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10463 {
10464 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10465
10466 u32 *digest = (u32 *) hash_buf->digest;
10467
10468 salt_t *salt = hash_buf->salt;
10469
10470 char *salt_pos = input_buf + 6;
10471
10472 uint iterations_len = 0;
10473
10474 if (memcmp (salt_pos, "rounds=", 7) == 0)
10475 {
10476 salt_pos += 7;
10477
10478 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10479
10480 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10481 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10482
10483 salt_pos[0] = 0x0;
10484
10485 salt->salt_iter = atoi (salt_pos - iterations_len);
10486
10487 salt_pos += 1;
10488
10489 iterations_len += 8;
10490 }
10491 else
10492 {
10493 salt->salt_iter = ROUNDS_MD5CRYPT;
10494 }
10495
10496 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10497
10498 char *hash_pos = strchr (salt_pos, '$');
10499
10500 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10501
10502 uint salt_len = hash_pos - salt_pos;
10503
10504 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10505
10506 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10507
10508 salt->salt_len = salt_len;
10509
10510 hash_pos++;
10511
10512 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10513
10514 return (PARSER_OK);
10515 }
10516
10517 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10518 {
10519 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10520
10521 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10522
10523 u32 *digest = (u32 *) hash_buf->digest;
10524
10525 salt_t *salt = hash_buf->salt;
10526
10527 char *salt_pos = input_buf + 14;
10528
10529 char *hash_pos = strchr (salt_pos, '*');
10530
10531 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10532
10533 hash_pos++;
10534
10535 uint salt_len = hash_pos - salt_pos - 1;
10536
10537 char *salt_buf_ptr = (char *) salt->salt_buf;
10538
10539 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10540
10541 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10542
10543 salt->salt_len = salt_len;
10544
10545 u8 tmp_buf[100] = { 0 };
10546
10547 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10548
10549 memcpy (digest, tmp_buf, 20);
10550
10551 digest[0] = byte_swap_32 (digest[0]);
10552 digest[1] = byte_swap_32 (digest[1]);
10553 digest[2] = byte_swap_32 (digest[2]);
10554 digest[3] = byte_swap_32 (digest[3]);
10555 digest[4] = byte_swap_32 (digest[4]);
10556
10557 digest[0] -= SHA1M_A;
10558 digest[1] -= SHA1M_B;
10559 digest[2] -= SHA1M_C;
10560 digest[3] -= SHA1M_D;
10561 digest[4] -= SHA1M_E;
10562
10563 return (PARSER_OK);
10564 }
10565
10566 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10567 {
10568 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10569
10570 unsigned char c12 = itoa64_to_int (input_buf[12]);
10571
10572 if (c12 & 3) return (PARSER_HASH_VALUE);
10573
10574 u32 *digest = (u32 *) hash_buf->digest;
10575
10576 salt_t *salt = hash_buf->salt;
10577
10578 // for ascii_digest
10579 salt->salt_sign[0] = input_buf[0];
10580 salt->salt_sign[1] = input_buf[1];
10581
10582 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10583 | itoa64_to_int (input_buf[1]) << 6;
10584
10585 salt->salt_len = 2;
10586
10587 u8 tmp_buf[100] = { 0 };
10588
10589 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10590
10591 memcpy (digest, tmp_buf, 8);
10592
10593 uint tt;
10594
10595 IP (digest[0], digest[1], tt);
10596
10597 digest[2] = 0;
10598 digest[3] = 0;
10599
10600 return (PARSER_OK);
10601 }
10602
10603 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10604 {
10605 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10606
10607 u32 *digest = (u32 *) hash_buf->digest;
10608
10609 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10610 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10611 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10612 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10613
10614 digest[0] = byte_swap_32 (digest[0]);
10615 digest[1] = byte_swap_32 (digest[1]);
10616 digest[2] = byte_swap_32 (digest[2]);
10617 digest[3] = byte_swap_32 (digest[3]);
10618
10619 digest[0] -= MD4M_A;
10620 digest[1] -= MD4M_B;
10621 digest[2] -= MD4M_C;
10622 digest[3] -= MD4M_D;
10623
10624 return (PARSER_OK);
10625 }
10626
10627 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10628 {
10629 if (data.opts_type & OPTS_TYPE_ST_HEX)
10630 {
10631 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10632 }
10633 else
10634 {
10635 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10636 }
10637
10638 u32 *digest = (u32 *) hash_buf->digest;
10639
10640 salt_t *salt = hash_buf->salt;
10641
10642 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10643 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10644 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10645 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10646
10647 digest[0] = byte_swap_32 (digest[0]);
10648 digest[1] = byte_swap_32 (digest[1]);
10649 digest[2] = byte_swap_32 (digest[2]);
10650 digest[3] = byte_swap_32 (digest[3]);
10651
10652 digest[0] -= MD4M_A;
10653 digest[1] -= MD4M_B;
10654 digest[2] -= MD4M_C;
10655 digest[3] -= MD4M_D;
10656
10657 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10658
10659 uint salt_len = input_len - 32 - 1;
10660
10661 char *salt_buf = input_buf + 32 + 1;
10662
10663 char *salt_buf_ptr = (char *) salt->salt_buf;
10664
10665 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10666
10667 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10668
10669 salt->salt_len = salt_len;
10670
10671 return (PARSER_OK);
10672 }
10673
10674 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10675 {
10676 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10677
10678 u32 *digest = (u32 *) hash_buf->digest;
10679
10680 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10681 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10682 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10683 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10684
10685 digest[0] = byte_swap_32 (digest[0]);
10686 digest[1] = byte_swap_32 (digest[1]);
10687 digest[2] = byte_swap_32 (digest[2]);
10688 digest[3] = byte_swap_32 (digest[3]);
10689
10690 digest[0] -= MD5M_A;
10691 digest[1] -= MD5M_B;
10692 digest[2] -= MD5M_C;
10693 digest[3] -= MD5M_D;
10694
10695 return (PARSER_OK);
10696 }
10697
10698 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10699 {
10700 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10701
10702 u32 *digest = (u32 *) hash_buf->digest;
10703
10704 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10705 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10706 digest[2] = 0;
10707 digest[3] = 0;
10708
10709 digest[0] = byte_swap_32 (digest[0]);
10710 digest[1] = byte_swap_32 (digest[1]);
10711
10712 return (PARSER_OK);
10713 }
10714
10715 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10716 {
10717 if (data.opts_type & OPTS_TYPE_ST_HEX)
10718 {
10719 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10720 }
10721 else
10722 {
10723 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10724 }
10725
10726 u32 *digest = (u32 *) hash_buf->digest;
10727
10728 salt_t *salt = hash_buf->salt;
10729
10730 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10731 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10732 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10733 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10734
10735 digest[0] = byte_swap_32 (digest[0]);
10736 digest[1] = byte_swap_32 (digest[1]);
10737 digest[2] = byte_swap_32 (digest[2]);
10738 digest[3] = byte_swap_32 (digest[3]);
10739
10740 digest[0] -= MD5M_A;
10741 digest[1] -= MD5M_B;
10742 digest[2] -= MD5M_C;
10743 digest[3] -= MD5M_D;
10744
10745 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10746
10747 uint salt_len = input_len - 32 - 1;
10748
10749 char *salt_buf = input_buf + 32 + 1;
10750
10751 char *salt_buf_ptr = (char *) salt->salt_buf;
10752
10753 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10754
10755 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10756
10757 salt->salt_len = salt_len;
10758
10759 return (PARSER_OK);
10760 }
10761
10762 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10763 {
10764 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10765
10766 u32 *digest = (u32 *) hash_buf->digest;
10767
10768 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10769 | itoa64_to_int (input_buf[ 1]) << 6
10770 | itoa64_to_int (input_buf[ 2]) << 12
10771 | itoa64_to_int (input_buf[ 3]) << 18;
10772 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10773 | itoa64_to_int (input_buf[ 5]) << 6
10774 | itoa64_to_int (input_buf[ 6]) << 12
10775 | itoa64_to_int (input_buf[ 7]) << 18;
10776 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10777 | itoa64_to_int (input_buf[ 9]) << 6
10778 | itoa64_to_int (input_buf[10]) << 12
10779 | itoa64_to_int (input_buf[11]) << 18;
10780 digest[3] = itoa64_to_int (input_buf[12]) << 0
10781 | itoa64_to_int (input_buf[13]) << 6
10782 | itoa64_to_int (input_buf[14]) << 12
10783 | itoa64_to_int (input_buf[15]) << 18;
10784
10785 digest[0] -= MD5M_A;
10786 digest[1] -= MD5M_B;
10787 digest[2] -= MD5M_C;
10788 digest[3] -= MD5M_D;
10789
10790 digest[0] &= 0x00ffffff;
10791 digest[1] &= 0x00ffffff;
10792 digest[2] &= 0x00ffffff;
10793 digest[3] &= 0x00ffffff;
10794
10795 return (PARSER_OK);
10796 }
10797
10798 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10799 {
10800 if (data.opts_type & OPTS_TYPE_ST_HEX)
10801 {
10802 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10803 }
10804 else
10805 {
10806 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10807 }
10808
10809 u32 *digest = (u32 *) hash_buf->digest;
10810
10811 salt_t *salt = hash_buf->salt;
10812
10813 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10814 | itoa64_to_int (input_buf[ 1]) << 6
10815 | itoa64_to_int (input_buf[ 2]) << 12
10816 | itoa64_to_int (input_buf[ 3]) << 18;
10817 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10818 | itoa64_to_int (input_buf[ 5]) << 6
10819 | itoa64_to_int (input_buf[ 6]) << 12
10820 | itoa64_to_int (input_buf[ 7]) << 18;
10821 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10822 | itoa64_to_int (input_buf[ 9]) << 6
10823 | itoa64_to_int (input_buf[10]) << 12
10824 | itoa64_to_int (input_buf[11]) << 18;
10825 digest[3] = itoa64_to_int (input_buf[12]) << 0
10826 | itoa64_to_int (input_buf[13]) << 6
10827 | itoa64_to_int (input_buf[14]) << 12
10828 | itoa64_to_int (input_buf[15]) << 18;
10829
10830 digest[0] -= MD5M_A;
10831 digest[1] -= MD5M_B;
10832 digest[2] -= MD5M_C;
10833 digest[3] -= MD5M_D;
10834
10835 digest[0] &= 0x00ffffff;
10836 digest[1] &= 0x00ffffff;
10837 digest[2] &= 0x00ffffff;
10838 digest[3] &= 0x00ffffff;
10839
10840 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10841
10842 uint salt_len = input_len - 16 - 1;
10843
10844 char *salt_buf = input_buf + 16 + 1;
10845
10846 char *salt_buf_ptr = (char *) salt->salt_buf;
10847
10848 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10849
10850 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10851
10852 salt->salt_len = salt_len;
10853
10854 return (PARSER_OK);
10855 }
10856
10857 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10858 {
10859 key[0] = (nthash[0] >> 0);
10860 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10861 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10862 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10863 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10864 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10865 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10866 key[7] = (nthash[6] << 1);
10867
10868 key[0] |= 0x01;
10869 key[1] |= 0x01;
10870 key[2] |= 0x01;
10871 key[3] |= 0x01;
10872 key[4] |= 0x01;
10873 key[5] |= 0x01;
10874 key[6] |= 0x01;
10875 key[7] |= 0x01;
10876 }
10877
10878 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10879 {
10880 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10881
10882 u32 *digest = (u32 *) hash_buf->digest;
10883
10884 salt_t *salt = hash_buf->salt;
10885
10886 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10887
10888 /**
10889 * parse line
10890 */
10891
10892 char *user_pos = input_buf;
10893
10894 char *unused_pos = strchr (user_pos, ':');
10895
10896 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10897
10898 uint user_len = unused_pos - user_pos;
10899
10900 if (user_len > 60) return (PARSER_SALT_LENGTH);
10901
10902 unused_pos++;
10903
10904 char *domain_pos = strchr (unused_pos, ':');
10905
10906 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10907
10908 uint unused_len = domain_pos - unused_pos;
10909
10910 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10911
10912 domain_pos++;
10913
10914 char *srvchall_pos = strchr (domain_pos, ':');
10915
10916 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10917
10918 uint domain_len = srvchall_pos - domain_pos;
10919
10920 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10921
10922 srvchall_pos++;
10923
10924 char *hash_pos = strchr (srvchall_pos, ':');
10925
10926 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10927
10928 uint srvchall_len = hash_pos - srvchall_pos;
10929
10930 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10931
10932 hash_pos++;
10933
10934 char *clichall_pos = strchr (hash_pos, ':');
10935
10936 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10937
10938 uint hash_len = clichall_pos - hash_pos;
10939
10940 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10941
10942 clichall_pos++;
10943
10944 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10945
10946 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10947
10948 /**
10949 * store some data for later use
10950 */
10951
10952 netntlm->user_len = user_len * 2;
10953 netntlm->domain_len = domain_len * 2;
10954 netntlm->srvchall_len = srvchall_len / 2;
10955 netntlm->clichall_len = clichall_len / 2;
10956
10957 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10958 char *chall_ptr = (char *) netntlm->chall_buf;
10959
10960 /**
10961 * handle username and domainname
10962 */
10963
10964 for (uint i = 0; i < user_len; i++)
10965 {
10966 *userdomain_ptr++ = user_pos[i];
10967 *userdomain_ptr++ = 0;
10968 }
10969
10970 for (uint i = 0; i < domain_len; i++)
10971 {
10972 *userdomain_ptr++ = domain_pos[i];
10973 *userdomain_ptr++ = 0;
10974 }
10975
10976 /**
10977 * handle server challenge encoding
10978 */
10979
10980 for (uint i = 0; i < srvchall_len; i += 2)
10981 {
10982 const char p0 = srvchall_pos[i + 0];
10983 const char p1 = srvchall_pos[i + 1];
10984
10985 *chall_ptr++ = hex_convert (p1) << 0
10986 | hex_convert (p0) << 4;
10987 }
10988
10989 /**
10990 * handle client challenge encoding
10991 */
10992
10993 for (uint i = 0; i < clichall_len; i += 2)
10994 {
10995 const char p0 = clichall_pos[i + 0];
10996 const char p1 = clichall_pos[i + 1];
10997
10998 *chall_ptr++ = hex_convert (p1) << 0
10999 | hex_convert (p0) << 4;
11000 }
11001
11002 /**
11003 * store data
11004 */
11005
11006 char *salt_buf_ptr = (char *) salt->salt_buf;
11007
11008 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11009
11010 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11011
11012 salt->salt_len = salt_len;
11013
11014 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11015 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11016 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11017 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11018
11019 digest[0] = byte_swap_32 (digest[0]);
11020 digest[1] = byte_swap_32 (digest[1]);
11021 digest[2] = byte_swap_32 (digest[2]);
11022 digest[3] = byte_swap_32 (digest[3]);
11023
11024 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11025
11026 uint digest_tmp[2] = { 0 };
11027
11028 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11029 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11030
11031 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11032 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11033
11034 /* special case 2: ESS */
11035
11036 if (srvchall_len == 48)
11037 {
11038 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11039 {
11040 uint w[16] = { 0 };
11041
11042 w[ 0] = netntlm->chall_buf[6];
11043 w[ 1] = netntlm->chall_buf[7];
11044 w[ 2] = netntlm->chall_buf[0];
11045 w[ 3] = netntlm->chall_buf[1];
11046 w[ 4] = 0x80;
11047 w[14] = 16 * 8;
11048
11049 uint dgst[4] = { 0 };
11050
11051 dgst[0] = MAGIC_A;
11052 dgst[1] = MAGIC_B;
11053 dgst[2] = MAGIC_C;
11054 dgst[3] = MAGIC_D;
11055
11056 md5_64 (w, dgst);
11057
11058 salt->salt_buf[0] = dgst[0];
11059 salt->salt_buf[1] = dgst[1];
11060 }
11061 }
11062
11063 /* precompute netntlmv1 exploit start */
11064
11065 for (uint i = 0; i < 0x10000; i++)
11066 {
11067 uint key_md4[2] = { i, 0 };
11068 uint key_des[2] = { 0, 0 };
11069
11070 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11071
11072 uint Kc[16] = { 0 };
11073 uint Kd[16] = { 0 };
11074
11075 _des_keysetup (key_des, Kc, Kd, c_skb);
11076
11077 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11078
11079 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11080
11081 if (data3[0] != digest_tmp[0]) continue;
11082 if (data3[1] != digest_tmp[1]) continue;
11083
11084 salt->salt_buf[2] = i;
11085
11086 salt->salt_len = 24;
11087
11088 break;
11089 }
11090
11091 salt->salt_buf_pc[0] = digest_tmp[0];
11092 salt->salt_buf_pc[1] = digest_tmp[1];
11093
11094 /* precompute netntlmv1 exploit stop */
11095
11096 u32 tt;
11097
11098 IP (digest[0], digest[1], tt);
11099 IP (digest[2], digest[3], tt);
11100
11101 digest[0] = rotr32 (digest[0], 29);
11102 digest[1] = rotr32 (digest[1], 29);
11103 digest[2] = rotr32 (digest[2], 29);
11104 digest[3] = rotr32 (digest[3], 29);
11105
11106 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11107
11108 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11109 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11110
11111 return (PARSER_OK);
11112 }
11113
11114 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11115 {
11116 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11117
11118 u32 *digest = (u32 *) hash_buf->digest;
11119
11120 salt_t *salt = hash_buf->salt;
11121
11122 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11123
11124 /**
11125 * parse line
11126 */
11127
11128 char *user_pos = input_buf;
11129
11130 char *unused_pos = strchr (user_pos, ':');
11131
11132 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11133
11134 uint user_len = unused_pos - user_pos;
11135
11136 if (user_len > 60) return (PARSER_SALT_LENGTH);
11137
11138 unused_pos++;
11139
11140 char *domain_pos = strchr (unused_pos, ':');
11141
11142 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11143
11144 uint unused_len = domain_pos - unused_pos;
11145
11146 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11147
11148 domain_pos++;
11149
11150 char *srvchall_pos = strchr (domain_pos, ':');
11151
11152 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11153
11154 uint domain_len = srvchall_pos - domain_pos;
11155
11156 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11157
11158 srvchall_pos++;
11159
11160 char *hash_pos = strchr (srvchall_pos, ':');
11161
11162 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11163
11164 uint srvchall_len = hash_pos - srvchall_pos;
11165
11166 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11167
11168 hash_pos++;
11169
11170 char *clichall_pos = strchr (hash_pos, ':');
11171
11172 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11173
11174 uint hash_len = clichall_pos - hash_pos;
11175
11176 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11177
11178 clichall_pos++;
11179
11180 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11181
11182 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11183
11184 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11185
11186 /**
11187 * store some data for later use
11188 */
11189
11190 netntlm->user_len = user_len * 2;
11191 netntlm->domain_len = domain_len * 2;
11192 netntlm->srvchall_len = srvchall_len / 2;
11193 netntlm->clichall_len = clichall_len / 2;
11194
11195 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11196 char *chall_ptr = (char *) netntlm->chall_buf;
11197
11198 /**
11199 * handle username and domainname
11200 */
11201
11202 for (uint i = 0; i < user_len; i++)
11203 {
11204 *userdomain_ptr++ = toupper (user_pos[i]);
11205 *userdomain_ptr++ = 0;
11206 }
11207
11208 for (uint i = 0; i < domain_len; i++)
11209 {
11210 *userdomain_ptr++ = domain_pos[i];
11211 *userdomain_ptr++ = 0;
11212 }
11213
11214 *userdomain_ptr++ = 0x80;
11215
11216 /**
11217 * handle server challenge encoding
11218 */
11219
11220 for (uint i = 0; i < srvchall_len; i += 2)
11221 {
11222 const char p0 = srvchall_pos[i + 0];
11223 const char p1 = srvchall_pos[i + 1];
11224
11225 *chall_ptr++ = hex_convert (p1) << 0
11226 | hex_convert (p0) << 4;
11227 }
11228
11229 /**
11230 * handle client challenge encoding
11231 */
11232
11233 for (uint i = 0; i < clichall_len; i += 2)
11234 {
11235 const char p0 = clichall_pos[i + 0];
11236 const char p1 = clichall_pos[i + 1];
11237
11238 *chall_ptr++ = hex_convert (p1) << 0
11239 | hex_convert (p0) << 4;
11240 }
11241
11242 *chall_ptr++ = 0x80;
11243
11244 /**
11245 * handle hash itself
11246 */
11247
11248 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11249 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11250 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11251 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11252
11253 digest[0] = byte_swap_32 (digest[0]);
11254 digest[1] = byte_swap_32 (digest[1]);
11255 digest[2] = byte_swap_32 (digest[2]);
11256 digest[3] = byte_swap_32 (digest[3]);
11257
11258 /**
11259 * reuse challange data as salt_buf, its the buffer that is most likely unique
11260 */
11261
11262 salt->salt_buf[0] = 0;
11263 salt->salt_buf[1] = 0;
11264 salt->salt_buf[2] = 0;
11265 salt->salt_buf[3] = 0;
11266 salt->salt_buf[4] = 0;
11267 salt->salt_buf[5] = 0;
11268 salt->salt_buf[6] = 0;
11269 salt->salt_buf[7] = 0;
11270
11271 uint *uptr;
11272
11273 uptr = (uint *) netntlm->userdomain_buf;
11274
11275 for (uint i = 0; i < 16; i += 16)
11276 {
11277 md5_64 (uptr, salt->salt_buf);
11278 }
11279
11280 uptr = (uint *) netntlm->chall_buf;
11281
11282 for (uint i = 0; i < 256; i += 16)
11283 {
11284 md5_64 (uptr, salt->salt_buf);
11285 }
11286
11287 salt->salt_len = 16;
11288
11289 return (PARSER_OK);
11290 }
11291
11292 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11293 {
11294 if (data.opts_type & OPTS_TYPE_ST_HEX)
11295 {
11296 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11297 }
11298 else
11299 {
11300 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11301 }
11302
11303 u32 *digest = (u32 *) hash_buf->digest;
11304
11305 salt_t *salt = hash_buf->salt;
11306
11307 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11308 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11309 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11310 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11311
11312 digest[0] = byte_swap_32 (digest[0]);
11313 digest[1] = byte_swap_32 (digest[1]);
11314 digest[2] = byte_swap_32 (digest[2]);
11315 digest[3] = byte_swap_32 (digest[3]);
11316
11317 digest[0] -= MD5M_A;
11318 digest[1] -= MD5M_B;
11319 digest[2] -= MD5M_C;
11320 digest[3] -= MD5M_D;
11321
11322 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11323
11324 uint salt_len = input_len - 32 - 1;
11325
11326 char *salt_buf = input_buf + 32 + 1;
11327
11328 char *salt_buf_ptr = (char *) salt->salt_buf;
11329
11330 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11331
11332 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11333
11334 salt->salt_len = salt_len;
11335
11336 return (PARSER_OK);
11337 }
11338
11339 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11340 {
11341 if (data.opts_type & OPTS_TYPE_ST_HEX)
11342 {
11343 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11344 }
11345 else
11346 {
11347 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11348 }
11349
11350 u32 *digest = (u32 *) hash_buf->digest;
11351
11352 salt_t *salt = hash_buf->salt;
11353
11354 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11355 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11356 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11357 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11358
11359 digest[0] = byte_swap_32 (digest[0]);
11360 digest[1] = byte_swap_32 (digest[1]);
11361 digest[2] = byte_swap_32 (digest[2]);
11362 digest[3] = byte_swap_32 (digest[3]);
11363
11364 digest[0] -= MD5M_A;
11365 digest[1] -= MD5M_B;
11366 digest[2] -= MD5M_C;
11367 digest[3] -= MD5M_D;
11368
11369 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11370
11371 uint salt_len = input_len - 32 - 1;
11372
11373 char *salt_buf = input_buf + 32 + 1;
11374
11375 char *salt_buf_ptr = (char *) salt->salt_buf;
11376
11377 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11378
11379 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11380
11381 salt->salt_len = salt_len;
11382
11383 return (PARSER_OK);
11384 }
11385
11386 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11387 {
11388 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11389
11390 u32 *digest = (u32 *) hash_buf->digest;
11391
11392 salt_t *salt = hash_buf->salt;
11393
11394 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11395 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11396 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11397 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11398
11399 digest[0] = byte_swap_32 (digest[0]);
11400 digest[1] = byte_swap_32 (digest[1]);
11401 digest[2] = byte_swap_32 (digest[2]);
11402 digest[3] = byte_swap_32 (digest[3]);
11403
11404 digest[0] -= MD5M_A;
11405 digest[1] -= MD5M_B;
11406 digest[2] -= MD5M_C;
11407 digest[3] -= MD5M_D;
11408
11409 /**
11410 * This is a virtual salt. While the algorithm is basically not salted
11411 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11412 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11413 */
11414
11415 char *salt_buf_ptr = (char *) salt->salt_buf;
11416
11417 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11418
11419 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11420
11421 salt->salt_len = salt_len;
11422
11423 return (PARSER_OK);
11424 }
11425
11426 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11427 {
11428 if (data.opts_type & OPTS_TYPE_ST_HEX)
11429 {
11430 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11431 }
11432 else
11433 {
11434 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11435 }
11436
11437 u32 *digest = (u32 *) hash_buf->digest;
11438
11439 salt_t *salt = hash_buf->salt;
11440
11441 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11442 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11443 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11444 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11445
11446 digest[0] = byte_swap_32 (digest[0]);
11447 digest[1] = byte_swap_32 (digest[1]);
11448 digest[2] = byte_swap_32 (digest[2]);
11449 digest[3] = byte_swap_32 (digest[3]);
11450
11451 digest[0] -= MD5M_A;
11452 digest[1] -= MD5M_B;
11453 digest[2] -= MD5M_C;
11454 digest[3] -= MD5M_D;
11455
11456 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11457
11458 uint salt_len = input_len - 32 - 1;
11459
11460 char *salt_buf = input_buf + 32 + 1;
11461
11462 char *salt_buf_ptr = (char *) salt->salt_buf;
11463
11464 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11465
11466 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11467
11468 salt->salt_len = salt_len;
11469
11470 return (PARSER_OK);
11471 }
11472
11473 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11474 {
11475 if (data.opts_type & OPTS_TYPE_ST_HEX)
11476 {
11477 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11478 }
11479 else
11480 {
11481 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11482 }
11483
11484 u32 *digest = (u32 *) hash_buf->digest;
11485
11486 salt_t *salt = hash_buf->salt;
11487
11488 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11489 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11490 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11491 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11492
11493 digest[0] = byte_swap_32 (digest[0]);
11494 digest[1] = byte_swap_32 (digest[1]);
11495 digest[2] = byte_swap_32 (digest[2]);
11496 digest[3] = byte_swap_32 (digest[3]);
11497
11498 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11499
11500 uint salt_len = input_len - 32 - 1;
11501
11502 char *salt_buf = input_buf + 32 + 1;
11503
11504 char *salt_buf_ptr = (char *) salt->salt_buf;
11505
11506 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11507
11508 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11509
11510 salt->salt_len = salt_len;
11511
11512 return (PARSER_OK);
11513 }
11514
11515 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11516 {
11517 if (data.opts_type & OPTS_TYPE_ST_HEX)
11518 {
11519 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11520 }
11521 else
11522 {
11523 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11524 }
11525
11526 u32 *digest = (u32 *) hash_buf->digest;
11527
11528 salt_t *salt = hash_buf->salt;
11529
11530 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11531 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11532 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11533 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11534
11535 digest[0] = byte_swap_32 (digest[0]);
11536 digest[1] = byte_swap_32 (digest[1]);
11537 digest[2] = byte_swap_32 (digest[2]);
11538 digest[3] = byte_swap_32 (digest[3]);
11539
11540 digest[0] -= MD4M_A;
11541 digest[1] -= MD4M_B;
11542 digest[2] -= MD4M_C;
11543 digest[3] -= MD4M_D;
11544
11545 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11546
11547 uint salt_len = input_len - 32 - 1;
11548
11549 char *salt_buf = input_buf + 32 + 1;
11550
11551 char *salt_buf_ptr = (char *) salt->salt_buf;
11552
11553 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11554
11555 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11556
11557 salt->salt_len = salt_len;
11558
11559 return (PARSER_OK);
11560 }
11561
11562 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11563 {
11564 if (data.opts_type & OPTS_TYPE_ST_HEX)
11565 {
11566 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11567 }
11568 else
11569 {
11570 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11571 }
11572
11573 u32 *digest = (u32 *) hash_buf->digest;
11574
11575 salt_t *salt = hash_buf->salt;
11576
11577 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11578 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11579 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11580 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11581
11582 digest[0] = byte_swap_32 (digest[0]);
11583 digest[1] = byte_swap_32 (digest[1]);
11584 digest[2] = byte_swap_32 (digest[2]);
11585 digest[3] = byte_swap_32 (digest[3]);
11586
11587 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11588
11589 uint salt_len = input_len - 32 - 1;
11590
11591 char *salt_buf = input_buf + 32 + 1;
11592
11593 uint salt_pc_block[16] = { 0 };
11594
11595 char *salt_pc_block_ptr = (char *) salt_pc_block;
11596
11597 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11598
11599 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11600
11601 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11602
11603 salt_pc_block[14] = salt_len * 8;
11604
11605 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11606
11607 md5_64 (salt_pc_block, salt_pc_digest);
11608
11609 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11610 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11611 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11612 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11613
11614 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11615
11616 memcpy (salt_buf_ptr, salt_buf, salt_len);
11617
11618 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11619
11620 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11621 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11622 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11623 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11624
11625 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11626
11627 return (PARSER_OK);
11628 }
11629
11630 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11631 {
11632 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11633
11634 u32 *digest = (u32 *) hash_buf->digest;
11635
11636 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11637 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11638 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11639 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11640 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11641
11642 digest[0] -= SHA1M_A;
11643 digest[1] -= SHA1M_B;
11644 digest[2] -= SHA1M_C;
11645 digest[3] -= SHA1M_D;
11646 digest[4] -= SHA1M_E;
11647
11648 return (PARSER_OK);
11649 }
11650
11651 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11652 {
11653 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11654
11655 u32 *digest = (u32 *) hash_buf->digest;
11656
11657 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11658 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11659 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11660 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11661 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11662
11663 return (PARSER_OK);
11664 }
11665
11666 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11667 {
11668 if (data.opts_type & OPTS_TYPE_ST_HEX)
11669 {
11670 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11671 }
11672 else
11673 {
11674 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11675 }
11676
11677 u32 *digest = (u32 *) hash_buf->digest;
11678
11679 salt_t *salt = hash_buf->salt;
11680
11681 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11682 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11683 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11684 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11685 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11686
11687 digest[0] -= SHA1M_A;
11688 digest[1] -= SHA1M_B;
11689 digest[2] -= SHA1M_C;
11690 digest[3] -= SHA1M_D;
11691 digest[4] -= SHA1M_E;
11692
11693 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11694
11695 uint salt_len = input_len - 40 - 1;
11696
11697 char *salt_buf = input_buf + 40 + 1;
11698
11699 char *salt_buf_ptr = (char *) salt->salt_buf;
11700
11701 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11702
11703 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11704
11705 salt->salt_len = salt_len;
11706
11707 return (PARSER_OK);
11708 }
11709
11710 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11711 {
11712 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11713
11714 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11715
11716 u32 *digest = (u32 *) hash_buf->digest;
11717
11718 u8 tmp_buf[100] = { 0 };
11719
11720 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11721
11722 memcpy (digest, tmp_buf, 20);
11723
11724 digest[0] = byte_swap_32 (digest[0]);
11725 digest[1] = byte_swap_32 (digest[1]);
11726 digest[2] = byte_swap_32 (digest[2]);
11727 digest[3] = byte_swap_32 (digest[3]);
11728 digest[4] = byte_swap_32 (digest[4]);
11729
11730 digest[0] -= SHA1M_A;
11731 digest[1] -= SHA1M_B;
11732 digest[2] -= SHA1M_C;
11733 digest[3] -= SHA1M_D;
11734 digest[4] -= SHA1M_E;
11735
11736 return (PARSER_OK);
11737 }
11738
11739 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11740 {
11741 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11742
11743 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11744
11745 u32 *digest = (u32 *) hash_buf->digest;
11746
11747 salt_t *salt = hash_buf->salt;
11748
11749 u8 tmp_buf[100] = { 0 };
11750
11751 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11752
11753 memcpy (digest, tmp_buf, 20);
11754
11755 salt->salt_len = tmp_len - 20;
11756
11757 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11758
11759 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11760 {
11761 char *ptr = (char *) salt->salt_buf;
11762
11763 ptr[salt->salt_len] = 0x80;
11764 }
11765
11766 digest[0] = byte_swap_32 (digest[0]);
11767 digest[1] = byte_swap_32 (digest[1]);
11768 digest[2] = byte_swap_32 (digest[2]);
11769 digest[3] = byte_swap_32 (digest[3]);
11770 digest[4] = byte_swap_32 (digest[4]);
11771
11772 digest[0] -= SHA1M_A;
11773 digest[1] -= SHA1M_B;
11774 digest[2] -= SHA1M_C;
11775 digest[3] -= SHA1M_D;
11776 digest[4] -= SHA1M_E;
11777
11778 return (PARSER_OK);
11779 }
11780
11781 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11782 {
11783 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11784
11785 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11786
11787 u32 *digest = (u32 *) hash_buf->digest;
11788
11789 salt_t *salt = hash_buf->salt;
11790
11791 char *salt_buf = input_buf + 6;
11792
11793 uint salt_len = 8;
11794
11795 char *salt_buf_ptr = (char *) salt->salt_buf;
11796
11797 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11798
11799 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11800
11801 salt->salt_len = salt_len;
11802
11803 char *hash_pos = input_buf + 6 + 8 + 40;
11804
11805 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11806 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11807 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11808 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11809 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11810
11811 digest[0] -= SHA1M_A;
11812 digest[1] -= SHA1M_B;
11813 digest[2] -= SHA1M_C;
11814 digest[3] -= SHA1M_D;
11815 digest[4] -= SHA1M_E;
11816
11817 return (PARSER_OK);
11818 }
11819
11820 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11821 {
11822 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11823
11824 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11825
11826 u32 *digest = (u32 *) hash_buf->digest;
11827
11828 salt_t *salt = hash_buf->salt;
11829
11830 char *salt_buf = input_buf + 6;
11831
11832 uint salt_len = 8;
11833
11834 char *salt_buf_ptr = (char *) salt->salt_buf;
11835
11836 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11837
11838 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11839
11840 salt->salt_len = salt_len;
11841
11842 char *hash_pos = input_buf + 6 + 8;
11843
11844 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11845 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11846 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11847 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11848 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11849
11850 digest[0] -= SHA1M_A;
11851 digest[1] -= SHA1M_B;
11852 digest[2] -= SHA1M_C;
11853 digest[3] -= SHA1M_D;
11854 digest[4] -= SHA1M_E;
11855
11856 return (PARSER_OK);
11857 }
11858
11859 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11860 {
11861 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11862
11863 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11864
11865 u64 *digest = (u64 *) hash_buf->digest;
11866
11867 salt_t *salt = hash_buf->salt;
11868
11869 char *salt_buf = input_buf + 6;
11870
11871 uint salt_len = 8;
11872
11873 char *salt_buf_ptr = (char *) salt->salt_buf;
11874
11875 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11876
11877 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11878
11879 salt->salt_len = salt_len;
11880
11881 char *hash_pos = input_buf + 6 + 8;
11882
11883 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11884 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11885 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11886 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11887 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11888 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11889 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11890 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11891
11892 digest[0] -= SHA512M_A;
11893 digest[1] -= SHA512M_B;
11894 digest[2] -= SHA512M_C;
11895 digest[3] -= SHA512M_D;
11896 digest[4] -= SHA512M_E;
11897 digest[5] -= SHA512M_F;
11898 digest[6] -= SHA512M_G;
11899 digest[7] -= SHA512M_H;
11900
11901 return (PARSER_OK);
11902 }
11903
11904 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11905 {
11906 if (data.opts_type & OPTS_TYPE_ST_HEX)
11907 {
11908 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11909 }
11910 else
11911 {
11912 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11913 }
11914
11915 u32 *digest = (u32 *) hash_buf->digest;
11916
11917 salt_t *salt = hash_buf->salt;
11918
11919 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11920 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11921 digest[2] = 0;
11922 digest[3] = 0;
11923
11924 digest[0] = byte_swap_32 (digest[0]);
11925 digest[1] = byte_swap_32 (digest[1]);
11926
11927 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11928
11929 uint salt_len = input_len - 16 - 1;
11930
11931 char *salt_buf = input_buf + 16 + 1;
11932
11933 char *salt_buf_ptr = (char *) salt->salt_buf;
11934
11935 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11936
11937 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11938
11939 salt->salt_len = salt_len;
11940
11941 return (PARSER_OK);
11942 }
11943
11944 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11945 {
11946 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11947
11948 u32 *digest = (u32 *) hash_buf->digest;
11949
11950 salt_t *salt = hash_buf->salt;
11951
11952 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11953 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11954 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11955 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11956 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11957
11958 digest[0] -= SHA1M_A;
11959 digest[1] -= SHA1M_B;
11960 digest[2] -= SHA1M_C;
11961 digest[3] -= SHA1M_D;
11962 digest[4] -= SHA1M_E;
11963
11964 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11965
11966 uint salt_len = input_len - 40 - 1;
11967
11968 char *salt_buf = input_buf + 40 + 1;
11969
11970 char *salt_buf_ptr = (char *) salt->salt_buf;
11971
11972 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11973
11974 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11975
11976 salt->salt_len = salt_len;
11977
11978 return (PARSER_OK);
11979 }
11980
11981 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11982 {
11983 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11984
11985 u32 *digest = (u32 *) hash_buf->digest;
11986
11987 salt_t *salt = hash_buf->salt;
11988
11989 char *hash_pos = input_buf;
11990
11991 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11992 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11993 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11994 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11995 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
11996 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
11997 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
11998 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
11999 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12000 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12001 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12002 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12003 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12004 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12005 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12006 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12007
12008 char *salt_pos = input_buf + 128;
12009
12010 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12011 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12012 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12013 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12014
12015 salt->salt_iter = ROUNDS_ORACLET - 1;
12016 salt->salt_len = 16;
12017
12018 return (PARSER_OK);
12019 }
12020
12021 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12022 {
12023 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12024
12025 u32 *digest = (u32 *) hash_buf->digest;
12026
12027 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12028 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12029 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12030 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12031 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12032 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12033 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12034 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12035
12036 digest[0] -= SHA256M_A;
12037 digest[1] -= SHA256M_B;
12038 digest[2] -= SHA256M_C;
12039 digest[3] -= SHA256M_D;
12040 digest[4] -= SHA256M_E;
12041 digest[5] -= SHA256M_F;
12042 digest[6] -= SHA256M_G;
12043 digest[7] -= SHA256M_H;
12044
12045 return (PARSER_OK);
12046 }
12047
12048 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12049 {
12050 if (data.opts_type & OPTS_TYPE_ST_HEX)
12051 {
12052 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12053 }
12054 else
12055 {
12056 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
12057 }
12058
12059 u32 *digest = (u32 *) hash_buf->digest;
12060
12061 salt_t *salt = hash_buf->salt;
12062
12063 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12064 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12065 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12066 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12067 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12068 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12069 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12070 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12071
12072 digest[0] -= SHA256M_A;
12073 digest[1] -= SHA256M_B;
12074 digest[2] -= SHA256M_C;
12075 digest[3] -= SHA256M_D;
12076 digest[4] -= SHA256M_E;
12077 digest[5] -= SHA256M_F;
12078 digest[6] -= SHA256M_G;
12079 digest[7] -= SHA256M_H;
12080
12081 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12082
12083 uint salt_len = input_len - 64 - 1;
12084
12085 char *salt_buf = input_buf + 64 + 1;
12086
12087 char *salt_buf_ptr = (char *) salt->salt_buf;
12088
12089 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12090
12091 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12092
12093 salt->salt_len = salt_len;
12094
12095 return (PARSER_OK);
12096 }
12097
12098 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12099 {
12100 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12101
12102 u64 *digest = (u64 *) hash_buf->digest;
12103
12104 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12105 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12106 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12107 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12108 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12109 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12110 digest[6] = 0;
12111 digest[7] = 0;
12112
12113 digest[0] -= SHA384M_A;
12114 digest[1] -= SHA384M_B;
12115 digest[2] -= SHA384M_C;
12116 digest[3] -= SHA384M_D;
12117 digest[4] -= SHA384M_E;
12118 digest[5] -= SHA384M_F;
12119 digest[6] -= 0;
12120 digest[7] -= 0;
12121
12122 return (PARSER_OK);
12123 }
12124
12125 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12126 {
12127 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12128
12129 u64 *digest = (u64 *) hash_buf->digest;
12130
12131 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12132 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12133 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12134 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12135 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12136 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12137 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12138 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12139
12140 digest[0] -= SHA512M_A;
12141 digest[1] -= SHA512M_B;
12142 digest[2] -= SHA512M_C;
12143 digest[3] -= SHA512M_D;
12144 digest[4] -= SHA512M_E;
12145 digest[5] -= SHA512M_F;
12146 digest[6] -= SHA512M_G;
12147 digest[7] -= SHA512M_H;
12148
12149 return (PARSER_OK);
12150 }
12151
12152 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12153 {
12154 if (data.opts_type & OPTS_TYPE_ST_HEX)
12155 {
12156 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12157 }
12158 else
12159 {
12160 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12161 }
12162
12163 u64 *digest = (u64 *) hash_buf->digest;
12164
12165 salt_t *salt = hash_buf->salt;
12166
12167 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12168 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12169 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12170 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12171 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12172 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12173 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12174 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12175
12176 digest[0] -= SHA512M_A;
12177 digest[1] -= SHA512M_B;
12178 digest[2] -= SHA512M_C;
12179 digest[3] -= SHA512M_D;
12180 digest[4] -= SHA512M_E;
12181 digest[5] -= SHA512M_F;
12182 digest[6] -= SHA512M_G;
12183 digest[7] -= SHA512M_H;
12184
12185 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12186
12187 uint salt_len = input_len - 128 - 1;
12188
12189 char *salt_buf = input_buf + 128 + 1;
12190
12191 char *salt_buf_ptr = (char *) salt->salt_buf;
12192
12193 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12194
12195 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12196
12197 salt->salt_len = salt_len;
12198
12199 return (PARSER_OK);
12200 }
12201
12202 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12203 {
12204 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12205
12206 u64 *digest = (u64 *) hash_buf->digest;
12207
12208 salt_t *salt = hash_buf->salt;
12209
12210 char *salt_pos = input_buf + 3;
12211
12212 uint iterations_len = 0;
12213
12214 if (memcmp (salt_pos, "rounds=", 7) == 0)
12215 {
12216 salt_pos += 7;
12217
12218 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12219
12220 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12221 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12222
12223 salt_pos[0] = 0x0;
12224
12225 salt->salt_iter = atoi (salt_pos - iterations_len);
12226
12227 salt_pos += 1;
12228
12229 iterations_len += 8;
12230 }
12231 else
12232 {
12233 salt->salt_iter = ROUNDS_SHA512CRYPT;
12234 }
12235
12236 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12237
12238 char *hash_pos = strchr (salt_pos, '$');
12239
12240 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12241
12242 uint salt_len = hash_pos - salt_pos;
12243
12244 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12245
12246 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12247
12248 salt->salt_len = salt_len;
12249
12250 hash_pos++;
12251
12252 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12253
12254 return (PARSER_OK);
12255 }
12256
12257 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12258 {
12259 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12260
12261 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12262
12263 u64 *digest = (u64 *) hash_buf->digest;
12264
12265 salt_t *salt = hash_buf->salt;
12266
12267 uint keccak_mdlen = input_len / 2;
12268
12269 for (uint i = 0; i < keccak_mdlen / 8; i++)
12270 {
12271 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12272
12273 digest[i] = byte_swap_64 (digest[i]);
12274 }
12275
12276 salt->keccak_mdlen = keccak_mdlen;
12277
12278 return (PARSER_OK);
12279 }
12280
12281 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12282 {
12283 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12284
12285 u32 *digest = (u32 *) hash_buf->digest;
12286
12287 salt_t *salt = hash_buf->salt;
12288
12289 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12290
12291 /**
12292 * Parse that strange long line
12293 */
12294
12295 char *in_off[9];
12296
12297 size_t in_len[9] = { 0 };
12298
12299 in_off[0] = strtok (input_buf, ":");
12300
12301 in_len[0] = strlen (in_off[0]);
12302
12303 size_t i;
12304
12305 for (i = 1; i < 9; i++)
12306 {
12307 in_off[i] = strtok (NULL, ":");
12308
12309 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12310
12311 in_len[i] = strlen (in_off[i]);
12312 }
12313
12314 char *ptr = (char *) ikepsk->msg_buf;
12315
12316 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12317 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12318 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12319 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12320 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12321 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12322
12323 *ptr = 0x80;
12324
12325 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12326
12327 ptr = (char *) ikepsk->nr_buf;
12328
12329 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12330 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12331
12332 *ptr = 0x80;
12333
12334 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12335
12336 /**
12337 * Store to database
12338 */
12339
12340 ptr = in_off[8];
12341
12342 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12343 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12344 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12345 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12346
12347 digest[0] = byte_swap_32 (digest[0]);
12348 digest[1] = byte_swap_32 (digest[1]);
12349 digest[2] = byte_swap_32 (digest[2]);
12350 digest[3] = byte_swap_32 (digest[3]);
12351
12352 salt->salt_len = 32;
12353
12354 salt->salt_buf[0] = ikepsk->nr_buf[0];
12355 salt->salt_buf[1] = ikepsk->nr_buf[1];
12356 salt->salt_buf[2] = ikepsk->nr_buf[2];
12357 salt->salt_buf[3] = ikepsk->nr_buf[3];
12358 salt->salt_buf[4] = ikepsk->nr_buf[4];
12359 salt->salt_buf[5] = ikepsk->nr_buf[5];
12360 salt->salt_buf[6] = ikepsk->nr_buf[6];
12361 salt->salt_buf[7] = ikepsk->nr_buf[7];
12362
12363 return (PARSER_OK);
12364 }
12365
12366 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12367 {
12368 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12369
12370 u32 *digest = (u32 *) hash_buf->digest;
12371
12372 salt_t *salt = hash_buf->salt;
12373
12374 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12375
12376 /**
12377 * Parse that strange long line
12378 */
12379
12380 char *in_off[9];
12381
12382 size_t in_len[9] = { 0 };
12383
12384 in_off[0] = strtok (input_buf, ":");
12385
12386 in_len[0] = strlen (in_off[0]);
12387
12388 size_t i;
12389
12390 for (i = 1; i < 9; i++)
12391 {
12392 in_off[i] = strtok (NULL, ":");
12393
12394 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12395
12396 in_len[i] = strlen (in_off[i]);
12397 }
12398
12399 char *ptr = (char *) ikepsk->msg_buf;
12400
12401 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12402 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12403 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12404 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12405 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12406 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12407
12408 *ptr = 0x80;
12409
12410 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12411
12412 ptr = (char *) ikepsk->nr_buf;
12413
12414 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12415 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12416
12417 *ptr = 0x80;
12418
12419 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12420
12421 /**
12422 * Store to database
12423 */
12424
12425 ptr = in_off[8];
12426
12427 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12428 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12429 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12430 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12431 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12432
12433 salt->salt_len = 32;
12434
12435 salt->salt_buf[0] = ikepsk->nr_buf[0];
12436 salt->salt_buf[1] = ikepsk->nr_buf[1];
12437 salt->salt_buf[2] = ikepsk->nr_buf[2];
12438 salt->salt_buf[3] = ikepsk->nr_buf[3];
12439 salt->salt_buf[4] = ikepsk->nr_buf[4];
12440 salt->salt_buf[5] = ikepsk->nr_buf[5];
12441 salt->salt_buf[6] = ikepsk->nr_buf[6];
12442 salt->salt_buf[7] = ikepsk->nr_buf[7];
12443
12444 return (PARSER_OK);
12445 }
12446
12447 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12448 {
12449 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12450
12451 u32 *digest = (u32 *) hash_buf->digest;
12452
12453 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12454 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12455 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12456 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12457 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12458
12459 digest[0] = byte_swap_32 (digest[0]);
12460 digest[1] = byte_swap_32 (digest[1]);
12461 digest[2] = byte_swap_32 (digest[2]);
12462 digest[3] = byte_swap_32 (digest[3]);
12463 digest[4] = byte_swap_32 (digest[4]);
12464
12465 return (PARSER_OK);
12466 }
12467
12468 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12469 {
12470 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12471
12472 u32 *digest = (u32 *) hash_buf->digest;
12473
12474 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12475 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12476 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12477 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12478 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12479 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12480 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12481 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12482 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12483 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12484 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12485 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12486 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12487 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12488 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12489 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12490
12491 return (PARSER_OK);
12492 }
12493
12494 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12495 {
12496 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12497
12498 u32 *digest = (u32 *) hash_buf->digest;
12499
12500 salt_t *salt = hash_buf->salt;
12501
12502 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12503 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12504 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12505 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12506 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12507
12508 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12509
12510 uint salt_len = input_len - 40 - 1;
12511
12512 char *salt_buf = input_buf + 40 + 1;
12513
12514 char *salt_buf_ptr = (char *) salt->salt_buf;
12515
12516 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12517
12518 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12519
12520 salt->salt_len = salt_len;
12521
12522 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12523
12524 return (PARSER_OK);
12525 }
12526
12527 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12528 {
12529 u32 *digest = (u32 *) hash_buf->digest;
12530
12531 salt_t *salt = hash_buf->salt;
12532
12533 tc_t *tc = (tc_t *) hash_buf->esalt;
12534
12535 if (input_len == 0)
12536 {
12537 log_error ("TrueCrypt container not specified");
12538
12539 exit (-1);
12540 }
12541
12542 FILE *fp = fopen (input_buf, "rb");
12543
12544 if (fp == NULL)
12545 {
12546 log_error ("%s: %s", input_buf, strerror (errno));
12547
12548 exit (-1);
12549 }
12550
12551 char buf[512] = { 0 };
12552
12553 int n = fread (buf, 1, sizeof (buf), fp);
12554
12555 fclose (fp);
12556
12557 if (n != 512) return (PARSER_TC_FILE_SIZE);
12558
12559 memcpy (tc->salt_buf, buf, 64);
12560
12561 memcpy (tc->data_buf, buf + 64, 512 - 64);
12562
12563 salt->salt_buf[0] = tc->salt_buf[0];
12564
12565 salt->salt_len = 4;
12566
12567 salt->salt_iter = 1000 - 1;
12568
12569 digest[0] = tc->data_buf[0];
12570
12571 return (PARSER_OK);
12572 }
12573
12574 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12575 {
12576 u32 *digest = (u32 *) hash_buf->digest;
12577
12578 salt_t *salt = hash_buf->salt;
12579
12580 tc_t *tc = (tc_t *) hash_buf->esalt;
12581
12582 if (input_len == 0)
12583 {
12584 log_error ("TrueCrypt container not specified");
12585
12586 exit (-1);
12587 }
12588
12589 FILE *fp = fopen (input_buf, "rb");
12590
12591 if (fp == NULL)
12592 {
12593 log_error ("%s: %s", input_buf, strerror (errno));
12594
12595 exit (-1);
12596 }
12597
12598 char buf[512] = { 0 };
12599
12600 int n = fread (buf, 1, sizeof (buf), fp);
12601
12602 fclose (fp);
12603
12604 if (n != 512) return (PARSER_TC_FILE_SIZE);
12605
12606 memcpy (tc->salt_buf, buf, 64);
12607
12608 memcpy (tc->data_buf, buf + 64, 512 - 64);
12609
12610 salt->salt_buf[0] = tc->salt_buf[0];
12611
12612 salt->salt_len = 4;
12613
12614 salt->salt_iter = 2000 - 1;
12615
12616 digest[0] = tc->data_buf[0];
12617
12618 return (PARSER_OK);
12619 }
12620
12621 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12622 {
12623 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12624
12625 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12626
12627 u32 *digest = (u32 *) hash_buf->digest;
12628
12629 salt_t *salt = hash_buf->salt;
12630
12631 char *salt_pos = input_buf + 6;
12632
12633 char *hash_pos = strchr (salt_pos, '$');
12634
12635 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12636
12637 uint salt_len = hash_pos - salt_pos;
12638
12639 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12640
12641 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12642
12643 salt->salt_len = salt_len;
12644
12645 salt->salt_iter = 1000;
12646
12647 hash_pos++;
12648
12649 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12650
12651 return (PARSER_OK);
12652 }
12653
12654 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12655 {
12656 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12657
12658 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12659
12660 u32 *digest = (u32 *) hash_buf->digest;
12661
12662 salt_t *salt = hash_buf->salt;
12663
12664 char *iter_pos = input_buf + 7;
12665
12666 char *salt_pos = strchr (iter_pos, '$');
12667
12668 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12669
12670 salt_pos++;
12671
12672 char *hash_pos = strchr (salt_pos, '$');
12673
12674 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12675
12676 uint salt_len = hash_pos - salt_pos;
12677
12678 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12679
12680 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12681
12682 salt->salt_len = salt_len;
12683
12684 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12685
12686 salt->salt_sign[0] = atoi (salt_iter);
12687
12688 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12689
12690 hash_pos++;
12691
12692 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12693
12694 digest[0] = byte_swap_32 (digest[0]);
12695 digest[1] = byte_swap_32 (digest[1]);
12696 digest[2] = byte_swap_32 (digest[2]);
12697 digest[3] = byte_swap_32 (digest[3]);
12698 digest[4] = byte_swap_32 (digest[4]);
12699
12700 return (PARSER_OK);
12701 }
12702
12703 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12704 {
12705 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12706
12707 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12708
12709 u32 *digest = (u32 *) hash_buf->digest;
12710
12711 salt_t *salt = hash_buf->salt;
12712
12713 char *iter_pos = input_buf + 9;
12714
12715 char *salt_pos = strchr (iter_pos, '$');
12716
12717 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12718
12719 salt_pos++;
12720
12721 char *hash_pos = strchr (salt_pos, '$');
12722
12723 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12724
12725 uint salt_len = hash_pos - salt_pos;
12726
12727 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12728
12729 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12730
12731 salt->salt_len = salt_len;
12732
12733 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12734
12735 salt->salt_sign[0] = atoi (salt_iter);
12736
12737 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12738
12739 hash_pos++;
12740
12741 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12742
12743 digest[0] = byte_swap_32 (digest[0]);
12744 digest[1] = byte_swap_32 (digest[1]);
12745 digest[2] = byte_swap_32 (digest[2]);
12746 digest[3] = byte_swap_32 (digest[3]);
12747 digest[4] = byte_swap_32 (digest[4]);
12748 digest[5] = byte_swap_32 (digest[5]);
12749 digest[6] = byte_swap_32 (digest[6]);
12750 digest[7] = byte_swap_32 (digest[7]);
12751
12752 return (PARSER_OK);
12753 }
12754
12755 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12756 {
12757 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12758
12759 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12760
12761 u64 *digest = (u64 *) hash_buf->digest;
12762
12763 salt_t *salt = hash_buf->salt;
12764
12765 char *iter_pos = input_buf + 9;
12766
12767 char *salt_pos = strchr (iter_pos, '$');
12768
12769 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12770
12771 salt_pos++;
12772
12773 char *hash_pos = strchr (salt_pos, '$');
12774
12775 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12776
12777 uint salt_len = hash_pos - salt_pos;
12778
12779 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12780
12781 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12782
12783 salt->salt_len = salt_len;
12784
12785 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12786
12787 salt->salt_sign[0] = atoi (salt_iter);
12788
12789 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12790
12791 hash_pos++;
12792
12793 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12794
12795 digest[0] = byte_swap_64 (digest[0]);
12796 digest[1] = byte_swap_64 (digest[1]);
12797 digest[2] = byte_swap_64 (digest[2]);
12798 digest[3] = byte_swap_64 (digest[3]);
12799 digest[4] = byte_swap_64 (digest[4]);
12800 digest[5] = byte_swap_64 (digest[5]);
12801 digest[6] = byte_swap_64 (digest[6]);
12802 digest[7] = byte_swap_64 (digest[7]);
12803
12804 return (PARSER_OK);
12805 }
12806
12807 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12808 {
12809 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12810
12811 u32 *digest = (u32 *) hash_buf->digest;
12812
12813 salt_t *salt = hash_buf->salt;
12814
12815 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12816
12817 /**
12818 * parse line
12819 */
12820
12821 char *iterations_pos = input_buf;
12822
12823 char *saltbuf_pos = strchr (iterations_pos, ':');
12824
12825 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12826
12827 uint iterations_len = saltbuf_pos - iterations_pos;
12828
12829 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12830
12831 saltbuf_pos++;
12832
12833 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12834
12835 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12836
12837 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12838
12839 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12840
12841 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12842
12843 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12844
12845 cipherbuf_pos++;
12846
12847 /**
12848 * pbkdf2 iterations
12849 */
12850
12851 salt->salt_iter = atoi (iterations_pos) - 1;
12852
12853 /**
12854 * handle salt encoding
12855 */
12856
12857 char *saltbuf_ptr = (char *) salt->salt_buf;
12858
12859 for (uint i = 0; i < saltbuf_len; i += 2)
12860 {
12861 const char p0 = saltbuf_pos[i + 0];
12862 const char p1 = saltbuf_pos[i + 1];
12863
12864 *saltbuf_ptr++ = hex_convert (p1) << 0
12865 | hex_convert (p0) << 4;
12866 }
12867
12868 salt->salt_len = saltbuf_len / 2;
12869
12870 /**
12871 * handle cipher encoding
12872 */
12873
12874 uint *tmp = (uint *) mymalloc (32);
12875
12876 char *cipherbuf_ptr = (char *) tmp;
12877
12878 for (uint i = 2016; i < cipherbuf_len; i += 2)
12879 {
12880 const char p0 = cipherbuf_pos[i + 0];
12881 const char p1 = cipherbuf_pos[i + 1];
12882
12883 *cipherbuf_ptr++ = hex_convert (p1) << 0
12884 | hex_convert (p0) << 4;
12885 }
12886
12887 // iv is stored at salt_buf 4 (length 16)
12888 // data is stored at salt_buf 8 (length 16)
12889
12890 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12891 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12892 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12893 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12894
12895 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12896 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12897 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12898 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12899
12900 free (tmp);
12901
12902 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12903 {
12904 const char p0 = cipherbuf_pos[j + 0];
12905 const char p1 = cipherbuf_pos[j + 1];
12906
12907 agilekey->cipher[i] = hex_convert (p1) << 0
12908 | hex_convert (p0) << 4;
12909 }
12910
12911 /**
12912 * digest buf
12913 */
12914
12915 digest[0] = 0x10101010;
12916 digest[1] = 0x10101010;
12917 digest[2] = 0x10101010;
12918 digest[3] = 0x10101010;
12919
12920 return (PARSER_OK);
12921 }
12922
12923 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12924 {
12925 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12926
12927 u32 *digest = (u32 *) hash_buf->digest;
12928
12929 salt_t *salt = hash_buf->salt;
12930
12931 char *hashbuf_pos = input_buf;
12932
12933 char *iterations_pos = strchr (hashbuf_pos, ':');
12934
12935 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12936
12937 uint hash_len = iterations_pos - hashbuf_pos;
12938
12939 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12940
12941 iterations_pos++;
12942
12943 char *saltbuf_pos = strchr (iterations_pos, ':');
12944
12945 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12946
12947 uint iterations_len = saltbuf_pos - iterations_pos;
12948
12949 saltbuf_pos++;
12950
12951 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12952
12953 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12954
12955 char *salt_buf_ptr = (char *) salt->salt_buf;
12956
12957 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12958
12959 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12960
12961 salt->salt_len = salt_len;
12962
12963 salt->salt_iter = atoi (iterations_pos) - 1;
12964
12965 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12966 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12967 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12968 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12969
12970 return (PARSER_OK);
12971 }
12972
12973 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12974 {
12975 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12976
12977 u32 *digest = (u32 *) hash_buf->digest;
12978
12979 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12980 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12981 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12982 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12983 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12984 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12985 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12986 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12987
12988 digest[0] = byte_swap_32 (digest[0]);
12989 digest[1] = byte_swap_32 (digest[1]);
12990 digest[2] = byte_swap_32 (digest[2]);
12991 digest[3] = byte_swap_32 (digest[3]);
12992 digest[4] = byte_swap_32 (digest[4]);
12993 digest[5] = byte_swap_32 (digest[5]);
12994 digest[6] = byte_swap_32 (digest[6]);
12995 digest[7] = byte_swap_32 (digest[7]);
12996
12997 return (PARSER_OK);
12998 }
12999
13000 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13001 {
13002 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13003
13004 u32 *digest = (u32 *) hash_buf->digest;
13005
13006 salt_t *salt = hash_buf->salt;
13007
13008 char *salt_pos = input_buf + 3;
13009
13010 uint iterations_len = 0;
13011
13012 if (memcmp (salt_pos, "rounds=", 7) == 0)
13013 {
13014 salt_pos += 7;
13015
13016 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13017
13018 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13019 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13020
13021 salt_pos[0] = 0x0;
13022
13023 salt->salt_iter = atoi (salt_pos - iterations_len);
13024
13025 salt_pos += 1;
13026
13027 iterations_len += 8;
13028 }
13029 else
13030 {
13031 salt->salt_iter = ROUNDS_SHA256CRYPT;
13032 }
13033
13034 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13035
13036 char *hash_pos = strchr (salt_pos, '$');
13037
13038 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13039
13040 uint salt_len = hash_pos - salt_pos;
13041
13042 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13043
13044 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13045
13046 salt->salt_len = salt_len;
13047
13048 hash_pos++;
13049
13050 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13051
13052 return (PARSER_OK);
13053 }
13054
13055 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13056 {
13057 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13058
13059 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13060
13061 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13062
13063 u64 *digest = (u64 *) hash_buf->digest;
13064
13065 salt_t *salt = hash_buf->salt;
13066
13067 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13068
13069 char *iter_pos = input_buf + 4;
13070
13071 char *salt_pos = strchr (iter_pos, '$');
13072
13073 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13074
13075 salt_pos++;
13076
13077 char *hash_pos = strchr (salt_pos, '$');
13078
13079 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13080
13081 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13082
13083 hash_pos++;
13084
13085 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13086 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13087 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13088 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13089 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13090 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13091 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13092 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13093
13094 uint salt_len = hash_pos - salt_pos - 1;
13095
13096 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13097
13098 salt->salt_len = salt_len / 2;
13099
13100 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13101 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13102 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13103 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13104 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13105 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13106 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13107 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13108
13109 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13110 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13111 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13112 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13113 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13114 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13115 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13116 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13117 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13118 pbkdf2_sha512->salt_buf[9] = 0x80;
13119
13120 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13121
13122 salt->salt_iter = atoi (iter_pos) - 1;
13123
13124 return (PARSER_OK);
13125 }
13126
13127 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13128 {
13129 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13130
13131 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13132
13133 u32 *digest = (u32 *) hash_buf->digest;
13134
13135 salt_t *salt = hash_buf->salt;
13136
13137 char *salt_pos = input_buf + 14;
13138
13139 char *hash_pos = strchr (salt_pos, '*');
13140
13141 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13142
13143 hash_pos++;
13144
13145 uint salt_len = hash_pos - salt_pos - 1;
13146
13147 char *salt_buf_ptr = (char *) salt->salt_buf;
13148
13149 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13150
13151 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13152
13153 salt->salt_len = salt_len;
13154
13155 u8 tmp_buf[100] = { 0 };
13156
13157 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13158
13159 memcpy (digest, tmp_buf, 32);
13160
13161 digest[0] = byte_swap_32 (digest[0]);
13162 digest[1] = byte_swap_32 (digest[1]);
13163 digest[2] = byte_swap_32 (digest[2]);
13164 digest[3] = byte_swap_32 (digest[3]);
13165 digest[4] = byte_swap_32 (digest[4]);
13166 digest[5] = byte_swap_32 (digest[5]);
13167 digest[6] = byte_swap_32 (digest[6]);
13168 digest[7] = byte_swap_32 (digest[7]);
13169
13170 digest[0] -= SHA256M_A;
13171 digest[1] -= SHA256M_B;
13172 digest[2] -= SHA256M_C;
13173 digest[3] -= SHA256M_D;
13174 digest[4] -= SHA256M_E;
13175 digest[5] -= SHA256M_F;
13176 digest[6] -= SHA256M_G;
13177 digest[7] -= SHA256M_H;
13178
13179 return (PARSER_OK);
13180 }
13181
13182 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13183 {
13184 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13185
13186 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13187
13188 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13189
13190 u64 *digest = (u64 *) hash_buf->digest;
13191
13192 salt_t *salt = hash_buf->salt;
13193
13194 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13195
13196 char *iter_pos = input_buf + 19;
13197
13198 char *salt_pos = strchr (iter_pos, '.');
13199
13200 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13201
13202 salt_pos++;
13203
13204 char *hash_pos = strchr (salt_pos, '.');
13205
13206 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13207
13208 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13209
13210 hash_pos++;
13211
13212 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13213 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13214 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13215 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13216 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13217 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13218 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13219 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13220
13221 uint salt_len = hash_pos - salt_pos - 1;
13222
13223 salt_len /= 2;
13224
13225 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13226
13227 uint i;
13228
13229 for (i = 0; i < salt_len; i++)
13230 {
13231 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13232 }
13233
13234 salt_buf_ptr[salt_len + 3] = 0x01;
13235 salt_buf_ptr[salt_len + 4] = 0x80;
13236
13237 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13238
13239 salt->salt_len = salt_len;
13240
13241 salt->salt_iter = atoi (iter_pos) - 1;
13242
13243 return (PARSER_OK);
13244 }
13245
13246 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13247 {
13248 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13249
13250 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13251
13252 u64 *digest = (u64 *) hash_buf->digest;
13253
13254 salt_t *salt = hash_buf->salt;
13255
13256 u8 tmp_buf[120] = { 0 };
13257
13258 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13259
13260 memcpy (digest, tmp_buf, 64);
13261
13262 digest[0] = byte_swap_64 (digest[0]);
13263 digest[1] = byte_swap_64 (digest[1]);
13264 digest[2] = byte_swap_64 (digest[2]);
13265 digest[3] = byte_swap_64 (digest[3]);
13266 digest[4] = byte_swap_64 (digest[4]);
13267 digest[5] = byte_swap_64 (digest[5]);
13268 digest[6] = byte_swap_64 (digest[6]);
13269 digest[7] = byte_swap_64 (digest[7]);
13270
13271 digest[0] -= SHA512M_A;
13272 digest[1] -= SHA512M_B;
13273 digest[2] -= SHA512M_C;
13274 digest[3] -= SHA512M_D;
13275 digest[4] -= SHA512M_E;
13276 digest[5] -= SHA512M_F;
13277 digest[6] -= SHA512M_G;
13278 digest[7] -= SHA512M_H;
13279
13280 salt->salt_len = tmp_len - 64;
13281
13282 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13283
13284 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13285 {
13286 char *ptr = (char *) salt->salt_buf;
13287
13288 ptr[salt->salt_len] = 0x80;
13289 }
13290
13291 return (PARSER_OK);
13292 }
13293
13294 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13295 {
13296 if (data.opts_type & OPTS_TYPE_ST_HEX)
13297 {
13298 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13299 }
13300 else
13301 {
13302 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13303 }
13304
13305 u32 *digest = (u32 *) hash_buf->digest;
13306
13307 salt_t *salt = hash_buf->salt;
13308
13309 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13310 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13311 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13312 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13313
13314 digest[0] = byte_swap_32 (digest[0]);
13315 digest[1] = byte_swap_32 (digest[1]);
13316 digest[2] = byte_swap_32 (digest[2]);
13317 digest[3] = byte_swap_32 (digest[3]);
13318
13319 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13320
13321 uint salt_len = input_len - 32 - 1;
13322
13323 char *salt_buf = input_buf + 32 + 1;
13324
13325 char *salt_buf_ptr = (char *) salt->salt_buf;
13326
13327 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13328
13329 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13330
13331 salt->salt_len = salt_len;
13332
13333 return (PARSER_OK);
13334 }
13335
13336 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13337 {
13338 if (data.opts_type & OPTS_TYPE_ST_HEX)
13339 {
13340 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13341 }
13342 else
13343 {
13344 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13345 }
13346
13347 u32 *digest = (u32 *) hash_buf->digest;
13348
13349 salt_t *salt = hash_buf->salt;
13350
13351 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13352 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13353 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13354 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13355 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13356
13357 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13358
13359 uint salt_len = input_len - 40 - 1;
13360
13361 char *salt_buf = input_buf + 40 + 1;
13362
13363 char *salt_buf_ptr = (char *) salt->salt_buf;
13364
13365 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13366
13367 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13368
13369 salt->salt_len = salt_len;
13370
13371 return (PARSER_OK);
13372 }
13373
13374 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13375 {
13376 if (data.opts_type & OPTS_TYPE_ST_HEX)
13377 {
13378 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13379 }
13380 else
13381 {
13382 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13383 }
13384
13385 u32 *digest = (u32 *) hash_buf->digest;
13386
13387 salt_t *salt = hash_buf->salt;
13388
13389 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13390 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13391 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13392 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13393 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13394 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13395 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13396 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13397
13398 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13399
13400 uint salt_len = input_len - 64 - 1;
13401
13402 char *salt_buf = input_buf + 64 + 1;
13403
13404 char *salt_buf_ptr = (char *) salt->salt_buf;
13405
13406 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13407
13408 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13409
13410 salt->salt_len = salt_len;
13411
13412 return (PARSER_OK);
13413 }
13414
13415 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13416 {
13417 if (data.opts_type & OPTS_TYPE_ST_HEX)
13418 {
13419 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13420 }
13421 else
13422 {
13423 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13424 }
13425
13426 u64 *digest = (u64 *) hash_buf->digest;
13427
13428 salt_t *salt = hash_buf->salt;
13429
13430 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13431 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13432 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13433 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13434 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13435 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13436 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13437 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13438
13439 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13440
13441 uint salt_len = input_len - 128 - 1;
13442
13443 char *salt_buf = input_buf + 128 + 1;
13444
13445 char *salt_buf_ptr = (char *) salt->salt_buf;
13446
13447 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13448
13449 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13450
13451 salt->salt_len = salt_len;
13452
13453 return (PARSER_OK);
13454 }
13455
13456 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13457 {
13458 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13459
13460 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13461
13462 u32 *digest = (u32 *) hash_buf->digest;
13463
13464 salt_t *salt = hash_buf->salt;
13465
13466 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13467
13468 /**
13469 * parse line
13470 */
13471
13472 char *user_pos = input_buf + 10 + 1;
13473
13474 char *realm_pos = strchr (user_pos, '$');
13475
13476 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13477
13478 uint user_len = realm_pos - user_pos;
13479
13480 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13481
13482 realm_pos++;
13483
13484 char *salt_pos = strchr (realm_pos, '$');
13485
13486 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13487
13488 uint realm_len = salt_pos - realm_pos;
13489
13490 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13491
13492 salt_pos++;
13493
13494 char *data_pos = strchr (salt_pos, '$');
13495
13496 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13497
13498 uint salt_len = data_pos - salt_pos;
13499
13500 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13501
13502 data_pos++;
13503
13504 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13505
13506 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13507
13508 /**
13509 * copy data
13510 */
13511
13512 memcpy (krb5pa->user, user_pos, user_len);
13513 memcpy (krb5pa->realm, realm_pos, realm_len);
13514 memcpy (krb5pa->salt, salt_pos, salt_len);
13515
13516 char *timestamp_ptr = (char *) krb5pa->timestamp;
13517
13518 for (uint i = 0; i < (36 * 2); i += 2)
13519 {
13520 const char p0 = data_pos[i + 0];
13521 const char p1 = data_pos[i + 1];
13522
13523 *timestamp_ptr++ = hex_convert (p1) << 0
13524 | hex_convert (p0) << 4;
13525 }
13526
13527 char *checksum_ptr = (char *) krb5pa->checksum;
13528
13529 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13530 {
13531 const char p0 = data_pos[i + 0];
13532 const char p1 = data_pos[i + 1];
13533
13534 *checksum_ptr++ = hex_convert (p1) << 0
13535 | hex_convert (p0) << 4;
13536 }
13537
13538 /**
13539 * copy some data to generic buffers to make sorting happy
13540 */
13541
13542 salt->salt_buf[0] = krb5pa->timestamp[0];
13543 salt->salt_buf[1] = krb5pa->timestamp[1];
13544 salt->salt_buf[2] = krb5pa->timestamp[2];
13545 salt->salt_buf[3] = krb5pa->timestamp[3];
13546 salt->salt_buf[4] = krb5pa->timestamp[4];
13547 salt->salt_buf[5] = krb5pa->timestamp[5];
13548 salt->salt_buf[6] = krb5pa->timestamp[6];
13549 salt->salt_buf[7] = krb5pa->timestamp[7];
13550 salt->salt_buf[8] = krb5pa->timestamp[8];
13551
13552 salt->salt_len = 36;
13553
13554 digest[0] = krb5pa->checksum[0];
13555 digest[1] = krb5pa->checksum[1];
13556 digest[2] = krb5pa->checksum[2];
13557 digest[3] = krb5pa->checksum[3];
13558
13559 return (PARSER_OK);
13560 }
13561
13562 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13563 {
13564 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13565
13566 u32 *digest = (u32 *) hash_buf->digest;
13567
13568 salt_t *salt = hash_buf->salt;
13569
13570 /**
13571 * parse line
13572 */
13573
13574 char *salt_pos = input_buf;
13575
13576 char *hash_pos = strchr (salt_pos, '$');
13577
13578 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13579
13580 uint salt_len = hash_pos - salt_pos;
13581
13582 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13583
13584 hash_pos++;
13585
13586 uint hash_len = input_len - 1 - salt_len;
13587
13588 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13589
13590 /**
13591 * valid some data
13592 */
13593
13594 uint user_len = 0;
13595
13596 for (uint i = 0; i < salt_len; i++)
13597 {
13598 if (salt_pos[i] == ' ') continue;
13599
13600 user_len++;
13601 }
13602
13603 // SAP user names cannot be longer than 12 characters
13604 if (user_len > 12) return (PARSER_SALT_LENGTH);
13605
13606 // SAP user name cannot start with ! or ?
13607 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13608
13609 /**
13610 * copy data
13611 */
13612
13613 char *salt_buf_ptr = (char *) salt->salt_buf;
13614
13615 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13616
13617 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13618
13619 salt->salt_len = salt_len;
13620
13621 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13622 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13623 digest[2] = 0;
13624 digest[3] = 0;
13625
13626 digest[0] = byte_swap_32 (digest[0]);
13627 digest[1] = byte_swap_32 (digest[1]);
13628
13629 return (PARSER_OK);
13630 }
13631
13632 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13633 {
13634 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13635
13636 u32 *digest = (u32 *) hash_buf->digest;
13637
13638 salt_t *salt = hash_buf->salt;
13639
13640 /**
13641 * parse line
13642 */
13643
13644 char *salt_pos = input_buf;
13645
13646 char *hash_pos = strchr (salt_pos, '$');
13647
13648 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13649
13650 uint salt_len = hash_pos - salt_pos;
13651
13652 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13653
13654 hash_pos++;
13655
13656 uint hash_len = input_len - 1 - salt_len;
13657
13658 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13659
13660 /**
13661 * valid some data
13662 */
13663
13664 uint user_len = 0;
13665
13666 for (uint i = 0; i < salt_len; i++)
13667 {
13668 if (salt_pos[i] == ' ') continue;
13669
13670 user_len++;
13671 }
13672
13673 // SAP user names cannot be longer than 12 characters
13674 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13675 // so far nobody complained so we stay with this because it helps in optimization
13676 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13677
13678 if (user_len > 12) return (PARSER_SALT_LENGTH);
13679
13680 // SAP user name cannot start with ! or ?
13681 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13682
13683 /**
13684 * copy data
13685 */
13686
13687 char *salt_buf_ptr = (char *) salt->salt_buf;
13688
13689 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13690
13691 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13692
13693 salt->salt_len = salt_len;
13694
13695 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13696 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13697 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13698 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13699 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13700
13701 return (PARSER_OK);
13702 }
13703
13704 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13705 {
13706 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13707
13708 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13709
13710 u64 *digest = (u64 *) hash_buf->digest;
13711
13712 salt_t *salt = hash_buf->salt;
13713
13714 char *iter_pos = input_buf + 3;
13715
13716 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13717
13718 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13719
13720 memcpy ((char *) salt->salt_sign, input_buf, 4);
13721
13722 salt->salt_iter = salt_iter;
13723
13724 char *salt_pos = iter_pos + 1;
13725
13726 uint salt_len = 8;
13727
13728 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13729
13730 salt->salt_len = salt_len;
13731
13732 char *hash_pos = salt_pos + salt_len;
13733
13734 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13735
13736 // ugly hack start
13737
13738 char *tmp = (char *) salt->salt_buf_pc;
13739
13740 tmp[0] = hash_pos[42];
13741
13742 // ugly hack end
13743
13744 digest[ 0] = byte_swap_64 (digest[ 0]);
13745 digest[ 1] = byte_swap_64 (digest[ 1]);
13746 digest[ 2] = byte_swap_64 (digest[ 2]);
13747 digest[ 3] = byte_swap_64 (digest[ 3]);
13748 digest[ 4] = 0;
13749 digest[ 5] = 0;
13750 digest[ 6] = 0;
13751 digest[ 7] = 0;
13752
13753 return (PARSER_OK);
13754 }
13755
13756 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13757 {
13758 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13759
13760 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13761
13762 u32 *digest = (u32 *) hash_buf->digest;
13763
13764 salt_t *salt = hash_buf->salt;
13765
13766 char *salt_buf = input_buf + 6;
13767
13768 uint salt_len = 16;
13769
13770 char *salt_buf_ptr = (char *) salt->salt_buf;
13771
13772 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13773
13774 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13775
13776 salt->salt_len = salt_len;
13777
13778 char *hash_pos = input_buf + 6 + 16;
13779
13780 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13781 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13782 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13783 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13784 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13785 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13786 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13787 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13788
13789 return (PARSER_OK);
13790 }
13791
13792 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13793 {
13794 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13795
13796 u32 *digest = (u32 *) hash_buf->digest;
13797
13798 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13799 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13800 digest[2] = 0;
13801 digest[3] = 0;
13802
13803 return (PARSER_OK);
13804 }
13805
13806 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13807 {
13808 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13809
13810 u32 *digest = (u32 *) hash_buf->digest;
13811
13812 salt_t *salt = hash_buf->salt;
13813
13814 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13815
13816 char *saltbuf_pos = input_buf;
13817
13818 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13819
13820 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13821
13822 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13823
13824 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13825 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13826
13827 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13828
13829 hashbuf_pos++;
13830
13831 uint hashbuf_len = input_len - saltbuf_len - 1;
13832
13833 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13834
13835 char *salt_ptr = (char *) saltbuf_pos;
13836 char *rakp_ptr = (char *) rakp->salt_buf;
13837
13838 uint i;
13839 uint j;
13840
13841 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13842 {
13843 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13844 }
13845
13846 rakp_ptr[j] = 0x80;
13847
13848 rakp->salt_len = j;
13849
13850 for (i = 0; i < 64; i++)
13851 {
13852 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13853 }
13854
13855 salt->salt_buf[0] = rakp->salt_buf[0];
13856 salt->salt_buf[1] = rakp->salt_buf[1];
13857 salt->salt_buf[2] = rakp->salt_buf[2];
13858 salt->salt_buf[3] = rakp->salt_buf[3];
13859 salt->salt_buf[4] = rakp->salt_buf[4];
13860 salt->salt_buf[5] = rakp->salt_buf[5];
13861 salt->salt_buf[6] = rakp->salt_buf[6];
13862 salt->salt_buf[7] = rakp->salt_buf[7];
13863
13864 salt->salt_len = 32; // muss min. 32 haben
13865
13866 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13867 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13868 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13869 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13870 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13871
13872 return (PARSER_OK);
13873 }
13874
13875 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13876 {
13877 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13878
13879 u32 *digest = (u32 *) hash_buf->digest;
13880
13881 salt_t *salt = hash_buf->salt;
13882
13883 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13884
13885 char *salt_pos = input_buf + 1;
13886
13887 memcpy (salt->salt_buf, salt_pos, 8);
13888
13889 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13890 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13891
13892 salt->salt_len = 8;
13893
13894 char *hash_pos = salt_pos + 8;
13895
13896 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13897 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13898 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13899 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13900 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13901
13902 digest[0] -= SHA1M_A;
13903 digest[1] -= SHA1M_B;
13904 digest[2] -= SHA1M_C;
13905 digest[3] -= SHA1M_D;
13906 digest[4] -= SHA1M_E;
13907
13908 return (PARSER_OK);
13909 }
13910
13911 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13912 {
13913 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13914
13915 u32 *digest = (u32 *) hash_buf->digest;
13916
13917 salt_t *salt = hash_buf->salt;
13918
13919 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13920 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13921 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13922 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13923
13924 digest[0] = byte_swap_32 (digest[0]);
13925 digest[1] = byte_swap_32 (digest[1]);
13926 digest[2] = byte_swap_32 (digest[2]);
13927 digest[3] = byte_swap_32 (digest[3]);
13928
13929 digest[0] -= MD5M_A;
13930 digest[1] -= MD5M_B;
13931 digest[2] -= MD5M_C;
13932 digest[3] -= MD5M_D;
13933
13934 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13935
13936 char *salt_buf_ptr = input_buf + 32 + 1;
13937
13938 u32 *salt_buf = salt->salt_buf;
13939
13940 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13941 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13942 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13943 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13944
13945 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13946 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13947 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13948 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13949
13950 salt->salt_len = 16 + 1;
13951
13952 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13953
13954 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13955
13956 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13957
13958 return (PARSER_OK);
13959 }
13960
13961 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13962 {
13963 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13964
13965 u32 *digest = (u32 *) hash_buf->digest;
13966
13967 salt_t *salt = hash_buf->salt;
13968
13969 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13970
13971 /**
13972 * parse line
13973 */
13974
13975 char *hashbuf_pos = input_buf;
13976
13977 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13978
13979 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13980
13981 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13982
13983 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13984
13985 saltbuf_pos++;
13986
13987 char *iteration_pos = strchr (saltbuf_pos, ':');
13988
13989 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13990
13991 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13992
13993 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13994
13995 iteration_pos++;
13996
13997 char *databuf_pos = strchr (iteration_pos, ':');
13998
13999 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14000
14001 const uint iteration_len = databuf_pos - iteration_pos;
14002
14003 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14004 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14005
14006 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14007
14008 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14009 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14010
14011 databuf_pos++;
14012
14013 // digest
14014
14015 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14016 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14017 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14018 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14019 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14020 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14021 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14022 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14023
14024 // salt
14025
14026 char *saltbuf_ptr = (char *) salt->salt_buf;
14027
14028 for (uint i = 0; i < saltbuf_len; i += 2)
14029 {
14030 const char p0 = saltbuf_pos[i + 0];
14031 const char p1 = saltbuf_pos[i + 1];
14032
14033 *saltbuf_ptr++ = hex_convert (p1) << 0
14034 | hex_convert (p0) << 4;
14035 }
14036
14037 salt->salt_buf[4] = 0x01000000;
14038 salt->salt_buf[5] = 0x80;
14039
14040 salt->salt_len = saltbuf_len / 2;
14041
14042 // iteration
14043
14044 salt->salt_iter = atoi (iteration_pos) - 1;
14045
14046 // data
14047
14048 char *databuf_ptr = (char *) cloudkey->data_buf;
14049
14050 for (uint i = 0; i < databuf_len; i += 2)
14051 {
14052 const char p0 = databuf_pos[i + 0];
14053 const char p1 = databuf_pos[i + 1];
14054
14055 *databuf_ptr++ = hex_convert (p1) << 0
14056 | hex_convert (p0) << 4;
14057 }
14058
14059 *databuf_ptr++ = 0x80;
14060
14061 for (uint i = 0; i < 512; i++)
14062 {
14063 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14064 }
14065
14066 cloudkey->data_len = databuf_len / 2;
14067
14068 return (PARSER_OK);
14069 }
14070
14071 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14072 {
14073 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14074
14075 u32 *digest = (u32 *) hash_buf->digest;
14076
14077 salt_t *salt = hash_buf->salt;
14078
14079 /**
14080 * parse line
14081 */
14082
14083 char *hashbuf_pos = input_buf;
14084
14085 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14086
14087 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14088
14089 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14090
14091 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14092
14093 domainbuf_pos++;
14094
14095 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14096
14097 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14098
14099 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14100
14101 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14102
14103 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14104
14105 saltbuf_pos++;
14106
14107 char *iteration_pos = strchr (saltbuf_pos, ':');
14108
14109 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14110
14111 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14112
14113 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14114
14115 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14116
14117 iteration_pos++;
14118
14119 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14120
14121 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14122 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14123
14124 // ok, the plan for this algorithm is the following:
14125 // we have 2 salts here, the domain-name and a random salt
14126 // while both are used in the initial transformation,
14127 // only the random salt is used in the following iterations
14128 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14129 // and one that includes only the real salt (stored into salt_buf[]).
14130 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14131
14132 u8 tmp_buf[100] = { 0 };
14133
14134 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14135
14136 memcpy (digest, tmp_buf, 20);
14137
14138 digest[0] = byte_swap_32 (digest[0]);
14139 digest[1] = byte_swap_32 (digest[1]);
14140 digest[2] = byte_swap_32 (digest[2]);
14141 digest[3] = byte_swap_32 (digest[3]);
14142 digest[4] = byte_swap_32 (digest[4]);
14143
14144 // domain
14145
14146 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14147
14148 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14149
14150 char *len_ptr = NULL;
14151
14152 for (uint i = 0; i < domainbuf_len; i++)
14153 {
14154 if (salt_buf_pc_ptr[i] == '.')
14155 {
14156 len_ptr = &salt_buf_pc_ptr[i];
14157
14158 *len_ptr = 0;
14159 }
14160 else
14161 {
14162 *len_ptr += 1;
14163 }
14164 }
14165
14166 salt->salt_buf_pc[7] = domainbuf_len;
14167
14168 // "real" salt
14169
14170 char *salt_buf_ptr = (char *) salt->salt_buf;
14171
14172 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14173
14174 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14175
14176 salt->salt_len = salt_len;
14177
14178 // iteration
14179
14180 salt->salt_iter = atoi (iteration_pos);
14181
14182 return (PARSER_OK);
14183 }
14184
14185 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14186 {
14187 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14188
14189 u32 *digest = (u32 *) hash_buf->digest;
14190
14191 salt_t *salt = hash_buf->salt;
14192
14193 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14194 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14195 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14196 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14197 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14198
14199 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14200
14201 uint salt_len = input_len - 40 - 1;
14202
14203 char *salt_buf = input_buf + 40 + 1;
14204
14205 char *salt_buf_ptr = (char *) salt->salt_buf;
14206
14207 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14208
14209 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14210
14211 salt->salt_len = salt_len;
14212
14213 return (PARSER_OK);
14214 }
14215
14216 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14217 {
14218 const u8 ascii_to_ebcdic[] =
14219 {
14220 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14221 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14222 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14223 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14224 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14225 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14226 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14227 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14228 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14229 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14230 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14231 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14232 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14233 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14234 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14235 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14236 };
14237
14238 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14239
14240 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14241
14242 u32 *digest = (u32 *) hash_buf->digest;
14243
14244 salt_t *salt = hash_buf->salt;
14245
14246 char *salt_pos = input_buf + 6 + 1;
14247
14248 char *digest_pos = strchr (salt_pos, '*');
14249
14250 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14251
14252 uint salt_len = digest_pos - salt_pos;
14253
14254 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14255
14256 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14257
14258 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14259
14260 digest_pos++;
14261
14262 char *salt_buf_ptr = (char *) salt->salt_buf;
14263 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14264
14265 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14266
14267 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14268
14269 salt->salt_len = salt_len;
14270
14271 for (uint i = 0; i < salt_len; i++)
14272 {
14273 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14274 }
14275 for (uint i = salt_len; i < 8; i++)
14276 {
14277 salt_buf_pc_ptr[i] = 0x40;
14278 }
14279
14280 uint tt;
14281
14282 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14283
14284 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14285 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14286
14287 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14288 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14289
14290 digest[0] = byte_swap_32 (digest[0]);
14291 digest[1] = byte_swap_32 (digest[1]);
14292
14293 IP (digest[0], digest[1], tt);
14294
14295 digest[0] = rotr32 (digest[0], 29);
14296 digest[1] = rotr32 (digest[1], 29);
14297 digest[2] = 0;
14298 digest[3] = 0;
14299
14300 return (PARSER_OK);
14301 }
14302
14303 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14304 {
14305 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14306
14307 u32 *digest = (u32 *) hash_buf->digest;
14308
14309 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14310 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14311 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14312 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14313
14314 digest[0] = byte_swap_32 (digest[0]);
14315 digest[1] = byte_swap_32 (digest[1]);
14316 digest[2] = byte_swap_32 (digest[2]);
14317 digest[3] = byte_swap_32 (digest[3]);
14318
14319 return (PARSER_OK);
14320 }
14321
14322 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14323 {
14324 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14325
14326 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14327
14328 u32 *digest = (u32 *) hash_buf->digest;
14329
14330 salt_t *salt = hash_buf->salt;
14331
14332 u8 tmp_buf[120] = { 0 };
14333
14334 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14335
14336 tmp_buf[3] += -4; // dont ask!
14337
14338 memcpy (salt->salt_buf, tmp_buf, 5);
14339
14340 salt->salt_len = 5;
14341
14342 memcpy (digest, tmp_buf + 5, 9);
14343
14344 // yes, only 9 byte are needed to crack, but 10 to display
14345
14346 salt->salt_buf_pc[7] = input_buf[20];
14347
14348 return (PARSER_OK);
14349 }
14350
14351 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14352 {
14353 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14354
14355 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14356
14357 u32 *digest = (u32 *) hash_buf->digest;
14358
14359 salt_t *salt = hash_buf->salt;
14360
14361 u8 tmp_buf[120] = { 0 };
14362
14363 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14364
14365 tmp_buf[3] += -4; // dont ask!
14366
14367 // salt
14368
14369 memcpy (salt->salt_buf, tmp_buf, 16);
14370
14371 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)
14372
14373 // iteration
14374
14375 char tmp_iter_buf[11] = { 0 };
14376
14377 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14378
14379 tmp_iter_buf[10] = 0;
14380
14381 salt->salt_iter = atoi (tmp_iter_buf);
14382
14383 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14384 {
14385 return (PARSER_SALT_ITERATION);
14386 }
14387
14388 salt->salt_iter--; // first round in init
14389
14390 // 2 additional bytes for display only
14391
14392 salt->salt_buf_pc[0] = tmp_buf[26];
14393 salt->salt_buf_pc[1] = tmp_buf[27];
14394
14395 // digest
14396
14397 memcpy (digest, tmp_buf + 28, 8);
14398
14399 digest[0] = byte_swap_32 (digest[0]);
14400 digest[1] = byte_swap_32 (digest[1]);
14401 digest[2] = 0;
14402 digest[3] = 0;
14403
14404 return (PARSER_OK);
14405 }
14406
14407 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14408 {
14409 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14410
14411 u32 *digest = (u32 *) hash_buf->digest;
14412
14413 salt_t *salt = hash_buf->salt;
14414
14415 char *salt_buf_pos = input_buf;
14416
14417 char *hash_buf_pos = salt_buf_pos + 6;
14418
14419 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14420 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14421 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14422 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14423 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14424 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14425 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14426 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14427
14428 digest[0] -= SHA256M_A;
14429 digest[1] -= SHA256M_B;
14430 digest[2] -= SHA256M_C;
14431 digest[3] -= SHA256M_D;
14432 digest[4] -= SHA256M_E;
14433 digest[5] -= SHA256M_F;
14434 digest[6] -= SHA256M_G;
14435 digest[7] -= SHA256M_H;
14436
14437 char *salt_buf_ptr = (char *) salt->salt_buf;
14438
14439 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14440
14441 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14442
14443 salt->salt_len = salt_len;
14444
14445 return (PARSER_OK);
14446 }
14447
14448 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14449 {
14450 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14451
14452 u32 *digest = (u32 *) hash_buf->digest;
14453
14454 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14455
14456 salt_t *salt = hash_buf->salt;
14457
14458 char *salt_buf = input_buf + 6;
14459
14460 char *digest_buf = strchr (salt_buf, '$');
14461
14462 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14463
14464 uint salt_len = digest_buf - salt_buf;
14465
14466 digest_buf++; // skip the '$' symbol
14467
14468 char *salt_buf_ptr = (char *) salt->salt_buf;
14469
14470 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14471
14472 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14473
14474 salt->salt_len = salt_len;
14475
14476 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14477 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14478 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14479 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14480
14481 digest[0] = byte_swap_32 (digest[0]);
14482 digest[1] = byte_swap_32 (digest[1]);
14483 digest[2] = byte_swap_32 (digest[2]);
14484 digest[3] = byte_swap_32 (digest[3]);
14485
14486 digest[0] -= MD5M_A;
14487 digest[1] -= MD5M_B;
14488 digest[2] -= MD5M_C;
14489 digest[3] -= MD5M_D;
14490
14491 return (PARSER_OK);
14492 }
14493
14494 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14495 {
14496 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14497
14498 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14499
14500 u32 *digest = (u32 *) hash_buf->digest;
14501
14502 salt_t *salt = hash_buf->salt;
14503
14504 char *salt_buf = input_buf + 3;
14505
14506 char *digest_buf = strchr (salt_buf, '$');
14507
14508 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14509
14510 uint salt_len = digest_buf - salt_buf;
14511
14512 digest_buf++; // skip the '$' symbol
14513
14514 char *salt_buf_ptr = (char *) salt->salt_buf;
14515
14516 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14517
14518 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14519
14520 salt_buf_ptr[salt_len] = 0x2d;
14521
14522 salt->salt_len = salt_len + 1;
14523
14524 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14525 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14526 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14527 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14528
14529 digest[0] = byte_swap_32 (digest[0]);
14530 digest[1] = byte_swap_32 (digest[1]);
14531 digest[2] = byte_swap_32 (digest[2]);
14532 digest[3] = byte_swap_32 (digest[3]);
14533
14534 digest[0] -= MD5M_A;
14535 digest[1] -= MD5M_B;
14536 digest[2] -= MD5M_C;
14537 digest[3] -= MD5M_D;
14538
14539 return (PARSER_OK);
14540 }
14541
14542 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14543 {
14544 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14545
14546 u32 *digest = (u32 *) hash_buf->digest;
14547
14548 u8 tmp_buf[100] = { 0 };
14549
14550 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14551
14552 memcpy (digest, tmp_buf, 20);
14553
14554 digest[0] = byte_swap_32 (digest[0]);
14555 digest[1] = byte_swap_32 (digest[1]);
14556 digest[2] = byte_swap_32 (digest[2]);
14557 digest[3] = byte_swap_32 (digest[3]);
14558 digest[4] = byte_swap_32 (digest[4]);
14559
14560 digest[0] -= SHA1M_A;
14561 digest[1] -= SHA1M_B;
14562 digest[2] -= SHA1M_C;
14563 digest[3] -= SHA1M_D;
14564 digest[4] -= SHA1M_E;
14565
14566 return (PARSER_OK);
14567 }
14568
14569 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14570 {
14571 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14572
14573 u32 *digest = (u32 *) hash_buf->digest;
14574
14575 salt_t *salt = hash_buf->salt;
14576
14577 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14578 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14579 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14580 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14581
14582 digest[0] = byte_swap_32 (digest[0]);
14583 digest[1] = byte_swap_32 (digest[1]);
14584 digest[2] = byte_swap_32 (digest[2]);
14585 digest[3] = byte_swap_32 (digest[3]);
14586
14587 digest[0] -= MD5M_A;
14588 digest[1] -= MD5M_B;
14589 digest[2] -= MD5M_C;
14590 digest[3] -= MD5M_D;
14591
14592 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14593
14594 uint salt_len = input_len - 32 - 1;
14595
14596 char *salt_buf = input_buf + 32 + 1;
14597
14598 char *salt_buf_ptr = (char *) salt->salt_buf;
14599
14600 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14601
14602 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14603
14604 /*
14605 * add static "salt" part
14606 */
14607
14608 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14609
14610 salt_len += 8;
14611
14612 salt->salt_len = salt_len;
14613
14614 return (PARSER_OK);
14615 }
14616
14617 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14618 {
14619 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14620
14621 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14622
14623 u32 *digest = (u32 *) hash_buf->digest;
14624
14625 salt_t *salt = hash_buf->salt;
14626
14627 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14628
14629 /**
14630 * parse line
14631 */
14632
14633 char *saltlen_pos = input_buf + 1 + 3 + 1;
14634
14635 char *saltbuf_pos = strchr (saltlen_pos, '$');
14636
14637 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14638
14639 uint saltlen_len = saltbuf_pos - saltlen_pos;
14640
14641 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14642
14643 saltbuf_pos++;
14644
14645 char *keylen_pos = strchr (saltbuf_pos, '$');
14646
14647 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14648
14649 uint saltbuf_len = keylen_pos - saltbuf_pos;
14650
14651 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14652
14653 keylen_pos++;
14654
14655 char *keybuf_pos = strchr (keylen_pos, '$');
14656
14657 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14658
14659 uint keylen_len = keybuf_pos - keylen_pos;
14660
14661 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14662
14663 keybuf_pos++;
14664
14665 char *databuf_pos = strchr (keybuf_pos, '$');
14666
14667 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14668
14669 uint keybuf_len = databuf_pos - keybuf_pos;
14670
14671 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14672
14673 databuf_pos++;
14674
14675 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14676
14677 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14678
14679 /**
14680 * copy data
14681 */
14682
14683 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14684 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14685 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14686 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14687
14688 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14689 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14690 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14691 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14692
14693 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14694 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14695 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14696 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14697
14698 salt->salt_len = 16;
14699 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14700
14701 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14702 {
14703 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14704 }
14705
14706 return (PARSER_OK);
14707 }
14708
14709 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14710 {
14711 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14712
14713 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14714
14715 u32 *digest = (u32 *) hash_buf->digest;
14716
14717 salt_t *salt = hash_buf->salt;
14718
14719 /**
14720 * parse line
14721 */
14722
14723 // first is the N salt parameter
14724
14725 char *N_pos = input_buf + 6;
14726
14727 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14728
14729 N_pos++;
14730
14731 salt->scrypt_N = atoi (N_pos);
14732
14733 // r
14734
14735 char *r_pos = strchr (N_pos, ':');
14736
14737 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14738
14739 r_pos++;
14740
14741 salt->scrypt_r = atoi (r_pos);
14742
14743 // p
14744
14745 char *p_pos = strchr (r_pos, ':');
14746
14747 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14748
14749 p_pos++;
14750
14751 salt->scrypt_p = atoi (p_pos);
14752
14753 // salt
14754
14755 char *saltbuf_pos = strchr (p_pos, ':');
14756
14757 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14758
14759 saltbuf_pos++;
14760
14761 char *hash_pos = strchr (saltbuf_pos, ':');
14762
14763 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14764
14765 hash_pos++;
14766
14767 // base64 decode
14768
14769 u8 tmp_buf[33] = { 0 };
14770
14771 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14772
14773 char *salt_buf_ptr = (char *) salt->salt_buf;
14774
14775 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14776
14777 salt->salt_len = tmp_len;
14778 salt->salt_iter = 1;
14779
14780 // digest - base64 decode
14781
14782 memset (tmp_buf, 0, sizeof (tmp_buf));
14783
14784 tmp_len = input_len - (hash_pos - input_buf);
14785
14786 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14787
14788 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14789
14790 memcpy (digest, tmp_buf, 32);
14791
14792 return (PARSER_OK);
14793 }
14794
14795 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14796 {
14797 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14798
14799 u32 *digest = (u32 *) hash_buf->digest;
14800
14801 salt_t *salt = hash_buf->salt;
14802
14803 /**
14804 * parse line
14805 */
14806
14807 char decrypted[76] = { 0 }; // iv + hash
14808
14809 juniper_decrypt_hash (input_buf, decrypted);
14810
14811 char *md5crypt_hash = decrypted + 12;
14812
14813 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14814
14815 salt->salt_iter = ROUNDS_MD5CRYPT;
14816
14817 char *salt_pos = md5crypt_hash + 3;
14818
14819 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14820
14821 salt->salt_len = hash_pos - salt_pos; // should be 8
14822
14823 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14824
14825 hash_pos++;
14826
14827 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14828
14829 return (PARSER_OK);
14830 }
14831
14832 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14833 {
14834 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14835
14836 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14837
14838 u32 *digest = (u32 *) hash_buf->digest;
14839
14840 salt_t *salt = hash_buf->salt;
14841
14842 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14843
14844 /**
14845 * parse line
14846 */
14847
14848 // first is *raw* salt
14849
14850 char *salt_pos = input_buf + 3;
14851
14852 char *hash_pos = strchr (salt_pos, '$');
14853
14854 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14855
14856 uint salt_len = hash_pos - salt_pos;
14857
14858 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14859
14860 hash_pos++;
14861
14862 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14863
14864 memcpy (salt_buf_ptr, salt_pos, 14);
14865
14866 salt_buf_ptr[17] = 0x01;
14867 salt_buf_ptr[18] = 0x80;
14868
14869 // add some stuff to normal salt to make sorted happy
14870
14871 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14872 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14873 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14874 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14875
14876 salt->salt_len = salt_len;
14877 salt->salt_iter = ROUNDS_CISCO8 - 1;
14878
14879 // base64 decode hash
14880
14881 u8 tmp_buf[100] = { 0 };
14882
14883 uint hash_len = input_len - 3 - salt_len - 1;
14884
14885 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14886
14887 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14888
14889 memcpy (digest, tmp_buf, 32);
14890
14891 digest[0] = byte_swap_32 (digest[0]);
14892 digest[1] = byte_swap_32 (digest[1]);
14893 digest[2] = byte_swap_32 (digest[2]);
14894 digest[3] = byte_swap_32 (digest[3]);
14895 digest[4] = byte_swap_32 (digest[4]);
14896 digest[5] = byte_swap_32 (digest[5]);
14897 digest[6] = byte_swap_32 (digest[6]);
14898 digest[7] = byte_swap_32 (digest[7]);
14899
14900 return (PARSER_OK);
14901 }
14902
14903 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14904 {
14905 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14906
14907 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14908
14909 u32 *digest = (u32 *) hash_buf->digest;
14910
14911 salt_t *salt = hash_buf->salt;
14912
14913 /**
14914 * parse line
14915 */
14916
14917 // first is *raw* salt
14918
14919 char *salt_pos = input_buf + 3;
14920
14921 char *hash_pos = strchr (salt_pos, '$');
14922
14923 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14924
14925 uint salt_len = hash_pos - salt_pos;
14926
14927 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14928
14929 salt->salt_len = salt_len;
14930 hash_pos++;
14931
14932 char *salt_buf_ptr = (char *) salt->salt_buf;
14933
14934 memcpy (salt_buf_ptr, salt_pos, salt_len);
14935 salt_buf_ptr[salt_len] = 0;
14936
14937 // base64 decode hash
14938
14939 u8 tmp_buf[100] = { 0 };
14940
14941 uint hash_len = input_len - 3 - salt_len - 1;
14942
14943 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14944
14945 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14946
14947 memcpy (digest, tmp_buf, 32);
14948
14949 // fixed:
14950 salt->scrypt_N = 16384;
14951 salt->scrypt_r = 1;
14952 salt->scrypt_p = 1;
14953 salt->salt_iter = 1;
14954
14955 return (PARSER_OK);
14956 }
14957
14958 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14959 {
14960 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14961
14962 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14963
14964 u32 *digest = (u32 *) hash_buf->digest;
14965
14966 salt_t *salt = hash_buf->salt;
14967
14968 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14969
14970 /**
14971 * parse line
14972 */
14973
14974 char *version_pos = input_buf + 8 + 1;
14975
14976 char *verifierHashSize_pos = strchr (version_pos, '*');
14977
14978 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14979
14980 u32 version_len = verifierHashSize_pos - version_pos;
14981
14982 if (version_len != 4) return (PARSER_SALT_LENGTH);
14983
14984 verifierHashSize_pos++;
14985
14986 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14987
14988 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14989
14990 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14991
14992 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14993
14994 keySize_pos++;
14995
14996 char *saltSize_pos = strchr (keySize_pos, '*');
14997
14998 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14999
15000 u32 keySize_len = saltSize_pos - keySize_pos;
15001
15002 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15003
15004 saltSize_pos++;
15005
15006 char *osalt_pos = strchr (saltSize_pos, '*');
15007
15008 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15009
15010 u32 saltSize_len = osalt_pos - saltSize_pos;
15011
15012 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15013
15014 osalt_pos++;
15015
15016 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15017
15018 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15019
15020 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15021
15022 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15023
15024 encryptedVerifier_pos++;
15025
15026 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15027
15028 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15029
15030 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15031
15032 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15033
15034 encryptedVerifierHash_pos++;
15035
15036 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;
15037
15038 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15039
15040 const uint version = atoi (version_pos);
15041
15042 if (version != 2007) return (PARSER_SALT_VALUE);
15043
15044 const uint verifierHashSize = atoi (verifierHashSize_pos);
15045
15046 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15047
15048 const uint keySize = atoi (keySize_pos);
15049
15050 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15051
15052 office2007->keySize = keySize;
15053
15054 const uint saltSize = atoi (saltSize_pos);
15055
15056 if (saltSize != 16) return (PARSER_SALT_VALUE);
15057
15058 /**
15059 * salt
15060 */
15061
15062 salt->salt_len = 16;
15063 salt->salt_iter = ROUNDS_OFFICE2007;
15064
15065 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15066 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15067 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15068 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15069
15070 /**
15071 * esalt
15072 */
15073
15074 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15075 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15076 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15077 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15078
15079 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15080 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15081 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15082 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15083 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15084
15085 /**
15086 * digest
15087 */
15088
15089 digest[0] = office2007->encryptedVerifierHash[0];
15090 digest[1] = office2007->encryptedVerifierHash[1];
15091 digest[2] = office2007->encryptedVerifierHash[2];
15092 digest[3] = office2007->encryptedVerifierHash[3];
15093
15094 return (PARSER_OK);
15095 }
15096
15097 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15098 {
15099 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15100
15101 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15102
15103 u32 *digest = (u32 *) hash_buf->digest;
15104
15105 salt_t *salt = hash_buf->salt;
15106
15107 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15108
15109 /**
15110 * parse line
15111 */
15112
15113 char *version_pos = input_buf + 8 + 1;
15114
15115 char *spinCount_pos = strchr (version_pos, '*');
15116
15117 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15118
15119 u32 version_len = spinCount_pos - version_pos;
15120
15121 if (version_len != 4) return (PARSER_SALT_LENGTH);
15122
15123 spinCount_pos++;
15124
15125 char *keySize_pos = strchr (spinCount_pos, '*');
15126
15127 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15128
15129 u32 spinCount_len = keySize_pos - spinCount_pos;
15130
15131 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15132
15133 keySize_pos++;
15134
15135 char *saltSize_pos = strchr (keySize_pos, '*');
15136
15137 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15138
15139 u32 keySize_len = saltSize_pos - keySize_pos;
15140
15141 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15142
15143 saltSize_pos++;
15144
15145 char *osalt_pos = strchr (saltSize_pos, '*');
15146
15147 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15148
15149 u32 saltSize_len = osalt_pos - saltSize_pos;
15150
15151 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15152
15153 osalt_pos++;
15154
15155 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15156
15157 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15158
15159 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15160
15161 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15162
15163 encryptedVerifier_pos++;
15164
15165 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15166
15167 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15168
15169 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15170
15171 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15172
15173 encryptedVerifierHash_pos++;
15174
15175 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;
15176
15177 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15178
15179 const uint version = atoi (version_pos);
15180
15181 if (version != 2010) return (PARSER_SALT_VALUE);
15182
15183 const uint spinCount = atoi (spinCount_pos);
15184
15185 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15186
15187 const uint keySize = atoi (keySize_pos);
15188
15189 if (keySize != 128) return (PARSER_SALT_VALUE);
15190
15191 const uint saltSize = atoi (saltSize_pos);
15192
15193 if (saltSize != 16) return (PARSER_SALT_VALUE);
15194
15195 /**
15196 * salt
15197 */
15198
15199 salt->salt_len = 16;
15200 salt->salt_iter = spinCount;
15201
15202 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15203 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15204 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15205 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15206
15207 /**
15208 * esalt
15209 */
15210
15211 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15212 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15213 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15214 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15215
15216 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15217 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15218 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15219 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15220 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15221 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15222 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15223 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15224
15225 /**
15226 * digest
15227 */
15228
15229 digest[0] = office2010->encryptedVerifierHash[0];
15230 digest[1] = office2010->encryptedVerifierHash[1];
15231 digest[2] = office2010->encryptedVerifierHash[2];
15232 digest[3] = office2010->encryptedVerifierHash[3];
15233
15234 return (PARSER_OK);
15235 }
15236
15237 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15238 {
15239 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15240
15241 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15242
15243 u32 *digest = (u32 *) hash_buf->digest;
15244
15245 salt_t *salt = hash_buf->salt;
15246
15247 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15248
15249 /**
15250 * parse line
15251 */
15252
15253 char *version_pos = input_buf + 8 + 1;
15254
15255 char *spinCount_pos = strchr (version_pos, '*');
15256
15257 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15258
15259 u32 version_len = spinCount_pos - version_pos;
15260
15261 if (version_len != 4) return (PARSER_SALT_LENGTH);
15262
15263 spinCount_pos++;
15264
15265 char *keySize_pos = strchr (spinCount_pos, '*');
15266
15267 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15268
15269 u32 spinCount_len = keySize_pos - spinCount_pos;
15270
15271 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15272
15273 keySize_pos++;
15274
15275 char *saltSize_pos = strchr (keySize_pos, '*');
15276
15277 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15278
15279 u32 keySize_len = saltSize_pos - keySize_pos;
15280
15281 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15282
15283 saltSize_pos++;
15284
15285 char *osalt_pos = strchr (saltSize_pos, '*');
15286
15287 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15288
15289 u32 saltSize_len = osalt_pos - saltSize_pos;
15290
15291 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15292
15293 osalt_pos++;
15294
15295 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15296
15297 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15298
15299 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15300
15301 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15302
15303 encryptedVerifier_pos++;
15304
15305 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15306
15307 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15308
15309 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15310
15311 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15312
15313 encryptedVerifierHash_pos++;
15314
15315 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;
15316
15317 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15318
15319 const uint version = atoi (version_pos);
15320
15321 if (version != 2013) return (PARSER_SALT_VALUE);
15322
15323 const uint spinCount = atoi (spinCount_pos);
15324
15325 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15326
15327 const uint keySize = atoi (keySize_pos);
15328
15329 if (keySize != 256) return (PARSER_SALT_VALUE);
15330
15331 const uint saltSize = atoi (saltSize_pos);
15332
15333 if (saltSize != 16) return (PARSER_SALT_VALUE);
15334
15335 /**
15336 * salt
15337 */
15338
15339 salt->salt_len = 16;
15340 salt->salt_iter = spinCount;
15341
15342 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15343 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15344 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15345 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15346
15347 /**
15348 * esalt
15349 */
15350
15351 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15352 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15353 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15354 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15355
15356 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15357 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15358 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15359 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15360 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15361 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15362 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15363 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15364
15365 /**
15366 * digest
15367 */
15368
15369 digest[0] = office2013->encryptedVerifierHash[0];
15370 digest[1] = office2013->encryptedVerifierHash[1];
15371 digest[2] = office2013->encryptedVerifierHash[2];
15372 digest[3] = office2013->encryptedVerifierHash[3];
15373
15374 return (PARSER_OK);
15375 }
15376
15377 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15378 {
15379 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15380
15381 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15382
15383 u32 *digest = (u32 *) hash_buf->digest;
15384
15385 salt_t *salt = hash_buf->salt;
15386
15387 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15388
15389 /**
15390 * parse line
15391 */
15392
15393 char *version_pos = input_buf + 11;
15394
15395 char *osalt_pos = strchr (version_pos, '*');
15396
15397 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15398
15399 u32 version_len = osalt_pos - version_pos;
15400
15401 if (version_len != 1) return (PARSER_SALT_LENGTH);
15402
15403 osalt_pos++;
15404
15405 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15406
15407 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15408
15409 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15410
15411 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15412
15413 encryptedVerifier_pos++;
15414
15415 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15416
15417 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15418
15419 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15420
15421 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15422
15423 encryptedVerifierHash_pos++;
15424
15425 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15426
15427 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15428
15429 const uint version = *version_pos - 0x30;
15430
15431 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15432
15433 /**
15434 * esalt
15435 */
15436
15437 oldoffice01->version = version;
15438
15439 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15440 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15441 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15442 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15443
15444 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15445 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15446 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15447 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15448
15449 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15450 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15451 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15452 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15453
15454 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15455 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15456 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15457 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15458
15459 /**
15460 * salt
15461 */
15462
15463 salt->salt_len = 16;
15464
15465 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15466 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15467 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15468 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15469
15470 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15471 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15472 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15473 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15474
15475 // this is a workaround as office produces multiple documents with the same salt
15476
15477 salt->salt_len += 32;
15478
15479 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15480 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15481 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15482 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15483 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15484 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15485 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15486 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15487
15488 /**
15489 * digest
15490 */
15491
15492 digest[0] = oldoffice01->encryptedVerifierHash[0];
15493 digest[1] = oldoffice01->encryptedVerifierHash[1];
15494 digest[2] = oldoffice01->encryptedVerifierHash[2];
15495 digest[3] = oldoffice01->encryptedVerifierHash[3];
15496
15497 return (PARSER_OK);
15498 }
15499
15500 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15501 {
15502 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15503 }
15504
15505 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15506 {
15507 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15508
15509 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15510
15511 u32 *digest = (u32 *) hash_buf->digest;
15512
15513 salt_t *salt = hash_buf->salt;
15514
15515 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15516
15517 /**
15518 * parse line
15519 */
15520
15521 char *version_pos = input_buf + 11;
15522
15523 char *osalt_pos = strchr (version_pos, '*');
15524
15525 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15526
15527 u32 version_len = osalt_pos - version_pos;
15528
15529 if (version_len != 1) return (PARSER_SALT_LENGTH);
15530
15531 osalt_pos++;
15532
15533 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15534
15535 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15536
15537 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15538
15539 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15540
15541 encryptedVerifier_pos++;
15542
15543 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15544
15545 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15546
15547 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15548
15549 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15550
15551 encryptedVerifierHash_pos++;
15552
15553 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15554
15555 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15556
15557 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15558
15559 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15560
15561 rc4key_pos++;
15562
15563 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15564
15565 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15566
15567 const uint version = *version_pos - 0x30;
15568
15569 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15570
15571 /**
15572 * esalt
15573 */
15574
15575 oldoffice01->version = version;
15576
15577 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15578 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15579 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15580 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15581
15582 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15583 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15584 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15585 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15586
15587 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15588 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15589 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15590 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15591
15592 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15593 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15594 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15595 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15596
15597 oldoffice01->rc4key[1] = 0;
15598 oldoffice01->rc4key[0] = 0;
15599
15600 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15601 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15602 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15603 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15604 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15605 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15606 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15607 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15608 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15609 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15610
15611 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15612 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15613
15614 /**
15615 * salt
15616 */
15617
15618 salt->salt_len = 16;
15619
15620 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15621 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15622 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15623 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15624
15625 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15626 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15627 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15628 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15629
15630 // this is a workaround as office produces multiple documents with the same salt
15631
15632 salt->salt_len += 32;
15633
15634 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15635 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15636 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15637 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15638 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15639 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15640 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15641 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15642
15643 /**
15644 * digest
15645 */
15646
15647 digest[0] = oldoffice01->rc4key[0];
15648 digest[1] = oldoffice01->rc4key[1];
15649 digest[2] = 0;
15650 digest[3] = 0;
15651
15652 return (PARSER_OK);
15653 }
15654
15655 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15656 {
15657 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15658
15659 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15660
15661 u32 *digest = (u32 *) hash_buf->digest;
15662
15663 salt_t *salt = hash_buf->salt;
15664
15665 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15666
15667 /**
15668 * parse line
15669 */
15670
15671 char *version_pos = input_buf + 11;
15672
15673 char *osalt_pos = strchr (version_pos, '*');
15674
15675 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15676
15677 u32 version_len = osalt_pos - version_pos;
15678
15679 if (version_len != 1) return (PARSER_SALT_LENGTH);
15680
15681 osalt_pos++;
15682
15683 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15684
15685 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15686
15687 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15688
15689 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15690
15691 encryptedVerifier_pos++;
15692
15693 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15694
15695 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15696
15697 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15698
15699 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15700
15701 encryptedVerifierHash_pos++;
15702
15703 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15704
15705 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15706
15707 const uint version = *version_pos - 0x30;
15708
15709 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15710
15711 /**
15712 * esalt
15713 */
15714
15715 oldoffice34->version = version;
15716
15717 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15718 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15719 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15720 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15721
15722 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15723 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15724 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15725 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15726
15727 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15728 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15729 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15730 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15731 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15732
15733 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15734 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15735 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15736 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15737 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15738
15739 /**
15740 * salt
15741 */
15742
15743 salt->salt_len = 16;
15744
15745 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15746 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15747 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15748 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15749
15750 // this is a workaround as office produces multiple documents with the same salt
15751
15752 salt->salt_len += 32;
15753
15754 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15755 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15756 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15757 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15758 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15759 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15760 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15761 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15762
15763 /**
15764 * digest
15765 */
15766
15767 digest[0] = oldoffice34->encryptedVerifierHash[0];
15768 digest[1] = oldoffice34->encryptedVerifierHash[1];
15769 digest[2] = oldoffice34->encryptedVerifierHash[2];
15770 digest[3] = oldoffice34->encryptedVerifierHash[3];
15771
15772 return (PARSER_OK);
15773 }
15774
15775 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15776 {
15777 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15778
15779 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15780 }
15781
15782 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15783 {
15784 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15785
15786 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15787
15788 u32 *digest = (u32 *) hash_buf->digest;
15789
15790 salt_t *salt = hash_buf->salt;
15791
15792 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15793
15794 /**
15795 * parse line
15796 */
15797
15798 char *version_pos = input_buf + 11;
15799
15800 char *osalt_pos = strchr (version_pos, '*');
15801
15802 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15803
15804 u32 version_len = osalt_pos - version_pos;
15805
15806 if (version_len != 1) return (PARSER_SALT_LENGTH);
15807
15808 osalt_pos++;
15809
15810 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15811
15812 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15813
15814 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15815
15816 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15817
15818 encryptedVerifier_pos++;
15819
15820 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15821
15822 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15823
15824 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15825
15826 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15827
15828 encryptedVerifierHash_pos++;
15829
15830 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15831
15832 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15833
15834 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15835
15836 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15837
15838 rc4key_pos++;
15839
15840 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15841
15842 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15843
15844 const uint version = *version_pos - 0x30;
15845
15846 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15847
15848 /**
15849 * esalt
15850 */
15851
15852 oldoffice34->version = version;
15853
15854 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15855 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15856 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15857 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15858
15859 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15860 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15861 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15862 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15863
15864 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15865 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15866 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15867 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15868 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15869
15870 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15871 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15872 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15873 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15874 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15875
15876 oldoffice34->rc4key[1] = 0;
15877 oldoffice34->rc4key[0] = 0;
15878
15879 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15880 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15881 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15882 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15883 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15884 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15885 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15886 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15887 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15888 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15889
15890 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15891 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15892
15893 /**
15894 * salt
15895 */
15896
15897 salt->salt_len = 16;
15898
15899 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15900 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15901 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15902 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15903
15904 // this is a workaround as office produces multiple documents with the same salt
15905
15906 salt->salt_len += 32;
15907
15908 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15909 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15910 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15911 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15912 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15913 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15914 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15915 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15916
15917 /**
15918 * digest
15919 */
15920
15921 digest[0] = oldoffice34->rc4key[0];
15922 digest[1] = oldoffice34->rc4key[1];
15923 digest[2] = 0;
15924 digest[3] = 0;
15925
15926 return (PARSER_OK);
15927 }
15928
15929 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15930 {
15931 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15932
15933 u32 *digest = (u32 *) hash_buf->digest;
15934
15935 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15936 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15937 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15938 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15939
15940 digest[0] = byte_swap_32 (digest[0]);
15941 digest[1] = byte_swap_32 (digest[1]);
15942 digest[2] = byte_swap_32 (digest[2]);
15943 digest[3] = byte_swap_32 (digest[3]);
15944
15945 return (PARSER_OK);
15946 }
15947
15948 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15949 {
15950 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15951
15952 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15953
15954 u32 *digest = (u32 *) hash_buf->digest;
15955
15956 salt_t *salt = hash_buf->salt;
15957
15958 char *signature_pos = input_buf;
15959
15960 char *salt_pos = strchr (signature_pos, '$');
15961
15962 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15963
15964 u32 signature_len = salt_pos - signature_pos;
15965
15966 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15967
15968 salt_pos++;
15969
15970 char *hash_pos = strchr (salt_pos, '$');
15971
15972 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15973
15974 u32 salt_len = hash_pos - salt_pos;
15975
15976 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15977
15978 hash_pos++;
15979
15980 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15981
15982 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15983
15984 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15985 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15986 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15987 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15988 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15989
15990 digest[0] -= SHA1M_A;
15991 digest[1] -= SHA1M_B;
15992 digest[2] -= SHA1M_C;
15993 digest[3] -= SHA1M_D;
15994 digest[4] -= SHA1M_E;
15995
15996 char *salt_buf_ptr = (char *) salt->salt_buf;
15997
15998 memcpy (salt_buf_ptr, salt_pos, salt_len);
15999
16000 salt->salt_len = salt_len;
16001
16002 return (PARSER_OK);
16003 }
16004
16005 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16006 {
16007 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16008
16009 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16010
16011 u32 *digest = (u32 *) hash_buf->digest;
16012
16013 salt_t *salt = hash_buf->salt;
16014
16015 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16016
16017 /**
16018 * parse line
16019 */
16020
16021 char *iter_pos = input_buf + 14;
16022
16023 const int iter = atoi (iter_pos);
16024
16025 if (iter < 1) return (PARSER_SALT_ITERATION);
16026
16027 salt->salt_iter = iter - 1;
16028
16029 char *salt_pos = strchr (iter_pos, '$');
16030
16031 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16032
16033 salt_pos++;
16034
16035 char *hash_pos = strchr (salt_pos, '$');
16036
16037 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16038
16039 const uint salt_len = hash_pos - salt_pos;
16040
16041 hash_pos++;
16042
16043 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16044
16045 memcpy (salt_buf_ptr, salt_pos, salt_len);
16046
16047 salt->salt_len = salt_len;
16048
16049 salt_buf_ptr[salt_len + 3] = 0x01;
16050 salt_buf_ptr[salt_len + 4] = 0x80;
16051
16052 // add some stuff to normal salt to make sorted happy
16053
16054 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16055 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16056 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16057 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16058 salt->salt_buf[4] = salt->salt_iter;
16059
16060 // base64 decode hash
16061
16062 u8 tmp_buf[100] = { 0 };
16063
16064 uint hash_len = input_len - (hash_pos - input_buf);
16065
16066 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16067
16068 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16069
16070 memcpy (digest, tmp_buf, 32);
16071
16072 digest[0] = byte_swap_32 (digest[0]);
16073 digest[1] = byte_swap_32 (digest[1]);
16074 digest[2] = byte_swap_32 (digest[2]);
16075 digest[3] = byte_swap_32 (digest[3]);
16076 digest[4] = byte_swap_32 (digest[4]);
16077 digest[5] = byte_swap_32 (digest[5]);
16078 digest[6] = byte_swap_32 (digest[6]);
16079 digest[7] = byte_swap_32 (digest[7]);
16080
16081 return (PARSER_OK);
16082 }
16083
16084 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16085 {
16086 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16087
16088 u32 *digest = (u32 *) hash_buf->digest;
16089
16090 salt_t *salt = hash_buf->salt;
16091
16092 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16093 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16094 digest[2] = 0;
16095 digest[3] = 0;
16096
16097 digest[0] = byte_swap_32 (digest[0]);
16098 digest[1] = byte_swap_32 (digest[1]);
16099
16100 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16101 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16102 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16103
16104 char iter_c = input_buf[17];
16105 char iter_d = input_buf[19];
16106
16107 // atm only defaults, let's see if there's more request
16108 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16109 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16110
16111 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16112
16113 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16114 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16115 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16116 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16117
16118 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16119 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16120 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16121 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16122
16123 salt->salt_len = 16;
16124
16125 return (PARSER_OK);
16126 }
16127
16128 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16129 {
16130 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16131
16132 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16133
16134 u32 *digest = (u32 *) hash_buf->digest;
16135
16136 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16137
16138 salt_t *salt = hash_buf->salt;
16139
16140 char *salt_pos = input_buf + 10;
16141
16142 char *hash_pos = strchr (salt_pos, '$');
16143
16144 uint salt_len = hash_pos - salt_pos;
16145
16146 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16147
16148 hash_pos++;
16149
16150 uint hash_len = input_len - 10 - salt_len - 1;
16151
16152 // base64 decode salt
16153
16154 u8 tmp_buf[100] = { 0 };
16155
16156 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16157
16158 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16159
16160 tmp_buf[salt_len] = 0x80;
16161
16162 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16163
16164 salt->salt_len = salt_len;
16165
16166 // base64 decode salt
16167
16168 memset (tmp_buf, 0, sizeof (tmp_buf));
16169
16170 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16171
16172 uint user_len = hash_len - 32;
16173
16174 const u8 *tmp_hash = tmp_buf + user_len;
16175
16176 user_len--; // skip the trailing space
16177
16178 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16179 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16180 digest[2] = hex_to_u32 (&tmp_hash[16]);
16181 digest[3] = hex_to_u32 (&tmp_hash[24]);
16182
16183 digest[0] = byte_swap_32 (digest[0]);
16184 digest[1] = byte_swap_32 (digest[1]);
16185 digest[2] = byte_swap_32 (digest[2]);
16186 digest[3] = byte_swap_32 (digest[3]);
16187
16188 // store username for host only (output hash if cracked)
16189
16190 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16191 memcpy (cram_md5->user, tmp_buf, user_len);
16192
16193 return (PARSER_OK);
16194 }
16195
16196 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16197 {
16198 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16199
16200 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16201
16202 u32 *digest = (u32 *) hash_buf->digest;
16203
16204 salt_t *salt = hash_buf->salt;
16205
16206 char *iter_pos = input_buf + 10;
16207
16208 u32 iter = atoi (iter_pos);
16209
16210 if (iter < 1)
16211 {
16212 return (PARSER_SALT_ITERATION);
16213 }
16214
16215 iter--; // first iteration is special
16216
16217 salt->salt_iter = iter;
16218
16219 char *base64_pos = strchr (iter_pos, '}');
16220
16221 if (base64_pos == NULL)
16222 {
16223 return (PARSER_SIGNATURE_UNMATCHED);
16224 }
16225
16226 base64_pos++;
16227
16228 // base64 decode salt
16229
16230 u32 base64_len = input_len - (base64_pos - input_buf);
16231
16232 u8 tmp_buf[100] = { 0 };
16233
16234 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16235
16236 if (decoded_len < 24)
16237 {
16238 return (PARSER_SALT_LENGTH);
16239 }
16240
16241 // copy the salt
16242
16243 uint salt_len = decoded_len - 20;
16244
16245 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16246 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16247
16248 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16249
16250 salt->salt_len = salt_len;
16251
16252 // set digest
16253
16254 u32 *digest_ptr = (u32*) tmp_buf;
16255
16256 digest[0] = byte_swap_32 (digest_ptr[0]);
16257 digest[1] = byte_swap_32 (digest_ptr[1]);
16258 digest[2] = byte_swap_32 (digest_ptr[2]);
16259 digest[3] = byte_swap_32 (digest_ptr[3]);
16260 digest[4] = byte_swap_32 (digest_ptr[4]);
16261
16262 return (PARSER_OK);
16263 }
16264
16265 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16266 {
16267 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16268
16269 u32 *digest = (u32 *) hash_buf->digest;
16270
16271 salt_t *salt = hash_buf->salt;
16272
16273 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16274 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16275 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16276 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16277 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16278
16279 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16280
16281 uint salt_len = input_len - 40 - 1;
16282
16283 char *salt_buf = input_buf + 40 + 1;
16284
16285 char *salt_buf_ptr = (char *) salt->salt_buf;
16286
16287 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16288
16289 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16290
16291 salt->salt_len = salt_len;
16292
16293 return (PARSER_OK);
16294 }
16295
16296 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16297 {
16298 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16299
16300 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16301
16302 u32 *digest = (u32 *) hash_buf->digest;
16303
16304 salt_t *salt = hash_buf->salt;
16305
16306 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16307
16308 /**
16309 * parse line
16310 */
16311
16312 char *V_pos = input_buf + 5;
16313
16314 char *R_pos = strchr (V_pos, '*');
16315
16316 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16317
16318 u32 V_len = R_pos - V_pos;
16319
16320 R_pos++;
16321
16322 char *bits_pos = strchr (R_pos, '*');
16323
16324 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16325
16326 u32 R_len = bits_pos - R_pos;
16327
16328 bits_pos++;
16329
16330 char *P_pos = strchr (bits_pos, '*');
16331
16332 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16333
16334 u32 bits_len = P_pos - bits_pos;
16335
16336 P_pos++;
16337
16338 char *enc_md_pos = strchr (P_pos, '*');
16339
16340 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16341
16342 u32 P_len = enc_md_pos - P_pos;
16343
16344 enc_md_pos++;
16345
16346 char *id_len_pos = strchr (enc_md_pos, '*');
16347
16348 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16349
16350 u32 enc_md_len = id_len_pos - enc_md_pos;
16351
16352 id_len_pos++;
16353
16354 char *id_buf_pos = strchr (id_len_pos, '*');
16355
16356 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16357
16358 u32 id_len_len = id_buf_pos - id_len_pos;
16359
16360 id_buf_pos++;
16361
16362 char *u_len_pos = strchr (id_buf_pos, '*');
16363
16364 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16365
16366 u32 id_buf_len = u_len_pos - id_buf_pos;
16367
16368 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16369
16370 u_len_pos++;
16371
16372 char *u_buf_pos = strchr (u_len_pos, '*');
16373
16374 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16375
16376 u32 u_len_len = u_buf_pos - u_len_pos;
16377
16378 u_buf_pos++;
16379
16380 char *o_len_pos = strchr (u_buf_pos, '*');
16381
16382 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16383
16384 u32 u_buf_len = o_len_pos - u_buf_pos;
16385
16386 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16387
16388 o_len_pos++;
16389
16390 char *o_buf_pos = strchr (o_len_pos, '*');
16391
16392 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16393
16394 u32 o_len_len = o_buf_pos - o_len_pos;
16395
16396 o_buf_pos++;
16397
16398 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;
16399
16400 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16401
16402 // validate data
16403
16404 const int V = atoi (V_pos);
16405 const int R = atoi (R_pos);
16406 const int P = atoi (P_pos);
16407
16408 if (V != 1) return (PARSER_SALT_VALUE);
16409 if (R != 2) return (PARSER_SALT_VALUE);
16410
16411 const int enc_md = atoi (enc_md_pos);
16412
16413 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16414
16415 const int id_len = atoi (id_len_pos);
16416 const int u_len = atoi (u_len_pos);
16417 const int o_len = atoi (o_len_pos);
16418
16419 if (id_len != 16) return (PARSER_SALT_VALUE);
16420 if (u_len != 32) return (PARSER_SALT_VALUE);
16421 if (o_len != 32) return (PARSER_SALT_VALUE);
16422
16423 const int bits = atoi (bits_pos);
16424
16425 if (bits != 40) return (PARSER_SALT_VALUE);
16426
16427 // copy data to esalt
16428
16429 pdf->V = V;
16430 pdf->R = R;
16431 pdf->P = P;
16432
16433 pdf->enc_md = enc_md;
16434
16435 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16436 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16437 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16438 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16439 pdf->id_len = id_len;
16440
16441 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16442 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16443 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16444 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16445 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16446 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16447 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16448 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16449 pdf->u_len = u_len;
16450
16451 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16452 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16453 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16454 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16455 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16456 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16457 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16458 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16459 pdf->o_len = o_len;
16460
16461 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16462 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16463 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16464 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16465
16466 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16467 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16468 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16469 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16470 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16471 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16472 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16473 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16474
16475 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16476 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16477 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16478 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16479 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16480 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16481 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16482 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16483
16484 // we use ID for salt, maybe needs to change, we will see...
16485
16486 salt->salt_buf[0] = pdf->id_buf[0];
16487 salt->salt_buf[1] = pdf->id_buf[1];
16488 salt->salt_buf[2] = pdf->id_buf[2];
16489 salt->salt_buf[3] = pdf->id_buf[3];
16490 salt->salt_len = pdf->id_len;
16491
16492 digest[0] = pdf->u_buf[0];
16493 digest[1] = pdf->u_buf[1];
16494 digest[2] = pdf->u_buf[2];
16495 digest[3] = pdf->u_buf[3];
16496
16497 return (PARSER_OK);
16498 }
16499
16500 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16501 {
16502 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16503 }
16504
16505 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16506 {
16507 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16508
16509 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16510
16511 u32 *digest = (u32 *) hash_buf->digest;
16512
16513 salt_t *salt = hash_buf->salt;
16514
16515 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16516
16517 /**
16518 * parse line
16519 */
16520
16521 char *V_pos = input_buf + 5;
16522
16523 char *R_pos = strchr (V_pos, '*');
16524
16525 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16526
16527 u32 V_len = R_pos - V_pos;
16528
16529 R_pos++;
16530
16531 char *bits_pos = strchr (R_pos, '*');
16532
16533 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16534
16535 u32 R_len = bits_pos - R_pos;
16536
16537 bits_pos++;
16538
16539 char *P_pos = strchr (bits_pos, '*');
16540
16541 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16542
16543 u32 bits_len = P_pos - bits_pos;
16544
16545 P_pos++;
16546
16547 char *enc_md_pos = strchr (P_pos, '*');
16548
16549 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16550
16551 u32 P_len = enc_md_pos - P_pos;
16552
16553 enc_md_pos++;
16554
16555 char *id_len_pos = strchr (enc_md_pos, '*');
16556
16557 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16558
16559 u32 enc_md_len = id_len_pos - enc_md_pos;
16560
16561 id_len_pos++;
16562
16563 char *id_buf_pos = strchr (id_len_pos, '*');
16564
16565 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16566
16567 u32 id_len_len = id_buf_pos - id_len_pos;
16568
16569 id_buf_pos++;
16570
16571 char *u_len_pos = strchr (id_buf_pos, '*');
16572
16573 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16574
16575 u32 id_buf_len = u_len_pos - id_buf_pos;
16576
16577 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16578
16579 u_len_pos++;
16580
16581 char *u_buf_pos = strchr (u_len_pos, '*');
16582
16583 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16584
16585 u32 u_len_len = u_buf_pos - u_len_pos;
16586
16587 u_buf_pos++;
16588
16589 char *o_len_pos = strchr (u_buf_pos, '*');
16590
16591 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16592
16593 u32 u_buf_len = o_len_pos - u_buf_pos;
16594
16595 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16596
16597 o_len_pos++;
16598
16599 char *o_buf_pos = strchr (o_len_pos, '*');
16600
16601 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16602
16603 u32 o_len_len = o_buf_pos - o_len_pos;
16604
16605 o_buf_pos++;
16606
16607 char *rc4key_pos = strchr (o_buf_pos, ':');
16608
16609 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16610
16611 u32 o_buf_len = rc4key_pos - o_buf_pos;
16612
16613 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16614
16615 rc4key_pos++;
16616
16617 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;
16618
16619 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16620
16621 // validate data
16622
16623 const int V = atoi (V_pos);
16624 const int R = atoi (R_pos);
16625 const int P = atoi (P_pos);
16626
16627 if (V != 1) return (PARSER_SALT_VALUE);
16628 if (R != 2) return (PARSER_SALT_VALUE);
16629
16630 const int enc_md = atoi (enc_md_pos);
16631
16632 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16633
16634 const int id_len = atoi (id_len_pos);
16635 const int u_len = atoi (u_len_pos);
16636 const int o_len = atoi (o_len_pos);
16637
16638 if (id_len != 16) return (PARSER_SALT_VALUE);
16639 if (u_len != 32) return (PARSER_SALT_VALUE);
16640 if (o_len != 32) return (PARSER_SALT_VALUE);
16641
16642 const int bits = atoi (bits_pos);
16643
16644 if (bits != 40) return (PARSER_SALT_VALUE);
16645
16646 // copy data to esalt
16647
16648 pdf->V = V;
16649 pdf->R = R;
16650 pdf->P = P;
16651
16652 pdf->enc_md = enc_md;
16653
16654 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16655 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16656 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16657 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16658 pdf->id_len = id_len;
16659
16660 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16661 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16662 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16663 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16664 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16665 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16666 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16667 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16668 pdf->u_len = u_len;
16669
16670 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16671 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16672 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16673 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16674 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16675 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16676 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16677 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16678 pdf->o_len = o_len;
16679
16680 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16681 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16682 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16683 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16684
16685 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16686 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16687 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16688 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16689 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16690 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16691 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16692 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16693
16694 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16695 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16696 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16697 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16698 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16699 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16700 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16701 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16702
16703 pdf->rc4key[1] = 0;
16704 pdf->rc4key[0] = 0;
16705
16706 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16707 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16708 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16709 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16710 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16711 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16712 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16713 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16714 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16715 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16716
16717 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16718 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16719
16720 // we use ID for salt, maybe needs to change, we will see...
16721
16722 salt->salt_buf[0] = pdf->id_buf[0];
16723 salt->salt_buf[1] = pdf->id_buf[1];
16724 salt->salt_buf[2] = pdf->id_buf[2];
16725 salt->salt_buf[3] = pdf->id_buf[3];
16726 salt->salt_buf[4] = pdf->u_buf[0];
16727 salt->salt_buf[5] = pdf->u_buf[1];
16728 salt->salt_buf[6] = pdf->o_buf[0];
16729 salt->salt_buf[7] = pdf->o_buf[1];
16730 salt->salt_len = pdf->id_len + 16;
16731
16732 digest[0] = pdf->rc4key[0];
16733 digest[1] = pdf->rc4key[1];
16734 digest[2] = 0;
16735 digest[3] = 0;
16736
16737 return (PARSER_OK);
16738 }
16739
16740 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16741 {
16742 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16743
16744 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16745
16746 u32 *digest = (u32 *) hash_buf->digest;
16747
16748 salt_t *salt = hash_buf->salt;
16749
16750 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16751
16752 /**
16753 * parse line
16754 */
16755
16756 char *V_pos = input_buf + 5;
16757
16758 char *R_pos = strchr (V_pos, '*');
16759
16760 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16761
16762 u32 V_len = R_pos - V_pos;
16763
16764 R_pos++;
16765
16766 char *bits_pos = strchr (R_pos, '*');
16767
16768 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16769
16770 u32 R_len = bits_pos - R_pos;
16771
16772 bits_pos++;
16773
16774 char *P_pos = strchr (bits_pos, '*');
16775
16776 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16777
16778 u32 bits_len = P_pos - bits_pos;
16779
16780 P_pos++;
16781
16782 char *enc_md_pos = strchr (P_pos, '*');
16783
16784 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16785
16786 u32 P_len = enc_md_pos - P_pos;
16787
16788 enc_md_pos++;
16789
16790 char *id_len_pos = strchr (enc_md_pos, '*');
16791
16792 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16793
16794 u32 enc_md_len = id_len_pos - enc_md_pos;
16795
16796 id_len_pos++;
16797
16798 char *id_buf_pos = strchr (id_len_pos, '*');
16799
16800 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16801
16802 u32 id_len_len = id_buf_pos - id_len_pos;
16803
16804 id_buf_pos++;
16805
16806 char *u_len_pos = strchr (id_buf_pos, '*');
16807
16808 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16809
16810 u32 id_buf_len = u_len_pos - id_buf_pos;
16811
16812 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16813
16814 u_len_pos++;
16815
16816 char *u_buf_pos = strchr (u_len_pos, '*');
16817
16818 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16819
16820 u32 u_len_len = u_buf_pos - u_len_pos;
16821
16822 u_buf_pos++;
16823
16824 char *o_len_pos = strchr (u_buf_pos, '*');
16825
16826 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16827
16828 u32 u_buf_len = o_len_pos - u_buf_pos;
16829
16830 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16831
16832 o_len_pos++;
16833
16834 char *o_buf_pos = strchr (o_len_pos, '*');
16835
16836 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16837
16838 u32 o_len_len = o_buf_pos - o_len_pos;
16839
16840 o_buf_pos++;
16841
16842 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;
16843
16844 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16845
16846 // validate data
16847
16848 const int V = atoi (V_pos);
16849 const int R = atoi (R_pos);
16850 const int P = atoi (P_pos);
16851
16852 int vr_ok = 0;
16853
16854 if ((V == 2) && (R == 3)) vr_ok = 1;
16855 if ((V == 4) && (R == 4)) vr_ok = 1;
16856
16857 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16858
16859 const int id_len = atoi (id_len_pos);
16860 const int u_len = atoi (u_len_pos);
16861 const int o_len = atoi (o_len_pos);
16862
16863 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16864
16865 if (u_len != 32) return (PARSER_SALT_VALUE);
16866 if (o_len != 32) return (PARSER_SALT_VALUE);
16867
16868 const int bits = atoi (bits_pos);
16869
16870 if (bits != 128) return (PARSER_SALT_VALUE);
16871
16872 int enc_md = 1;
16873
16874 if (R >= 4)
16875 {
16876 enc_md = atoi (enc_md_pos);
16877 }
16878
16879 // copy data to esalt
16880
16881 pdf->V = V;
16882 pdf->R = R;
16883 pdf->P = P;
16884
16885 pdf->enc_md = enc_md;
16886
16887 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16888 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16889 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16890 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16891
16892 if (id_len == 32)
16893 {
16894 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16895 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16896 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16897 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16898 }
16899
16900 pdf->id_len = id_len;
16901
16902 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16903 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16904 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16905 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16906 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16907 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16908 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16909 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16910 pdf->u_len = u_len;
16911
16912 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16913 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16914 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16915 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16916 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16917 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16918 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16919 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16920 pdf->o_len = o_len;
16921
16922 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16923 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16924 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16925 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16926
16927 if (id_len == 32)
16928 {
16929 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16930 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16931 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16932 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16933 }
16934
16935 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16936 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16937 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16938 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16939 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16940 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16941 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16942 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16943
16944 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16945 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16946 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16947 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16948 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16949 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16950 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16951 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16952
16953 // precompute rc4 data for later use
16954
16955 uint padding[8] =
16956 {
16957 0x5e4ebf28,
16958 0x418a754e,
16959 0x564e0064,
16960 0x0801faff,
16961 0xb6002e2e,
16962 0x803e68d0,
16963 0xfea90c2f,
16964 0x7a695364
16965 };
16966
16967 // md5
16968
16969 uint salt_pc_block[32] = { 0 };
16970
16971 char *salt_pc_ptr = (char *) salt_pc_block;
16972
16973 memcpy (salt_pc_ptr, padding, 32);
16974 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16975
16976 uint salt_pc_digest[4] = { 0 };
16977
16978 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16979
16980 pdf->rc4data[0] = salt_pc_digest[0];
16981 pdf->rc4data[1] = salt_pc_digest[1];
16982
16983 // we use ID for salt, maybe needs to change, we will see...
16984
16985 salt->salt_buf[0] = pdf->id_buf[0];
16986 salt->salt_buf[1] = pdf->id_buf[1];
16987 salt->salt_buf[2] = pdf->id_buf[2];
16988 salt->salt_buf[3] = pdf->id_buf[3];
16989 salt->salt_buf[4] = pdf->u_buf[0];
16990 salt->salt_buf[5] = pdf->u_buf[1];
16991 salt->salt_buf[6] = pdf->o_buf[0];
16992 salt->salt_buf[7] = pdf->o_buf[1];
16993 salt->salt_len = pdf->id_len + 16;
16994
16995 salt->salt_iter = ROUNDS_PDF14;
16996
16997 digest[0] = pdf->u_buf[0];
16998 digest[1] = pdf->u_buf[1];
16999 digest[2] = 0;
17000 digest[3] = 0;
17001
17002 return (PARSER_OK);
17003 }
17004
17005 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17006 {
17007 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17008
17009 if (ret != PARSER_OK)
17010 {
17011 return ret;
17012 }
17013
17014 u32 *digest = (u32 *) hash_buf->digest;
17015
17016 salt_t *salt = hash_buf->salt;
17017
17018 digest[0] -= SHA256M_A;
17019 digest[1] -= SHA256M_B;
17020 digest[2] -= SHA256M_C;
17021 digest[3] -= SHA256M_D;
17022 digest[4] -= SHA256M_E;
17023 digest[5] -= SHA256M_F;
17024 digest[6] -= SHA256M_G;
17025 digest[7] -= SHA256M_H;
17026
17027 salt->salt_buf[2] = 0x80;
17028
17029 return (PARSER_OK);
17030 }
17031
17032 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17033 {
17034 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17035
17036 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17037
17038 u32 *digest = (u32 *) hash_buf->digest;
17039
17040 salt_t *salt = hash_buf->salt;
17041
17042 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17043
17044 /**
17045 * parse line
17046 */
17047
17048 char *V_pos = input_buf + 5;
17049
17050 char *R_pos = strchr (V_pos, '*');
17051
17052 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17053
17054 u32 V_len = R_pos - V_pos;
17055
17056 R_pos++;
17057
17058 char *bits_pos = strchr (R_pos, '*');
17059
17060 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17061
17062 u32 R_len = bits_pos - R_pos;
17063
17064 bits_pos++;
17065
17066 char *P_pos = strchr (bits_pos, '*');
17067
17068 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17069
17070 u32 bits_len = P_pos - bits_pos;
17071
17072 P_pos++;
17073
17074 char *enc_md_pos = strchr (P_pos, '*');
17075
17076 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17077
17078 u32 P_len = enc_md_pos - P_pos;
17079
17080 enc_md_pos++;
17081
17082 char *id_len_pos = strchr (enc_md_pos, '*');
17083
17084 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17085
17086 u32 enc_md_len = id_len_pos - enc_md_pos;
17087
17088 id_len_pos++;
17089
17090 char *id_buf_pos = strchr (id_len_pos, '*');
17091
17092 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17093
17094 u32 id_len_len = id_buf_pos - id_len_pos;
17095
17096 id_buf_pos++;
17097
17098 char *u_len_pos = strchr (id_buf_pos, '*');
17099
17100 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17101
17102 u32 id_buf_len = u_len_pos - id_buf_pos;
17103
17104 u_len_pos++;
17105
17106 char *u_buf_pos = strchr (u_len_pos, '*');
17107
17108 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17109
17110 u32 u_len_len = u_buf_pos - u_len_pos;
17111
17112 u_buf_pos++;
17113
17114 char *o_len_pos = strchr (u_buf_pos, '*');
17115
17116 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17117
17118 u32 u_buf_len = o_len_pos - u_buf_pos;
17119
17120 o_len_pos++;
17121
17122 char *o_buf_pos = strchr (o_len_pos, '*');
17123
17124 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17125
17126 u32 o_len_len = o_buf_pos - o_len_pos;
17127
17128 o_buf_pos++;
17129
17130 char *last = strchr (o_buf_pos, '*');
17131
17132 if (last == NULL) last = input_buf + input_len;
17133
17134 u32 o_buf_len = last - o_buf_pos;
17135
17136 // validate data
17137
17138 const int V = atoi (V_pos);
17139 const int R = atoi (R_pos);
17140
17141 int vr_ok = 0;
17142
17143 if ((V == 5) && (R == 5)) vr_ok = 1;
17144 if ((V == 5) && (R == 6)) vr_ok = 1;
17145
17146 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17147
17148 const int bits = atoi (bits_pos);
17149
17150 if (bits != 256) return (PARSER_SALT_VALUE);
17151
17152 int enc_md = atoi (enc_md_pos);
17153
17154 if (enc_md != 1) return (PARSER_SALT_VALUE);
17155
17156 const uint id_len = atoi (id_len_pos);
17157 const uint u_len = atoi (u_len_pos);
17158 const uint o_len = atoi (o_len_pos);
17159
17160 if (V_len > 6) return (PARSER_SALT_LENGTH);
17161 if (R_len > 6) return (PARSER_SALT_LENGTH);
17162 if (P_len > 6) return (PARSER_SALT_LENGTH);
17163 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17164 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17165 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17166 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17167 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17168
17169 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17170 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17171 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17172
17173 // copy data to esalt
17174
17175 if (u_len < 40) return (PARSER_SALT_VALUE);
17176
17177 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17178 {
17179 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17180 }
17181
17182 salt->salt_buf[0] = pdf->u_buf[8];
17183 salt->salt_buf[1] = pdf->u_buf[9];
17184
17185 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17186 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17187
17188 salt->salt_len = 8;
17189 salt->salt_iter = ROUNDS_PDF17L8;
17190
17191 digest[0] = pdf->u_buf[0];
17192 digest[1] = pdf->u_buf[1];
17193 digest[2] = pdf->u_buf[2];
17194 digest[3] = pdf->u_buf[3];
17195 digest[4] = pdf->u_buf[4];
17196 digest[5] = pdf->u_buf[5];
17197 digest[6] = pdf->u_buf[6];
17198 digest[7] = pdf->u_buf[7];
17199
17200 return (PARSER_OK);
17201 }
17202
17203 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17204 {
17205 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17206
17207 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17208
17209 u32 *digest = (u32 *) hash_buf->digest;
17210
17211 salt_t *salt = hash_buf->salt;
17212
17213 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17214
17215 /**
17216 * parse line
17217 */
17218
17219 // iterations
17220
17221 char *iter_pos = input_buf + 7;
17222
17223 u32 iter = atoi (iter_pos);
17224
17225 if (iter < 1) return (PARSER_SALT_ITERATION);
17226 if (iter > 999999) return (PARSER_SALT_ITERATION);
17227
17228 // first is *raw* salt
17229
17230 char *salt_pos = strchr (iter_pos, ':');
17231
17232 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17233
17234 salt_pos++;
17235
17236 char *hash_pos = strchr (salt_pos, ':');
17237
17238 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17239
17240 u32 salt_len = hash_pos - salt_pos;
17241
17242 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17243
17244 hash_pos++;
17245
17246 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17247
17248 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17249
17250 // decode salt
17251
17252 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17253
17254 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17255
17256 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17257
17258 salt_buf_ptr[salt_len + 3] = 0x01;
17259 salt_buf_ptr[salt_len + 4] = 0x80;
17260
17261 salt->salt_len = salt_len;
17262 salt->salt_iter = iter - 1;
17263
17264 // decode hash
17265
17266 u8 tmp_buf[100] = { 0 };
17267
17268 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17269
17270 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17271
17272 memcpy (digest, tmp_buf, 16);
17273
17274 digest[0] = byte_swap_32 (digest[0]);
17275 digest[1] = byte_swap_32 (digest[1]);
17276 digest[2] = byte_swap_32 (digest[2]);
17277 digest[3] = byte_swap_32 (digest[3]);
17278
17279 // add some stuff to normal salt to make sorted happy
17280
17281 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17282 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17283 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17284 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17285 salt->salt_buf[4] = salt->salt_iter;
17286
17287 return (PARSER_OK);
17288 }
17289
17290 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17291 {
17292 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17293
17294 u32 *digest = (u32 *) hash_buf->digest;
17295
17296 salt_t *salt = hash_buf->salt;
17297
17298 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17299 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17300 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17301 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17302
17303 digest[0] = byte_swap_32 (digest[0]);
17304 digest[1] = byte_swap_32 (digest[1]);
17305 digest[2] = byte_swap_32 (digest[2]);
17306 digest[3] = byte_swap_32 (digest[3]);
17307
17308 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17309
17310 uint salt_len = input_len - 32 - 1;
17311
17312 char *salt_buf = input_buf + 32 + 1;
17313
17314 char *salt_buf_ptr = (char *) salt->salt_buf;
17315
17316 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17317
17318 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17319
17320 salt->salt_len = salt_len;
17321
17322 return (PARSER_OK);
17323 }
17324
17325 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17326 {
17327 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17328
17329 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17330
17331 u32 *digest = (u32 *) hash_buf->digest;
17332
17333 salt_t *salt = hash_buf->salt;
17334
17335 char *user_pos = input_buf + 10;
17336
17337 char *salt_pos = strchr (user_pos, '*');
17338
17339 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17340
17341 salt_pos++;
17342
17343 char *hash_pos = strchr (salt_pos, '*');
17344
17345 hash_pos++;
17346
17347 uint hash_len = input_len - (hash_pos - input_buf);
17348
17349 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17350
17351 uint user_len = salt_pos - user_pos - 1;
17352
17353 uint salt_len = hash_pos - salt_pos - 1;
17354
17355 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17356
17357 /*
17358 * store digest
17359 */
17360
17361 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17362 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17363 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17364 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17365
17366 digest[0] = byte_swap_32 (digest[0]);
17367 digest[1] = byte_swap_32 (digest[1]);
17368 digest[2] = byte_swap_32 (digest[2]);
17369 digest[3] = byte_swap_32 (digest[3]);
17370
17371 digest[0] -= MD5M_A;
17372 digest[1] -= MD5M_B;
17373 digest[2] -= MD5M_C;
17374 digest[3] -= MD5M_D;
17375
17376 /*
17377 * store salt
17378 */
17379
17380 char *salt_buf_ptr = (char *) salt->salt_buf;
17381
17382 // first 4 bytes are the "challenge"
17383
17384 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17385 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17386 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17387 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17388
17389 // append the user name
17390
17391 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17392
17393 salt->salt_len = 4 + user_len;
17394
17395 return (PARSER_OK);
17396 }
17397
17398 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17399 {
17400 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17401
17402 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17403
17404 u32 *digest = (u32 *) hash_buf->digest;
17405
17406 salt_t *salt = hash_buf->salt;
17407
17408 char *salt_pos = input_buf + 9;
17409
17410 char *hash_pos = strchr (salt_pos, '*');
17411
17412 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17413
17414 hash_pos++;
17415
17416 uint hash_len = input_len - (hash_pos - input_buf);
17417
17418 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17419
17420 uint salt_len = hash_pos - salt_pos - 1;
17421
17422 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17423
17424 /*
17425 * store digest
17426 */
17427
17428 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17429 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17430 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17431 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17432 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17433
17434 /*
17435 * store salt
17436 */
17437
17438 char *salt_buf_ptr = (char *) salt->salt_buf;
17439
17440 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17441
17442 salt->salt_len = salt_len;
17443
17444 return (PARSER_OK);
17445 }
17446
17447 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17448 {
17449 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17450
17451 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17452
17453 u32 *digest = (u32 *) hash_buf->digest;
17454
17455 salt_t *salt = hash_buf->salt;
17456
17457 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17458
17459 /**
17460 * parse line
17461 */
17462
17463 char *cry_master_len_pos = input_buf + 9;
17464
17465 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17466
17467 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17468
17469 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17470
17471 cry_master_buf_pos++;
17472
17473 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17474
17475 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17476
17477 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17478
17479 cry_salt_len_pos++;
17480
17481 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17482
17483 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17484
17485 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17486
17487 cry_salt_buf_pos++;
17488
17489 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17490
17491 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17492
17493 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17494
17495 cry_rounds_pos++;
17496
17497 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17498
17499 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17500
17501 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17502
17503 ckey_len_pos++;
17504
17505 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17506
17507 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17508
17509 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17510
17511 ckey_buf_pos++;
17512
17513 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17514
17515 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17516
17517 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17518
17519 public_key_len_pos++;
17520
17521 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17522
17523 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17524
17525 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17526
17527 public_key_buf_pos++;
17528
17529 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;
17530
17531 const uint cry_master_len = atoi (cry_master_len_pos);
17532 const uint cry_salt_len = atoi (cry_salt_len_pos);
17533 const uint ckey_len = atoi (ckey_len_pos);
17534 const uint public_key_len = atoi (public_key_len_pos);
17535
17536 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17537 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17538 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17539 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17540
17541 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17542 {
17543 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17544
17545 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17546 }
17547
17548 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17549 {
17550 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17551
17552 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17553 }
17554
17555 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17556 {
17557 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17558
17559 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17560 }
17561
17562 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17563 bitcoin_wallet->ckey_len = ckey_len / 2;
17564 bitcoin_wallet->public_key_len = public_key_len / 2;
17565
17566 /*
17567 * store digest (should be unique enought, hopefully)
17568 */
17569
17570 digest[0] = bitcoin_wallet->cry_master_buf[0];
17571 digest[1] = bitcoin_wallet->cry_master_buf[1];
17572 digest[2] = bitcoin_wallet->cry_master_buf[2];
17573 digest[3] = bitcoin_wallet->cry_master_buf[3];
17574
17575 /*
17576 * store salt
17577 */
17578
17579 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17580
17581 const uint cry_rounds = atoi (cry_rounds_pos);
17582
17583 salt->salt_iter = cry_rounds - 1;
17584
17585 char *salt_buf_ptr = (char *) salt->salt_buf;
17586
17587 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17588
17589 salt->salt_len = salt_len;
17590
17591 return (PARSER_OK);
17592 }
17593
17594 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17595 {
17596 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17597
17598 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17599
17600 u32 *digest = (u32 *) hash_buf->digest;
17601
17602 salt_t *salt = hash_buf->salt;
17603
17604 sip_t *sip = (sip_t *) hash_buf->esalt;
17605
17606 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17607
17608 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17609
17610 memcpy (temp_input_buf, input_buf, input_len);
17611
17612 // URI_server:
17613
17614 char *URI_server_pos = temp_input_buf + 6;
17615
17616 char *URI_client_pos = strchr (URI_server_pos, '*');
17617
17618 if (URI_client_pos == NULL)
17619 {
17620 myfree (temp_input_buf);
17621
17622 return (PARSER_SEPARATOR_UNMATCHED);
17623 }
17624
17625 URI_client_pos[0] = 0;
17626 URI_client_pos++;
17627
17628 uint URI_server_len = strlen (URI_server_pos);
17629
17630 if (URI_server_len > 512)
17631 {
17632 myfree (temp_input_buf);
17633
17634 return (PARSER_SALT_LENGTH);
17635 }
17636
17637 // URI_client:
17638
17639 char *user_pos = strchr (URI_client_pos, '*');
17640
17641 if (user_pos == NULL)
17642 {
17643 myfree (temp_input_buf);
17644
17645 return (PARSER_SEPARATOR_UNMATCHED);
17646 }
17647
17648 user_pos[0] = 0;
17649 user_pos++;
17650
17651 uint URI_client_len = strlen (URI_client_pos);
17652
17653 if (URI_client_len > 512)
17654 {
17655 myfree (temp_input_buf);
17656
17657 return (PARSER_SALT_LENGTH);
17658 }
17659
17660 // user:
17661
17662 char *realm_pos = strchr (user_pos, '*');
17663
17664 if (realm_pos == NULL)
17665 {
17666 myfree (temp_input_buf);
17667
17668 return (PARSER_SEPARATOR_UNMATCHED);
17669 }
17670
17671 realm_pos[0] = 0;
17672 realm_pos++;
17673
17674 uint user_len = strlen (user_pos);
17675
17676 if (user_len > 116)
17677 {
17678 myfree (temp_input_buf);
17679
17680 return (PARSER_SALT_LENGTH);
17681 }
17682
17683 // realm:
17684
17685 char *method_pos = strchr (realm_pos, '*');
17686
17687 if (method_pos == NULL)
17688 {
17689 myfree (temp_input_buf);
17690
17691 return (PARSER_SEPARATOR_UNMATCHED);
17692 }
17693
17694 method_pos[0] = 0;
17695 method_pos++;
17696
17697 uint realm_len = strlen (realm_pos);
17698
17699 if (realm_len > 116)
17700 {
17701 myfree (temp_input_buf);
17702
17703 return (PARSER_SALT_LENGTH);
17704 }
17705
17706 // method:
17707
17708 char *URI_prefix_pos = strchr (method_pos, '*');
17709
17710 if (URI_prefix_pos == NULL)
17711 {
17712 myfree (temp_input_buf);
17713
17714 return (PARSER_SEPARATOR_UNMATCHED);
17715 }
17716
17717 URI_prefix_pos[0] = 0;
17718 URI_prefix_pos++;
17719
17720 uint method_len = strlen (method_pos);
17721
17722 if (method_len > 246)
17723 {
17724 myfree (temp_input_buf);
17725
17726 return (PARSER_SALT_LENGTH);
17727 }
17728
17729 // URI_prefix:
17730
17731 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17732
17733 if (URI_resource_pos == NULL)
17734 {
17735 myfree (temp_input_buf);
17736
17737 return (PARSER_SEPARATOR_UNMATCHED);
17738 }
17739
17740 URI_resource_pos[0] = 0;
17741 URI_resource_pos++;
17742
17743 uint URI_prefix_len = strlen (URI_prefix_pos);
17744
17745 if (URI_prefix_len > 245)
17746 {
17747 myfree (temp_input_buf);
17748
17749 return (PARSER_SALT_LENGTH);
17750 }
17751
17752 // URI_resource:
17753
17754 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17755
17756 if (URI_suffix_pos == NULL)
17757 {
17758 myfree (temp_input_buf);
17759
17760 return (PARSER_SEPARATOR_UNMATCHED);
17761 }
17762
17763 URI_suffix_pos[0] = 0;
17764 URI_suffix_pos++;
17765
17766 uint URI_resource_len = strlen (URI_resource_pos);
17767
17768 if (URI_resource_len < 1 || URI_resource_len > 246)
17769 {
17770 myfree (temp_input_buf);
17771
17772 return (PARSER_SALT_LENGTH);
17773 }
17774
17775 // URI_suffix:
17776
17777 char *nonce_pos = strchr (URI_suffix_pos, '*');
17778
17779 if (nonce_pos == NULL)
17780 {
17781 myfree (temp_input_buf);
17782
17783 return (PARSER_SEPARATOR_UNMATCHED);
17784 }
17785
17786 nonce_pos[0] = 0;
17787 nonce_pos++;
17788
17789 uint URI_suffix_len = strlen (URI_suffix_pos);
17790
17791 if (URI_suffix_len > 245)
17792 {
17793 myfree (temp_input_buf);
17794
17795 return (PARSER_SALT_LENGTH);
17796 }
17797
17798 // nonce:
17799
17800 char *nonce_client_pos = strchr (nonce_pos, '*');
17801
17802 if (nonce_client_pos == NULL)
17803 {
17804 myfree (temp_input_buf);
17805
17806 return (PARSER_SEPARATOR_UNMATCHED);
17807 }
17808
17809 nonce_client_pos[0] = 0;
17810 nonce_client_pos++;
17811
17812 uint nonce_len = strlen (nonce_pos);
17813
17814 if (nonce_len < 1 || nonce_len > 50)
17815 {
17816 myfree (temp_input_buf);
17817
17818 return (PARSER_SALT_LENGTH);
17819 }
17820
17821 // nonce_client:
17822
17823 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17824
17825 if (nonce_count_pos == NULL)
17826 {
17827 myfree (temp_input_buf);
17828
17829 return (PARSER_SEPARATOR_UNMATCHED);
17830 }
17831
17832 nonce_count_pos[0] = 0;
17833 nonce_count_pos++;
17834
17835 uint nonce_client_len = strlen (nonce_client_pos);
17836
17837 if (nonce_client_len > 50)
17838 {
17839 myfree (temp_input_buf);
17840
17841 return (PARSER_SALT_LENGTH);
17842 }
17843
17844 // nonce_count:
17845
17846 char *qop_pos = strchr (nonce_count_pos, '*');
17847
17848 if (qop_pos == NULL)
17849 {
17850 myfree (temp_input_buf);
17851
17852 return (PARSER_SEPARATOR_UNMATCHED);
17853 }
17854
17855 qop_pos[0] = 0;
17856 qop_pos++;
17857
17858 uint nonce_count_len = strlen (nonce_count_pos);
17859
17860 if (nonce_count_len > 50)
17861 {
17862 myfree (temp_input_buf);
17863
17864 return (PARSER_SALT_LENGTH);
17865 }
17866
17867 // qop:
17868
17869 char *directive_pos = strchr (qop_pos, '*');
17870
17871 if (directive_pos == NULL)
17872 {
17873 myfree (temp_input_buf);
17874
17875 return (PARSER_SEPARATOR_UNMATCHED);
17876 }
17877
17878 directive_pos[0] = 0;
17879 directive_pos++;
17880
17881 uint qop_len = strlen (qop_pos);
17882
17883 if (qop_len > 50)
17884 {
17885 myfree (temp_input_buf);
17886
17887 return (PARSER_SALT_LENGTH);
17888 }
17889
17890 // directive
17891
17892 char *digest_pos = strchr (directive_pos, '*');
17893
17894 if (digest_pos == NULL)
17895 {
17896 myfree (temp_input_buf);
17897
17898 return (PARSER_SEPARATOR_UNMATCHED);
17899 }
17900
17901 digest_pos[0] = 0;
17902 digest_pos++;
17903
17904 uint directive_len = strlen (directive_pos);
17905
17906 if (directive_len != 3)
17907 {
17908 myfree (temp_input_buf);
17909
17910 return (PARSER_SALT_LENGTH);
17911 }
17912
17913 if (memcmp (directive_pos, "MD5", 3))
17914 {
17915 log_info ("ERROR: only the MD5 directive is currently supported\n");
17916
17917 myfree (temp_input_buf);
17918
17919 return (PARSER_SIP_AUTH_DIRECTIVE);
17920 }
17921
17922 /*
17923 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17924 */
17925
17926 uint md5_len = 0;
17927
17928 uint md5_max_len = 4 * 64;
17929
17930 uint md5_remaining_len = md5_max_len;
17931
17932 uint tmp_md5_buf[64] = { 0 };
17933
17934 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17935
17936 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17937
17938 md5_len += method_len + 1;
17939 tmp_md5_ptr += method_len + 1;
17940
17941 if (URI_prefix_len > 0)
17942 {
17943 md5_remaining_len = md5_max_len - md5_len;
17944
17945 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17946
17947 md5_len += URI_prefix_len + 1;
17948 tmp_md5_ptr += URI_prefix_len + 1;
17949 }
17950
17951 md5_remaining_len = md5_max_len - md5_len;
17952
17953 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17954
17955 md5_len += URI_resource_len;
17956 tmp_md5_ptr += URI_resource_len;
17957
17958 if (URI_suffix_len > 0)
17959 {
17960 md5_remaining_len = md5_max_len - md5_len;
17961
17962 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17963
17964 md5_len += 1 + URI_suffix_len;
17965 }
17966
17967 uint tmp_digest[4] = { 0 };
17968
17969 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17970
17971 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17972 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17973 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17974 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17975
17976 /*
17977 * esalt
17978 */
17979
17980 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17981
17982 uint esalt_len = 0;
17983
17984 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17985
17986 // there are 2 possibilities for the esalt:
17987
17988 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17989 {
17990 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17991
17992 if (esalt_len > max_esalt_len)
17993 {
17994 myfree (temp_input_buf);
17995
17996 return (PARSER_SALT_LENGTH);
17997 }
17998
17999 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18000 nonce_pos,
18001 nonce_count_pos,
18002 nonce_client_pos,
18003 qop_pos,
18004 tmp_digest[0],
18005 tmp_digest[1],
18006 tmp_digest[2],
18007 tmp_digest[3]);
18008 }
18009 else
18010 {
18011 esalt_len = 1 + nonce_len + 1 + 32;
18012
18013 if (esalt_len > max_esalt_len)
18014 {
18015 myfree (temp_input_buf);
18016
18017 return (PARSER_SALT_LENGTH);
18018 }
18019
18020 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18021 nonce_pos,
18022 tmp_digest[0],
18023 tmp_digest[1],
18024 tmp_digest[2],
18025 tmp_digest[3]);
18026 }
18027
18028 // add 0x80 to esalt
18029
18030 esalt_buf_ptr[esalt_len] = 0x80;
18031
18032 sip->esalt_len = esalt_len;
18033
18034 /*
18035 * actual salt
18036 */
18037
18038 char *sip_salt_ptr = (char *) sip->salt_buf;
18039
18040 uint salt_len = user_len + 1 + realm_len + 1;
18041
18042 uint max_salt_len = 119;
18043
18044 if (salt_len > max_salt_len)
18045 {
18046 myfree (temp_input_buf);
18047
18048 return (PARSER_SALT_LENGTH);
18049 }
18050
18051 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18052
18053 sip->salt_len = salt_len;
18054
18055 /*
18056 * fake salt (for sorting)
18057 */
18058
18059 char *salt_buf_ptr = (char *) salt->salt_buf;
18060
18061 max_salt_len = 55;
18062
18063 uint fake_salt_len = salt_len;
18064
18065 if (fake_salt_len > max_salt_len)
18066 {
18067 fake_salt_len = max_salt_len;
18068 }
18069
18070 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18071
18072 salt->salt_len = fake_salt_len;
18073
18074 /*
18075 * digest
18076 */
18077
18078 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18079 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18080 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18081 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18082
18083 digest[0] = byte_swap_32 (digest[0]);
18084 digest[1] = byte_swap_32 (digest[1]);
18085 digest[2] = byte_swap_32 (digest[2]);
18086 digest[3] = byte_swap_32 (digest[3]);
18087
18088 myfree (temp_input_buf);
18089
18090 return (PARSER_OK);
18091 }
18092
18093 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18094 {
18095 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18096
18097 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18098
18099 u32 *digest = (u32 *) hash_buf->digest;
18100
18101 salt_t *salt = hash_buf->salt;
18102
18103 // digest
18104
18105 char *digest_pos = input_buf;
18106
18107 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18108 digest[1] = 0;
18109 digest[2] = 0;
18110 digest[3] = 0;
18111
18112 // salt
18113
18114 char *salt_buf = input_buf + 8 + 1;
18115
18116 uint salt_len = 8;
18117
18118 char *salt_buf_ptr = (char *) salt->salt_buf;
18119
18120 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18121
18122 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18123
18124 salt->salt_len = salt_len;
18125
18126 return (PARSER_OK);
18127 }
18128
18129 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18130 {
18131 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18132
18133 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18134
18135 u32 *digest = (u32 *) hash_buf->digest;
18136
18137 salt_t *salt = hash_buf->salt;
18138
18139 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18140
18141 /**
18142 * parse line
18143 */
18144
18145 char *p_buf_pos = input_buf + 4;
18146
18147 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18148
18149 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18150
18151 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18152
18153 NumCyclesPower_pos++;
18154
18155 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18156
18157 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18158
18159 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18160
18161 salt_len_pos++;
18162
18163 char *salt_buf_pos = strchr (salt_len_pos, '$');
18164
18165 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18166
18167 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18168
18169 salt_buf_pos++;
18170
18171 char *iv_len_pos = strchr (salt_buf_pos, '$');
18172
18173 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18174
18175 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18176
18177 iv_len_pos++;
18178
18179 char *iv_buf_pos = strchr (iv_len_pos, '$');
18180
18181 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18182
18183 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18184
18185 iv_buf_pos++;
18186
18187 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18188
18189 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18190
18191 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18192
18193 crc_buf_pos++;
18194
18195 char *data_len_pos = strchr (crc_buf_pos, '$');
18196
18197 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18198
18199 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18200
18201 data_len_pos++;
18202
18203 char *unpack_size_pos = strchr (data_len_pos, '$');
18204
18205 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18206
18207 u32 data_len_len = unpack_size_pos - data_len_pos;
18208
18209 unpack_size_pos++;
18210
18211 char *data_buf_pos = strchr (unpack_size_pos, '$');
18212
18213 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18214
18215 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18216
18217 data_buf_pos++;
18218
18219 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;
18220
18221 const uint iter = atoi (NumCyclesPower_pos);
18222 const uint crc = atoi (crc_buf_pos);
18223 const uint p_buf = atoi (p_buf_pos);
18224 const uint salt_len = atoi (salt_len_pos);
18225 const uint iv_len = atoi (iv_len_pos);
18226 const uint unpack_size = atoi (unpack_size_pos);
18227 const uint data_len = atoi (data_len_pos);
18228
18229 /**
18230 * verify some data
18231 */
18232
18233 if (p_buf != 0) return (PARSER_SALT_VALUE);
18234 if (salt_len != 0) return (PARSER_SALT_VALUE);
18235
18236 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18237
18238 if (data_len > 384) return (PARSER_SALT_VALUE);
18239
18240 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18241
18242 /**
18243 * store data
18244 */
18245
18246 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18247 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18248 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18249 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18250
18251 seven_zip->iv_len = iv_len;
18252
18253 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18254
18255 seven_zip->salt_len = 0;
18256
18257 seven_zip->crc = crc;
18258
18259 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18260 {
18261 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18262
18263 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18264 }
18265
18266 seven_zip->data_len = data_len;
18267
18268 seven_zip->unpack_size = unpack_size;
18269
18270 // real salt
18271
18272 salt->salt_buf[0] = seven_zip->data_buf[0];
18273 salt->salt_buf[1] = seven_zip->data_buf[1];
18274 salt->salt_buf[2] = seven_zip->data_buf[2];
18275 salt->salt_buf[3] = seven_zip->data_buf[3];
18276
18277 salt->salt_len = 16;
18278
18279 salt->salt_sign[0] = iter;
18280
18281 salt->salt_iter = 1 << iter;
18282
18283 /**
18284 * digest
18285 */
18286
18287 digest[0] = crc;
18288 digest[1] = 0;
18289 digest[2] = 0;
18290 digest[3] = 0;
18291
18292 return (PARSER_OK);
18293 }
18294
18295 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18296 {
18297 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18298
18299 u32 *digest = (u32 *) hash_buf->digest;
18300
18301 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18302 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18303 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18304 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18305 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18306 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18307 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18308 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18309
18310 digest[0] = byte_swap_32 (digest[0]);
18311 digest[1] = byte_swap_32 (digest[1]);
18312 digest[2] = byte_swap_32 (digest[2]);
18313 digest[3] = byte_swap_32 (digest[3]);
18314 digest[4] = byte_swap_32 (digest[4]);
18315 digest[5] = byte_swap_32 (digest[5]);
18316 digest[6] = byte_swap_32 (digest[6]);
18317 digest[7] = byte_swap_32 (digest[7]);
18318
18319 return (PARSER_OK);
18320 }
18321
18322 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18323 {
18324 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18325
18326 u32 *digest = (u32 *) hash_buf->digest;
18327
18328 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18329 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18330 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18331 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18332 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18333 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18334 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18335 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18336 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18337 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18338 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18339 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18340 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18341 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18342 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18343 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18344
18345 digest[ 0] = byte_swap_32 (digest[ 0]);
18346 digest[ 1] = byte_swap_32 (digest[ 1]);
18347 digest[ 2] = byte_swap_32 (digest[ 2]);
18348 digest[ 3] = byte_swap_32 (digest[ 3]);
18349 digest[ 4] = byte_swap_32 (digest[ 4]);
18350 digest[ 5] = byte_swap_32 (digest[ 5]);
18351 digest[ 6] = byte_swap_32 (digest[ 6]);
18352 digest[ 7] = byte_swap_32 (digest[ 7]);
18353 digest[ 8] = byte_swap_32 (digest[ 8]);
18354 digest[ 9] = byte_swap_32 (digest[ 9]);
18355 digest[10] = byte_swap_32 (digest[10]);
18356 digest[11] = byte_swap_32 (digest[11]);
18357 digest[12] = byte_swap_32 (digest[12]);
18358 digest[13] = byte_swap_32 (digest[13]);
18359 digest[14] = byte_swap_32 (digest[14]);
18360 digest[15] = byte_swap_32 (digest[15]);
18361
18362 return (PARSER_OK);
18363 }
18364
18365 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18366 {
18367 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18368
18369 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18370
18371 u32 *digest = (u32 *) hash_buf->digest;
18372
18373 salt_t *salt = hash_buf->salt;
18374
18375 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18376
18377 /**
18378 * parse line
18379 */
18380
18381 // iterations
18382
18383 char *iter_pos = input_buf + 4;
18384
18385 u32 iter = atoi (iter_pos);
18386
18387 if (iter < 1) return (PARSER_SALT_ITERATION);
18388 if (iter > 999999) return (PARSER_SALT_ITERATION);
18389
18390 // first is *raw* salt
18391
18392 char *salt_pos = strchr (iter_pos, ':');
18393
18394 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18395
18396 salt_pos++;
18397
18398 char *hash_pos = strchr (salt_pos, ':');
18399
18400 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18401
18402 u32 salt_len = hash_pos - salt_pos;
18403
18404 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18405
18406 hash_pos++;
18407
18408 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18409
18410 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18411
18412 // decode salt
18413
18414 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18415
18416 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18417
18418 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18419
18420 salt_buf_ptr[salt_len + 3] = 0x01;
18421 salt_buf_ptr[salt_len + 4] = 0x80;
18422
18423 salt->salt_len = salt_len;
18424 salt->salt_iter = iter - 1;
18425
18426 // decode hash
18427
18428 u8 tmp_buf[100] = { 0 };
18429
18430 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18431
18432 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18433
18434 memcpy (digest, tmp_buf, 16);
18435
18436 // add some stuff to normal salt to make sorted happy
18437
18438 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18439 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18440 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18441 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18442 salt->salt_buf[4] = salt->salt_iter;
18443
18444 return (PARSER_OK);
18445 }
18446
18447 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18448 {
18449 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18450
18451 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18452
18453 u32 *digest = (u32 *) hash_buf->digest;
18454
18455 salt_t *salt = hash_buf->salt;
18456
18457 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18458
18459 /**
18460 * parse line
18461 */
18462
18463 // iterations
18464
18465 char *iter_pos = input_buf + 5;
18466
18467 u32 iter = atoi (iter_pos);
18468
18469 if (iter < 1) return (PARSER_SALT_ITERATION);
18470 if (iter > 999999) return (PARSER_SALT_ITERATION);
18471
18472 // first is *raw* salt
18473
18474 char *salt_pos = strchr (iter_pos, ':');
18475
18476 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18477
18478 salt_pos++;
18479
18480 char *hash_pos = strchr (salt_pos, ':');
18481
18482 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18483
18484 u32 salt_len = hash_pos - salt_pos;
18485
18486 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18487
18488 hash_pos++;
18489
18490 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18491
18492 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18493
18494 // decode salt
18495
18496 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18497
18498 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18499
18500 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18501
18502 salt_buf_ptr[salt_len + 3] = 0x01;
18503 salt_buf_ptr[salt_len + 4] = 0x80;
18504
18505 salt->salt_len = salt_len;
18506 salt->salt_iter = iter - 1;
18507
18508 // decode hash
18509
18510 u8 tmp_buf[100] = { 0 };
18511
18512 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18513
18514 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18515
18516 memcpy (digest, tmp_buf, 16);
18517
18518 digest[0] = byte_swap_32 (digest[0]);
18519 digest[1] = byte_swap_32 (digest[1]);
18520 digest[2] = byte_swap_32 (digest[2]);
18521 digest[3] = byte_swap_32 (digest[3]);
18522
18523 // add some stuff to normal salt to make sorted happy
18524
18525 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18526 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18527 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18528 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18529 salt->salt_buf[4] = salt->salt_iter;
18530
18531 return (PARSER_OK);
18532 }
18533
18534 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18535 {
18536 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18537
18538 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18539
18540 u64 *digest = (u64 *) hash_buf->digest;
18541
18542 salt_t *salt = hash_buf->salt;
18543
18544 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18545
18546 /**
18547 * parse line
18548 */
18549
18550 // iterations
18551
18552 char *iter_pos = input_buf + 7;
18553
18554 u32 iter = atoi (iter_pos);
18555
18556 if (iter < 1) return (PARSER_SALT_ITERATION);
18557 if (iter > 999999) return (PARSER_SALT_ITERATION);
18558
18559 // first is *raw* salt
18560
18561 char *salt_pos = strchr (iter_pos, ':');
18562
18563 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18564
18565 salt_pos++;
18566
18567 char *hash_pos = strchr (salt_pos, ':');
18568
18569 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18570
18571 u32 salt_len = hash_pos - salt_pos;
18572
18573 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18574
18575 hash_pos++;
18576
18577 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18578
18579 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18580
18581 // decode salt
18582
18583 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18584
18585 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18586
18587 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18588
18589 salt_buf_ptr[salt_len + 3] = 0x01;
18590 salt_buf_ptr[salt_len + 4] = 0x80;
18591
18592 salt->salt_len = salt_len;
18593 salt->salt_iter = iter - 1;
18594
18595 // decode hash
18596
18597 u8 tmp_buf[100] = { 0 };
18598
18599 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18600
18601 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18602
18603 memcpy (digest, tmp_buf, 64);
18604
18605 digest[0] = byte_swap_64 (digest[0]);
18606 digest[1] = byte_swap_64 (digest[1]);
18607 digest[2] = byte_swap_64 (digest[2]);
18608 digest[3] = byte_swap_64 (digest[3]);
18609 digest[4] = byte_swap_64 (digest[4]);
18610 digest[5] = byte_swap_64 (digest[5]);
18611 digest[6] = byte_swap_64 (digest[6]);
18612 digest[7] = byte_swap_64 (digest[7]);
18613
18614 // add some stuff to normal salt to make sorted happy
18615
18616 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18617 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18618 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18619 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18620 salt->salt_buf[4] = salt->salt_iter;
18621
18622 return (PARSER_OK);
18623 }
18624
18625 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18626 {
18627 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18628
18629 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18630
18631 uint *digest = (uint *) hash_buf->digest;
18632
18633 salt_t *salt = hash_buf->salt;
18634
18635 /**
18636 * parse line
18637 */
18638
18639 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18640
18641 char *hash_pos = strchr (salt_pos, '$');
18642
18643 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18644
18645 u32 salt_len = hash_pos - salt_pos;
18646
18647 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18648
18649 hash_pos++;
18650
18651 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18652
18653 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18654
18655 // decode hash
18656
18657 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18658 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18659 digest[ 2] = 0;
18660 digest[ 3] = 0;
18661 digest[ 4] = 0;
18662 digest[ 5] = 0;
18663 digest[ 6] = 0;
18664 digest[ 7] = 0;
18665 digest[ 8] = 0;
18666 digest[ 9] = 0;
18667 digest[10] = 0;
18668 digest[11] = 0;
18669 digest[12] = 0;
18670 digest[13] = 0;
18671 digest[14] = 0;
18672 digest[15] = 0;
18673
18674 // decode salt
18675
18676 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18677 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18678
18679 salt->salt_iter = ROUNDS_ECRYPTFS;
18680 salt->salt_len = 8;
18681
18682 return (PARSER_OK);
18683 }
18684
18685 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18686 {
18687 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18688
18689 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18690
18691 unsigned char c19 = itoa64_to_int (input_buf[19]);
18692
18693 if (c19 & 3) return (PARSER_HASH_VALUE);
18694
18695 salt_t *salt = hash_buf->salt;
18696
18697 u32 *digest = (u32 *) hash_buf->digest;
18698
18699 // iteration count
18700
18701 salt->salt_iter = itoa64_to_int (input_buf[1])
18702 | itoa64_to_int (input_buf[2]) << 6
18703 | itoa64_to_int (input_buf[3]) << 12
18704 | itoa64_to_int (input_buf[4]) << 18;
18705
18706 // set salt
18707
18708 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18709 | itoa64_to_int (input_buf[6]) << 6
18710 | itoa64_to_int (input_buf[7]) << 12
18711 | itoa64_to_int (input_buf[8]) << 18;
18712
18713 salt->salt_len = 4;
18714
18715 u8 tmp_buf[100] = { 0 };
18716
18717 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18718
18719 memcpy (digest, tmp_buf, 8);
18720
18721 uint tt;
18722
18723 IP (digest[0], digest[1], tt);
18724
18725 digest[0] = rotr32 (digest[0], 31);
18726 digest[1] = rotr32 (digest[1], 31);
18727 digest[2] = 0;
18728 digest[3] = 0;
18729
18730 return (PARSER_OK);
18731 }
18732
18733 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18734 {
18735 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18736
18737 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18738
18739 u32 *digest = (u32 *) hash_buf->digest;
18740
18741 salt_t *salt = hash_buf->salt;
18742
18743 /**
18744 * parse line
18745 */
18746
18747 char *type_pos = input_buf + 6 + 1;
18748
18749 char *salt_pos = strchr (type_pos, '*');
18750
18751 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18752
18753 u32 type_len = salt_pos - type_pos;
18754
18755 if (type_len != 1) return (PARSER_SALT_LENGTH);
18756
18757 salt_pos++;
18758
18759 char *crypted_pos = strchr (salt_pos, '*');
18760
18761 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18762
18763 u32 salt_len = crypted_pos - salt_pos;
18764
18765 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18766
18767 crypted_pos++;
18768
18769 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18770
18771 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18772
18773 /**
18774 * copy data
18775 */
18776
18777 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18778 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18779
18780 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18781 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18782
18783 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18784 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18785 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18786 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18787
18788 salt->salt_len = 24;
18789 salt->salt_iter = ROUNDS_RAR3;
18790
18791 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18792 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18793
18794 digest[0] = 0xc43d7b00;
18795 digest[1] = 0x40070000;
18796 digest[2] = 0;
18797 digest[3] = 0;
18798
18799 return (PARSER_OK);
18800 }
18801
18802 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18803 {
18804 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18805
18806 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18807
18808 u32 *digest = (u32 *) hash_buf->digest;
18809
18810 salt_t *salt = hash_buf->salt;
18811
18812 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18813
18814 /**
18815 * parse line
18816 */
18817
18818 char *param0_pos = input_buf + 1 + 4 + 1;
18819
18820 char *param1_pos = strchr (param0_pos, '$');
18821
18822 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18823
18824 u32 param0_len = param1_pos - param0_pos;
18825
18826 param1_pos++;
18827
18828 char *param2_pos = strchr (param1_pos, '$');
18829
18830 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18831
18832 u32 param1_len = param2_pos - param1_pos;
18833
18834 param2_pos++;
18835
18836 char *param3_pos = strchr (param2_pos, '$');
18837
18838 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18839
18840 u32 param2_len = param3_pos - param2_pos;
18841
18842 param3_pos++;
18843
18844 char *param4_pos = strchr (param3_pos, '$');
18845
18846 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18847
18848 u32 param3_len = param4_pos - param3_pos;
18849
18850 param4_pos++;
18851
18852 char *param5_pos = strchr (param4_pos, '$');
18853
18854 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18855
18856 u32 param4_len = param5_pos - param4_pos;
18857
18858 param5_pos++;
18859
18860 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18861
18862 char *salt_buf = param1_pos;
18863 char *iv = param3_pos;
18864 char *pswcheck = param5_pos;
18865
18866 const uint salt_len = atoi (param0_pos);
18867 const uint iterations = atoi (param2_pos);
18868 const uint pswcheck_len = atoi (param4_pos);
18869
18870 /**
18871 * verify some data
18872 */
18873
18874 if (param1_len != 32) return (PARSER_SALT_VALUE);
18875 if (param3_len != 32) return (PARSER_SALT_VALUE);
18876 if (param5_len != 16) return (PARSER_SALT_VALUE);
18877
18878 if (salt_len != 16) return (PARSER_SALT_VALUE);
18879 if (iterations == 0) return (PARSER_SALT_VALUE);
18880 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18881
18882 /**
18883 * store data
18884 */
18885
18886 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18887 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18888 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18889 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18890
18891 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18892 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18893 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18894 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18895
18896 salt->salt_len = 16;
18897
18898 salt->salt_sign[0] = iterations;
18899
18900 salt->salt_iter = ((1 << iterations) + 32) - 1;
18901
18902 /**
18903 * digest buf
18904 */
18905
18906 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18907 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18908 digest[2] = 0;
18909 digest[3] = 0;
18910
18911 return (PARSER_OK);
18912 }
18913
18914 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18915 {
18916 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18917
18918 u32 *digest = (u32 *) hash_buf->digest;
18919
18920 salt_t *salt = hash_buf->salt;
18921
18922 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18923 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18924 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18925 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18926 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18927 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18928 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18929 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18930
18931 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18932
18933 uint salt_len = input_len - 64 - 1;
18934
18935 char *salt_buf = input_buf + 64 + 1;
18936
18937 char *salt_buf_ptr = (char *) salt->salt_buf;
18938
18939 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18940
18941 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18942
18943 salt->salt_len = salt_len;
18944
18945 /**
18946 * we can precompute the first sha256 transform
18947 */
18948
18949 uint w[16] = { 0 };
18950
18951 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18952 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18953 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18954 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18955 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18956 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18957 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18958 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18959 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18960 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18961 w[10] = byte_swap_32 (salt->salt_buf[10]);
18962 w[11] = byte_swap_32 (salt->salt_buf[11]);
18963 w[12] = byte_swap_32 (salt->salt_buf[12]);
18964 w[13] = byte_swap_32 (salt->salt_buf[13]);
18965 w[14] = byte_swap_32 (salt->salt_buf[14]);
18966 w[15] = byte_swap_32 (salt->salt_buf[15]);
18967
18968 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
18969
18970 sha256_64 (w, pc256);
18971
18972 salt->salt_buf_pc[0] = pc256[0];
18973 salt->salt_buf_pc[1] = pc256[1];
18974 salt->salt_buf_pc[2] = pc256[2];
18975 salt->salt_buf_pc[3] = pc256[3];
18976 salt->salt_buf_pc[4] = pc256[4];
18977 salt->salt_buf_pc[5] = pc256[5];
18978 salt->salt_buf_pc[6] = pc256[6];
18979 salt->salt_buf_pc[7] = pc256[7];
18980
18981 digest[0] -= pc256[0];
18982 digest[1] -= pc256[1];
18983 digest[2] -= pc256[2];
18984 digest[3] -= pc256[3];
18985 digest[4] -= pc256[4];
18986 digest[5] -= pc256[5];
18987 digest[6] -= pc256[6];
18988 digest[7] -= pc256[7];
18989
18990 return (PARSER_OK);
18991 }
18992
18993 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18994 {
18995 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18996
18997 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18998
18999 u32 *digest = (u32 *) hash_buf->digest;
19000
19001 salt_t *salt = hash_buf->salt;
19002
19003 /**
19004 * parse line
19005 */
19006
19007 char *data_len_pos = input_buf + 1 + 10 + 1;
19008
19009 char *data_buf_pos = strchr (data_len_pos, '$');
19010
19011 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19012
19013 u32 data_len_len = data_buf_pos - data_len_pos;
19014
19015 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
19016 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
19017
19018 data_buf_pos++;
19019
19020 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
19021
19022 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
19023
19024 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
19025
19026 u32 data_len = atoi (data_len_pos);
19027
19028 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
19029
19030 /**
19031 * salt
19032 */
19033
19034 char *salt_pos = data_buf_pos;
19035
19036 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
19037 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
19038 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
19039 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
19040
19041 // this is actually the CT, which is also the hash later (if matched)
19042
19043 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
19044 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
19045 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
19046 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
19047
19048 salt->salt_len = 32; // note we need to fix this to 16 in kernel
19049
19050 salt->salt_iter = 10 - 1;
19051
19052 /**
19053 * digest buf
19054 */
19055
19056 digest[0] = salt->salt_buf[4];
19057 digest[1] = salt->salt_buf[5];
19058 digest[2] = salt->salt_buf[6];
19059 digest[3] = salt->salt_buf[7];
19060
19061 return (PARSER_OK);
19062 }
19063
19064 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19065 {
19066 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
19067
19068 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19069
19070 u32 *digest = (u32 *) hash_buf->digest;
19071
19072 salt_t *salt = hash_buf->salt;
19073
19074 /**
19075 * parse line
19076 */
19077
19078 char *salt_pos = input_buf + 11 + 1;
19079
19080 char *iter_pos = strchr (salt_pos, ',');
19081
19082 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19083
19084 u32 salt_len = iter_pos - salt_pos;
19085
19086 if (salt_len != 20) return (PARSER_SALT_LENGTH);
19087
19088 iter_pos++;
19089
19090 char *hash_pos = strchr (iter_pos, ',');
19091
19092 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19093
19094 u32 iter_len = hash_pos - iter_pos;
19095
19096 if (iter_len > 5) return (PARSER_SALT_LENGTH);
19097
19098 hash_pos++;
19099
19100 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
19101
19102 if (hash_len != 64) return (PARSER_HASH_LENGTH);
19103
19104 /**
19105 * salt
19106 */
19107
19108 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
19109 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
19110 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
19111 salt->salt_buf[3] = 0x00018000;
19112
19113 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19114 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19115 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
19116 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
19117
19118 salt->salt_len = salt_len / 2;
19119
19120 salt->salt_iter = atoi (iter_pos) - 1;
19121
19122 /**
19123 * digest buf
19124 */
19125
19126 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19127 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19128 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19129 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19130 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19131 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19132 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19133 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19134
19135 return (PARSER_OK);
19136 }
19137
19138 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19139 {
19140 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
19141
19142 u32 *digest = (u32 *) hash_buf->digest;
19143
19144 salt_t *salt = hash_buf->salt;
19145
19146 /**
19147 * parse line
19148 */
19149
19150 char *hash_pos = input_buf + 64;
19151 char *salt1_pos = input_buf + 128;
19152 char *salt2_pos = input_buf;
19153
19154 /**
19155 * salt
19156 */
19157
19158 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
19159 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
19160 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
19161 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
19162
19163 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
19164 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
19165 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
19166 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
19167
19168 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
19169 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
19170 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
19171 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
19172
19173 salt->salt_len = 48;
19174
19175 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
19176
19177 /**
19178 * digest buf
19179 */
19180
19181 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19182 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19183 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19184 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19185 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19186 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19187 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19188 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19189
19190 return (PARSER_OK);
19191 }
19192
19193 /**
19194 * parallel running threads
19195 */
19196
19197 #ifdef WIN
19198
19199 BOOL WINAPI sigHandler_default (DWORD sig)
19200 {
19201 switch (sig)
19202 {
19203 case CTRL_CLOSE_EVENT:
19204
19205 /*
19206 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
19207 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
19208 * function otherwise it is too late (e.g. after returning from this function)
19209 */
19210
19211 myabort ();
19212
19213 SetConsoleCtrlHandler (NULL, TRUE);
19214
19215 hc_sleep (10);
19216
19217 return TRUE;
19218
19219 case CTRL_C_EVENT:
19220 case CTRL_LOGOFF_EVENT:
19221 case CTRL_SHUTDOWN_EVENT:
19222
19223 myabort ();
19224
19225 SetConsoleCtrlHandler (NULL, TRUE);
19226
19227 return TRUE;
19228 }
19229
19230 return FALSE;
19231 }
19232
19233 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19234 {
19235 switch (sig)
19236 {
19237 case CTRL_CLOSE_EVENT:
19238
19239 myabort ();
19240
19241 SetConsoleCtrlHandler (NULL, TRUE);
19242
19243 hc_sleep (10);
19244
19245 return TRUE;
19246
19247 case CTRL_C_EVENT:
19248 case CTRL_LOGOFF_EVENT:
19249 case CTRL_SHUTDOWN_EVENT:
19250
19251 myquit ();
19252
19253 SetConsoleCtrlHandler (NULL, TRUE);
19254
19255 return TRUE;
19256 }
19257
19258 return FALSE;
19259 }
19260
19261 void hc_signal (BOOL WINAPI (callback) (DWORD))
19262 {
19263 if (callback == NULL)
19264 {
19265 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19266 }
19267 else
19268 {
19269 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19270 }
19271 }
19272
19273 #else
19274
19275 void sigHandler_default (int sig)
19276 {
19277 myabort ();
19278
19279 signal (sig, NULL);
19280 }
19281
19282 void sigHandler_benchmark (int sig)
19283 {
19284 myquit ();
19285
19286 signal (sig, NULL);
19287 }
19288
19289 void hc_signal (void (callback) (int))
19290 {
19291 if (callback == NULL) callback = SIG_DFL;
19292
19293 signal (SIGINT, callback);
19294 signal (SIGTERM, callback);
19295 signal (SIGABRT, callback);
19296 }
19297
19298 #endif
19299
19300 void status_display ();
19301
19302 void *thread_keypress (void *p)
19303 {
19304 int benchmark = *((int *) p);
19305
19306 uint quiet = data.quiet;
19307
19308 tty_break();
19309
19310 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19311 {
19312 int ch = tty_getchar();
19313
19314 if (ch == -1) break;
19315
19316 if (ch == 0) continue;
19317
19318 #ifdef _POSIX
19319 if (ch != '\n')
19320 #endif
19321
19322 hc_thread_mutex_lock (mux_display);
19323
19324 log_info ("");
19325
19326 switch (ch)
19327 {
19328 case 's':
19329 case '\n':
19330
19331 log_info ("");
19332
19333 status_display ();
19334
19335 log_info ("");
19336
19337 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19338 if (quiet == 0) fflush (stdout);
19339
19340 break;
19341
19342 case 'b':
19343
19344 log_info ("");
19345
19346 bypass ();
19347
19348 log_info ("");
19349
19350 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19351 if (quiet == 0) fflush (stdout);
19352
19353 break;
19354
19355 case 'p':
19356
19357 log_info ("");
19358
19359 SuspendThreads ();
19360
19361 log_info ("");
19362
19363 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19364 if (quiet == 0) fflush (stdout);
19365
19366 break;
19367
19368 case 'r':
19369
19370 log_info ("");
19371
19372 ResumeThreads ();
19373
19374 log_info ("");
19375
19376 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19377 if (quiet == 0) fflush (stdout);
19378
19379 break;
19380
19381 case 'c':
19382
19383 log_info ("");
19384
19385 if (benchmark == 1) break;
19386
19387 stop_at_checkpoint ();
19388
19389 log_info ("");
19390
19391 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19392 if (quiet == 0) fflush (stdout);
19393
19394 break;
19395
19396 case 'q':
19397
19398 log_info ("");
19399
19400 if (benchmark == 1)
19401 {
19402 myquit ();
19403 }
19404 else
19405 {
19406 myabort ();
19407 }
19408
19409 break;
19410 }
19411
19412 hc_thread_mutex_unlock (mux_display);
19413 }
19414
19415 tty_fix();
19416
19417 return (p);
19418 }
19419
19420 /**
19421 * rules common
19422 */
19423
19424 bool class_num (const u8 c)
19425 {
19426 return ((c >= '0') && (c <= '9'));
19427 }
19428
19429 bool class_lower (const u8 c)
19430 {
19431 return ((c >= 'a') && (c <= 'z'));
19432 }
19433
19434 bool class_upper (const u8 c)
19435 {
19436 return ((c >= 'A') && (c <= 'Z'));
19437 }
19438
19439 bool class_alpha (const u8 c)
19440 {
19441 return (class_lower (c) || class_upper (c));
19442 }
19443
19444 int conv_ctoi (const u8 c)
19445 {
19446 if (class_num (c))
19447 {
19448 return c - '0';
19449 }
19450 else if (class_upper (c))
19451 {
19452 return c - 'A' + 10;
19453 }
19454
19455 return -1;
19456 }
19457
19458 int conv_itoc (const u8 c)
19459 {
19460 if (c < 10)
19461 {
19462 return c + '0';
19463 }
19464 else if (c < 37)
19465 {
19466 return c + 'A' - 10;
19467 }
19468
19469 return -1;
19470 }
19471
19472 /**
19473 * device rules
19474 */
19475
19476 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19477 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19478 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19479 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19480 #define MAX_KERNEL_RULES 255
19481 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19482 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19483 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19484
19485 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19486 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19487 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19488 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19489
19490 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19491 {
19492 uint rule_pos;
19493 uint rule_cnt;
19494
19495 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19496 {
19497 switch (rule_buf[rule_pos])
19498 {
19499 case ' ':
19500 rule_cnt--;
19501 break;
19502
19503 case RULE_OP_MANGLE_NOOP:
19504 SET_NAME (rule, rule_buf[rule_pos]);
19505 break;
19506
19507 case RULE_OP_MANGLE_LREST:
19508 SET_NAME (rule, rule_buf[rule_pos]);
19509 break;
19510
19511 case RULE_OP_MANGLE_UREST:
19512 SET_NAME (rule, rule_buf[rule_pos]);
19513 break;
19514
19515 case RULE_OP_MANGLE_LREST_UFIRST:
19516 SET_NAME (rule, rule_buf[rule_pos]);
19517 break;
19518
19519 case RULE_OP_MANGLE_UREST_LFIRST:
19520 SET_NAME (rule, rule_buf[rule_pos]);
19521 break;
19522
19523 case RULE_OP_MANGLE_TREST:
19524 SET_NAME (rule, rule_buf[rule_pos]);
19525 break;
19526
19527 case RULE_OP_MANGLE_TOGGLE_AT:
19528 SET_NAME (rule, rule_buf[rule_pos]);
19529 SET_P0_CONV (rule, rule_buf[rule_pos]);
19530 break;
19531
19532 case RULE_OP_MANGLE_REVERSE:
19533 SET_NAME (rule, rule_buf[rule_pos]);
19534 break;
19535
19536 case RULE_OP_MANGLE_DUPEWORD:
19537 SET_NAME (rule, rule_buf[rule_pos]);
19538 break;
19539
19540 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19541 SET_NAME (rule, rule_buf[rule_pos]);
19542 SET_P0_CONV (rule, rule_buf[rule_pos]);
19543 break;
19544
19545 case RULE_OP_MANGLE_REFLECT:
19546 SET_NAME (rule, rule_buf[rule_pos]);
19547 break;
19548
19549 case RULE_OP_MANGLE_ROTATE_LEFT:
19550 SET_NAME (rule, rule_buf[rule_pos]);
19551 break;
19552
19553 case RULE_OP_MANGLE_ROTATE_RIGHT:
19554 SET_NAME (rule, rule_buf[rule_pos]);
19555 break;
19556
19557 case RULE_OP_MANGLE_APPEND:
19558 SET_NAME (rule, rule_buf[rule_pos]);
19559 SET_P0 (rule, rule_buf[rule_pos]);
19560 break;
19561
19562 case RULE_OP_MANGLE_PREPEND:
19563 SET_NAME (rule, rule_buf[rule_pos]);
19564 SET_P0 (rule, rule_buf[rule_pos]);
19565 break;
19566
19567 case RULE_OP_MANGLE_DELETE_FIRST:
19568 SET_NAME (rule, rule_buf[rule_pos]);
19569 break;
19570
19571 case RULE_OP_MANGLE_DELETE_LAST:
19572 SET_NAME (rule, rule_buf[rule_pos]);
19573 break;
19574
19575 case RULE_OP_MANGLE_DELETE_AT:
19576 SET_NAME (rule, rule_buf[rule_pos]);
19577 SET_P0_CONV (rule, rule_buf[rule_pos]);
19578 break;
19579
19580 case RULE_OP_MANGLE_EXTRACT:
19581 SET_NAME (rule, rule_buf[rule_pos]);
19582 SET_P0_CONV (rule, rule_buf[rule_pos]);
19583 SET_P1_CONV (rule, rule_buf[rule_pos]);
19584 break;
19585
19586 case RULE_OP_MANGLE_OMIT:
19587 SET_NAME (rule, rule_buf[rule_pos]);
19588 SET_P0_CONV (rule, rule_buf[rule_pos]);
19589 SET_P1_CONV (rule, rule_buf[rule_pos]);
19590 break;
19591
19592 case RULE_OP_MANGLE_INSERT:
19593 SET_NAME (rule, rule_buf[rule_pos]);
19594 SET_P0_CONV (rule, rule_buf[rule_pos]);
19595 SET_P1 (rule, rule_buf[rule_pos]);
19596 break;
19597
19598 case RULE_OP_MANGLE_OVERSTRIKE:
19599 SET_NAME (rule, rule_buf[rule_pos]);
19600 SET_P0_CONV (rule, rule_buf[rule_pos]);
19601 SET_P1 (rule, rule_buf[rule_pos]);
19602 break;
19603
19604 case RULE_OP_MANGLE_TRUNCATE_AT:
19605 SET_NAME (rule, rule_buf[rule_pos]);
19606 SET_P0_CONV (rule, rule_buf[rule_pos]);
19607 break;
19608
19609 case RULE_OP_MANGLE_REPLACE:
19610 SET_NAME (rule, rule_buf[rule_pos]);
19611 SET_P0 (rule, rule_buf[rule_pos]);
19612 SET_P1 (rule, rule_buf[rule_pos]);
19613 break;
19614
19615 case RULE_OP_MANGLE_PURGECHAR:
19616 return (-1);
19617 break;
19618
19619 case RULE_OP_MANGLE_TOGGLECASE_REC:
19620 return (-1);
19621 break;
19622
19623 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19624 SET_NAME (rule, rule_buf[rule_pos]);
19625 SET_P0_CONV (rule, rule_buf[rule_pos]);
19626 break;
19627
19628 case RULE_OP_MANGLE_DUPECHAR_LAST:
19629 SET_NAME (rule, rule_buf[rule_pos]);
19630 SET_P0_CONV (rule, rule_buf[rule_pos]);
19631 break;
19632
19633 case RULE_OP_MANGLE_DUPECHAR_ALL:
19634 SET_NAME (rule, rule_buf[rule_pos]);
19635 break;
19636
19637 case RULE_OP_MANGLE_SWITCH_FIRST:
19638 SET_NAME (rule, rule_buf[rule_pos]);
19639 break;
19640
19641 case RULE_OP_MANGLE_SWITCH_LAST:
19642 SET_NAME (rule, rule_buf[rule_pos]);
19643 break;
19644
19645 case RULE_OP_MANGLE_SWITCH_AT:
19646 SET_NAME (rule, rule_buf[rule_pos]);
19647 SET_P0_CONV (rule, rule_buf[rule_pos]);
19648 SET_P1_CONV (rule, rule_buf[rule_pos]);
19649 break;
19650
19651 case RULE_OP_MANGLE_CHR_SHIFTL:
19652 SET_NAME (rule, rule_buf[rule_pos]);
19653 SET_P0_CONV (rule, rule_buf[rule_pos]);
19654 break;
19655
19656 case RULE_OP_MANGLE_CHR_SHIFTR:
19657 SET_NAME (rule, rule_buf[rule_pos]);
19658 SET_P0_CONV (rule, rule_buf[rule_pos]);
19659 break;
19660
19661 case RULE_OP_MANGLE_CHR_INCR:
19662 SET_NAME (rule, rule_buf[rule_pos]);
19663 SET_P0_CONV (rule, rule_buf[rule_pos]);
19664 break;
19665
19666 case RULE_OP_MANGLE_CHR_DECR:
19667 SET_NAME (rule, rule_buf[rule_pos]);
19668 SET_P0_CONV (rule, rule_buf[rule_pos]);
19669 break;
19670
19671 case RULE_OP_MANGLE_REPLACE_NP1:
19672 SET_NAME (rule, rule_buf[rule_pos]);
19673 SET_P0_CONV (rule, rule_buf[rule_pos]);
19674 break;
19675
19676 case RULE_OP_MANGLE_REPLACE_NM1:
19677 SET_NAME (rule, rule_buf[rule_pos]);
19678 SET_P0_CONV (rule, rule_buf[rule_pos]);
19679 break;
19680
19681 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19682 SET_NAME (rule, rule_buf[rule_pos]);
19683 SET_P0_CONV (rule, rule_buf[rule_pos]);
19684 break;
19685
19686 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19687 SET_NAME (rule, rule_buf[rule_pos]);
19688 SET_P0_CONV (rule, rule_buf[rule_pos]);
19689 break;
19690
19691 case RULE_OP_MANGLE_TITLE:
19692 SET_NAME (rule, rule_buf[rule_pos]);
19693 break;
19694
19695 default:
19696 return (-1);
19697 break;
19698 }
19699 }
19700
19701 if (rule_pos < rule_len) return (-1);
19702
19703 return (0);
19704 }
19705
19706 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19707 {
19708 uint rule_cnt;
19709 uint rule_pos;
19710 uint rule_len = BUFSIZ - 1; // maximum possible len
19711
19712 char rule_cmd;
19713
19714 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19715 {
19716 GET_NAME (rule);
19717
19718 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19719
19720 switch (rule_cmd)
19721 {
19722 case RULE_OP_MANGLE_NOOP:
19723 rule_buf[rule_pos] = rule_cmd;
19724 break;
19725
19726 case RULE_OP_MANGLE_LREST:
19727 rule_buf[rule_pos] = rule_cmd;
19728 break;
19729
19730 case RULE_OP_MANGLE_UREST:
19731 rule_buf[rule_pos] = rule_cmd;
19732 break;
19733
19734 case RULE_OP_MANGLE_LREST_UFIRST:
19735 rule_buf[rule_pos] = rule_cmd;
19736 break;
19737
19738 case RULE_OP_MANGLE_UREST_LFIRST:
19739 rule_buf[rule_pos] = rule_cmd;
19740 break;
19741
19742 case RULE_OP_MANGLE_TREST:
19743 rule_buf[rule_pos] = rule_cmd;
19744 break;
19745
19746 case RULE_OP_MANGLE_TOGGLE_AT:
19747 rule_buf[rule_pos] = rule_cmd;
19748 GET_P0_CONV (rule);
19749 break;
19750
19751 case RULE_OP_MANGLE_REVERSE:
19752 rule_buf[rule_pos] = rule_cmd;
19753 break;
19754
19755 case RULE_OP_MANGLE_DUPEWORD:
19756 rule_buf[rule_pos] = rule_cmd;
19757 break;
19758
19759 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19760 rule_buf[rule_pos] = rule_cmd;
19761 GET_P0_CONV (rule);
19762 break;
19763
19764 case RULE_OP_MANGLE_REFLECT:
19765 rule_buf[rule_pos] = rule_cmd;
19766 break;
19767
19768 case RULE_OP_MANGLE_ROTATE_LEFT:
19769 rule_buf[rule_pos] = rule_cmd;
19770 break;
19771
19772 case RULE_OP_MANGLE_ROTATE_RIGHT:
19773 rule_buf[rule_pos] = rule_cmd;
19774 break;
19775
19776 case RULE_OP_MANGLE_APPEND:
19777 rule_buf[rule_pos] = rule_cmd;
19778 GET_P0 (rule);
19779 break;
19780
19781 case RULE_OP_MANGLE_PREPEND:
19782 rule_buf[rule_pos] = rule_cmd;
19783 GET_P0 (rule);
19784 break;
19785
19786 case RULE_OP_MANGLE_DELETE_FIRST:
19787 rule_buf[rule_pos] = rule_cmd;
19788 break;
19789
19790 case RULE_OP_MANGLE_DELETE_LAST:
19791 rule_buf[rule_pos] = rule_cmd;
19792 break;
19793
19794 case RULE_OP_MANGLE_DELETE_AT:
19795 rule_buf[rule_pos] = rule_cmd;
19796 GET_P0_CONV (rule);
19797 break;
19798
19799 case RULE_OP_MANGLE_EXTRACT:
19800 rule_buf[rule_pos] = rule_cmd;
19801 GET_P0_CONV (rule);
19802 GET_P1_CONV (rule);
19803 break;
19804
19805 case RULE_OP_MANGLE_OMIT:
19806 rule_buf[rule_pos] = rule_cmd;
19807 GET_P0_CONV (rule);
19808 GET_P1_CONV (rule);
19809 break;
19810
19811 case RULE_OP_MANGLE_INSERT:
19812 rule_buf[rule_pos] = rule_cmd;
19813 GET_P0_CONV (rule);
19814 GET_P1 (rule);
19815 break;
19816
19817 case RULE_OP_MANGLE_OVERSTRIKE:
19818 rule_buf[rule_pos] = rule_cmd;
19819 GET_P0_CONV (rule);
19820 GET_P1 (rule);
19821 break;
19822
19823 case RULE_OP_MANGLE_TRUNCATE_AT:
19824 rule_buf[rule_pos] = rule_cmd;
19825 GET_P0_CONV (rule);
19826 break;
19827
19828 case RULE_OP_MANGLE_REPLACE:
19829 rule_buf[rule_pos] = rule_cmd;
19830 GET_P0 (rule);
19831 GET_P1 (rule);
19832 break;
19833
19834 case RULE_OP_MANGLE_PURGECHAR:
19835 return (-1);
19836 break;
19837
19838 case RULE_OP_MANGLE_TOGGLECASE_REC:
19839 return (-1);
19840 break;
19841
19842 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19843 rule_buf[rule_pos] = rule_cmd;
19844 GET_P0_CONV (rule);
19845 break;
19846
19847 case RULE_OP_MANGLE_DUPECHAR_LAST:
19848 rule_buf[rule_pos] = rule_cmd;
19849 GET_P0_CONV (rule);
19850 break;
19851
19852 case RULE_OP_MANGLE_DUPECHAR_ALL:
19853 rule_buf[rule_pos] = rule_cmd;
19854 break;
19855
19856 case RULE_OP_MANGLE_SWITCH_FIRST:
19857 rule_buf[rule_pos] = rule_cmd;
19858 break;
19859
19860 case RULE_OP_MANGLE_SWITCH_LAST:
19861 rule_buf[rule_pos] = rule_cmd;
19862 break;
19863
19864 case RULE_OP_MANGLE_SWITCH_AT:
19865 rule_buf[rule_pos] = rule_cmd;
19866 GET_P0_CONV (rule);
19867 GET_P1_CONV (rule);
19868 break;
19869
19870 case RULE_OP_MANGLE_CHR_SHIFTL:
19871 rule_buf[rule_pos] = rule_cmd;
19872 GET_P0_CONV (rule);
19873 break;
19874
19875 case RULE_OP_MANGLE_CHR_SHIFTR:
19876 rule_buf[rule_pos] = rule_cmd;
19877 GET_P0_CONV (rule);
19878 break;
19879
19880 case RULE_OP_MANGLE_CHR_INCR:
19881 rule_buf[rule_pos] = rule_cmd;
19882 GET_P0_CONV (rule);
19883 break;
19884
19885 case RULE_OP_MANGLE_CHR_DECR:
19886 rule_buf[rule_pos] = rule_cmd;
19887 GET_P0_CONV (rule);
19888 break;
19889
19890 case RULE_OP_MANGLE_REPLACE_NP1:
19891 rule_buf[rule_pos] = rule_cmd;
19892 GET_P0_CONV (rule);
19893 break;
19894
19895 case RULE_OP_MANGLE_REPLACE_NM1:
19896 rule_buf[rule_pos] = rule_cmd;
19897 GET_P0_CONV (rule);
19898 break;
19899
19900 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19901 rule_buf[rule_pos] = rule_cmd;
19902 GET_P0_CONV (rule);
19903 break;
19904
19905 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19906 rule_buf[rule_pos] = rule_cmd;
19907 GET_P0_CONV (rule);
19908 break;
19909
19910 case RULE_OP_MANGLE_TITLE:
19911 rule_buf[rule_pos] = rule_cmd;
19912 break;
19913
19914 case 0:
19915 return rule_pos - 1;
19916 break;
19917
19918 default:
19919 return (-1);
19920 break;
19921 }
19922 }
19923
19924 if (rule_cnt > 0)
19925 {
19926 return rule_pos;
19927 }
19928
19929 return (-1);
19930 }
19931
19932 /**
19933 * CPU rules : this is from hashcat sources, cpu based rules
19934 */
19935
19936 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19937 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19938
19939 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19940 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19941 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19942
19943 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19944 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19945 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19946
19947 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19948 {
19949 int pos;
19950
19951 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19952
19953 return (arr_len);
19954 }
19955
19956 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19957 {
19958 int pos;
19959
19960 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19961
19962 return (arr_len);
19963 }
19964
19965 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19966 {
19967 int pos;
19968
19969 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19970
19971 return (arr_len);
19972 }
19973
19974 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19975 {
19976 int l;
19977 int r;
19978
19979 for (l = 0; l < arr_len; l++)
19980 {
19981 r = arr_len - 1 - l;
19982
19983 if (l >= r) break;
19984
19985 MANGLE_SWITCH (arr, l, r);
19986 }
19987
19988 return (arr_len);
19989 }
19990
19991 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19992 {
19993 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19994
19995 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19996
19997 return (arr_len * 2);
19998 }
19999
20000 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
20001 {
20002 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
20003
20004 int orig_len = arr_len;
20005
20006 int i;
20007
20008 for (i = 0; i < times; i++)
20009 {
20010 memcpy (&arr[arr_len], arr, orig_len);
20011
20012 arr_len += orig_len;
20013 }
20014
20015 return (arr_len);
20016 }
20017
20018 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
20019 {
20020 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
20021
20022 mangle_double (arr, arr_len);
20023
20024 mangle_reverse (arr + arr_len, arr_len);
20025
20026 return (arr_len * 2);
20027 }
20028
20029 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
20030 {
20031 int l;
20032 int r;
20033
20034 for (l = 0, r = arr_len - 1; r > 0; r--)
20035 {
20036 MANGLE_SWITCH (arr, l, r);
20037 }
20038
20039 return (arr_len);
20040 }
20041
20042 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
20043 {
20044 int l;
20045 int r;
20046
20047 for (l = 0, r = arr_len - 1; l < r; l++)
20048 {
20049 MANGLE_SWITCH (arr, l, r);
20050 }
20051
20052 return (arr_len);
20053 }
20054
20055 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
20056 {
20057 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20058
20059 arr[arr_len] = c;
20060
20061 return (arr_len + 1);
20062 }
20063
20064 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
20065 {
20066 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20067
20068 int arr_pos;
20069
20070 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20071 {
20072 arr[arr_pos + 1] = arr[arr_pos];
20073 }
20074
20075 arr[0] = c;
20076
20077 return (arr_len + 1);
20078 }
20079
20080 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
20081 {
20082 if (upos >= arr_len) return (arr_len);
20083
20084 int arr_pos;
20085
20086 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
20087 {
20088 arr[arr_pos] = arr[arr_pos + 1];
20089 }
20090
20091 return (arr_len - 1);
20092 }
20093
20094 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20095 {
20096 if (upos >= arr_len) return (arr_len);
20097
20098 if ((upos + ulen) > arr_len) return (arr_len);
20099
20100 int arr_pos;
20101
20102 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
20103 {
20104 arr[arr_pos] = arr[upos + arr_pos];
20105 }
20106
20107 return (ulen);
20108 }
20109
20110 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20111 {
20112 if (upos >= arr_len) return (arr_len);
20113
20114 if ((upos + ulen) >= arr_len) return (arr_len);
20115
20116 int arr_pos;
20117
20118 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
20119 {
20120 arr[arr_pos] = arr[arr_pos + ulen];
20121 }
20122
20123 return (arr_len - ulen);
20124 }
20125
20126 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20127 {
20128 if (upos >= arr_len) return (arr_len);
20129
20130 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20131
20132 int arr_pos;
20133
20134 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
20135 {
20136 arr[arr_pos + 1] = arr[arr_pos];
20137 }
20138
20139 arr[upos] = c;
20140
20141 return (arr_len + 1);
20142 }
20143
20144 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)
20145 {
20146 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20147
20148 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
20149
20150 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
20151
20152 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
20153
20154 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
20155
20156 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
20157
20158 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
20159
20160 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
20161
20162 return (arr_len + arr2_cpy);
20163 }
20164
20165 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20166 {
20167 if (upos >= arr_len) return (arr_len);
20168
20169 arr[upos] = c;
20170
20171 return (arr_len);
20172 }
20173
20174 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
20175 {
20176 if (upos >= arr_len) return (arr_len);
20177
20178 memset (arr + upos, 0, arr_len - upos);
20179
20180 return (upos);
20181 }
20182
20183 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
20184 {
20185 int arr_pos;
20186
20187 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
20188 {
20189 if (arr[arr_pos] != oldc) continue;
20190
20191 arr[arr_pos] = newc;
20192 }
20193
20194 return (arr_len);
20195 }
20196
20197 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
20198 {
20199 int arr_pos;
20200
20201 int ret_len;
20202
20203 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
20204 {
20205 if (arr[arr_pos] == c) continue;
20206
20207 arr[ret_len] = arr[arr_pos];
20208
20209 ret_len++;
20210 }
20211
20212 return (ret_len);
20213 }
20214
20215 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
20216 {
20217 if (ulen > arr_len) return (arr_len);
20218
20219 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20220
20221 char cs[100] = { 0 };
20222
20223 memcpy (cs, arr, ulen);
20224
20225 int i;
20226
20227 for (i = 0; i < ulen; i++)
20228 {
20229 char c = cs[i];
20230
20231 arr_len = mangle_insert (arr, arr_len, i, c);
20232 }
20233
20234 return (arr_len);
20235 }
20236
20237 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20238 {
20239 if (ulen > arr_len) return (arr_len);
20240
20241 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20242
20243 int upos = arr_len - ulen;
20244
20245 int i;
20246
20247 for (i = 0; i < ulen; i++)
20248 {
20249 char c = arr[upos + i];
20250
20251 arr_len = mangle_append (arr, arr_len, c);
20252 }
20253
20254 return (arr_len);
20255 }
20256
20257 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20258 {
20259 if ( arr_len == 0) return (arr_len);
20260 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20261
20262 char c = arr[upos];
20263
20264 int i;
20265
20266 for (i = 0; i < ulen; i++)
20267 {
20268 arr_len = mangle_insert (arr, arr_len, upos, c);
20269 }
20270
20271 return (arr_len);
20272 }
20273
20274 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20275 {
20276 if ( arr_len == 0) return (arr_len);
20277 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20278
20279 int arr_pos;
20280
20281 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20282 {
20283 int new_pos = arr_pos * 2;
20284
20285 arr[new_pos] = arr[arr_pos];
20286
20287 arr[new_pos + 1] = arr[arr_pos];
20288 }
20289
20290 return (arr_len * 2);
20291 }
20292
20293 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20294 {
20295 if (upos >= arr_len) return (arr_len);
20296 if (upos2 >= arr_len) return (arr_len);
20297
20298 MANGLE_SWITCH (arr, upos, upos2);
20299
20300 return (arr_len);
20301 }
20302
20303 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20304 {
20305 MANGLE_SWITCH (arr, upos, upos2);
20306
20307 return (arr_len);
20308 }
20309
20310 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20311 {
20312 if (upos >= arr_len) return (arr_len);
20313
20314 arr[upos] <<= 1;
20315
20316 return (arr_len);
20317 }
20318
20319 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20320 {
20321 if (upos >= arr_len) return (arr_len);
20322
20323 arr[upos] >>= 1;
20324
20325 return (arr_len);
20326 }
20327
20328 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20329 {
20330 if (upos >= arr_len) return (arr_len);
20331
20332 arr[upos] += 1;
20333
20334 return (arr_len);
20335 }
20336
20337 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20338 {
20339 if (upos >= arr_len) return (arr_len);
20340
20341 arr[upos] -= 1;
20342
20343 return (arr_len);
20344 }
20345
20346 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20347 {
20348 int upper_next = 1;
20349
20350 int pos;
20351
20352 for (pos = 0; pos < arr_len; pos++)
20353 {
20354 if (arr[pos] == ' ')
20355 {
20356 upper_next = 1;
20357
20358 continue;
20359 }
20360
20361 if (upper_next)
20362 {
20363 upper_next = 0;
20364
20365 MANGLE_UPPER_AT (arr, pos);
20366 }
20367 else
20368 {
20369 MANGLE_LOWER_AT (arr, pos);
20370 }
20371 }
20372
20373 return (arr_len);
20374 }
20375
20376 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20377 {
20378 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20379
20380 u32 j;
20381
20382 u32 rule_pos = 0;
20383
20384 for (j = 0; j < rp_gen_num; j++)
20385 {
20386 u32 r = 0;
20387 u32 p1 = 0;
20388 u32 p2 = 0;
20389 u32 p3 = 0;
20390
20391 switch ((char) get_random_num (0, 9))
20392 {
20393 case 0:
20394 r = get_random_num (0, sizeof (grp_op_nop));
20395 rule_buf[rule_pos++] = grp_op_nop[r];
20396 break;
20397
20398 case 1:
20399 r = get_random_num (0, sizeof (grp_op_pos_p0));
20400 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20401 p1 = get_random_num (0, sizeof (grp_pos));
20402 rule_buf[rule_pos++] = grp_pos[p1];
20403 break;
20404
20405 case 2:
20406 r = get_random_num (0, sizeof (grp_op_pos_p1));
20407 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20408 p1 = get_random_num (1, 6);
20409 rule_buf[rule_pos++] = grp_pos[p1];
20410 break;
20411
20412 case 3:
20413 r = get_random_num (0, sizeof (grp_op_chr));
20414 rule_buf[rule_pos++] = grp_op_chr[r];
20415 p1 = get_random_num (0x20, 0x7e);
20416 rule_buf[rule_pos++] = (char) p1;
20417 break;
20418
20419 case 4:
20420 r = get_random_num (0, sizeof (grp_op_chr_chr));
20421 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20422 p1 = get_random_num (0x20, 0x7e);
20423 rule_buf[rule_pos++] = (char) p1;
20424 p2 = get_random_num (0x20, 0x7e);
20425 while (p1 == p2)
20426 p2 = get_random_num (0x20, 0x7e);
20427 rule_buf[rule_pos++] = (char) p2;
20428 break;
20429
20430 case 5:
20431 r = get_random_num (0, sizeof (grp_op_pos_chr));
20432 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20433 p1 = get_random_num (0, sizeof (grp_pos));
20434 rule_buf[rule_pos++] = grp_pos[p1];
20435 p2 = get_random_num (0x20, 0x7e);
20436 rule_buf[rule_pos++] = (char) p2;
20437 break;
20438
20439 case 6:
20440 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20441 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20442 p1 = get_random_num (0, sizeof (grp_pos));
20443 rule_buf[rule_pos++] = grp_pos[p1];
20444 p2 = get_random_num (0, sizeof (grp_pos));
20445 while (p1 == p2)
20446 p2 = get_random_num (0, sizeof (grp_pos));
20447 rule_buf[rule_pos++] = grp_pos[p2];
20448 break;
20449
20450 case 7:
20451 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20452 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20453 p1 = get_random_num (0, sizeof (grp_pos));
20454 rule_buf[rule_pos++] = grp_pos[p1];
20455 p2 = get_random_num (1, sizeof (grp_pos));
20456 while (p1 == p2)
20457 p2 = get_random_num (1, sizeof (grp_pos));
20458 rule_buf[rule_pos++] = grp_pos[p2];
20459 break;
20460
20461 case 8:
20462 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20463 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20464 p1 = get_random_num (0, sizeof (grp_pos));
20465 rule_buf[rule_pos++] = grp_pos[p1];
20466 p2 = get_random_num (1, sizeof (grp_pos));
20467 rule_buf[rule_pos++] = grp_pos[p1];
20468 p3 = get_random_num (0, sizeof (grp_pos));
20469 rule_buf[rule_pos++] = grp_pos[p3];
20470 break;
20471 }
20472 }
20473
20474 return (rule_pos);
20475 }
20476
20477 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20478 {
20479 char mem[BLOCK_SIZE] = { 0 };
20480
20481 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20482
20483 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20484
20485 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20486
20487 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20488
20489 int out_len = in_len;
20490 int mem_len = in_len;
20491
20492 memcpy (out, in, out_len);
20493
20494 int rule_pos;
20495
20496 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20497 {
20498 int upos, upos2;
20499 int ulen;
20500
20501 switch (rule[rule_pos])
20502 {
20503 case ' ':
20504 break;
20505
20506 case RULE_OP_MANGLE_NOOP:
20507 break;
20508
20509 case RULE_OP_MANGLE_LREST:
20510 out_len = mangle_lrest (out, out_len);
20511 break;
20512
20513 case RULE_OP_MANGLE_UREST:
20514 out_len = mangle_urest (out, out_len);
20515 break;
20516
20517 case RULE_OP_MANGLE_LREST_UFIRST:
20518 out_len = mangle_lrest (out, out_len);
20519 if (out_len) MANGLE_UPPER_AT (out, 0);
20520 break;
20521
20522 case RULE_OP_MANGLE_UREST_LFIRST:
20523 out_len = mangle_urest (out, out_len);
20524 if (out_len) MANGLE_LOWER_AT (out, 0);
20525 break;
20526
20527 case RULE_OP_MANGLE_TREST:
20528 out_len = mangle_trest (out, out_len);
20529 break;
20530
20531 case RULE_OP_MANGLE_TOGGLE_AT:
20532 NEXT_RULEPOS (rule_pos);
20533 NEXT_RPTOI (rule, rule_pos, upos);
20534 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20535 break;
20536
20537 case RULE_OP_MANGLE_REVERSE:
20538 out_len = mangle_reverse (out, out_len);
20539 break;
20540
20541 case RULE_OP_MANGLE_DUPEWORD:
20542 out_len = mangle_double (out, out_len);
20543 break;
20544
20545 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20546 NEXT_RULEPOS (rule_pos);
20547 NEXT_RPTOI (rule, rule_pos, ulen);
20548 out_len = mangle_double_times (out, out_len, ulen);
20549 break;
20550
20551 case RULE_OP_MANGLE_REFLECT:
20552 out_len = mangle_reflect (out, out_len);
20553 break;
20554
20555 case RULE_OP_MANGLE_ROTATE_LEFT:
20556 mangle_rotate_left (out, out_len);
20557 break;
20558
20559 case RULE_OP_MANGLE_ROTATE_RIGHT:
20560 mangle_rotate_right (out, out_len);
20561 break;
20562
20563 case RULE_OP_MANGLE_APPEND:
20564 NEXT_RULEPOS (rule_pos);
20565 out_len = mangle_append (out, out_len, rule[rule_pos]);
20566 break;
20567
20568 case RULE_OP_MANGLE_PREPEND:
20569 NEXT_RULEPOS (rule_pos);
20570 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20571 break;
20572
20573 case RULE_OP_MANGLE_DELETE_FIRST:
20574 out_len = mangle_delete_at (out, out_len, 0);
20575 break;
20576
20577 case RULE_OP_MANGLE_DELETE_LAST:
20578 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20579 break;
20580
20581 case RULE_OP_MANGLE_DELETE_AT:
20582 NEXT_RULEPOS (rule_pos);
20583 NEXT_RPTOI (rule, rule_pos, upos);
20584 out_len = mangle_delete_at (out, out_len, upos);
20585 break;
20586
20587 case RULE_OP_MANGLE_EXTRACT:
20588 NEXT_RULEPOS (rule_pos);
20589 NEXT_RPTOI (rule, rule_pos, upos);
20590 NEXT_RULEPOS (rule_pos);
20591 NEXT_RPTOI (rule, rule_pos, ulen);
20592 out_len = mangle_extract (out, out_len, upos, ulen);
20593 break;
20594
20595 case RULE_OP_MANGLE_OMIT:
20596 NEXT_RULEPOS (rule_pos);
20597 NEXT_RPTOI (rule, rule_pos, upos);
20598 NEXT_RULEPOS (rule_pos);
20599 NEXT_RPTOI (rule, rule_pos, ulen);
20600 out_len = mangle_omit (out, out_len, upos, ulen);
20601 break;
20602
20603 case RULE_OP_MANGLE_INSERT:
20604 NEXT_RULEPOS (rule_pos);
20605 NEXT_RPTOI (rule, rule_pos, upos);
20606 NEXT_RULEPOS (rule_pos);
20607 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20608 break;
20609
20610 case RULE_OP_MANGLE_OVERSTRIKE:
20611 NEXT_RULEPOS (rule_pos);
20612 NEXT_RPTOI (rule, rule_pos, upos);
20613 NEXT_RULEPOS (rule_pos);
20614 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20615 break;
20616
20617 case RULE_OP_MANGLE_TRUNCATE_AT:
20618 NEXT_RULEPOS (rule_pos);
20619 NEXT_RPTOI (rule, rule_pos, upos);
20620 out_len = mangle_truncate_at (out, out_len, upos);
20621 break;
20622
20623 case RULE_OP_MANGLE_REPLACE:
20624 NEXT_RULEPOS (rule_pos);
20625 NEXT_RULEPOS (rule_pos);
20626 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20627 break;
20628
20629 case RULE_OP_MANGLE_PURGECHAR:
20630 NEXT_RULEPOS (rule_pos);
20631 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20632 break;
20633
20634 case RULE_OP_MANGLE_TOGGLECASE_REC:
20635 /* todo */
20636 break;
20637
20638 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20639 NEXT_RULEPOS (rule_pos);
20640 NEXT_RPTOI (rule, rule_pos, ulen);
20641 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20642 break;
20643
20644 case RULE_OP_MANGLE_DUPECHAR_LAST:
20645 NEXT_RULEPOS (rule_pos);
20646 NEXT_RPTOI (rule, rule_pos, ulen);
20647 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20648 break;
20649
20650 case RULE_OP_MANGLE_DUPECHAR_ALL:
20651 out_len = mangle_dupechar (out, out_len);
20652 break;
20653
20654 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20655 NEXT_RULEPOS (rule_pos);
20656 NEXT_RPTOI (rule, rule_pos, ulen);
20657 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20658 break;
20659
20660 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20661 NEXT_RULEPOS (rule_pos);
20662 NEXT_RPTOI (rule, rule_pos, ulen);
20663 out_len = mangle_dupeblock_append (out, out_len, ulen);
20664 break;
20665
20666 case RULE_OP_MANGLE_SWITCH_FIRST:
20667 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20668 break;
20669
20670 case RULE_OP_MANGLE_SWITCH_LAST:
20671 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20672 break;
20673
20674 case RULE_OP_MANGLE_SWITCH_AT:
20675 NEXT_RULEPOS (rule_pos);
20676 NEXT_RPTOI (rule, rule_pos, upos);
20677 NEXT_RULEPOS (rule_pos);
20678 NEXT_RPTOI (rule, rule_pos, upos2);
20679 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20680 break;
20681
20682 case RULE_OP_MANGLE_CHR_SHIFTL:
20683 NEXT_RULEPOS (rule_pos);
20684 NEXT_RPTOI (rule, rule_pos, upos);
20685 mangle_chr_shiftl (out, out_len, upos);
20686 break;
20687
20688 case RULE_OP_MANGLE_CHR_SHIFTR:
20689 NEXT_RULEPOS (rule_pos);
20690 NEXT_RPTOI (rule, rule_pos, upos);
20691 mangle_chr_shiftr (out, out_len, upos);
20692 break;
20693
20694 case RULE_OP_MANGLE_CHR_INCR:
20695 NEXT_RULEPOS (rule_pos);
20696 NEXT_RPTOI (rule, rule_pos, upos);
20697 mangle_chr_incr (out, out_len, upos);
20698 break;
20699
20700 case RULE_OP_MANGLE_CHR_DECR:
20701 NEXT_RULEPOS (rule_pos);
20702 NEXT_RPTOI (rule, rule_pos, upos);
20703 mangle_chr_decr (out, out_len, upos);
20704 break;
20705
20706 case RULE_OP_MANGLE_REPLACE_NP1:
20707 NEXT_RULEPOS (rule_pos);
20708 NEXT_RPTOI (rule, rule_pos, upos);
20709 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20710 break;
20711
20712 case RULE_OP_MANGLE_REPLACE_NM1:
20713 NEXT_RULEPOS (rule_pos);
20714 NEXT_RPTOI (rule, rule_pos, upos);
20715 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20716 break;
20717
20718 case RULE_OP_MANGLE_TITLE:
20719 out_len = mangle_title (out, out_len);
20720 break;
20721
20722 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20723 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20724 NEXT_RULEPOS (rule_pos);
20725 NEXT_RPTOI (rule, rule_pos, upos);
20726 NEXT_RULEPOS (rule_pos);
20727 NEXT_RPTOI (rule, rule_pos, ulen);
20728 NEXT_RULEPOS (rule_pos);
20729 NEXT_RPTOI (rule, rule_pos, upos2);
20730 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20731 break;
20732
20733 case RULE_OP_MANGLE_APPEND_MEMORY:
20734 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20735 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20736 memcpy (out + out_len, mem, mem_len);
20737 out_len += mem_len;
20738 break;
20739
20740 case RULE_OP_MANGLE_PREPEND_MEMORY:
20741 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20742 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20743 memcpy (mem + mem_len, out, out_len);
20744 out_len += mem_len;
20745 memcpy (out, mem, out_len);
20746 break;
20747
20748 case RULE_OP_MEMORIZE_WORD:
20749 memcpy (mem, out, out_len);
20750 mem_len = out_len;
20751 break;
20752
20753 case RULE_OP_REJECT_LESS:
20754 NEXT_RULEPOS (rule_pos);
20755 NEXT_RPTOI (rule, rule_pos, upos);
20756 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20757 break;
20758
20759 case RULE_OP_REJECT_GREATER:
20760 NEXT_RULEPOS (rule_pos);
20761 NEXT_RPTOI (rule, rule_pos, upos);
20762 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20763 break;
20764
20765 case RULE_OP_REJECT_CONTAIN:
20766 NEXT_RULEPOS (rule_pos);
20767 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20768 break;
20769
20770 case RULE_OP_REJECT_NOT_CONTAIN:
20771 NEXT_RULEPOS (rule_pos);
20772 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20773 break;
20774
20775 case RULE_OP_REJECT_EQUAL_FIRST:
20776 NEXT_RULEPOS (rule_pos);
20777 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20778 break;
20779
20780 case RULE_OP_REJECT_EQUAL_LAST:
20781 NEXT_RULEPOS (rule_pos);
20782 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20783 break;
20784
20785 case RULE_OP_REJECT_EQUAL_AT:
20786 NEXT_RULEPOS (rule_pos);
20787 NEXT_RPTOI (rule, rule_pos, upos);
20788 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20789 NEXT_RULEPOS (rule_pos);
20790 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20791 break;
20792
20793 case RULE_OP_REJECT_CONTAINS:
20794 NEXT_RULEPOS (rule_pos);
20795 NEXT_RPTOI (rule, rule_pos, upos);
20796 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20797 NEXT_RULEPOS (rule_pos);
20798 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20799 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20800 break;
20801
20802 case RULE_OP_REJECT_MEMORY:
20803 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20804 break;
20805
20806 default:
20807 return (RULE_RC_SYNTAX_ERROR);
20808 break;
20809 }
20810 }
20811
20812 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20813
20814 return (out_len);
20815 }