16f8abb6b5c7760a7741615f4fc410e74c263444
[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 = 16;
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 = 16;
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 = 16;
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 // 16 - 2 (since last 2 uints contain the digest)
4431 uint n = 14;
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 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5568 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5569 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5570 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5571 }
5572
5573 return (NULL);
5574 }
5575
5576 char *strparser (const uint parser_status)
5577 {
5578 switch (parser_status)
5579 {
5580 case PARSER_OK: return ((char *) PA_000); break;
5581 case PARSER_COMMENT: return ((char *) PA_001); break;
5582 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5583 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5584 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5585 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5586 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5587 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5588 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5589 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5590 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5591 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5592 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5593 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5594 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5595 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5596 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5597 }
5598
5599 return ((char *) PA_255);
5600 }
5601
5602 char *strhashtype (const uint hash_mode)
5603 {
5604 switch (hash_mode)
5605 {
5606 case 0: return ((char *) HT_00000); break;
5607 case 10: return ((char *) HT_00010); break;
5608 case 11: return ((char *) HT_00011); break;
5609 case 12: return ((char *) HT_00012); break;
5610 case 20: return ((char *) HT_00020); break;
5611 case 21: return ((char *) HT_00021); break;
5612 case 22: return ((char *) HT_00022); break;
5613 case 23: return ((char *) HT_00023); break;
5614 case 30: return ((char *) HT_00030); break;
5615 case 40: return ((char *) HT_00040); break;
5616 case 50: return ((char *) HT_00050); break;
5617 case 60: return ((char *) HT_00060); break;
5618 case 100: return ((char *) HT_00100); break;
5619 case 101: return ((char *) HT_00101); break;
5620 case 110: return ((char *) HT_00110); break;
5621 case 111: return ((char *) HT_00111); break;
5622 case 112: return ((char *) HT_00112); break;
5623 case 120: return ((char *) HT_00120); break;
5624 case 121: return ((char *) HT_00121); break;
5625 case 122: return ((char *) HT_00122); break;
5626 case 124: return ((char *) HT_00124); break;
5627 case 130: return ((char *) HT_00130); break;
5628 case 131: return ((char *) HT_00131); break;
5629 case 132: return ((char *) HT_00132); break;
5630 case 133: return ((char *) HT_00133); break;
5631 case 140: return ((char *) HT_00140); break;
5632 case 141: return ((char *) HT_00141); break;
5633 case 150: return ((char *) HT_00150); break;
5634 case 160: return ((char *) HT_00160); break;
5635 case 190: return ((char *) HT_00190); break;
5636 case 200: return ((char *) HT_00200); break;
5637 case 300: return ((char *) HT_00300); break;
5638 case 400: return ((char *) HT_00400); break;
5639 case 500: return ((char *) HT_00500); break;
5640 case 501: return ((char *) HT_00501); break;
5641 case 900: return ((char *) HT_00900); break;
5642 case 910: return ((char *) HT_00910); break;
5643 case 1000: return ((char *) HT_01000); break;
5644 case 1100: return ((char *) HT_01100); break;
5645 case 1400: return ((char *) HT_01400); break;
5646 case 1410: return ((char *) HT_01410); break;
5647 case 1420: return ((char *) HT_01420); break;
5648 case 1421: return ((char *) HT_01421); break;
5649 case 1430: return ((char *) HT_01430); break;
5650 case 1440: return ((char *) HT_01440); break;
5651 case 1441: return ((char *) HT_01441); break;
5652 case 1450: return ((char *) HT_01450); break;
5653 case 1460: return ((char *) HT_01460); break;
5654 case 1500: return ((char *) HT_01500); break;
5655 case 1600: return ((char *) HT_01600); break;
5656 case 1700: return ((char *) HT_01700); break;
5657 case 1710: return ((char *) HT_01710); break;
5658 case 1711: return ((char *) HT_01711); break;
5659 case 1720: return ((char *) HT_01720); break;
5660 case 1722: return ((char *) HT_01722); break;
5661 case 1730: return ((char *) HT_01730); break;
5662 case 1731: return ((char *) HT_01731); break;
5663 case 1740: return ((char *) HT_01740); break;
5664 case 1750: return ((char *) HT_01750); break;
5665 case 1760: return ((char *) HT_01760); break;
5666 case 1800: return ((char *) HT_01800); break;
5667 case 2100: return ((char *) HT_02100); break;
5668 case 2400: return ((char *) HT_02400); break;
5669 case 2410: return ((char *) HT_02410); break;
5670 case 2500: return ((char *) HT_02500); break;
5671 case 2600: return ((char *) HT_02600); break;
5672 case 2611: return ((char *) HT_02611); break;
5673 case 2612: return ((char *) HT_02612); break;
5674 case 2711: return ((char *) HT_02711); break;
5675 case 2811: return ((char *) HT_02811); break;
5676 case 3000: return ((char *) HT_03000); break;
5677 case 3100: return ((char *) HT_03100); break;
5678 case 3200: return ((char *) HT_03200); break;
5679 case 3710: return ((char *) HT_03710); break;
5680 case 3711: return ((char *) HT_03711); break;
5681 case 3800: return ((char *) HT_03800); break;
5682 case 4300: return ((char *) HT_04300); break;
5683 case 4400: return ((char *) HT_04400); break;
5684 case 4500: return ((char *) HT_04500); break;
5685 case 4700: return ((char *) HT_04700); break;
5686 case 4800: return ((char *) HT_04800); break;
5687 case 4900: return ((char *) HT_04900); break;
5688 case 5000: return ((char *) HT_05000); break;
5689 case 5100: return ((char *) HT_05100); break;
5690 case 5200: return ((char *) HT_05200); break;
5691 case 5300: return ((char *) HT_05300); break;
5692 case 5400: return ((char *) HT_05400); break;
5693 case 5500: return ((char *) HT_05500); break;
5694 case 5600: return ((char *) HT_05600); break;
5695 case 5700: return ((char *) HT_05700); break;
5696 case 5800: return ((char *) HT_05800); break;
5697 case 6000: return ((char *) HT_06000); break;
5698 case 6100: return ((char *) HT_06100); break;
5699 case 6211: return ((char *) HT_06211); break;
5700 case 6212: return ((char *) HT_06212); break;
5701 case 6213: return ((char *) HT_06213); break;
5702 case 6221: return ((char *) HT_06221); break;
5703 case 6222: return ((char *) HT_06222); break;
5704 case 6223: return ((char *) HT_06223); break;
5705 case 6231: return ((char *) HT_06231); break;
5706 case 6232: return ((char *) HT_06232); break;
5707 case 6233: return ((char *) HT_06233); break;
5708 case 6241: return ((char *) HT_06241); break;
5709 case 6242: return ((char *) HT_06242); break;
5710 case 6243: return ((char *) HT_06243); break;
5711 case 6300: return ((char *) HT_06300); break;
5712 case 6400: return ((char *) HT_06400); break;
5713 case 6500: return ((char *) HT_06500); break;
5714 case 6600: return ((char *) HT_06600); break;
5715 case 6700: return ((char *) HT_06700); break;
5716 case 6800: return ((char *) HT_06800); break;
5717 case 6900: return ((char *) HT_06900); break;
5718 case 7100: return ((char *) HT_07100); break;
5719 case 7200: return ((char *) HT_07200); break;
5720 case 7300: return ((char *) HT_07300); break;
5721 case 7400: return ((char *) HT_07400); break;
5722 case 7500: return ((char *) HT_07500); break;
5723 case 7600: return ((char *) HT_07600); break;
5724 case 7700: return ((char *) HT_07700); break;
5725 case 7800: return ((char *) HT_07800); break;
5726 case 7900: return ((char *) HT_07900); break;
5727 case 8000: return ((char *) HT_08000); break;
5728 case 8100: return ((char *) HT_08100); break;
5729 case 8200: return ((char *) HT_08200); break;
5730 case 8300: return ((char *) HT_08300); break;
5731 case 8400: return ((char *) HT_08400); break;
5732 case 8500: return ((char *) HT_08500); break;
5733 case 8600: return ((char *) HT_08600); break;
5734 case 8700: return ((char *) HT_08700); break;
5735 case 8800: return ((char *) HT_08800); break;
5736 case 8900: return ((char *) HT_08900); break;
5737 case 9000: return ((char *) HT_09000); break;
5738 case 9100: return ((char *) HT_09100); break;
5739 case 9200: return ((char *) HT_09200); break;
5740 case 9300: return ((char *) HT_09300); break;
5741 case 9400: return ((char *) HT_09400); break;
5742 case 9500: return ((char *) HT_09500); break;
5743 case 9600: return ((char *) HT_09600); break;
5744 case 9700: return ((char *) HT_09700); break;
5745 case 9710: return ((char *) HT_09710); break;
5746 case 9720: return ((char *) HT_09720); break;
5747 case 9800: return ((char *) HT_09800); break;
5748 case 9810: return ((char *) HT_09810); break;
5749 case 9820: return ((char *) HT_09820); break;
5750 case 9900: return ((char *) HT_09900); break;
5751 case 10000: return ((char *) HT_10000); break;
5752 case 10100: return ((char *) HT_10100); break;
5753 case 10200: return ((char *) HT_10200); break;
5754 case 10300: return ((char *) HT_10300); break;
5755 case 10400: return ((char *) HT_10400); break;
5756 case 10410: return ((char *) HT_10410); break;
5757 case 10420: return ((char *) HT_10420); break;
5758 case 10500: return ((char *) HT_10500); break;
5759 case 10600: return ((char *) HT_10600); break;
5760 case 10700: return ((char *) HT_10700); break;
5761 case 10800: return ((char *) HT_10800); break;
5762 case 10900: return ((char *) HT_10900); break;
5763 case 11000: return ((char *) HT_11000); break;
5764 case 11100: return ((char *) HT_11100); break;
5765 case 11200: return ((char *) HT_11200); break;
5766 case 11300: return ((char *) HT_11300); break;
5767 case 11400: return ((char *) HT_11400); break;
5768 case 11500: return ((char *) HT_11500); break;
5769 case 11600: return ((char *) HT_11600); break;
5770 case 11700: return ((char *) HT_11700); break;
5771 case 11800: return ((char *) HT_11800); break;
5772 case 11900: return ((char *) HT_11900); break;
5773 case 12000: return ((char *) HT_12000); break;
5774 case 12100: return ((char *) HT_12100); break;
5775 case 12200: return ((char *) HT_12200); break;
5776 case 12300: return ((char *) HT_12300); break;
5777 case 12400: return ((char *) HT_12400); break;
5778 case 12500: return ((char *) HT_12500); break;
5779 case 12600: return ((char *) HT_12600); break;
5780 case 12700: return ((char *) HT_12700); break;
5781 case 12800: return ((char *) HT_12800); break;
5782 case 12900: return ((char *) HT_12900); break;
5783 case 13000: return ((char *) HT_13000); break;
5784 }
5785
5786 return ((char *) "Unknown");
5787 }
5788
5789 char *strstatus (const uint devices_status)
5790 {
5791 switch (devices_status)
5792 {
5793 case STATUS_INIT: return ((char *) ST_0000); break;
5794 case STATUS_STARTING: return ((char *) ST_0001); break;
5795 case STATUS_RUNNING: return ((char *) ST_0002); break;
5796 case STATUS_PAUSED: return ((char *) ST_0003); break;
5797 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5798 case STATUS_CRACKED: return ((char *) ST_0005); break;
5799 case STATUS_ABORTED: return ((char *) ST_0006); break;
5800 case STATUS_QUIT: return ((char *) ST_0007); break;
5801 case STATUS_BYPASS: return ((char *) ST_0008); break;
5802 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5803 }
5804
5805 return ((char *) "Unknown");
5806 }
5807
5808 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5809 {
5810 uint hash_type = data.hash_type;
5811 uint hash_mode = data.hash_mode;
5812 uint salt_type = data.salt_type;
5813 uint opts_type = data.opts_type;
5814 uint opti_type = data.opti_type;
5815 uint dgst_size = data.dgst_size;
5816
5817 char *hashfile = data.hashfile;
5818
5819 uint len = 4096;
5820
5821 uint digest_buf[64] = { 0 };
5822
5823 u64 *digest_buf64 = (u64 *) digest_buf;
5824
5825 char *digests_buf_ptr = (char *) data.digests_buf;
5826
5827 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5828
5829 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5830 {
5831 uint tt;
5832
5833 switch (hash_type)
5834 {
5835 case HASH_TYPE_DESCRYPT:
5836 FP (digest_buf[1], digest_buf[0], tt);
5837 break;
5838
5839 case HASH_TYPE_DESRACF:
5840 digest_buf[0] = rotl32 (digest_buf[0], 29);
5841 digest_buf[1] = rotl32 (digest_buf[1], 29);
5842
5843 FP (digest_buf[1], digest_buf[0], tt);
5844 break;
5845
5846 case HASH_TYPE_LM:
5847 FP (digest_buf[1], digest_buf[0], tt);
5848 break;
5849
5850 case HASH_TYPE_NETNTLM:
5851 digest_buf[0] = rotl32 (digest_buf[0], 29);
5852 digest_buf[1] = rotl32 (digest_buf[1], 29);
5853 digest_buf[2] = rotl32 (digest_buf[2], 29);
5854 digest_buf[3] = rotl32 (digest_buf[3], 29);
5855
5856 FP (digest_buf[1], digest_buf[0], tt);
5857 FP (digest_buf[3], digest_buf[2], tt);
5858 break;
5859
5860 case HASH_TYPE_BSDICRYPT:
5861 digest_buf[0] = rotl32 (digest_buf[0], 31);
5862 digest_buf[1] = rotl32 (digest_buf[1], 31);
5863
5864 FP (digest_buf[1], digest_buf[0], tt);
5865 break;
5866 }
5867 }
5868
5869 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5870 {
5871 switch (hash_type)
5872 {
5873 case HASH_TYPE_MD4:
5874 digest_buf[0] += MD4M_A;
5875 digest_buf[1] += MD4M_B;
5876 digest_buf[2] += MD4M_C;
5877 digest_buf[3] += MD4M_D;
5878 break;
5879
5880 case HASH_TYPE_MD5:
5881 digest_buf[0] += MD5M_A;
5882 digest_buf[1] += MD5M_B;
5883 digest_buf[2] += MD5M_C;
5884 digest_buf[3] += MD5M_D;
5885 break;
5886
5887 case HASH_TYPE_SHA1:
5888 digest_buf[0] += SHA1M_A;
5889 digest_buf[1] += SHA1M_B;
5890 digest_buf[2] += SHA1M_C;
5891 digest_buf[3] += SHA1M_D;
5892 digest_buf[4] += SHA1M_E;
5893 break;
5894
5895 case HASH_TYPE_SHA256:
5896 digest_buf[0] += SHA256M_A;
5897 digest_buf[1] += SHA256M_B;
5898 digest_buf[2] += SHA256M_C;
5899 digest_buf[3] += SHA256M_D;
5900 digest_buf[4] += SHA256M_E;
5901 digest_buf[5] += SHA256M_F;
5902 digest_buf[6] += SHA256M_G;
5903 digest_buf[7] += SHA256M_H;
5904 break;
5905
5906 case HASH_TYPE_SHA384:
5907 digest_buf64[0] += SHA384M_A;
5908 digest_buf64[1] += SHA384M_B;
5909 digest_buf64[2] += SHA384M_C;
5910 digest_buf64[3] += SHA384M_D;
5911 digest_buf64[4] += SHA384M_E;
5912 digest_buf64[5] += SHA384M_F;
5913 digest_buf64[6] += 0;
5914 digest_buf64[7] += 0;
5915 break;
5916
5917 case HASH_TYPE_SHA512:
5918 digest_buf64[0] += SHA512M_A;
5919 digest_buf64[1] += SHA512M_B;
5920 digest_buf64[2] += SHA512M_C;
5921 digest_buf64[3] += SHA512M_D;
5922 digest_buf64[4] += SHA512M_E;
5923 digest_buf64[5] += SHA512M_F;
5924 digest_buf64[6] += SHA512M_G;
5925 digest_buf64[7] += SHA512M_H;
5926 break;
5927 }
5928 }
5929
5930 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5931 {
5932 if (dgst_size == DGST_SIZE_4_2)
5933 {
5934 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5935 }
5936 else if (dgst_size == DGST_SIZE_4_4)
5937 {
5938 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5939 }
5940 else if (dgst_size == DGST_SIZE_4_5)
5941 {
5942 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5943 }
5944 else if (dgst_size == DGST_SIZE_4_6)
5945 {
5946 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5947 }
5948 else if (dgst_size == DGST_SIZE_4_8)
5949 {
5950 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5951 }
5952 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5953 {
5954 if (hash_type == HASH_TYPE_WHIRLPOOL)
5955 {
5956 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5957 }
5958 else if (hash_type == HASH_TYPE_SHA384)
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_SHA512)
5963 {
5964 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5965 }
5966 else if (hash_type == HASH_TYPE_GOST)
5967 {
5968 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5969 }
5970 }
5971 else if (dgst_size == DGST_SIZE_4_64)
5972 {
5973 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5974 }
5975 else if (dgst_size == DGST_SIZE_8_25)
5976 {
5977 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5978 }
5979 }
5980
5981 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5982 | (data.salt_type == SALT_TYPE_EXTERN)
5983 | (data.salt_type == SALT_TYPE_EMBEDDED));
5984
5985 salt_t salt;
5986
5987 if (isSalted)
5988 {
5989 memset (&salt, 0, sizeof (salt_t));
5990
5991 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5992
5993 char *ptr = (char *) salt.salt_buf;
5994
5995 uint len = salt.salt_len;
5996
5997 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5998 {
5999 uint tt;
6000
6001 switch (hash_type)
6002 {
6003 case HASH_TYPE_NETNTLM:
6004
6005 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6006 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6007
6008 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6009
6010 break;
6011 }
6012 }
6013
6014 if (opts_type & OPTS_TYPE_ST_UNICODE)
6015 {
6016 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6017 {
6018 ptr[i] = ptr[j];
6019 }
6020
6021 len = len / 2;
6022 }
6023
6024 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6025 {
6026 uint max = salt.salt_len / 4;
6027
6028 if (len % 4) max++;
6029
6030 for (uint i = 0; i < max; i++)
6031 {
6032 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6033 }
6034 }
6035
6036 if (opts_type & OPTS_TYPE_ST_HEX)
6037 {
6038 char tmp[64] = { 0 };
6039
6040 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6041 {
6042 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6043 }
6044
6045 len = len * 2;
6046
6047 memcpy (ptr, tmp, len);
6048 }
6049
6050 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6051
6052 memset (ptr + len, 0, memset_size);
6053
6054 salt.salt_len = len;
6055 }
6056
6057 //
6058 // some modes require special encoding
6059 //
6060
6061 uint out_buf_plain[256] = { 0 };
6062 uint out_buf_salt[256] = { 0 };
6063
6064 char tmp_buf[1024] = { 0 };
6065
6066 char *ptr_plain = (char *) out_buf_plain;
6067 char *ptr_salt = (char *) out_buf_salt;
6068
6069 if (hash_mode == 22)
6070 {
6071 char username[30] = { 0 };
6072
6073 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6074
6075 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6076
6077 u16 *ptr = (u16 *) digest_buf;
6078
6079 tmp_buf[ 0] = sig[0];
6080 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6081 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6082 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6083 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6084 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6085 tmp_buf[ 6] = sig[1];
6086 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6087 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6088 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6089 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6090 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6091 tmp_buf[12] = sig[2];
6092 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6093 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6094 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6095 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6096 tmp_buf[17] = sig[3];
6097 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6098 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6099 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6100 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6101 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6102 tmp_buf[23] = sig[4];
6103 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6104 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6105 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6106 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6107 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6108 tmp_buf[29] = sig[5];
6109
6110 snprintf (out_buf, len-1, "%s:%s",
6111 tmp_buf,
6112 username);
6113 }
6114 else if (hash_mode == 23)
6115 {
6116 // do not show the \nskyper\n part in output
6117
6118 char *salt_buf_ptr = (char *) salt.salt_buf;
6119
6120 salt_buf_ptr[salt.salt_len - 8] = 0;
6121
6122 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6123 digest_buf[0],
6124 digest_buf[1],
6125 digest_buf[2],
6126 digest_buf[3],
6127 salt_buf_ptr);
6128 }
6129 else if (hash_mode == 101)
6130 {
6131 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6132
6133 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6134 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6135 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6136 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6137 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6138
6139 memcpy (tmp_buf, digest_buf, 20);
6140
6141 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6142
6143 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6144 }
6145 else if (hash_mode == 111)
6146 {
6147 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6148
6149 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6150 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6151 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6152 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6153 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6154
6155 memcpy (tmp_buf, digest_buf, 20);
6156 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6157
6158 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6159
6160 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6161 }
6162 else if (hash_mode == 122)
6163 {
6164 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6165 (char *) salt.salt_buf,
6166 digest_buf[0],
6167 digest_buf[1],
6168 digest_buf[2],
6169 digest_buf[3],
6170 digest_buf[4]);
6171 }
6172 else if (hash_mode == 124)
6173 {
6174 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6175 (char *) salt.salt_buf,
6176 digest_buf[0],
6177 digest_buf[1],
6178 digest_buf[2],
6179 digest_buf[3],
6180 digest_buf[4]);
6181 }
6182 else if (hash_mode == 131)
6183 {
6184 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6185 (char *) salt.salt_buf,
6186 0, 0, 0, 0, 0,
6187 digest_buf[0],
6188 digest_buf[1],
6189 digest_buf[2],
6190 digest_buf[3],
6191 digest_buf[4]);
6192 }
6193 else if (hash_mode == 132)
6194 {
6195 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6196 (char *) salt.salt_buf,
6197 digest_buf[0],
6198 digest_buf[1],
6199 digest_buf[2],
6200 digest_buf[3],
6201 digest_buf[4]);
6202 }
6203 else if (hash_mode == 133)
6204 {
6205 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6206
6207 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6208 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6209 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6210 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6211 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6212
6213 memcpy (tmp_buf, digest_buf, 20);
6214
6215 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6216
6217 snprintf (out_buf, len-1, "%s", ptr_plain);
6218 }
6219 else if (hash_mode == 141)
6220 {
6221 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6222
6223 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6224
6225 memset (tmp_buf, 0, sizeof (tmp_buf));
6226
6227 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6228
6229 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6230 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6231 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6232 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6233 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6234
6235 memcpy (tmp_buf, digest_buf, 20);
6236
6237 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6238
6239 ptr_plain[27] = 0;
6240
6241 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6242 }
6243 else if (hash_mode == 400)
6244 {
6245 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6246
6247 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6248 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6249 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6250 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6251
6252 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6253
6254 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6255 }
6256 else if (hash_mode == 500)
6257 {
6258 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6259
6260 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6261 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6262 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6263 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6264
6265 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6266
6267 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6268 {
6269 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6270 }
6271 else
6272 {
6273 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6274 }
6275 }
6276 else if (hash_mode == 501)
6277 {
6278 uint digest_idx = salt.digests_offset + digest_pos;
6279
6280 hashinfo_t **hashinfo_ptr = data.hash_info;
6281 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6282
6283 snprintf (out_buf, len-1, "%s", hash_buf);
6284 }
6285 else if (hash_mode == 1421)
6286 {
6287 u8 *salt_ptr = (u8 *) salt.salt_buf;
6288
6289 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6290 salt_ptr[0],
6291 salt_ptr[1],
6292 salt_ptr[2],
6293 salt_ptr[3],
6294 salt_ptr[4],
6295 salt_ptr[5],
6296 digest_buf[0],
6297 digest_buf[1],
6298 digest_buf[2],
6299 digest_buf[3],
6300 digest_buf[4],
6301 digest_buf[5],
6302 digest_buf[6],
6303 digest_buf[7]);
6304 }
6305 else if (hash_mode == 1441)
6306 {
6307 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6308
6309 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6310
6311 memset (tmp_buf, 0, sizeof (tmp_buf));
6312
6313 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6314
6315 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6316 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6317 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6318 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6319 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6320 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6321 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6322 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6323
6324 memcpy (tmp_buf, digest_buf, 32);
6325
6326 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6327
6328 ptr_plain[43] = 0;
6329
6330 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6331 }
6332 else if (hash_mode == 1500)
6333 {
6334 out_buf[0] = salt.salt_sign[0] & 0xff;
6335 out_buf[1] = salt.salt_sign[1] & 0xff;
6336 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6337 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6338 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6339
6340 memset (tmp_buf, 0, sizeof (tmp_buf));
6341
6342 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6343
6344 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6345 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6346
6347 memcpy (tmp_buf, digest_buf, 8);
6348
6349 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6350
6351 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6352
6353 out_buf[13] = 0;
6354 }
6355 else if (hash_mode == 1600)
6356 {
6357 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6358
6359 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6360 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6361 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6362 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6363
6364 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6365
6366 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6367 {
6368 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6369 }
6370 else
6371 {
6372 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6373 }
6374 }
6375 else if (hash_mode == 1711)
6376 {
6377 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6378
6379 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6380 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6381 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6382 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6383 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6384 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6385 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6386 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6387
6388 memcpy (tmp_buf, digest_buf, 64);
6389 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6390
6391 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6392
6393 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6394 }
6395 else if (hash_mode == 1722)
6396 {
6397 uint *ptr = digest_buf;
6398
6399 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6400 (unsigned char *) salt.salt_buf,
6401 ptr[ 1], ptr[ 0],
6402 ptr[ 3], ptr[ 2],
6403 ptr[ 5], ptr[ 4],
6404 ptr[ 7], ptr[ 6],
6405 ptr[ 9], ptr[ 8],
6406 ptr[11], ptr[10],
6407 ptr[13], ptr[12],
6408 ptr[15], ptr[14]);
6409 }
6410 else if (hash_mode == 1731)
6411 {
6412 uint *ptr = digest_buf;
6413
6414 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6415 (unsigned char *) salt.salt_buf,
6416 ptr[ 1], ptr[ 0],
6417 ptr[ 3], ptr[ 2],
6418 ptr[ 5], ptr[ 4],
6419 ptr[ 7], ptr[ 6],
6420 ptr[ 9], ptr[ 8],
6421 ptr[11], ptr[10],
6422 ptr[13], ptr[12],
6423 ptr[15], ptr[14]);
6424 }
6425 else if (hash_mode == 1800)
6426 {
6427 // temp workaround
6428
6429 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6430 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6431 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6432 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6433 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6434 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6435 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6436 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6437
6438 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6439
6440 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6441 {
6442 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6443 }
6444 else
6445 {
6446 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6447 }
6448 }
6449 else if (hash_mode == 2100)
6450 {
6451 uint pos = 0;
6452
6453 snprintf (out_buf + pos, len-1, "%s%i#",
6454 SIGNATURE_DCC2,
6455 salt.salt_iter + 1);
6456
6457 uint signature_len = strlen (out_buf);
6458
6459 pos += signature_len;
6460 len -= signature_len;
6461
6462 char *salt_ptr = (char *) salt.salt_buf;
6463
6464 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6465
6466 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6467 byte_swap_32 (digest_buf[0]),
6468 byte_swap_32 (digest_buf[1]),
6469 byte_swap_32 (digest_buf[2]),
6470 byte_swap_32 (digest_buf[3]));
6471 }
6472 else if ((hash_mode == 2400) || (hash_mode == 2410))
6473 {
6474 memcpy (tmp_buf, digest_buf, 16);
6475
6476 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6477
6478 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6479 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6480 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6481 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6482
6483 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6484 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6485 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6486 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6487
6488 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6489 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6490 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6491 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6492
6493 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6494 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6495 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6496 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6497
6498 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6499 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6500 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6501 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6502
6503 out_buf[16] = 0;
6504 }
6505 else if (hash_mode == 2500)
6506 {
6507 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6508
6509 wpa_t *wpa = &wpas[salt_pos];
6510
6511 uint pke[25] = { 0 };
6512
6513 char *pke_ptr = (char *) pke;
6514
6515 for (uint i = 0; i < 25; i++)
6516 {
6517 pke[i] = byte_swap_32 (wpa->pke[i]);
6518 }
6519
6520 unsigned char mac1[6] = { 0 };
6521 unsigned char mac2[6] = { 0 };
6522
6523 memcpy (mac1, pke_ptr + 23, 6);
6524 memcpy (mac2, pke_ptr + 29, 6);
6525
6526 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6527 (char *) salt.salt_buf,
6528 mac1[0],
6529 mac1[1],
6530 mac1[2],
6531 mac1[3],
6532 mac1[4],
6533 mac1[5],
6534 mac2[0],
6535 mac2[1],
6536 mac2[2],
6537 mac2[3],
6538 mac2[4],
6539 mac2[5]);
6540 }
6541 else if (hash_mode == 4400)
6542 {
6543 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6544 byte_swap_32 (digest_buf[0]),
6545 byte_swap_32 (digest_buf[1]),
6546 byte_swap_32 (digest_buf[2]),
6547 byte_swap_32 (digest_buf[3]));
6548 }
6549 else if (hash_mode == 4700)
6550 {
6551 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6552 byte_swap_32 (digest_buf[0]),
6553 byte_swap_32 (digest_buf[1]),
6554 byte_swap_32 (digest_buf[2]),
6555 byte_swap_32 (digest_buf[3]),
6556 byte_swap_32 (digest_buf[4]));
6557 }
6558 else if (hash_mode == 4800)
6559 {
6560 u8 chap_id_byte = (u8) salt.salt_buf[4];
6561
6562 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6563 digest_buf[0],
6564 digest_buf[1],
6565 digest_buf[2],
6566 digest_buf[3],
6567 byte_swap_32 (salt.salt_buf[0]),
6568 byte_swap_32 (salt.salt_buf[1]),
6569 byte_swap_32 (salt.salt_buf[2]),
6570 byte_swap_32 (salt.salt_buf[3]),
6571 chap_id_byte);
6572 }
6573 else if (hash_mode == 4900)
6574 {
6575 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6576 byte_swap_32 (digest_buf[0]),
6577 byte_swap_32 (digest_buf[1]),
6578 byte_swap_32 (digest_buf[2]),
6579 byte_swap_32 (digest_buf[3]),
6580 byte_swap_32 (digest_buf[4]));
6581 }
6582 else if (hash_mode == 5100)
6583 {
6584 snprintf (out_buf, len-1, "%08x%08x",
6585 digest_buf[0],
6586 digest_buf[1]);
6587 }
6588 else if (hash_mode == 5200)
6589 {
6590 snprintf (out_buf, len-1, "%s", hashfile);
6591 }
6592 else if (hash_mode == 5300)
6593 {
6594 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6595
6596 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6597
6598 int buf_len = len -1;
6599
6600 // msg_buf
6601
6602 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6603
6604 for (uint i = 0; i < ikepsk_msg_len; i++)
6605 {
6606 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6607 {
6608 snprintf (out_buf, buf_len, ":");
6609
6610 buf_len--;
6611 out_buf++;
6612 }
6613
6614 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6615
6616 buf_len -= 8;
6617 out_buf += 8;
6618 }
6619
6620 // nr_buf
6621
6622 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6623
6624 for (uint i = 0; i < ikepsk_nr_len; i++)
6625 {
6626 if ((i == 0) || (i == 5))
6627 {
6628 snprintf (out_buf, buf_len, ":");
6629
6630 buf_len--;
6631 out_buf++;
6632 }
6633
6634 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6635
6636 buf_len -= 8;
6637 out_buf += 8;
6638 }
6639
6640 // digest_buf
6641
6642 for (uint i = 0; i < 4; i++)
6643 {
6644 if (i == 0)
6645 {
6646 snprintf (out_buf, buf_len, ":");
6647
6648 buf_len--;
6649 out_buf++;
6650 }
6651
6652 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6653
6654 buf_len -= 8;
6655 out_buf += 8;
6656 }
6657 }
6658 else if (hash_mode == 5400)
6659 {
6660 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6661
6662 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6663
6664 int buf_len = len -1;
6665
6666 // msg_buf
6667
6668 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6669
6670 for (uint i = 0; i < ikepsk_msg_len; i++)
6671 {
6672 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6673 {
6674 snprintf (out_buf, buf_len, ":");
6675
6676 buf_len--;
6677 out_buf++;
6678 }
6679
6680 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6681
6682 buf_len -= 8;
6683 out_buf += 8;
6684 }
6685
6686 // nr_buf
6687
6688 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6689
6690 for (uint i = 0; i < ikepsk_nr_len; i++)
6691 {
6692 if ((i == 0) || (i == 5))
6693 {
6694 snprintf (out_buf, buf_len, ":");
6695
6696 buf_len--;
6697 out_buf++;
6698 }
6699
6700 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6701
6702 buf_len -= 8;
6703 out_buf += 8;
6704 }
6705
6706 // digest_buf
6707
6708 for (uint i = 0; i < 5; i++)
6709 {
6710 if (i == 0)
6711 {
6712 snprintf (out_buf, buf_len, ":");
6713
6714 buf_len--;
6715 out_buf++;
6716 }
6717
6718 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6719
6720 buf_len -= 8;
6721 out_buf += 8;
6722 }
6723 }
6724 else if (hash_mode == 5500)
6725 {
6726 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6727
6728 netntlm_t *netntlm = &netntlms[salt_pos];
6729
6730 char user_buf[64] = { 0 };
6731 char domain_buf[64] = { 0 };
6732 char srvchall_buf[1024] = { 0 };
6733 char clichall_buf[1024] = { 0 };
6734
6735 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6736 {
6737 char *ptr = (char *) netntlm->userdomain_buf;
6738
6739 user_buf[i] = ptr[j];
6740 }
6741
6742 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6743 {
6744 char *ptr = (char *) netntlm->userdomain_buf;
6745
6746 domain_buf[i] = ptr[netntlm->user_len + j];
6747 }
6748
6749 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6750 {
6751 u8 *ptr = (u8 *) netntlm->chall_buf;
6752
6753 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6754 }
6755
6756 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6757 {
6758 u8 *ptr = (u8 *) netntlm->chall_buf;
6759
6760 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6761 }
6762
6763 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6764 user_buf,
6765 domain_buf,
6766 srvchall_buf,
6767 digest_buf[0],
6768 digest_buf[1],
6769 digest_buf[2],
6770 digest_buf[3],
6771 byte_swap_32 (salt.salt_buf_pc[0]),
6772 byte_swap_32 (salt.salt_buf_pc[1]),
6773 clichall_buf);
6774 }
6775 else if (hash_mode == 5600)
6776 {
6777 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6778
6779 netntlm_t *netntlm = &netntlms[salt_pos];
6780
6781 char user_buf[64] = { 0 };
6782 char domain_buf[64] = { 0 };
6783 char srvchall_buf[1024] = { 0 };
6784 char clichall_buf[1024] = { 0 };
6785
6786 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6787 {
6788 char *ptr = (char *) netntlm->userdomain_buf;
6789
6790 user_buf[i] = ptr[j];
6791 }
6792
6793 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6794 {
6795 char *ptr = (char *) netntlm->userdomain_buf;
6796
6797 domain_buf[i] = ptr[netntlm->user_len + j];
6798 }
6799
6800 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6801 {
6802 u8 *ptr = (u8 *) netntlm->chall_buf;
6803
6804 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6805 }
6806
6807 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6808 {
6809 u8 *ptr = (u8 *) netntlm->chall_buf;
6810
6811 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6812 }
6813
6814 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6815 user_buf,
6816 domain_buf,
6817 srvchall_buf,
6818 digest_buf[0],
6819 digest_buf[1],
6820 digest_buf[2],
6821 digest_buf[3],
6822 clichall_buf);
6823 }
6824 else if (hash_mode == 5700)
6825 {
6826 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6827
6828 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6829 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6830 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6831 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6832 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6833 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6834 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6835 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6836
6837 memcpy (tmp_buf, digest_buf, 32);
6838
6839 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6840
6841 ptr_plain[43] = 0;
6842
6843 snprintf (out_buf, len-1, "%s", ptr_plain);
6844 }
6845 else if (hash_mode == 5800)
6846 {
6847 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6848 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6849 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6850 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6851 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6852
6853 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6854 digest_buf[0],
6855 digest_buf[1],
6856 digest_buf[2],
6857 digest_buf[3],
6858 digest_buf[4]);
6859 }
6860 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6861 {
6862 snprintf (out_buf, len-1, "%s", hashfile);
6863 }
6864 else if (hash_mode == 6300)
6865 {
6866 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6867
6868 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6869 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6870 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6871 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6872
6873 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6874
6875 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6876 }
6877 else if (hash_mode == 6400)
6878 {
6879 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6880
6881 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6882 }
6883 else if (hash_mode == 6500)
6884 {
6885 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6886
6887 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6888 }
6889 else if (hash_mode == 6600)
6890 {
6891 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6892
6893 agilekey_t *agilekey = &agilekeys[salt_pos];
6894
6895 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6896 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6897
6898 uint buf_len = len - 1;
6899
6900 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6901 buf_len -= 22;
6902
6903 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6904 {
6905 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6906
6907 buf_len -= 2;
6908 }
6909 }
6910 else if (hash_mode == 6700)
6911 {
6912 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6913
6914 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6915 }
6916 else if (hash_mode == 6800)
6917 {
6918 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6919 }
6920 else if (hash_mode == 7100)
6921 {
6922 uint *ptr = digest_buf;
6923
6924 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6925
6926 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6927
6928 uint esalt[8] = { 0 };
6929
6930 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6931 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6932 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6933 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6934 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6935 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6936 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6937 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6938
6939 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",
6940 SIGNATURE_SHA512OSX,
6941 salt.salt_iter + 1,
6942 esalt[ 0], esalt[ 1],
6943 esalt[ 2], esalt[ 3],
6944 esalt[ 4], esalt[ 5],
6945 esalt[ 6], esalt[ 7],
6946 ptr [ 1], ptr [ 0],
6947 ptr [ 3], ptr [ 2],
6948 ptr [ 5], ptr [ 4],
6949 ptr [ 7], ptr [ 6],
6950 ptr [ 9], ptr [ 8],
6951 ptr [11], ptr [10],
6952 ptr [13], ptr [12],
6953 ptr [15], ptr [14]);
6954 }
6955 else if (hash_mode == 7200)
6956 {
6957 uint *ptr = digest_buf;
6958
6959 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6960
6961 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6962
6963 uint len_used = 0;
6964
6965 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6966
6967 len_used = strlen (out_buf);
6968
6969 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6970
6971 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6972 {
6973 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6974 }
6975
6976 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",
6977 ptr [ 1], ptr [ 0],
6978 ptr [ 3], ptr [ 2],
6979 ptr [ 5], ptr [ 4],
6980 ptr [ 7], ptr [ 6],
6981 ptr [ 9], ptr [ 8],
6982 ptr [11], ptr [10],
6983 ptr [13], ptr [12],
6984 ptr [15], ptr [14]);
6985 }
6986 else if (hash_mode == 7300)
6987 {
6988 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6989
6990 rakp_t *rakp = &rakps[salt_pos];
6991
6992 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6993 {
6994 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6995 }
6996
6997 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6998 digest_buf[0],
6999 digest_buf[1],
7000 digest_buf[2],
7001 digest_buf[3],
7002 digest_buf[4]);
7003 }
7004 else if (hash_mode == 7400)
7005 {
7006 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7007
7008 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7009 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7010 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7011 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7012 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7013 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7014 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7015 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7016
7017 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7018
7019 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7020 {
7021 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7022 }
7023 else
7024 {
7025 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7026 }
7027 }
7028 else if (hash_mode == 7500)
7029 {
7030 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7031
7032 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7033
7034 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7035 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7036
7037 char data[128] = { 0 };
7038
7039 char *ptr_data = data;
7040
7041 for (uint i = 0; i < 36; i++, ptr_data += 2)
7042 {
7043 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7044 }
7045
7046 for (uint i = 0; i < 16; i++, ptr_data += 2)
7047 {
7048 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7049 }
7050
7051 *ptr_data = 0;
7052
7053 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7054 SIGNATURE_KRB5PA,
7055 (char *) krb5pa->user,
7056 (char *) krb5pa->realm,
7057 (char *) krb5pa->salt,
7058 data);
7059 }
7060 else if (hash_mode == 7700)
7061 {
7062 snprintf (out_buf, len-1, "%s$%08X%08X",
7063 (char *) salt.salt_buf,
7064 digest_buf[0],
7065 digest_buf[1]);
7066 }
7067 else if (hash_mode == 7800)
7068 {
7069 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7070 (char *) salt.salt_buf,
7071 digest_buf[0],
7072 digest_buf[1],
7073 digest_buf[2],
7074 digest_buf[3],
7075 digest_buf[4]);
7076 }
7077 else if (hash_mode == 7900)
7078 {
7079 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7080
7081 // ugly hack start
7082
7083 char *tmp = (char *) salt.salt_buf_pc;
7084
7085 ptr_plain[42] = tmp[0];
7086
7087 // ugly hack end
7088
7089 ptr_plain[43] = 0;
7090
7091 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7092 }
7093 else if (hash_mode == 8000)
7094 {
7095 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7096 (unsigned char *) salt.salt_buf,
7097 digest_buf[0],
7098 digest_buf[1],
7099 digest_buf[2],
7100 digest_buf[3],
7101 digest_buf[4],
7102 digest_buf[5],
7103 digest_buf[6],
7104 digest_buf[7]);
7105 }
7106 else if (hash_mode == 8100)
7107 {
7108 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7109 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7110
7111 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7112 (unsigned char *) salt.salt_buf,
7113 digest_buf[0],
7114 digest_buf[1],
7115 digest_buf[2],
7116 digest_buf[3],
7117 digest_buf[4]);
7118 }
7119 else if (hash_mode == 8200)
7120 {
7121 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7122
7123 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7124
7125 char data_buf[4096] = { 0 };
7126
7127 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7128 {
7129 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7130 }
7131
7132 data_buf[cloudkey->data_len * 2] = 0;
7133
7134 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7135 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7136 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7137 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7138 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7139 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7140 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7141 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7142
7143 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7144 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7145 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7146 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7147
7148 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7149 digest_buf[0],
7150 digest_buf[1],
7151 digest_buf[2],
7152 digest_buf[3],
7153 digest_buf[4],
7154 digest_buf[5],
7155 digest_buf[6],
7156 digest_buf[7],
7157 salt.salt_buf[0],
7158 salt.salt_buf[1],
7159 salt.salt_buf[2],
7160 salt.salt_buf[3],
7161 salt.salt_iter + 1,
7162 data_buf);
7163 }
7164 else if (hash_mode == 8300)
7165 {
7166 char digest_buf_c[34] = { 0 };
7167
7168 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7169
7170 digest_buf_c[32] = 0;
7171
7172 // domain
7173
7174 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7175
7176 char domain_buf_c[33] = { 0 };
7177
7178 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7179
7180 for (uint i = 0; i < salt_pc_len; i++)
7181 {
7182 const char next = domain_buf_c[i];
7183
7184 domain_buf_c[i] = '.';
7185
7186 i += next;
7187 }
7188
7189 domain_buf_c[salt_pc_len] = 0;
7190
7191 // final
7192
7193 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7194 }
7195 else if (hash_mode == 8500)
7196 {
7197 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7198 }
7199 else if (hash_mode == 2612)
7200 {
7201 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7202 SIGNATURE_PHPS,
7203 (char *) salt.salt_buf,
7204 digest_buf[0],
7205 digest_buf[1],
7206 digest_buf[2],
7207 digest_buf[3]);
7208 }
7209 else if (hash_mode == 3711)
7210 {
7211 char *salt_ptr = (char *) salt.salt_buf;
7212
7213 salt_ptr[salt.salt_len - 1] = 0;
7214
7215 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7216 SIGNATURE_MEDIAWIKI_B,
7217 salt_ptr,
7218 digest_buf[0],
7219 digest_buf[1],
7220 digest_buf[2],
7221 digest_buf[3]);
7222 }
7223 else if (hash_mode == 8800)
7224 {
7225 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7226
7227 androidfde_t *androidfde = &androidfdes[salt_pos];
7228
7229 char tmp[3073] = { 0 };
7230
7231 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7232 {
7233 sprintf (tmp + j, "%08x", androidfde->data[i]);
7234 }
7235
7236 tmp[3072] = 0;
7237
7238 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7239 SIGNATURE_ANDROIDFDE,
7240 byte_swap_32 (salt.salt_buf[0]),
7241 byte_swap_32 (salt.salt_buf[1]),
7242 byte_swap_32 (salt.salt_buf[2]),
7243 byte_swap_32 (salt.salt_buf[3]),
7244 byte_swap_32 (digest_buf[0]),
7245 byte_swap_32 (digest_buf[1]),
7246 byte_swap_32 (digest_buf[2]),
7247 byte_swap_32 (digest_buf[3]),
7248 tmp);
7249 }
7250 else if (hash_mode == 8900)
7251 {
7252 uint N = salt.scrypt_N;
7253 uint r = salt.scrypt_r;
7254 uint p = salt.scrypt_p;
7255
7256 char base64_salt[32] = { 0 };
7257
7258 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7259
7260 memset (tmp_buf, 0, 46);
7261
7262 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7263 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7264 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7265 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7266 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7267 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7268 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7269 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7270 digest_buf[8] = 0; // needed for base64_encode ()
7271
7272 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7273
7274 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7275 SIGNATURE_SCRYPT,
7276 N,
7277 r,
7278 p,
7279 base64_salt,
7280 tmp_buf);
7281 }
7282 else if (hash_mode == 9000)
7283 {
7284 snprintf (out_buf, len-1, "%s", hashfile);
7285 }
7286 else if (hash_mode == 9200)
7287 {
7288 // salt
7289
7290 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7291
7292 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7293
7294 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7295
7296 // hash
7297
7298 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7299 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7300 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7301 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7302 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7303 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7304 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7305 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7306 digest_buf[8] = 0; // needed for base64_encode ()
7307
7308 char tmp_buf[64] = { 0 };
7309
7310 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7311 tmp_buf[43] = 0; // cut it here
7312
7313 // output
7314
7315 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7316 }
7317 else if (hash_mode == 9300)
7318 {
7319 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7320 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7321 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7322 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7323 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7324 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7325 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7326 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7327 digest_buf[8] = 0; // needed for base64_encode ()
7328
7329 char tmp_buf[64] = { 0 };
7330
7331 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7332 tmp_buf[43] = 0; // cut it here
7333
7334 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7335
7336 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7337 }
7338 else if (hash_mode == 9400)
7339 {
7340 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7341
7342 office2007_t *office2007 = &office2007s[salt_pos];
7343
7344 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7345 SIGNATURE_OFFICE2007,
7346 2007,
7347 20,
7348 office2007->keySize,
7349 16,
7350 salt.salt_buf[0],
7351 salt.salt_buf[1],
7352 salt.salt_buf[2],
7353 salt.salt_buf[3],
7354 office2007->encryptedVerifier[0],
7355 office2007->encryptedVerifier[1],
7356 office2007->encryptedVerifier[2],
7357 office2007->encryptedVerifier[3],
7358 office2007->encryptedVerifierHash[0],
7359 office2007->encryptedVerifierHash[1],
7360 office2007->encryptedVerifierHash[2],
7361 office2007->encryptedVerifierHash[3],
7362 office2007->encryptedVerifierHash[4]);
7363 }
7364 else if (hash_mode == 9500)
7365 {
7366 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7367
7368 office2010_t *office2010 = &office2010s[salt_pos];
7369
7370 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,
7371
7372 salt.salt_buf[0],
7373 salt.salt_buf[1],
7374 salt.salt_buf[2],
7375 salt.salt_buf[3],
7376 office2010->encryptedVerifier[0],
7377 office2010->encryptedVerifier[1],
7378 office2010->encryptedVerifier[2],
7379 office2010->encryptedVerifier[3],
7380 office2010->encryptedVerifierHash[0],
7381 office2010->encryptedVerifierHash[1],
7382 office2010->encryptedVerifierHash[2],
7383 office2010->encryptedVerifierHash[3],
7384 office2010->encryptedVerifierHash[4],
7385 office2010->encryptedVerifierHash[5],
7386 office2010->encryptedVerifierHash[6],
7387 office2010->encryptedVerifierHash[7]);
7388 }
7389 else if (hash_mode == 9600)
7390 {
7391 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7392
7393 office2013_t *office2013 = &office2013s[salt_pos];
7394
7395 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,
7396
7397 salt.salt_buf[0],
7398 salt.salt_buf[1],
7399 salt.salt_buf[2],
7400 salt.salt_buf[3],
7401 office2013->encryptedVerifier[0],
7402 office2013->encryptedVerifier[1],
7403 office2013->encryptedVerifier[2],
7404 office2013->encryptedVerifier[3],
7405 office2013->encryptedVerifierHash[0],
7406 office2013->encryptedVerifierHash[1],
7407 office2013->encryptedVerifierHash[2],
7408 office2013->encryptedVerifierHash[3],
7409 office2013->encryptedVerifierHash[4],
7410 office2013->encryptedVerifierHash[5],
7411 office2013->encryptedVerifierHash[6],
7412 office2013->encryptedVerifierHash[7]);
7413 }
7414 else if (hash_mode == 9700)
7415 {
7416 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7417
7418 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7419
7420 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7421 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7422 byte_swap_32 (salt.salt_buf[0]),
7423 byte_swap_32 (salt.salt_buf[1]),
7424 byte_swap_32 (salt.salt_buf[2]),
7425 byte_swap_32 (salt.salt_buf[3]),
7426 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7427 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7428 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7429 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7430 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7431 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7432 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7433 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7434 }
7435 else if (hash_mode == 9710)
7436 {
7437 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7438
7439 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7440
7441 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7442 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7443 byte_swap_32 (salt.salt_buf[0]),
7444 byte_swap_32 (salt.salt_buf[1]),
7445 byte_swap_32 (salt.salt_buf[2]),
7446 byte_swap_32 (salt.salt_buf[3]),
7447 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7448 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7449 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7450 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7451 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7452 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7453 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7454 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7455 }
7456 else if (hash_mode == 9720)
7457 {
7458 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7459
7460 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7461
7462 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7463
7464 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7465 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7466 byte_swap_32 (salt.salt_buf[0]),
7467 byte_swap_32 (salt.salt_buf[1]),
7468 byte_swap_32 (salt.salt_buf[2]),
7469 byte_swap_32 (salt.salt_buf[3]),
7470 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7471 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7472 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7473 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7474 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7475 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7476 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7477 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7478 rc4key[0],
7479 rc4key[1],
7480 rc4key[2],
7481 rc4key[3],
7482 rc4key[4]);
7483 }
7484 else if (hash_mode == 9800)
7485 {
7486 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7487
7488 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7489
7490 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7491 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7492 salt.salt_buf[0],
7493 salt.salt_buf[1],
7494 salt.salt_buf[2],
7495 salt.salt_buf[3],
7496 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7497 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7498 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7499 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7500 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7501 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7502 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7503 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7504 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7505 }
7506 else if (hash_mode == 9810)
7507 {
7508 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7509
7510 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7511
7512 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7513 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7514 salt.salt_buf[0],
7515 salt.salt_buf[1],
7516 salt.salt_buf[2],
7517 salt.salt_buf[3],
7518 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7519 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7520 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7521 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7522 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7523 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7524 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7525 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7526 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7527 }
7528 else if (hash_mode == 9820)
7529 {
7530 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7531
7532 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7533
7534 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7535
7536 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7537 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7538 salt.salt_buf[0],
7539 salt.salt_buf[1],
7540 salt.salt_buf[2],
7541 salt.salt_buf[3],
7542 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7543 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7544 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7545 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7546 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7547 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7548 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7549 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7550 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7551 rc4key[0],
7552 rc4key[1],
7553 rc4key[2],
7554 rc4key[3],
7555 rc4key[4]);
7556 }
7557 else if (hash_mode == 10000)
7558 {
7559 // salt
7560
7561 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7562
7563 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7564
7565 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7566
7567 // hash
7568
7569 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7570 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7571 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7572 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7573 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7574 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7575 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7576 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7577 digest_buf[8] = 0; // needed for base64_encode ()
7578
7579 char tmp_buf[64] = { 0 };
7580
7581 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7582
7583 // output
7584
7585 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7586 }
7587 else if (hash_mode == 10100)
7588 {
7589 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7590 digest_buf[0],
7591 digest_buf[1],
7592 2,
7593 4,
7594 byte_swap_32 (salt.salt_buf[0]),
7595 byte_swap_32 (salt.salt_buf[1]),
7596 byte_swap_32 (salt.salt_buf[2]),
7597 byte_swap_32 (salt.salt_buf[3]));
7598 }
7599 else if (hash_mode == 10200)
7600 {
7601 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7602
7603 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7604
7605 // challenge
7606
7607 char challenge[100] = { 0 };
7608
7609 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7610
7611 // response
7612
7613 char tmp_buf[100] = { 0 };
7614
7615 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7616 (char *) cram_md5->user,
7617 digest_buf[0],
7618 digest_buf[1],
7619 digest_buf[2],
7620 digest_buf[3]);
7621
7622 char response[100] = { 0 };
7623
7624 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7625
7626 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7627 }
7628 else if (hash_mode == 10300)
7629 {
7630 char tmp_buf[100] = { 0 };
7631
7632 memcpy (tmp_buf + 0, digest_buf, 20);
7633 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7634
7635 uint tmp_len = 20 + salt.salt_len;
7636
7637 // base64 encode it
7638
7639 char base64_encoded[100] = { 0 };
7640
7641 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7642
7643 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7644 }
7645 else if (hash_mode == 10400)
7646 {
7647 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7648
7649 pdf_t *pdf = &pdfs[salt_pos];
7650
7651 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",
7652
7653 pdf->V,
7654 pdf->R,
7655 40,
7656 pdf->P,
7657 pdf->enc_md,
7658 pdf->id_len,
7659 byte_swap_32 (pdf->id_buf[0]),
7660 byte_swap_32 (pdf->id_buf[1]),
7661 byte_swap_32 (pdf->id_buf[2]),
7662 byte_swap_32 (pdf->id_buf[3]),
7663 pdf->u_len,
7664 byte_swap_32 (pdf->u_buf[0]),
7665 byte_swap_32 (pdf->u_buf[1]),
7666 byte_swap_32 (pdf->u_buf[2]),
7667 byte_swap_32 (pdf->u_buf[3]),
7668 byte_swap_32 (pdf->u_buf[4]),
7669 byte_swap_32 (pdf->u_buf[5]),
7670 byte_swap_32 (pdf->u_buf[6]),
7671 byte_swap_32 (pdf->u_buf[7]),
7672 pdf->o_len,
7673 byte_swap_32 (pdf->o_buf[0]),
7674 byte_swap_32 (pdf->o_buf[1]),
7675 byte_swap_32 (pdf->o_buf[2]),
7676 byte_swap_32 (pdf->o_buf[3]),
7677 byte_swap_32 (pdf->o_buf[4]),
7678 byte_swap_32 (pdf->o_buf[5]),
7679 byte_swap_32 (pdf->o_buf[6]),
7680 byte_swap_32 (pdf->o_buf[7])
7681 );
7682 }
7683 else if (hash_mode == 10410)
7684 {
7685 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7686
7687 pdf_t *pdf = &pdfs[salt_pos];
7688
7689 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",
7690
7691 pdf->V,
7692 pdf->R,
7693 40,
7694 pdf->P,
7695 pdf->enc_md,
7696 pdf->id_len,
7697 byte_swap_32 (pdf->id_buf[0]),
7698 byte_swap_32 (pdf->id_buf[1]),
7699 byte_swap_32 (pdf->id_buf[2]),
7700 byte_swap_32 (pdf->id_buf[3]),
7701 pdf->u_len,
7702 byte_swap_32 (pdf->u_buf[0]),
7703 byte_swap_32 (pdf->u_buf[1]),
7704 byte_swap_32 (pdf->u_buf[2]),
7705 byte_swap_32 (pdf->u_buf[3]),
7706 byte_swap_32 (pdf->u_buf[4]),
7707 byte_swap_32 (pdf->u_buf[5]),
7708 byte_swap_32 (pdf->u_buf[6]),
7709 byte_swap_32 (pdf->u_buf[7]),
7710 pdf->o_len,
7711 byte_swap_32 (pdf->o_buf[0]),
7712 byte_swap_32 (pdf->o_buf[1]),
7713 byte_swap_32 (pdf->o_buf[2]),
7714 byte_swap_32 (pdf->o_buf[3]),
7715 byte_swap_32 (pdf->o_buf[4]),
7716 byte_swap_32 (pdf->o_buf[5]),
7717 byte_swap_32 (pdf->o_buf[6]),
7718 byte_swap_32 (pdf->o_buf[7])
7719 );
7720 }
7721 else if (hash_mode == 10420)
7722 {
7723 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7724
7725 pdf_t *pdf = &pdfs[salt_pos];
7726
7727 u8 *rc4key = (u8 *) pdf->rc4key;
7728
7729 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",
7730
7731 pdf->V,
7732 pdf->R,
7733 40,
7734 pdf->P,
7735 pdf->enc_md,
7736 pdf->id_len,
7737 byte_swap_32 (pdf->id_buf[0]),
7738 byte_swap_32 (pdf->id_buf[1]),
7739 byte_swap_32 (pdf->id_buf[2]),
7740 byte_swap_32 (pdf->id_buf[3]),
7741 pdf->u_len,
7742 byte_swap_32 (pdf->u_buf[0]),
7743 byte_swap_32 (pdf->u_buf[1]),
7744 byte_swap_32 (pdf->u_buf[2]),
7745 byte_swap_32 (pdf->u_buf[3]),
7746 byte_swap_32 (pdf->u_buf[4]),
7747 byte_swap_32 (pdf->u_buf[5]),
7748 byte_swap_32 (pdf->u_buf[6]),
7749 byte_swap_32 (pdf->u_buf[7]),
7750 pdf->o_len,
7751 byte_swap_32 (pdf->o_buf[0]),
7752 byte_swap_32 (pdf->o_buf[1]),
7753 byte_swap_32 (pdf->o_buf[2]),
7754 byte_swap_32 (pdf->o_buf[3]),
7755 byte_swap_32 (pdf->o_buf[4]),
7756 byte_swap_32 (pdf->o_buf[5]),
7757 byte_swap_32 (pdf->o_buf[6]),
7758 byte_swap_32 (pdf->o_buf[7]),
7759 rc4key[0],
7760 rc4key[1],
7761 rc4key[2],
7762 rc4key[3],
7763 rc4key[4]
7764 );
7765 }
7766 else if (hash_mode == 10500)
7767 {
7768 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7769
7770 pdf_t *pdf = &pdfs[salt_pos];
7771
7772 if (pdf->id_len == 32)
7773 {
7774 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",
7775
7776 pdf->V,
7777 pdf->R,
7778 128,
7779 pdf->P,
7780 pdf->enc_md,
7781 pdf->id_len,
7782 byte_swap_32 (pdf->id_buf[0]),
7783 byte_swap_32 (pdf->id_buf[1]),
7784 byte_swap_32 (pdf->id_buf[2]),
7785 byte_swap_32 (pdf->id_buf[3]),
7786 byte_swap_32 (pdf->id_buf[4]),
7787 byte_swap_32 (pdf->id_buf[5]),
7788 byte_swap_32 (pdf->id_buf[6]),
7789 byte_swap_32 (pdf->id_buf[7]),
7790 pdf->u_len,
7791 byte_swap_32 (pdf->u_buf[0]),
7792 byte_swap_32 (pdf->u_buf[1]),
7793 byte_swap_32 (pdf->u_buf[2]),
7794 byte_swap_32 (pdf->u_buf[3]),
7795 byte_swap_32 (pdf->u_buf[4]),
7796 byte_swap_32 (pdf->u_buf[5]),
7797 byte_swap_32 (pdf->u_buf[6]),
7798 byte_swap_32 (pdf->u_buf[7]),
7799 pdf->o_len,
7800 byte_swap_32 (pdf->o_buf[0]),
7801 byte_swap_32 (pdf->o_buf[1]),
7802 byte_swap_32 (pdf->o_buf[2]),
7803 byte_swap_32 (pdf->o_buf[3]),
7804 byte_swap_32 (pdf->o_buf[4]),
7805 byte_swap_32 (pdf->o_buf[5]),
7806 byte_swap_32 (pdf->o_buf[6]),
7807 byte_swap_32 (pdf->o_buf[7])
7808 );
7809 }
7810 else
7811 {
7812 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",
7813
7814 pdf->V,
7815 pdf->R,
7816 128,
7817 pdf->P,
7818 pdf->enc_md,
7819 pdf->id_len,
7820 byte_swap_32 (pdf->id_buf[0]),
7821 byte_swap_32 (pdf->id_buf[1]),
7822 byte_swap_32 (pdf->id_buf[2]),
7823 byte_swap_32 (pdf->id_buf[3]),
7824 pdf->u_len,
7825 byte_swap_32 (pdf->u_buf[0]),
7826 byte_swap_32 (pdf->u_buf[1]),
7827 byte_swap_32 (pdf->u_buf[2]),
7828 byte_swap_32 (pdf->u_buf[3]),
7829 byte_swap_32 (pdf->u_buf[4]),
7830 byte_swap_32 (pdf->u_buf[5]),
7831 byte_swap_32 (pdf->u_buf[6]),
7832 byte_swap_32 (pdf->u_buf[7]),
7833 pdf->o_len,
7834 byte_swap_32 (pdf->o_buf[0]),
7835 byte_swap_32 (pdf->o_buf[1]),
7836 byte_swap_32 (pdf->o_buf[2]),
7837 byte_swap_32 (pdf->o_buf[3]),
7838 byte_swap_32 (pdf->o_buf[4]),
7839 byte_swap_32 (pdf->o_buf[5]),
7840 byte_swap_32 (pdf->o_buf[6]),
7841 byte_swap_32 (pdf->o_buf[7])
7842 );
7843 }
7844 }
7845 else if (hash_mode == 10600)
7846 {
7847 uint digest_idx = salt.digests_offset + digest_pos;
7848
7849 hashinfo_t **hashinfo_ptr = data.hash_info;
7850 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7851
7852 snprintf (out_buf, len-1, "%s", hash_buf);
7853 }
7854 else if (hash_mode == 10700)
7855 {
7856 uint digest_idx = salt.digests_offset + digest_pos;
7857
7858 hashinfo_t **hashinfo_ptr = data.hash_info;
7859 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7860
7861 snprintf (out_buf, len-1, "%s", hash_buf);
7862 }
7863 else if (hash_mode == 10900)
7864 {
7865 uint digest_idx = salt.digests_offset + digest_pos;
7866
7867 hashinfo_t **hashinfo_ptr = data.hash_info;
7868 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7869
7870 snprintf (out_buf, len-1, "%s", hash_buf);
7871 }
7872 else if (hash_mode == 11100)
7873 {
7874 u32 salt_challenge = salt.salt_buf[0];
7875
7876 salt_challenge = byte_swap_32 (salt_challenge);
7877
7878 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7879
7880 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7881 SIGNATURE_POSTGRESQL_AUTH,
7882 user_name,
7883 salt_challenge,
7884 digest_buf[0],
7885 digest_buf[1],
7886 digest_buf[2],
7887 digest_buf[3]);
7888 }
7889 else if (hash_mode == 11200)
7890 {
7891 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7892 SIGNATURE_MYSQL_AUTH,
7893 (unsigned char *) salt.salt_buf,
7894 digest_buf[0],
7895 digest_buf[1],
7896 digest_buf[2],
7897 digest_buf[3],
7898 digest_buf[4]);
7899 }
7900 else if (hash_mode == 11300)
7901 {
7902 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7903
7904 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7905
7906 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7907 const uint ckey_len = bitcoin_wallet->ckey_len;
7908 const uint public_key_len = bitcoin_wallet->public_key_len;
7909
7910 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7911 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7912 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7913
7914 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7915 {
7916 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7917
7918 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7919 }
7920
7921 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7922 {
7923 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7924
7925 sprintf (ckey_buf + j, "%02x", ptr[i]);
7926 }
7927
7928 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7929 {
7930 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
7931
7932 sprintf (public_key_buf + j, "%02x", ptr[i]);
7933 }
7934
7935 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7936 SIGNATURE_BITCOIN_WALLET,
7937 cry_master_len * 2,
7938 cry_master_buf,
7939 salt.salt_len,
7940 (unsigned char *) salt.salt_buf,
7941 salt.salt_iter + 1,
7942 ckey_len * 2,
7943 ckey_buf,
7944 public_key_len * 2,
7945 public_key_buf
7946 );
7947
7948 free (cry_master_buf);
7949 free (ckey_buf);
7950 free (public_key_buf);
7951 }
7952 else if (hash_mode == 11400)
7953 {
7954 uint digest_idx = salt.digests_offset + digest_pos;
7955
7956 hashinfo_t **hashinfo_ptr = data.hash_info;
7957 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7958
7959 snprintf (out_buf, len-1, "%s", hash_buf);
7960 }
7961 else if (hash_mode == 11600)
7962 {
7963 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7964
7965 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7966
7967 const uint data_len = seven_zip->data_len;
7968
7969 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7970
7971 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7972 {
7973 const u8 *ptr = (const u8 *) seven_zip->data_buf;
7974
7975 sprintf (data_buf + j, "%02x", ptr[i]);
7976 }
7977
7978 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7979 SIGNATURE_SEVEN_ZIP,
7980 0,
7981 salt.salt_sign[0],
7982 0,
7983 (char *) seven_zip->salt_buf,
7984 seven_zip->iv_len,
7985 seven_zip->iv_buf[0],
7986 seven_zip->iv_buf[1],
7987 seven_zip->iv_buf[2],
7988 seven_zip->iv_buf[3],
7989 seven_zip->crc,
7990 seven_zip->data_len,
7991 seven_zip->unpack_size,
7992 data_buf);
7993
7994 free (data_buf);
7995 }
7996 else if (hash_mode == 11700)
7997 {
7998 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7999 digest_buf[0],
8000 digest_buf[1],
8001 digest_buf[2],
8002 digest_buf[3],
8003 digest_buf[4],
8004 digest_buf[5],
8005 digest_buf[6],
8006 digest_buf[7]);
8007 }
8008 else if (hash_mode == 11800)
8009 {
8010 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8011 digest_buf[ 0],
8012 digest_buf[ 1],
8013 digest_buf[ 2],
8014 digest_buf[ 3],
8015 digest_buf[ 4],
8016 digest_buf[ 5],
8017 digest_buf[ 6],
8018 digest_buf[ 7],
8019 digest_buf[ 8],
8020 digest_buf[ 9],
8021 digest_buf[10],
8022 digest_buf[11],
8023 digest_buf[12],
8024 digest_buf[13],
8025 digest_buf[14],
8026 digest_buf[15]);
8027 }
8028 else if (hash_mode == 11900)
8029 {
8030 uint digest_idx = salt.digests_offset + digest_pos;
8031
8032 hashinfo_t **hashinfo_ptr = data.hash_info;
8033 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8034
8035 snprintf (out_buf, len-1, "%s", hash_buf);
8036 }
8037 else if (hash_mode == 12000)
8038 {
8039 uint digest_idx = salt.digests_offset + digest_pos;
8040
8041 hashinfo_t **hashinfo_ptr = data.hash_info;
8042 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8043
8044 snprintf (out_buf, len-1, "%s", hash_buf);
8045 }
8046 else if (hash_mode == 12100)
8047 {
8048 uint digest_idx = salt.digests_offset + digest_pos;
8049
8050 hashinfo_t **hashinfo_ptr = data.hash_info;
8051 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8052
8053 snprintf (out_buf, len-1, "%s", hash_buf);
8054 }
8055 else if (hash_mode == 12200)
8056 {
8057 uint *ptr_digest = digest_buf;
8058 uint *ptr_salt = salt.salt_buf;
8059
8060 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8061 SIGNATURE_ECRYPTFS,
8062 ptr_salt[0],
8063 ptr_salt[1],
8064 ptr_digest[0],
8065 ptr_digest[1]);
8066 }
8067 else if (hash_mode == 12300)
8068 {
8069 uint *ptr_digest = digest_buf;
8070 uint *ptr_salt = salt.salt_buf;
8071
8072 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",
8073 ptr_digest[ 0], ptr_digest[ 1],
8074 ptr_digest[ 2], ptr_digest[ 3],
8075 ptr_digest[ 4], ptr_digest[ 5],
8076 ptr_digest[ 6], ptr_digest[ 7],
8077 ptr_digest[ 8], ptr_digest[ 9],
8078 ptr_digest[10], ptr_digest[11],
8079 ptr_digest[12], ptr_digest[13],
8080 ptr_digest[14], ptr_digest[15],
8081 ptr_salt[0],
8082 ptr_salt[1],
8083 ptr_salt[2],
8084 ptr_salt[3]);
8085 }
8086 else if (hash_mode == 12400)
8087 {
8088 // encode iteration count
8089
8090 char salt_iter[5] = { 0 };
8091
8092 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8093 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8094 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8095 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8096 salt_iter[4] = 0;
8097
8098 // encode salt
8099
8100 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8101 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8102 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8103 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8104 ptr_salt[4] = 0;
8105
8106 // encode digest
8107
8108 memset (tmp_buf, 0, sizeof (tmp_buf));
8109
8110 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8111 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8112
8113 memcpy (tmp_buf, digest_buf, 8);
8114
8115 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8116
8117 ptr_plain[11] = 0;
8118
8119 // fill the resulting buffer
8120
8121 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8122 }
8123 else if (hash_mode == 12500)
8124 {
8125 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8126 SIGNATURE_RAR3,
8127 byte_swap_32 (salt.salt_buf[0]),
8128 byte_swap_32 (salt.salt_buf[1]),
8129 salt.salt_buf[2],
8130 salt.salt_buf[3],
8131 salt.salt_buf[4],
8132 salt.salt_buf[5]);
8133 }
8134 else if (hash_mode == 12600)
8135 {
8136 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8137 digest_buf[0] + salt.salt_buf_pc[0],
8138 digest_buf[1] + salt.salt_buf_pc[1],
8139 digest_buf[2] + salt.salt_buf_pc[2],
8140 digest_buf[3] + salt.salt_buf_pc[3],
8141 digest_buf[4] + salt.salt_buf_pc[4],
8142 digest_buf[5] + salt.salt_buf_pc[5],
8143 digest_buf[6] + salt.salt_buf_pc[6],
8144 digest_buf[7] + salt.salt_buf_pc[7]);
8145 }
8146 else if (hash_mode == 12700)
8147 {
8148 uint digest_idx = salt.digests_offset + digest_pos;
8149
8150 hashinfo_t **hashinfo_ptr = data.hash_info;
8151 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8152
8153 snprintf (out_buf, len-1, "%s", hash_buf);
8154 }
8155 else if (hash_mode == 12800)
8156 {
8157 const u8 *ptr = (const u8 *) salt.salt_buf;
8158
8159 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",
8160 SIGNATURE_MS_DRSR,
8161 ptr[0],
8162 ptr[1],
8163 ptr[2],
8164 ptr[3],
8165 ptr[4],
8166 ptr[5],
8167 ptr[6],
8168 ptr[7],
8169 ptr[8],
8170 ptr[9],
8171 salt.salt_iter + 1,
8172 byte_swap_32 (digest_buf[0]),
8173 byte_swap_32 (digest_buf[1]),
8174 byte_swap_32 (digest_buf[2]),
8175 byte_swap_32 (digest_buf[3]),
8176 byte_swap_32 (digest_buf[4]),
8177 byte_swap_32 (digest_buf[5]),
8178 byte_swap_32 (digest_buf[6]),
8179 byte_swap_32 (digest_buf[7])
8180 );
8181 }
8182 else if (hash_mode == 12900)
8183 {
8184 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",
8185 salt.salt_buf[ 4],
8186 salt.salt_buf[ 5],
8187 salt.salt_buf[ 6],
8188 salt.salt_buf[ 7],
8189 salt.salt_buf[ 8],
8190 salt.salt_buf[ 9],
8191 salt.salt_buf[10],
8192 salt.salt_buf[11],
8193 byte_swap_32 (digest_buf[0]),
8194 byte_swap_32 (digest_buf[1]),
8195 byte_swap_32 (digest_buf[2]),
8196 byte_swap_32 (digest_buf[3]),
8197 byte_swap_32 (digest_buf[4]),
8198 byte_swap_32 (digest_buf[5]),
8199 byte_swap_32 (digest_buf[6]),
8200 byte_swap_32 (digest_buf[7]),
8201 salt.salt_buf[ 0],
8202 salt.salt_buf[ 1],
8203 salt.salt_buf[ 2],
8204 salt.salt_buf[ 3]
8205 );
8206 }
8207 else if (hash_mode == 13000)
8208 {
8209 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8210
8211 rar5_t *rar5 = &rar5s[salt_pos];
8212
8213 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8214 salt.salt_buf[0],
8215 salt.salt_buf[1],
8216 salt.salt_buf[2],
8217 salt.salt_buf[3],
8218 salt.salt_sign[0],
8219 rar5->iv[0],
8220 rar5->iv[1],
8221 rar5->iv[2],
8222 rar5->iv[3],
8223 byte_swap_32 (digest_buf[0]),
8224 byte_swap_32 (digest_buf[1])
8225 );
8226 }
8227 else
8228 {
8229 if (hash_type == HASH_TYPE_MD4)
8230 {
8231 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8232 digest_buf[0],
8233 digest_buf[1],
8234 digest_buf[2],
8235 digest_buf[3]);
8236 }
8237 else if (hash_type == HASH_TYPE_MD5)
8238 {
8239 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8240 digest_buf[0],
8241 digest_buf[1],
8242 digest_buf[2],
8243 digest_buf[3]);
8244 }
8245 else if (hash_type == HASH_TYPE_SHA1)
8246 {
8247 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8248 digest_buf[0],
8249 digest_buf[1],
8250 digest_buf[2],
8251 digest_buf[3],
8252 digest_buf[4]);
8253 }
8254 else if (hash_type == HASH_TYPE_SHA256)
8255 {
8256 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8257 digest_buf[0],
8258 digest_buf[1],
8259 digest_buf[2],
8260 digest_buf[3],
8261 digest_buf[4],
8262 digest_buf[5],
8263 digest_buf[6],
8264 digest_buf[7]);
8265 }
8266 else if (hash_type == HASH_TYPE_SHA384)
8267 {
8268 uint *ptr = digest_buf;
8269
8270 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8271 ptr[ 1], ptr[ 0],
8272 ptr[ 3], ptr[ 2],
8273 ptr[ 5], ptr[ 4],
8274 ptr[ 7], ptr[ 6],
8275 ptr[ 9], ptr[ 8],
8276 ptr[11], ptr[10]);
8277 }
8278 else if (hash_type == HASH_TYPE_SHA512)
8279 {
8280 uint *ptr = digest_buf;
8281
8282 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8283 ptr[ 1], ptr[ 0],
8284 ptr[ 3], ptr[ 2],
8285 ptr[ 5], ptr[ 4],
8286 ptr[ 7], ptr[ 6],
8287 ptr[ 9], ptr[ 8],
8288 ptr[11], ptr[10],
8289 ptr[13], ptr[12],
8290 ptr[15], ptr[14]);
8291 }
8292 else if (hash_type == HASH_TYPE_LM)
8293 {
8294 snprintf (out_buf, len-1, "%08x%08x",
8295 digest_buf[0],
8296 digest_buf[1]);
8297 }
8298 else if (hash_type == HASH_TYPE_ORACLEH)
8299 {
8300 snprintf (out_buf, len-1, "%08X%08X",
8301 digest_buf[0],
8302 digest_buf[1]);
8303 }
8304 else if (hash_type == HASH_TYPE_BCRYPT)
8305 {
8306 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8307 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8308
8309 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8310
8311 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8312 }
8313 else if (hash_type == HASH_TYPE_KECCAK)
8314 {
8315 uint *ptr = digest_buf;
8316
8317 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",
8318 ptr[ 1], ptr[ 0],
8319 ptr[ 3], ptr[ 2],
8320 ptr[ 5], ptr[ 4],
8321 ptr[ 7], ptr[ 6],
8322 ptr[ 9], ptr[ 8],
8323 ptr[11], ptr[10],
8324 ptr[13], ptr[12],
8325 ptr[15], ptr[14],
8326 ptr[17], ptr[16],
8327 ptr[19], ptr[18],
8328 ptr[21], ptr[20],
8329 ptr[23], ptr[22],
8330 ptr[25], ptr[24],
8331 ptr[27], ptr[26],
8332 ptr[29], ptr[28],
8333 ptr[31], ptr[30],
8334 ptr[33], ptr[32],
8335 ptr[35], ptr[34],
8336 ptr[37], ptr[36],
8337 ptr[39], ptr[38],
8338 ptr[41], ptr[30],
8339 ptr[43], ptr[42],
8340 ptr[45], ptr[44],
8341 ptr[47], ptr[46],
8342 ptr[49], ptr[48]
8343 );
8344
8345 out_buf[salt.keccak_mdlen * 2] = 0;
8346 }
8347 else if (hash_type == HASH_TYPE_RIPEMD160)
8348 {
8349 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8350 digest_buf[0],
8351 digest_buf[1],
8352 digest_buf[2],
8353 digest_buf[3],
8354 digest_buf[4]);
8355 }
8356 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8357 {
8358 digest_buf[ 0] = digest_buf[ 0];
8359 digest_buf[ 1] = digest_buf[ 1];
8360 digest_buf[ 2] = digest_buf[ 2];
8361 digest_buf[ 3] = digest_buf[ 3];
8362 digest_buf[ 4] = digest_buf[ 4];
8363 digest_buf[ 5] = digest_buf[ 5];
8364 digest_buf[ 6] = digest_buf[ 6];
8365 digest_buf[ 7] = digest_buf[ 7];
8366 digest_buf[ 8] = digest_buf[ 8];
8367 digest_buf[ 9] = digest_buf[ 9];
8368 digest_buf[10] = digest_buf[10];
8369 digest_buf[11] = digest_buf[11];
8370 digest_buf[12] = digest_buf[12];
8371 digest_buf[13] = digest_buf[13];
8372 digest_buf[14] = digest_buf[14];
8373 digest_buf[15] = digest_buf[15];
8374
8375 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8376 digest_buf[ 0],
8377 digest_buf[ 1],
8378 digest_buf[ 2],
8379 digest_buf[ 3],
8380 digest_buf[ 4],
8381 digest_buf[ 5],
8382 digest_buf[ 6],
8383 digest_buf[ 7],
8384 digest_buf[ 8],
8385 digest_buf[ 9],
8386 digest_buf[10],
8387 digest_buf[11],
8388 digest_buf[12],
8389 digest_buf[13],
8390 digest_buf[14],
8391 digest_buf[15]);
8392 }
8393 else if (hash_type == HASH_TYPE_GOST)
8394 {
8395 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8396 digest_buf[0],
8397 digest_buf[1],
8398 digest_buf[2],
8399 digest_buf[3],
8400 digest_buf[4],
8401 digest_buf[5],
8402 digest_buf[6],
8403 digest_buf[7]);
8404 }
8405 else if (hash_type == HASH_TYPE_MYSQL)
8406 {
8407 snprintf (out_buf, len-1, "%08x%08x",
8408 digest_buf[0],
8409 digest_buf[1]);
8410 }
8411 else if (hash_type == HASH_TYPE_LOTUS5)
8412 {
8413 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8414 digest_buf[0],
8415 digest_buf[1],
8416 digest_buf[2],
8417 digest_buf[3]);
8418 }
8419 else if (hash_type == HASH_TYPE_LOTUS6)
8420 {
8421 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8422 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8423 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8424 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8425
8426 char buf[16] = { 0 };
8427
8428 memcpy (buf + 0, salt.salt_buf, 5);
8429 memcpy (buf + 5, digest_buf, 9);
8430
8431 buf[3] -= -4;
8432
8433 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8434
8435 tmp_buf[18] = salt.salt_buf_pc[7];
8436 tmp_buf[19] = 0;
8437
8438 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8439 }
8440 else if (hash_type == HASH_TYPE_LOTUS8)
8441 {
8442 char buf[52] = { 0 };
8443
8444 // salt
8445
8446 memcpy (buf + 0, salt.salt_buf, 16);
8447
8448 buf[3] -= -4;
8449
8450 // iteration
8451
8452 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8453
8454 // chars
8455
8456 buf[26] = salt.salt_buf_pc[0];
8457 buf[27] = salt.salt_buf_pc[1];
8458
8459 // digest
8460
8461 memcpy (buf + 28, digest_buf, 8);
8462
8463 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8464
8465 tmp_buf[49] = 0;
8466
8467 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8468 }
8469 else if (hash_type == HASH_TYPE_CRC32)
8470 {
8471 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8472 }
8473 }
8474
8475 if (salt_type == SALT_TYPE_INTERN)
8476 {
8477 size_t pos = strlen (out_buf);
8478
8479 out_buf[pos] = data.separator;
8480
8481 char *ptr = (char *) salt.salt_buf;
8482
8483 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8484
8485 out_buf[pos + 1 + salt.salt_len] = 0;
8486 }
8487 }
8488
8489 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8490 {
8491 memset (hccap, 0, sizeof (hccap_t));
8492
8493 salt_t *salt = &data.salts_buf[salt_pos];
8494
8495 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8496
8497 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8498 wpa_t *wpa = &wpas[salt_pos];
8499
8500 hccap->keyver = wpa->keyver;
8501
8502 hccap->eapol_size = wpa->eapol_size;
8503
8504 if (wpa->keyver != 1)
8505 {
8506 uint eapol_tmp[64] = { 0 };
8507
8508 for (uint i = 0; i < 64; i++)
8509 {
8510 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8511 }
8512
8513 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8514 }
8515 else
8516 {
8517 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8518 }
8519
8520 uint pke_tmp[25] = { 0 };
8521
8522 for (int i = 5; i < 25; i++)
8523 {
8524 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8525 }
8526
8527 char *pke_ptr = (char *) pke_tmp;
8528
8529 memcpy (hccap->mac1, pke_ptr + 23, 6);
8530 memcpy (hccap->mac2, pke_ptr + 29, 6);
8531 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8532 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8533
8534 char *digests_buf_ptr = (char *) data.digests_buf;
8535
8536 uint dgst_size = data.dgst_size;
8537
8538 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8539
8540 if (wpa->keyver != 1)
8541 {
8542 uint digest_tmp[4] = { 0 };
8543
8544 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8545 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8546 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8547 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8548
8549 memcpy (hccap->keymic, digest_tmp, 16);
8550 }
8551 else
8552 {
8553 memcpy (hccap->keymic, digest_ptr, 16);
8554 }
8555 }
8556
8557 void SuspendThreads ()
8558 {
8559 if (data.devices_status == STATUS_RUNNING)
8560 {
8561 hc_timer_set (&data.timer_paused);
8562
8563 data.devices_status = STATUS_PAUSED;
8564
8565 log_info ("Paused");
8566 }
8567 }
8568
8569 void ResumeThreads ()
8570 {
8571 if (data.devices_status == STATUS_PAUSED)
8572 {
8573 float ms_paused;
8574
8575 hc_timer_get (data.timer_paused, ms_paused);
8576
8577 data.ms_paused += ms_paused;
8578
8579 data.devices_status = STATUS_RUNNING;
8580
8581 log_info ("Resumed");
8582 }
8583 }
8584
8585 void bypass ()
8586 {
8587 if (data.devices_status != STATUS_RUNNING) return;
8588
8589 data.devices_status = STATUS_BYPASS;
8590
8591 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8592 }
8593
8594 void stop_at_checkpoint ()
8595 {
8596 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8597 {
8598 if (data.devices_status != STATUS_RUNNING) return;
8599 }
8600
8601 // this feature only makes sense if --restore-disable was not specified
8602
8603 if (data.restore_disable == 1)
8604 {
8605 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8606
8607 return;
8608 }
8609
8610 // check if monitoring of Restore Point updates should be enabled or disabled
8611
8612 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8613 {
8614 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8615
8616 // save the current restore point value
8617
8618 data.checkpoint_cur_words = get_lowest_words_done ();
8619
8620 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8621 }
8622 else
8623 {
8624 data.devices_status = STATUS_RUNNING;
8625
8626 // reset the global value for checkpoint checks
8627
8628 data.checkpoint_cur_words = 0;
8629
8630 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8631 }
8632 }
8633
8634 void myabort ()
8635 {
8636 if (data.devices_status == STATUS_INIT) return;
8637 if (data.devices_status == STATUS_STARTING) return;
8638
8639 data.devices_status = STATUS_ABORTED;
8640 }
8641
8642 void myquit ()
8643 {
8644 if (data.devices_status == STATUS_INIT) return;
8645 if (data.devices_status == STATUS_STARTING) return;
8646
8647 data.devices_status = STATUS_QUIT;
8648 }
8649
8650 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8651 {
8652 FILE *fp = fopen (kernel_file, "rb");
8653
8654 if (fp != NULL)
8655 {
8656 struct stat st;
8657
8658 memset (&st, 0, sizeof (st));
8659
8660 stat (kernel_file, &st);
8661
8662 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8663
8664 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8665
8666 if (num_read != (size_t) st.st_size)
8667 {
8668 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8669
8670 exit (-1);
8671 }
8672
8673 fclose (fp);
8674
8675 buf[st.st_size] = 0;
8676
8677 for (int i = 0; i < num_devices; i++)
8678 {
8679 kernel_lengths[i] = (size_t) st.st_size;
8680
8681 kernel_sources[i] = buf;
8682 }
8683 }
8684 else
8685 {
8686 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8687
8688 exit (-1);
8689 }
8690
8691 return;
8692 }
8693
8694 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8695 {
8696 if (binary_size > 0)
8697 {
8698 FILE *fp = fopen (dst, "wb");
8699
8700 lock_file (fp);
8701 fwrite (binary, sizeof (u8), binary_size, fp);
8702
8703 fflush (fp);
8704 fclose (fp);
8705 }
8706 }
8707
8708 /**
8709 * restore
8710 */
8711
8712 restore_data_t *init_restore (int argc, char **argv)
8713 {
8714 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8715
8716 if (data.restore_disable == 0)
8717 {
8718 FILE *fp = fopen (data.eff_restore_file, "rb");
8719
8720 if (fp)
8721 {
8722 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8723
8724 if (nread != 1)
8725 {
8726 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8727
8728 exit (-1);
8729 }
8730
8731 fclose (fp);
8732
8733 if (rd->pid)
8734 {
8735 char pidbin[BUFSIZ] = { 0 };
8736
8737 int pidbin_len = -1;
8738
8739 #ifdef _POSIX
8740 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8741
8742 FILE *fd = fopen (pidbin, "rb");
8743
8744 if (fd)
8745 {
8746 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8747
8748 pidbin[pidbin_len] = 0;
8749
8750 fclose (fd);
8751
8752 char *argv0_r = strrchr (argv[0], '/');
8753
8754 char *pidbin_r = strrchr (pidbin, '/');
8755
8756 if (argv0_r == NULL) argv0_r = argv[0];
8757
8758 if (pidbin_r == NULL) pidbin_r = pidbin;
8759
8760 if (strcmp (argv0_r, pidbin_r) == 0)
8761 {
8762 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8763
8764 exit (-1);
8765 }
8766 }
8767
8768 #elif _WIN
8769 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8770
8771 char pidbin2[BUFSIZ] = { 0 };
8772
8773 int pidbin2_len = -1;
8774
8775 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8776 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8777
8778 pidbin[pidbin_len] = 0;
8779 pidbin2[pidbin2_len] = 0;
8780
8781 if (pidbin2_len)
8782 {
8783 if (strcmp (pidbin, pidbin2) == 0)
8784 {
8785 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8786
8787 exit (-1);
8788 }
8789 }
8790 #endif
8791 }
8792
8793 if (rd->version_bin < RESTORE_MIN)
8794 {
8795 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8796
8797 exit (-1);
8798 }
8799 }
8800 }
8801
8802 memset (rd, 0, sizeof (restore_data_t));
8803
8804 rd->version_bin = VERSION_BIN;
8805
8806 #ifdef _POSIX
8807 rd->pid = getpid ();
8808 #elif _WIN
8809 rd->pid = GetCurrentProcessId ();
8810 #endif
8811
8812 if (getcwd (rd->cwd, 255) == NULL)
8813 {
8814 myfree (rd);
8815
8816 return (NULL);
8817 }
8818
8819 rd->argc = argc;
8820 rd->argv = argv;
8821
8822 return (rd);
8823 }
8824
8825 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8826 {
8827 FILE *fp = fopen (eff_restore_file, "rb");
8828
8829 if (fp == NULL)
8830 {
8831 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8832
8833 exit (-1);
8834 }
8835
8836 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8837 {
8838 log_error ("ERROR: cannot read %s", eff_restore_file);
8839
8840 exit (-1);
8841 }
8842
8843 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8844
8845 for (uint i = 0; i < rd->argc; i++)
8846 {
8847 char buf[BUFSIZ] = { 0 };
8848
8849 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8850 {
8851 log_error ("ERROR: cannot read %s", eff_restore_file);
8852
8853 exit (-1);
8854 }
8855
8856 size_t len = strlen (buf);
8857
8858 if (len) buf[len - 1] = 0;
8859
8860 rd->argv[i] = mystrdup (buf);
8861 }
8862
8863 fclose (fp);
8864
8865 char new_cwd[1024] = { 0 };
8866
8867 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8868
8869 if (nwd == NULL)
8870 {
8871 log_error ("Restore file is corrupted");
8872 }
8873
8874 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8875 {
8876 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8877 {
8878 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8879
8880 exit (-1);
8881 }
8882
8883 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8884 }
8885
8886 if (chdir (rd->cwd))
8887 {
8888 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8889
8890 exit (-1);
8891 }
8892 }
8893
8894 u64 get_lowest_words_done ()
8895 {
8896 u64 words_cur = -1;
8897
8898 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8899 {
8900 hc_device_param_t *device_param = &data.devices_param[device_id];
8901
8902 if (device_param->skipped) continue;
8903
8904 const u64 words_done = device_param->words_done;
8905
8906 if (words_done < words_cur) words_cur = words_done;
8907 }
8908
8909 // It's possible that a device's workload isn't finished right after a restore-case.
8910 // In that case, this function would return 0 and overwrite the real restore point
8911 // There's also data.words_cur which is set to rd->words_cur but it changes while
8912 // the attack is running therefore we should stick to rd->words_cur.
8913 // Note that -s influences rd->words_cur we should keep a close look on that.
8914
8915 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8916
8917 return words_cur;
8918 }
8919
8920 void write_restore (const char *new_restore_file, restore_data_t *rd)
8921 {
8922 u64 words_cur = get_lowest_words_done ();
8923
8924 rd->words_cur = words_cur;
8925
8926 FILE *fp = fopen (new_restore_file, "wb");
8927
8928 if (fp == NULL)
8929 {
8930 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8931
8932 exit (-1);
8933 }
8934
8935 if (setvbuf (fp, NULL, _IONBF, 0))
8936 {
8937 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8938
8939 exit (-1);
8940 }
8941
8942 fwrite (rd, sizeof (restore_data_t), 1, fp);
8943
8944 for (uint i = 0; i < rd->argc; i++)
8945 {
8946 fprintf (fp, "%s", rd->argv[i]);
8947 fputc ('\n', fp);
8948 }
8949
8950 fflush (fp);
8951
8952 fsync (fileno (fp));
8953
8954 fclose (fp);
8955 }
8956
8957 void cycle_restore ()
8958 {
8959 const char *eff_restore_file = data.eff_restore_file;
8960 const char *new_restore_file = data.new_restore_file;
8961
8962 restore_data_t *rd = data.rd;
8963
8964 write_restore (new_restore_file, rd);
8965
8966 struct stat st;
8967
8968 memset (&st, 0, sizeof(st));
8969
8970 if (stat (eff_restore_file, &st) == 0)
8971 {
8972 if (unlink (eff_restore_file))
8973 {
8974 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8975 }
8976 }
8977
8978 if (rename (new_restore_file, eff_restore_file))
8979 {
8980 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8981 }
8982 }
8983
8984 void check_checkpoint ()
8985 {
8986 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8987
8988 u64 words_cur = get_lowest_words_done ();
8989
8990 if (words_cur != data.checkpoint_cur_words)
8991 {
8992 myabort ();
8993 }
8994 }
8995
8996 /**
8997 * adjustments
8998 */
8999
9000 #ifdef OSX
9001 uint set_kernel_accel_osx (uint hash_mode)
9002 {
9003 switch (hash_mode)
9004 {
9005 case 1800: return GET_ACCEL_OSX (1800);
9006 case 2500: return GET_ACCEL_OSX (2500);
9007 case 5000: return GET_ACCEL_OSX (5000);
9008 case 6100: return GET_ACCEL_OSX (6100);
9009 case 6211: return GET_ACCEL_OSX (6211);
9010 case 6231: return GET_ACCEL_OSX (6231);
9011 case 6241: return GET_ACCEL_OSX (6241);
9012 case 6800: return GET_ACCEL_OSX (6800);
9013 case 7100: return GET_ACCEL_OSX (7100);
9014 case 7200: return GET_ACCEL_OSX (7200);
9015 case 7900: return GET_ACCEL_OSX (7900);
9016 case 8200: return GET_ACCEL_OSX (8200);
9017 case 8700: return GET_ACCEL_OSX (8700);
9018 case 9100: return GET_ACCEL_OSX (9100);
9019 case 9200: return GET_ACCEL_OSX (9200);
9020 case 9300: return GET_ACCEL_OSX (9300);
9021 case 9400: return GET_ACCEL_OSX (9400);
9022 case 9500: return GET_ACCEL_OSX (9500);
9023 case 9600: return GET_ACCEL_OSX (9600);
9024 case 10000: return GET_ACCEL_OSX (10000);
9025 case 10500: return GET_ACCEL_OSX (10500);
9026 case 11300: return GET_ACCEL_OSX (11300);
9027 case 11600: return GET_ACCEL_OSX (11600);
9028 case 11700: return GET_ACCEL_OSX (11700);
9029 case 11800: return GET_ACCEL_OSX (11800);
9030 case 12200: return GET_ACCEL_OSX (12200);
9031 case 12400: return GET_ACCEL_OSX (12400);
9032 case 12500: return GET_ACCEL_OSX (12500);
9033 case 13000: return GET_ACCEL_OSX (13000);
9034 }
9035
9036 return (-1);
9037 }
9038
9039 uint set_kernel_accel (uint hash_mode, bool isGpu)
9040 {
9041 int accel = -1;
9042
9043 if (isGpu)
9044 accel = set_kernel_accel_osx (hash_mode);
9045
9046 if (accel != -1)
9047 return accel;
9048 #else
9049
9050 uint set_kernel_accel (uint hash_mode)
9051 {
9052
9053 #endif
9054
9055 switch (hash_mode)
9056 {
9057 case 0: return GET_ACCEL (0);
9058 case 10: return GET_ACCEL (10);
9059 case 11: return GET_ACCEL (11);
9060 case 12: return GET_ACCEL (12);
9061 case 20: return GET_ACCEL (20);
9062 case 21: return GET_ACCEL (21);
9063 case 22: return GET_ACCEL (22);
9064 case 23: return GET_ACCEL (23);
9065 case 30: return GET_ACCEL (30);
9066 case 40: return GET_ACCEL (40);
9067 case 50: return GET_ACCEL (50);
9068 case 60: return GET_ACCEL (60);
9069 case 100: return GET_ACCEL (100);
9070 case 101: return GET_ACCEL (101);
9071 case 110: return GET_ACCEL (110);
9072 case 111: return GET_ACCEL (111);
9073 case 112: return GET_ACCEL (112);
9074 case 120: return GET_ACCEL (120);
9075 case 121: return GET_ACCEL (121);
9076 case 122: return GET_ACCEL (122);
9077 case 124: return GET_ACCEL (124);
9078 case 130: return GET_ACCEL (130);
9079 case 131: return GET_ACCEL (131);
9080 case 132: return GET_ACCEL (132);
9081 case 133: return GET_ACCEL (133);
9082 case 140: return GET_ACCEL (140);
9083 case 141: return GET_ACCEL (141);
9084 case 150: return GET_ACCEL (150);
9085 case 160: return GET_ACCEL (160);
9086 case 190: return GET_ACCEL (190);
9087 case 200: return GET_ACCEL (200);
9088 case 300: return GET_ACCEL (300);
9089 case 400: return GET_ACCEL (400);
9090 case 500: return GET_ACCEL (500);
9091 case 501: return GET_ACCEL (501);
9092 case 900: return GET_ACCEL (900);
9093 case 910: return GET_ACCEL (910);
9094 case 1000: return GET_ACCEL (1000);
9095 case 1100: return GET_ACCEL (1100);
9096 case 1400: return GET_ACCEL (1400);
9097 case 1410: return GET_ACCEL (1410);
9098 case 1420: return GET_ACCEL (1420);
9099 case 1421: return GET_ACCEL (1421);
9100 case 1430: return GET_ACCEL (1430);
9101 case 1440: return GET_ACCEL (1440);
9102 case 1441: return GET_ACCEL (1441);
9103 case 1450: return GET_ACCEL (1450);
9104 case 1460: return GET_ACCEL (1460);
9105 case 1500: return GET_ACCEL (1500);
9106 case 1600: return GET_ACCEL (1600);
9107 case 1700: return GET_ACCEL (1700);
9108 case 1710: return GET_ACCEL (1710);
9109 case 1711: return GET_ACCEL (1711);
9110 case 1720: return GET_ACCEL (1720);
9111 case 1722: return GET_ACCEL (1722);
9112 case 1730: return GET_ACCEL (1730);
9113 case 1731: return GET_ACCEL (1731);
9114 case 1740: return GET_ACCEL (1740);
9115 case 1750: return GET_ACCEL (1750);
9116 case 1760: return GET_ACCEL (1760);
9117 case 1800: return GET_ACCEL (1800);
9118 case 2100: return GET_ACCEL (2100);
9119 case 2400: return GET_ACCEL (2400);
9120 case 2410: return GET_ACCEL (2410);
9121 case 2500: return GET_ACCEL (2500);
9122 case 2600: return GET_ACCEL (2600);
9123 case 2611: return GET_ACCEL (2611);
9124 case 2612: return GET_ACCEL (2612);
9125 case 2711: return GET_ACCEL (2711);
9126 case 2811: return GET_ACCEL (2811);
9127 case 3000: return GET_ACCEL (3000);
9128 case 3100: return GET_ACCEL (3100);
9129 case 3200: return GET_ACCEL (3200);
9130 case 3710: return GET_ACCEL (3710);
9131 case 3711: return GET_ACCEL (3711);
9132 case 3800: return GET_ACCEL (3800);
9133 case 4300: return GET_ACCEL (4300);
9134 case 4400: return GET_ACCEL (4400);
9135 case 4500: return GET_ACCEL (4500);
9136 case 4700: return GET_ACCEL (4700);
9137 case 4800: return GET_ACCEL (4800);
9138 case 4900: return GET_ACCEL (4900);
9139 case 5000: return GET_ACCEL (5000);
9140 case 5100: return GET_ACCEL (5100);
9141 case 5200: return GET_ACCEL (5200);
9142 case 5300: return GET_ACCEL (5300);
9143 case 5400: return GET_ACCEL (5400);
9144 case 5500: return GET_ACCEL (5500);
9145 case 5600: return GET_ACCEL (5600);
9146 case 5700: return GET_ACCEL (5700);
9147 case 5800: return GET_ACCEL (5800);
9148 case 6000: return GET_ACCEL (6000);
9149 case 6100: return GET_ACCEL (6100);
9150 case 6211: return GET_ACCEL (6211);
9151 case 6212: return GET_ACCEL (6212);
9152 case 6213: return GET_ACCEL (6213);
9153 case 6221: return GET_ACCEL (6221);
9154 case 6222: return GET_ACCEL (6222);
9155 case 6223: return GET_ACCEL (6223);
9156 case 6231: return GET_ACCEL (6231);
9157 case 6232: return GET_ACCEL (6232);
9158 case 6233: return GET_ACCEL (6233);
9159 case 6241: return GET_ACCEL (6241);
9160 case 6242: return GET_ACCEL (6242);
9161 case 6243: return GET_ACCEL (6243);
9162 case 6300: return GET_ACCEL (6300);
9163 case 6400: return GET_ACCEL (6400);
9164 case 6500: return GET_ACCEL (6500);
9165 case 6600: return GET_ACCEL (6600);
9166 case 6700: return GET_ACCEL (6700);
9167 case 6800: return GET_ACCEL (6800);
9168 case 6900: return GET_ACCEL (6900);
9169 case 7100: return GET_ACCEL (7100);
9170 case 7200: return GET_ACCEL (7200);
9171 case 7300: return GET_ACCEL (7300);
9172 case 7400: return GET_ACCEL (7400);
9173 case 7500: return GET_ACCEL (7500);
9174 case 7600: return GET_ACCEL (7600);
9175 case 7700: return GET_ACCEL (7700);
9176 case 7800: return GET_ACCEL (7800);
9177 case 7900: return GET_ACCEL (7900);
9178 case 8000: return GET_ACCEL (8000);
9179 case 8100: return GET_ACCEL (8100);
9180 case 8200: return GET_ACCEL (8200);
9181 case 8300: return GET_ACCEL (8300);
9182 case 8400: return GET_ACCEL (8400);
9183 case 8500: return GET_ACCEL (8500);
9184 case 8600: return GET_ACCEL (8600);
9185 case 8700: return GET_ACCEL (8700);
9186 case 8800: return GET_ACCEL (8800);
9187 case 8900: return GET_ACCEL (8900);
9188 case 9000: return GET_ACCEL (9000);
9189 case 9100: return GET_ACCEL (9100);
9190 case 9200: return GET_ACCEL (9200);
9191 case 9300: return GET_ACCEL (9300);
9192 case 9400: return GET_ACCEL (9400);
9193 case 9500: return GET_ACCEL (9500);
9194 case 9600: return GET_ACCEL (9600);
9195 case 9700: return GET_ACCEL (9700);
9196 case 9710: return GET_ACCEL (9710);
9197 case 9720: return GET_ACCEL (9720);
9198 case 9800: return GET_ACCEL (9800);
9199 case 9810: return GET_ACCEL (9810);
9200 case 9820: return GET_ACCEL (9820);
9201 case 9900: return GET_ACCEL (9900);
9202 case 10000: return GET_ACCEL (10000);
9203 case 10100: return GET_ACCEL (10100);
9204 case 10200: return GET_ACCEL (10200);
9205 case 10300: return GET_ACCEL (10300);
9206 case 10400: return GET_ACCEL (10400);
9207 case 10410: return GET_ACCEL (10410);
9208 case 10420: return GET_ACCEL (10420);
9209 case 10500: return GET_ACCEL (10500);
9210 case 10600: return GET_ACCEL (10600);
9211 case 10700: return GET_ACCEL (10700);
9212 case 10800: return GET_ACCEL (10800);
9213 case 10900: return GET_ACCEL (10900);
9214 case 11000: return GET_ACCEL (11000);
9215 case 11100: return GET_ACCEL (11100);
9216 case 11200: return GET_ACCEL (11200);
9217 case 11300: return GET_ACCEL (11300);
9218 case 11400: return GET_ACCEL (11400);
9219 case 11500: return GET_ACCEL (11500);
9220 case 11600: return GET_ACCEL (11600);
9221 case 11700: return GET_ACCEL (11700);
9222 case 11800: return GET_ACCEL (11800);
9223 case 11900: return GET_ACCEL (11900);
9224 case 12000: return GET_ACCEL (12000);
9225 case 12100: return GET_ACCEL (12100);
9226 case 12200: return GET_ACCEL (12200);
9227 case 12300: return GET_ACCEL (12300);
9228 case 12400: return GET_ACCEL (12400);
9229 case 12500: return GET_ACCEL (12500);
9230 case 12600: return GET_ACCEL (12600);
9231 case 12700: return GET_ACCEL (12700);
9232 case 12800: return GET_ACCEL (12800);
9233 case 12900: return GET_ACCEL (12900);
9234 case 13000: return GET_ACCEL (13000);
9235 }
9236
9237 return 0;
9238 }
9239
9240 #ifdef OSX
9241 uint set_kernel_loops_osx (uint hash_mode)
9242 {
9243 switch (hash_mode)
9244 {
9245 case 0: return GET_LOOPS_OSX (0);
9246 case 10: return GET_LOOPS_OSX (10);
9247 case 11: return GET_LOOPS_OSX (11);
9248 case 12: return GET_LOOPS_OSX (12);
9249 case 20: return GET_LOOPS_OSX (20);
9250 case 21: return GET_LOOPS_OSX (21);
9251 case 22: return GET_LOOPS_OSX (22);
9252 case 23: return GET_LOOPS_OSX (23);
9253 case 30: return GET_LOOPS_OSX (30);
9254 case 40: return GET_LOOPS_OSX (40);
9255 case 50: return GET_LOOPS_OSX (50);
9256 case 60: return GET_LOOPS_OSX (60);
9257 case 100: return GET_LOOPS_OSX (100);
9258 case 101: return GET_LOOPS_OSX (101);
9259 case 110: return GET_LOOPS_OSX (110);
9260 case 111: return GET_LOOPS_OSX (111);
9261 case 112: return GET_LOOPS_OSX (112);
9262 case 120: return GET_LOOPS_OSX (120);
9263 case 121: return GET_LOOPS_OSX (121);
9264 case 122: return GET_LOOPS_OSX (122);
9265 case 124: return GET_LOOPS_OSX (124);
9266 case 130: return GET_LOOPS_OSX (130);
9267 case 131: return GET_LOOPS_OSX (131);
9268 case 132: return GET_LOOPS_OSX (132);
9269 case 133: return GET_LOOPS_OSX (133);
9270 case 140: return GET_LOOPS_OSX (140);
9271 case 141: return GET_LOOPS_OSX (141);
9272 case 150: return GET_LOOPS_OSX (150);
9273 case 160: return GET_LOOPS_OSX (160);
9274 case 190: return GET_LOOPS_OSX (190);
9275 case 200: return GET_LOOPS_OSX (200);
9276 case 300: return GET_LOOPS_OSX (300);
9277 case 900: return GET_LOOPS_OSX (900);
9278 case 1000: return GET_LOOPS_OSX (1000);
9279 case 1100: return GET_LOOPS_OSX (1100);
9280 case 1400: return GET_LOOPS_OSX (1400);
9281 case 1410: return GET_LOOPS_OSX (1410);
9282 case 1420: return GET_LOOPS_OSX (1420);
9283 case 1421: return GET_LOOPS_OSX (1421);
9284 case 1430: return GET_LOOPS_OSX (1430);
9285 case 1440: return GET_LOOPS_OSX (1440);
9286 case 1441: return GET_LOOPS_OSX (1441);
9287 case 1450: return GET_LOOPS_OSX (1450);
9288 case 1460: return GET_LOOPS_OSX (1460);
9289 case 1700: return GET_LOOPS_OSX (1700);
9290 case 1710: return GET_LOOPS_OSX (1710);
9291 case 1711: return GET_LOOPS_OSX (1711);
9292 case 1720: return GET_LOOPS_OSX (1720);
9293 case 1722: return GET_LOOPS_OSX (1722);
9294 case 1730: return GET_LOOPS_OSX (1730);
9295 case 1731: return GET_LOOPS_OSX (1731);
9296 case 1740: return GET_LOOPS_OSX (1740);
9297 case 1750: return GET_LOOPS_OSX (1750);
9298 case 1760: return GET_LOOPS_OSX (1760);
9299 case 2400: return GET_LOOPS_OSX (2400);
9300 case 2410: return GET_LOOPS_OSX (2410);
9301 case 2600: return GET_LOOPS_OSX (2600);
9302 case 2611: return GET_LOOPS_OSX (2611);
9303 case 2612: return GET_LOOPS_OSX (2612);
9304 case 2711: return GET_LOOPS_OSX (2711);
9305 case 2811: return GET_LOOPS_OSX (2811);
9306 case 3100: return GET_LOOPS_OSX (3100);
9307 case 3200: return GET_LOOPS_OSX (3200);
9308 case 3710: return GET_LOOPS_OSX (3710);
9309 case 3711: return GET_LOOPS_OSX (3711);
9310 case 3800: return GET_LOOPS_OSX (3800);
9311 case 4300: return GET_LOOPS_OSX (4300);
9312 case 4400: return GET_LOOPS_OSX (4400);
9313 case 4500: return GET_LOOPS_OSX (4500);
9314 case 4700: return GET_LOOPS_OSX (4700);
9315 case 4800: return GET_LOOPS_OSX (4800);
9316 case 4900: return GET_LOOPS_OSX (4900);
9317 case 5000: return GET_LOOPS_OSX (5000);
9318 case 5100: return GET_LOOPS_OSX (5100);
9319 case 5300: return GET_LOOPS_OSX (5300);
9320 case 5400: return GET_LOOPS_OSX (5400);
9321 case 5500: return GET_LOOPS_OSX (5500);
9322 case 5600: return GET_LOOPS_OSX (5600);
9323 case 5700: return GET_LOOPS_OSX (5700);
9324 case 6000: return GET_LOOPS_OSX (6000);
9325 case 6100: return GET_LOOPS_OSX (6100);
9326 case 6231: return GET_LOOPS_OSX (6231);
9327 case 6232: return GET_LOOPS_OSX (6232);
9328 case 6233: return GET_LOOPS_OSX (6233);
9329 case 6900: return GET_LOOPS_OSX (6900);
9330 case 7300: return GET_LOOPS_OSX (7300);
9331 case 7500: return GET_LOOPS_OSX (7500);
9332 case 7600: return GET_LOOPS_OSX (7600);
9333 case 7700: return GET_LOOPS_OSX (7700);
9334 case 7800: return GET_LOOPS_OSX (7800);
9335 case 8000: return GET_LOOPS_OSX (8000);
9336 case 8100: return GET_LOOPS_OSX (8100);
9337 case 8200: return GET_LOOPS_OSX (8200);
9338 case 8300: return GET_LOOPS_OSX (8300);
9339 case 8400: return GET_LOOPS_OSX (8400);
9340 case 8500: return GET_LOOPS_OSX (8500);
9341 case 8600: return GET_LOOPS_OSX (8600);
9342 case 8700: return GET_LOOPS_OSX (8700);
9343 case 9700: return GET_LOOPS_OSX (9700);
9344 case 9710: return GET_LOOPS_OSX (9710);
9345 case 9720: return GET_LOOPS_OSX (9720);
9346 case 9800: return GET_LOOPS_OSX (9800);
9347 case 9810: return GET_LOOPS_OSX (9810);
9348 case 9820: return GET_LOOPS_OSX (9820);
9349 case 9900: return GET_LOOPS_OSX (9900);
9350 case 10100: return GET_LOOPS_OSX (10100);
9351 case 10200: return GET_LOOPS_OSX (10200);
9352 case 10400: return GET_LOOPS_OSX (10400);
9353 case 10410: return GET_LOOPS_OSX (10410);
9354 case 10420: return GET_LOOPS_OSX (10420);
9355 case 10600: return GET_LOOPS_OSX (10600);
9356 case 10700: return GET_LOOPS_OSX (10700);
9357 case 10800: return GET_LOOPS_OSX (10800);
9358 case 11000: return GET_LOOPS_OSX (11000);
9359 case 11100: return GET_LOOPS_OSX (11100);
9360 case 11200: return GET_LOOPS_OSX (11200);
9361 case 11300: return GET_LOOPS_OSX (11300);
9362 case 11400: return GET_LOOPS_OSX (11400);
9363 case 11500: return GET_LOOPS_OSX (11500);
9364 case 11700: return GET_LOOPS_OSX (11700);
9365 case 11800: return GET_LOOPS_OSX (11800);
9366 case 12600: return GET_LOOPS_OSX (12600);
9367 }
9368
9369 return (-1);
9370 }
9371
9372 uint set_kernel_loops (uint hash_mode, bool isGpu)
9373 {
9374 int loops = -1;
9375 if (isGpu)
9376 loops = set_kernel_loops_osx (hash_mode);
9377
9378 if (loops != -1)
9379 return loops;
9380
9381 #else
9382
9383 uint set_kernel_loops (uint hash_mode)
9384 {
9385
9386 #endif // OSX
9387
9388 switch (hash_mode)
9389 {
9390 case 0: return GET_LOOPS (0);
9391 case 10: return GET_LOOPS (10);
9392 case 11: return GET_LOOPS (11);
9393 case 12: return GET_LOOPS (12);
9394 case 20: return GET_LOOPS (20);
9395 case 21: return GET_LOOPS (21);
9396 case 22: return GET_LOOPS (22);
9397 case 23: return GET_LOOPS (23);
9398 case 30: return GET_LOOPS (30);
9399 case 40: return GET_LOOPS (40);
9400 case 50: return GET_LOOPS (50);
9401 case 60: return GET_LOOPS (60);
9402 case 100: return GET_LOOPS (100);
9403 case 101: return GET_LOOPS (101);
9404 case 110: return GET_LOOPS (110);
9405 case 111: return GET_LOOPS (111);
9406 case 112: return GET_LOOPS (112);
9407 case 120: return GET_LOOPS (120);
9408 case 121: return GET_LOOPS (121);
9409 case 122: return GET_LOOPS (122);
9410 case 124: return GET_LOOPS (124);
9411 case 130: return GET_LOOPS (130);
9412 case 131: return GET_LOOPS (131);
9413 case 132: return GET_LOOPS (132);
9414 case 133: return GET_LOOPS (133);
9415 case 140: return GET_LOOPS (140);
9416 case 141: return GET_LOOPS (141);
9417 case 150: return GET_LOOPS (150);
9418 case 160: return GET_LOOPS (160);
9419 case 190: return GET_LOOPS (190);
9420 case 200: return GET_LOOPS (200);
9421 case 300: return GET_LOOPS (300);
9422 case 400: return GET_LOOPS (400);
9423 case 500: return GET_LOOPS (500);
9424 case 501: return GET_LOOPS (501);
9425 case 900: return GET_LOOPS (900);
9426 case 910: return GET_LOOPS (910);
9427 case 1000: return GET_LOOPS (1000);
9428 case 1100: return GET_LOOPS (1100);
9429 case 1400: return GET_LOOPS (1400);
9430 case 1410: return GET_LOOPS (1410);
9431 case 1420: return GET_LOOPS (1420);
9432 case 1421: return GET_LOOPS (1421);
9433 case 1430: return GET_LOOPS (1430);
9434 case 1440: return GET_LOOPS (1440);
9435 case 1441: return GET_LOOPS (1441);
9436 case 1450: return GET_LOOPS (1450);
9437 case 1460: return GET_LOOPS (1460);
9438 case 1500: return GET_LOOPS (1500);
9439 case 1600: return GET_LOOPS (1600);
9440 case 1700: return GET_LOOPS (1700);
9441 case 1710: return GET_LOOPS (1710);
9442 case 1711: return GET_LOOPS (1711);
9443 case 1720: return GET_LOOPS (1720);
9444 case 1722: return GET_LOOPS (1722);
9445 case 1730: return GET_LOOPS (1730);
9446 case 1731: return GET_LOOPS (1731);
9447 case 1740: return GET_LOOPS (1740);
9448 case 1750: return GET_LOOPS (1750);
9449 case 1760: return GET_LOOPS (1760);
9450 case 1800: return GET_LOOPS (1800);
9451 case 2100: return GET_LOOPS (2100);
9452 case 2400: return GET_LOOPS (2400);
9453 case 2410: return GET_LOOPS (2410);
9454 case 2500: return GET_LOOPS (2500);
9455 case 2600: return GET_LOOPS (2600);
9456 case 2611: return GET_LOOPS (2611);
9457 case 2612: return GET_LOOPS (2612);
9458 case 2711: return GET_LOOPS (2711);
9459 case 2811: return GET_LOOPS (2811);
9460 case 3000: return GET_LOOPS (3000);
9461 case 3100: return GET_LOOPS (3100);
9462 case 3200: return GET_LOOPS (3200);
9463 case 3710: return GET_LOOPS (3710);
9464 case 3711: return GET_LOOPS (3711);
9465 case 3800: return GET_LOOPS (3800);
9466 case 4300: return GET_LOOPS (4300);
9467 case 4400: return GET_LOOPS (4400);
9468 case 4500: return GET_LOOPS (4500);
9469 case 4700: return GET_LOOPS (4700);
9470 case 4800: return GET_LOOPS (4800);
9471 case 4900: return GET_LOOPS (4900);
9472 case 5000: return GET_LOOPS (5000);
9473 case 5100: return GET_LOOPS (5100);
9474 case 5200: return GET_LOOPS (5200);
9475 case 5300: return GET_LOOPS (5300);
9476 case 5400: return GET_LOOPS (5400);
9477 case 5500: return GET_LOOPS (5500);
9478 case 5600: return GET_LOOPS (5600);
9479 case 5700: return GET_LOOPS (5700);
9480 case 5800: return GET_LOOPS (5800);
9481 case 6000: return GET_LOOPS (6000);
9482 case 6100: return GET_LOOPS (6100);
9483 case 6211: return GET_LOOPS (6211);
9484 case 6212: return GET_LOOPS (6212);
9485 case 6213: return GET_LOOPS (6213);
9486 case 6221: return GET_LOOPS (6221);
9487 case 6222: return GET_LOOPS (6222);
9488 case 6223: return GET_LOOPS (6223);
9489 case 6231: return GET_LOOPS (6231);
9490 case 6232: return GET_LOOPS (6232);
9491 case 6233: return GET_LOOPS (6233);
9492 case 6241: return GET_LOOPS (6241);
9493 case 6242: return GET_LOOPS (6242);
9494 case 6243: return GET_LOOPS (6243);
9495 case 6300: return GET_LOOPS (6300);
9496 case 6400: return GET_LOOPS (6400);
9497 case 6500: return GET_LOOPS (6500);
9498 case 6600: return GET_LOOPS (6600);
9499 case 6700: return GET_LOOPS (6700);
9500 case 6800: return GET_LOOPS (6800);
9501 case 6900: return GET_LOOPS (6900);
9502 case 7100: return GET_LOOPS (7100);
9503 case 7200: return GET_LOOPS (7200);
9504 case 7300: return GET_LOOPS (7300);
9505 case 7400: return GET_LOOPS (7400);
9506 case 7500: return GET_LOOPS (7500);
9507 case 7600: return GET_LOOPS (7600);
9508 case 7700: return GET_LOOPS (7700);
9509 case 7800: return GET_LOOPS (7800);
9510 case 7900: return GET_LOOPS (7900);
9511 case 8000: return GET_LOOPS (8000);
9512 case 8100: return GET_LOOPS (8100);
9513 case 8200: return GET_LOOPS (8200);
9514 case 8300: return GET_LOOPS (8300);
9515 case 8400: return GET_LOOPS (8400);
9516 case 8500: return GET_LOOPS (8500);
9517 case 8600: return GET_LOOPS (8600);
9518 case 8700: return GET_LOOPS (8700);
9519 case 8800: return GET_LOOPS (8800);
9520 case 8900: return GET_LOOPS (8900);
9521 case 9000: return GET_LOOPS (9000);
9522 case 9100: return GET_LOOPS (9100);
9523 case 9200: return GET_LOOPS (9200);
9524 case 9300: return GET_LOOPS (9300);
9525 case 9400: return GET_LOOPS (9400);
9526 case 9500: return GET_LOOPS (9500);
9527 case 9600: return GET_LOOPS (9600);
9528 case 9700: return GET_LOOPS (9700);
9529 case 9710: return GET_LOOPS (9710);
9530 case 9720: return GET_LOOPS (9720);
9531 case 9800: return GET_LOOPS (9800);
9532 case 9810: return GET_LOOPS (9810);
9533 case 9820: return GET_LOOPS (9820);
9534 case 9900: return GET_LOOPS (9900);
9535 case 10000: return GET_LOOPS (10000);
9536 case 10100: return GET_LOOPS (10100);
9537 case 10200: return GET_LOOPS (10200);
9538 case 10300: return GET_LOOPS (10300);
9539 case 10400: return GET_LOOPS (10400);
9540 case 10410: return GET_LOOPS (10410);
9541 case 10420: return GET_LOOPS (10420);
9542 case 10500: return GET_LOOPS (10500);
9543 case 10600: return GET_LOOPS (10600);
9544 case 10700: return GET_LOOPS (10700);
9545 case 10800: return GET_LOOPS (10800);
9546 case 10900: return GET_LOOPS (10900);
9547 case 11000: return GET_LOOPS (11000);
9548 case 11100: return GET_LOOPS (11100);
9549 case 11200: return GET_LOOPS (11200);
9550 case 11300: return GET_LOOPS (11300);
9551 case 11400: return GET_LOOPS (11400);
9552 case 11500: return GET_LOOPS (11500);
9553 case 11600: return GET_LOOPS (11600);
9554 case 11700: return GET_LOOPS (11700);
9555 case 11800: return GET_LOOPS (11800);
9556 case 11900: return GET_LOOPS (11900);
9557 case 12000: return GET_LOOPS (12000);
9558 case 12100: return GET_LOOPS (12100);
9559 case 12200: return GET_LOOPS (12200);
9560 case 12300: return GET_LOOPS (12300);
9561 case 12400: return GET_LOOPS (12400);
9562 case 12500: return GET_LOOPS (12500);
9563 case 12600: return GET_LOOPS (12600);
9564 case 12700: return GET_LOOPS (12700);
9565 case 12800: return GET_LOOPS (12800);
9566 case 12900: return GET_LOOPS (12900);
9567 case 13000: return GET_LOOPS (13000);
9568 }
9569
9570 return 0;
9571 }
9572
9573 /**
9574 * parser
9575 */
9576
9577 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9578 {
9579 u8 tmp[256] = { 0 };
9580
9581 if (salt_len > sizeof (tmp))
9582 {
9583 return UINT_MAX;
9584 }
9585
9586 memcpy (tmp, in, salt_len);
9587
9588 if (data.opts_type & OPTS_TYPE_ST_HEX)
9589 {
9590 if ((salt_len % 2) == 0)
9591 {
9592 u32 new_salt_len = salt_len / 2;
9593
9594 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9595 {
9596 u8 p0 = tmp[j + 0];
9597 u8 p1 = tmp[j + 1];
9598
9599 tmp[i] = hex_convert (p1) << 0;
9600 tmp[i] |= hex_convert (p0) << 4;
9601 }
9602
9603 salt_len = new_salt_len;
9604 }
9605 else
9606 {
9607 return UINT_MAX;
9608 }
9609 }
9610 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9611 {
9612 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9613 }
9614
9615 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9616
9617 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9618 {
9619 if (salt_len < 20)
9620 {
9621 u32 *tmp_uint = (u32 *) tmp;
9622
9623 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9624 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9625 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9626 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9627 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9628 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9629 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9630 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9631 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9632 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9633
9634 salt_len = salt_len * 2;
9635 }
9636 else
9637 {
9638 return UINT_MAX;
9639 }
9640 }
9641
9642 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9643 {
9644 lowercase (tmp, salt_len);
9645 }
9646
9647 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9648 {
9649 uppercase (tmp, salt_len);
9650 }
9651
9652 u32 len = salt_len;
9653
9654 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9655 {
9656 tmp[len++] = 0x80;
9657 }
9658
9659 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9660 {
9661 tmp[len++] = 0x01;
9662 }
9663
9664 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9665 {
9666 u32 *tmp_uint = (uint *) tmp;
9667
9668 u32 max = len / 4;
9669
9670 if (len % 4) max++;
9671
9672 for (u32 i = 0; i < max; i++)
9673 {
9674 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9675 }
9676
9677 // Important: we may need to increase the length of memcpy since
9678 // we don't want to "loose" some swapped bytes (could happen if
9679 // they do not perfectly fit in the 4-byte blocks)
9680 // Memcpy does always copy the bytes in the BE order, but since
9681 // we swapped them, some important bytes could be in positions
9682 // we normally skip with the original len
9683
9684 if (len % 4) len += 4 - (len % 4);
9685 }
9686
9687 memcpy (out, tmp, len);
9688
9689 return (salt_len);
9690 }
9691
9692 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9693 {
9694 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9695
9696 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9697
9698 u32 *digest = (u32 *) hash_buf->digest;
9699
9700 salt_t *salt = hash_buf->salt;
9701
9702 memcpy ((char *) salt->salt_sign, input_buf, 6);
9703
9704 char *iter_pos = input_buf + 4;
9705
9706 salt->salt_iter = 1 << atoi (iter_pos);
9707
9708 char *salt_pos = strchr (iter_pos, '$');
9709
9710 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9711
9712 salt_pos++;
9713
9714 uint salt_len = 16;
9715
9716 salt->salt_len = salt_len;
9717
9718 u8 tmp_buf[100] = { 0 };
9719
9720 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9721
9722 char *salt_buf_ptr = (char *) salt->salt_buf;
9723
9724 memcpy (salt_buf_ptr, tmp_buf, 16);
9725
9726 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9727 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9728 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9729 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9730
9731 char *hash_pos = salt_pos + 22;
9732
9733 memset (tmp_buf, 0, sizeof (tmp_buf));
9734
9735 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9736
9737 memcpy (digest, tmp_buf, 24);
9738
9739 digest[0] = byte_swap_32 (digest[0]);
9740 digest[1] = byte_swap_32 (digest[1]);
9741 digest[2] = byte_swap_32 (digest[2]);
9742 digest[3] = byte_swap_32 (digest[3]);
9743 digest[4] = byte_swap_32 (digest[4]);
9744 digest[5] = byte_swap_32 (digest[5]);
9745
9746 digest[5] &= ~0xff; // its just 23 not 24 !
9747
9748 return (PARSER_OK);
9749 }
9750
9751 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9752 {
9753 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9754
9755 u32 *digest = (u32 *) hash_buf->digest;
9756
9757 u8 tmp_buf[100] = { 0 };
9758
9759 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9760
9761 memcpy (digest, tmp_buf, 32);
9762
9763 digest[0] = byte_swap_32 (digest[0]);
9764 digest[1] = byte_swap_32 (digest[1]);
9765 digest[2] = byte_swap_32 (digest[2]);
9766 digest[3] = byte_swap_32 (digest[3]);
9767 digest[4] = byte_swap_32 (digest[4]);
9768 digest[5] = byte_swap_32 (digest[5]);
9769 digest[6] = byte_swap_32 (digest[6]);
9770 digest[7] = byte_swap_32 (digest[7]);
9771
9772 digest[0] -= SHA256M_A;
9773 digest[1] -= SHA256M_B;
9774 digest[2] -= SHA256M_C;
9775 digest[3] -= SHA256M_D;
9776 digest[4] -= SHA256M_E;
9777 digest[5] -= SHA256M_F;
9778 digest[6] -= SHA256M_G;
9779 digest[7] -= SHA256M_H;
9780
9781 return (PARSER_OK);
9782 }
9783
9784 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9785 {
9786 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9787
9788 u32 *digest = (u32 *) hash_buf->digest;
9789
9790 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9791 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9792
9793 digest[0] = byte_swap_32 (digest[0]);
9794 digest[1] = byte_swap_32 (digest[1]);
9795
9796 uint tt;
9797
9798 IP (digest[0], digest[1], tt);
9799
9800 digest[0] = digest[0];
9801 digest[1] = digest[1];
9802 digest[2] = 0;
9803 digest[3] = 0;
9804
9805 return (PARSER_OK);
9806 }
9807
9808 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9809 {
9810 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9811
9812 u32 *digest = (u32 *) hash_buf->digest;
9813
9814 salt_t *salt = hash_buf->salt;
9815
9816 char *hash_pos = input_buf + 8;
9817
9818 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9819 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9820 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9821 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9822 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9823
9824 digest[0] -= SHA1M_A;
9825 digest[1] -= SHA1M_B;
9826 digest[2] -= SHA1M_C;
9827 digest[3] -= SHA1M_D;
9828 digest[4] -= SHA1M_E;
9829
9830 uint salt_len = 8;
9831
9832 char *salt_buf_ptr = (char *) salt->salt_buf;
9833
9834 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9835
9836 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9837
9838 salt->salt_len = salt_len;
9839
9840 return (PARSER_OK);
9841 }
9842
9843 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9844 {
9845 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9846
9847 u64 *digest = (u64 *) hash_buf->digest;
9848
9849 salt_t *salt = hash_buf->salt;
9850
9851 char *hash_pos = input_buf + 8;
9852
9853 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9854 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9855 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9856 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9857 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9858 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9859 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9860 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9861
9862 digest[0] -= SHA512M_A;
9863 digest[1] -= SHA512M_B;
9864 digest[2] -= SHA512M_C;
9865 digest[3] -= SHA512M_D;
9866 digest[4] -= SHA512M_E;
9867 digest[5] -= SHA512M_F;
9868 digest[6] -= SHA512M_G;
9869 digest[7] -= SHA512M_H;
9870
9871 uint salt_len = 8;
9872
9873 char *salt_buf_ptr = (char *) salt->salt_buf;
9874
9875 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9876
9877 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9878
9879 salt->salt_len = salt_len;
9880
9881 return (PARSER_OK);
9882 }
9883
9884 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9885 {
9886 if (data.opts_type & OPTS_TYPE_ST_HEX)
9887 {
9888 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9889 }
9890 else
9891 {
9892 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9893 }
9894
9895 u32 *digest = (u32 *) hash_buf->digest;
9896
9897 salt_t *salt = hash_buf->salt;
9898
9899 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9900 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9901 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9902 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9903
9904 digest[0] = byte_swap_32 (digest[0]);
9905 digest[1] = byte_swap_32 (digest[1]);
9906 digest[2] = byte_swap_32 (digest[2]);
9907 digest[3] = byte_swap_32 (digest[3]);
9908
9909 digest[0] -= MD5M_A;
9910 digest[1] -= MD5M_B;
9911 digest[2] -= MD5M_C;
9912 digest[3] -= MD5M_D;
9913
9914 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9915
9916 uint salt_len = input_len - 32 - 1;
9917
9918 char *salt_buf = input_buf + 32 + 1;
9919
9920 char *salt_buf_ptr = (char *) salt->salt_buf;
9921
9922 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9923
9924 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9925
9926 salt->salt_len = salt_len;
9927
9928 return (PARSER_OK);
9929 }
9930
9931 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9932 {
9933 if (data.opts_type & OPTS_TYPE_ST_HEX)
9934 {
9935 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9936 }
9937 else
9938 {
9939 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9940 }
9941
9942 // unscramble
9943
9944 char clean_input_buf[32] = { 0 };
9945
9946 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9947 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9948
9949 for (int i = 0, j = 0, k = 0; i < 30; i++)
9950 {
9951 if (i == pos[j])
9952 {
9953 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9954
9955 j++;
9956 }
9957 else
9958 {
9959 clean_input_buf[k] = input_buf[i];
9960
9961 k++;
9962 }
9963 }
9964
9965 // base64 decode
9966
9967 u32 *digest = (u32 *) hash_buf->digest;
9968
9969 salt_t *salt = hash_buf->salt;
9970
9971 u32 a, b, c, d, e, f;
9972
9973 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9974 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9975 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9976 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9977 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9978 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9979
9980 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9981 | (((d << 12) | (e << 6) | (f)) << 0);
9982
9983 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9984 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9985 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9986 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9987 e = base64_to_int (clean_input_buf[10] & 0x7f);
9988 f = base64_to_int (clean_input_buf[11] & 0x7f);
9989
9990 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9991 | (((d << 12) | (e << 6) | (f)) << 0);
9992
9993 a = base64_to_int (clean_input_buf[12] & 0x7f);
9994 b = base64_to_int (clean_input_buf[13] & 0x7f);
9995 c = base64_to_int (clean_input_buf[14] & 0x7f);
9996 d = base64_to_int (clean_input_buf[15] & 0x7f);
9997 e = base64_to_int (clean_input_buf[16] & 0x7f);
9998 f = base64_to_int (clean_input_buf[17] & 0x7f);
9999
10000 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
10001 | (((d << 12) | (e << 6) | (f)) << 0);
10002
10003 a = base64_to_int (clean_input_buf[18] & 0x7f);
10004 b = base64_to_int (clean_input_buf[19] & 0x7f);
10005 c = base64_to_int (clean_input_buf[20] & 0x7f);
10006 d = base64_to_int (clean_input_buf[21] & 0x7f);
10007 e = base64_to_int (clean_input_buf[22] & 0x7f);
10008 f = base64_to_int (clean_input_buf[23] & 0x7f);
10009
10010 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10011 | (((d << 12) | (e << 6) | (f)) << 0);
10012
10013 digest[0] = byte_swap_32 (digest[0]);
10014 digest[1] = byte_swap_32 (digest[1]);
10015 digest[2] = byte_swap_32 (digest[2]);
10016 digest[3] = byte_swap_32 (digest[3]);
10017
10018 digest[0] -= MD5M_A;
10019 digest[1] -= MD5M_B;
10020 digest[2] -= MD5M_C;
10021 digest[3] -= MD5M_D;
10022
10023 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10024
10025 uint salt_len = input_len - 30 - 1;
10026
10027 char *salt_buf = input_buf + 30 + 1;
10028
10029 char *salt_buf_ptr = (char *) salt->salt_buf;
10030
10031 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10032
10033 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
10034 if (salt_len > 10) return (PARSER_SALT_LENGTH);
10035
10036 salt->salt_len = salt_len;
10037
10038 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10039
10040 salt->salt_len += 22;
10041
10042 return (PARSER_OK);
10043 }
10044
10045 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10046 {
10047 if (data.opts_type & OPTS_TYPE_ST_HEX)
10048 {
10049 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10050 }
10051 else
10052 {
10053 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10054 }
10055
10056 u32 *digest = (u32 *) hash_buf->digest;
10057
10058 salt_t *salt = hash_buf->salt;
10059
10060 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10061 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10062 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10063 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10064 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10065
10066 digest[0] -= SHA1M_A;
10067 digest[1] -= SHA1M_B;
10068 digest[2] -= SHA1M_C;
10069 digest[3] -= SHA1M_D;
10070 digest[4] -= SHA1M_E;
10071
10072 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10073
10074 uint salt_len = input_len - 40 - 1;
10075
10076 char *salt_buf = input_buf + 40 + 1;
10077
10078 char *salt_buf_ptr = (char *) salt->salt_buf;
10079
10080 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10081
10082 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10083
10084 salt->salt_len = salt_len;
10085
10086 return (PARSER_OK);
10087 }
10088
10089 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10090 {
10091 if (data.opts_type & OPTS_TYPE_ST_HEX)
10092 {
10093 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10094 }
10095 else
10096 {
10097 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10098 }
10099
10100 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10101
10102 char *iter_pos = input_buf + 6;
10103
10104 salt_t *salt = hash_buf->salt;
10105
10106 uint iter = atoi (iter_pos);
10107
10108 if (iter < 1)
10109 {
10110 iter = ROUNDS_DCC2;
10111 }
10112
10113 salt->salt_iter = iter - 1;
10114
10115 char *salt_pos = strchr (iter_pos, '#');
10116
10117 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10118
10119 salt_pos++;
10120
10121 char *digest_pos = strchr (salt_pos, '#');
10122
10123 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10124
10125 digest_pos++;
10126
10127 uint salt_len = digest_pos - salt_pos - 1;
10128
10129 u32 *digest = (u32 *) hash_buf->digest;
10130
10131 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10132 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10133 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10134 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10135
10136 char *salt_buf_ptr = (char *) salt->salt_buf;
10137
10138 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10139
10140 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10141
10142 salt->salt_len = salt_len;
10143
10144 return (PARSER_OK);
10145 }
10146
10147 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10148 {
10149 u32 *digest = (u32 *) hash_buf->digest;
10150
10151 salt_t *salt = hash_buf->salt;
10152
10153 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10154
10155 hccap_t in;
10156
10157 memcpy (&in, input_buf, input_len);
10158
10159 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10160
10161 memcpy (digest, in.keymic, 16);
10162
10163 /*
10164 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10165 The phrase "Pairwise key expansion"
10166 Access Point Address (referred to as Authenticator Address AA)
10167 Supplicant Address (referred to as Supplicant Address SA)
10168 Access Point Nonce (referred to as Authenticator Anonce)
10169 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10170 */
10171
10172 uint salt_len = strlen (in.essid);
10173
10174 memcpy (salt->salt_buf, in.essid, salt_len);
10175
10176 salt->salt_len = salt_len;
10177
10178 salt->salt_iter = ROUNDS_WPA2 - 1;
10179
10180 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10181
10182 memcpy (pke_ptr, "Pairwise key expansion", 23);
10183
10184 if (memcmp (in.mac1, in.mac2, 6) < 0)
10185 {
10186 memcpy (pke_ptr + 23, in.mac1, 6);
10187 memcpy (pke_ptr + 29, in.mac2, 6);
10188 }
10189 else
10190 {
10191 memcpy (pke_ptr + 23, in.mac2, 6);
10192 memcpy (pke_ptr + 29, in.mac1, 6);
10193 }
10194
10195 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10196 {
10197 memcpy (pke_ptr + 35, in.nonce1, 32);
10198 memcpy (pke_ptr + 67, in.nonce2, 32);
10199 }
10200 else
10201 {
10202 memcpy (pke_ptr + 35, in.nonce2, 32);
10203 memcpy (pke_ptr + 67, in.nonce1, 32);
10204 }
10205
10206 for (int i = 0; i < 25; i++)
10207 {
10208 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10209 }
10210
10211 wpa->keyver = in.keyver;
10212
10213 if (wpa->keyver > 255)
10214 {
10215 log_info ("ATTENTION!");
10216 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10217 log_info (" This could be due to a recent aircrack-ng bug.");
10218 log_info (" The key version was automatically reset to a reasonable value.");
10219 log_info ("");
10220
10221 wpa->keyver &= 0xff;
10222 }
10223
10224 wpa->eapol_size = in.eapol_size;
10225
10226 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10227
10228 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10229
10230 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10231
10232 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10233
10234 if (wpa->keyver == 1)
10235 {
10236 // nothing to do
10237 }
10238 else
10239 {
10240 digest[0] = byte_swap_32 (digest[0]);
10241 digest[1] = byte_swap_32 (digest[1]);
10242 digest[2] = byte_swap_32 (digest[2]);
10243 digest[3] = byte_swap_32 (digest[3]);
10244
10245 for (int i = 0; i < 64; i++)
10246 {
10247 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10248 }
10249 }
10250
10251 salt->salt_buf[10] = digest[1];
10252 salt->salt_buf[11] = digest[2];
10253
10254 return (PARSER_OK);
10255 }
10256
10257 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10258 {
10259 u32 *digest = (u32 *) hash_buf->digest;
10260
10261 salt_t *salt = hash_buf->salt;
10262
10263 if (input_len == 0)
10264 {
10265 log_error ("Password Safe v2 container not specified");
10266
10267 exit (-1);
10268 }
10269
10270 FILE *fp = fopen (input_buf, "rb");
10271
10272 if (fp == NULL)
10273 {
10274 log_error ("%s: %s", input_buf, strerror (errno));
10275
10276 exit (-1);
10277 }
10278
10279 psafe2_hdr buf;
10280
10281 memset (&buf, 0, sizeof (psafe2_hdr));
10282
10283 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10284
10285 fclose (fp);
10286
10287 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10288
10289 salt->salt_buf[0] = buf.random[0];
10290 salt->salt_buf[1] = buf.random[1];
10291
10292 salt->salt_len = 8;
10293 salt->salt_iter = 1000;
10294
10295 digest[0] = byte_swap_32 (buf.hash[0]);
10296 digest[1] = byte_swap_32 (buf.hash[1]);
10297 digest[2] = byte_swap_32 (buf.hash[2]);
10298 digest[3] = byte_swap_32 (buf.hash[3]);
10299 digest[4] = byte_swap_32 (buf.hash[4]);
10300
10301 return (PARSER_OK);
10302 }
10303
10304 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10305 {
10306 u32 *digest = (u32 *) hash_buf->digest;
10307
10308 salt_t *salt = hash_buf->salt;
10309
10310 if (input_len == 0)
10311 {
10312 log_error (".psafe3 not specified");
10313
10314 exit (-1);
10315 }
10316
10317 FILE *fp = fopen (input_buf, "rb");
10318
10319 if (fp == NULL)
10320 {
10321 log_error ("%s: %s", input_buf, strerror (errno));
10322
10323 exit (-1);
10324 }
10325
10326 psafe3_t in;
10327
10328 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10329
10330 fclose (fp);
10331
10332 data.hashfile = input_buf; // we will need this in case it gets cracked
10333
10334 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10335
10336 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10337
10338 salt->salt_iter = in.iterations + 1;
10339
10340 salt->salt_buf[0] = in.salt_buf[0];
10341 salt->salt_buf[1] = in.salt_buf[1];
10342 salt->salt_buf[2] = in.salt_buf[2];
10343 salt->salt_buf[3] = in.salt_buf[3];
10344 salt->salt_buf[4] = in.salt_buf[4];
10345 salt->salt_buf[5] = in.salt_buf[5];
10346 salt->salt_buf[6] = in.salt_buf[6];
10347 salt->salt_buf[7] = in.salt_buf[7];
10348
10349 salt->salt_len = 32;
10350
10351 digest[0] = in.hash_buf[0];
10352 digest[1] = in.hash_buf[1];
10353 digest[2] = in.hash_buf[2];
10354 digest[3] = in.hash_buf[3];
10355 digest[4] = in.hash_buf[4];
10356 digest[5] = in.hash_buf[5];
10357 digest[6] = in.hash_buf[6];
10358 digest[7] = in.hash_buf[7];
10359
10360 digest[0] = byte_swap_32 (digest[0]);
10361 digest[1] = byte_swap_32 (digest[1]);
10362 digest[2] = byte_swap_32 (digest[2]);
10363 digest[3] = byte_swap_32 (digest[3]);
10364 digest[4] = byte_swap_32 (digest[4]);
10365 digest[5] = byte_swap_32 (digest[5]);
10366 digest[6] = byte_swap_32 (digest[6]);
10367 digest[7] = byte_swap_32 (digest[7]);
10368
10369 return (PARSER_OK);
10370 }
10371
10372 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10373 {
10374 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10375
10376 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10377
10378 u32 *digest = (u32 *) hash_buf->digest;
10379
10380 salt_t *salt = hash_buf->salt;
10381
10382 char *iter_pos = input_buf + 3;
10383
10384 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10385
10386 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10387
10388 memcpy ((char *) salt->salt_sign, input_buf, 4);
10389
10390 salt->salt_iter = salt_iter;
10391
10392 char *salt_pos = iter_pos + 1;
10393
10394 uint salt_len = 8;
10395
10396 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10397
10398 salt->salt_len = salt_len;
10399
10400 char *hash_pos = salt_pos + salt_len;
10401
10402 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10403
10404 return (PARSER_OK);
10405 }
10406
10407 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10408 {
10409 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10410
10411 u32 *digest = (u32 *) hash_buf->digest;
10412
10413 salt_t *salt = hash_buf->salt;
10414
10415 char *salt_pos = input_buf + 3;
10416
10417 uint iterations_len = 0;
10418
10419 if (memcmp (salt_pos, "rounds=", 7) == 0)
10420 {
10421 salt_pos += 7;
10422
10423 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10424
10425 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10426 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10427
10428 salt_pos[0] = 0x0;
10429
10430 salt->salt_iter = atoi (salt_pos - iterations_len);
10431
10432 salt_pos += 1;
10433
10434 iterations_len += 8;
10435 }
10436 else
10437 {
10438 salt->salt_iter = ROUNDS_MD5CRYPT;
10439 }
10440
10441 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10442
10443 char *hash_pos = strchr (salt_pos, '$');
10444
10445 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10446
10447 uint salt_len = hash_pos - salt_pos;
10448
10449 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10450
10451 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10452
10453 salt->salt_len = salt_len;
10454
10455 hash_pos++;
10456
10457 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10458
10459 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10460
10461 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10462
10463 return (PARSER_OK);
10464 }
10465
10466 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10467 {
10468 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10469
10470 u32 *digest = (u32 *) hash_buf->digest;
10471
10472 salt_t *salt = hash_buf->salt;
10473
10474 char *salt_pos = input_buf + 6;
10475
10476 uint iterations_len = 0;
10477
10478 if (memcmp (salt_pos, "rounds=", 7) == 0)
10479 {
10480 salt_pos += 7;
10481
10482 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10483
10484 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10485 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10486
10487 salt_pos[0] = 0x0;
10488
10489 salt->salt_iter = atoi (salt_pos - iterations_len);
10490
10491 salt_pos += 1;
10492
10493 iterations_len += 8;
10494 }
10495 else
10496 {
10497 salt->salt_iter = ROUNDS_MD5CRYPT;
10498 }
10499
10500 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10501
10502 char *hash_pos = strchr (salt_pos, '$');
10503
10504 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10505
10506 uint salt_len = hash_pos - salt_pos;
10507
10508 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10509
10510 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10511
10512 salt->salt_len = salt_len;
10513
10514 hash_pos++;
10515
10516 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10517
10518 return (PARSER_OK);
10519 }
10520
10521 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10522 {
10523 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10524
10525 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10526
10527 u32 *digest = (u32 *) hash_buf->digest;
10528
10529 salt_t *salt = hash_buf->salt;
10530
10531 char *salt_pos = input_buf + 14;
10532
10533 char *hash_pos = strchr (salt_pos, '*');
10534
10535 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10536
10537 hash_pos++;
10538
10539 uint salt_len = hash_pos - salt_pos - 1;
10540
10541 char *salt_buf_ptr = (char *) salt->salt_buf;
10542
10543 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10544
10545 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10546
10547 salt->salt_len = salt_len;
10548
10549 u8 tmp_buf[100] = { 0 };
10550
10551 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10552
10553 memcpy (digest, tmp_buf, 20);
10554
10555 digest[0] = byte_swap_32 (digest[0]);
10556 digest[1] = byte_swap_32 (digest[1]);
10557 digest[2] = byte_swap_32 (digest[2]);
10558 digest[3] = byte_swap_32 (digest[3]);
10559 digest[4] = byte_swap_32 (digest[4]);
10560
10561 digest[0] -= SHA1M_A;
10562 digest[1] -= SHA1M_B;
10563 digest[2] -= SHA1M_C;
10564 digest[3] -= SHA1M_D;
10565 digest[4] -= SHA1M_E;
10566
10567 return (PARSER_OK);
10568 }
10569
10570 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10571 {
10572 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10573
10574 unsigned char c12 = itoa64_to_int (input_buf[12]);
10575
10576 if (c12 & 3) return (PARSER_HASH_VALUE);
10577
10578 u32 *digest = (u32 *) hash_buf->digest;
10579
10580 salt_t *salt = hash_buf->salt;
10581
10582 // for ascii_digest
10583 salt->salt_sign[0] = input_buf[0];
10584 salt->salt_sign[1] = input_buf[1];
10585
10586 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10587 | itoa64_to_int (input_buf[1]) << 6;
10588
10589 salt->salt_len = 2;
10590
10591 u8 tmp_buf[100] = { 0 };
10592
10593 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10594
10595 memcpy (digest, tmp_buf, 8);
10596
10597 uint tt;
10598
10599 IP (digest[0], digest[1], tt);
10600
10601 digest[2] = 0;
10602 digest[3] = 0;
10603
10604 return (PARSER_OK);
10605 }
10606
10607 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10608 {
10609 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10610
10611 u32 *digest = (u32 *) hash_buf->digest;
10612
10613 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10614 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10615 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10616 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10617
10618 digest[0] = byte_swap_32 (digest[0]);
10619 digest[1] = byte_swap_32 (digest[1]);
10620 digest[2] = byte_swap_32 (digest[2]);
10621 digest[3] = byte_swap_32 (digest[3]);
10622
10623 digest[0] -= MD4M_A;
10624 digest[1] -= MD4M_B;
10625 digest[2] -= MD4M_C;
10626 digest[3] -= MD4M_D;
10627
10628 return (PARSER_OK);
10629 }
10630
10631 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10632 {
10633 if (data.opts_type & OPTS_TYPE_ST_HEX)
10634 {
10635 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10636 }
10637 else
10638 {
10639 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10640 }
10641
10642 u32 *digest = (u32 *) hash_buf->digest;
10643
10644 salt_t *salt = hash_buf->salt;
10645
10646 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10647 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10648 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10649 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10650
10651 digest[0] = byte_swap_32 (digest[0]);
10652 digest[1] = byte_swap_32 (digest[1]);
10653 digest[2] = byte_swap_32 (digest[2]);
10654 digest[3] = byte_swap_32 (digest[3]);
10655
10656 digest[0] -= MD4M_A;
10657 digest[1] -= MD4M_B;
10658 digest[2] -= MD4M_C;
10659 digest[3] -= MD4M_D;
10660
10661 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10662
10663 uint salt_len = input_len - 32 - 1;
10664
10665 char *salt_buf = input_buf + 32 + 1;
10666
10667 char *salt_buf_ptr = (char *) salt->salt_buf;
10668
10669 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10670
10671 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10672
10673 salt->salt_len = salt_len;
10674
10675 return (PARSER_OK);
10676 }
10677
10678 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10679 {
10680 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10681
10682 u32 *digest = (u32 *) hash_buf->digest;
10683
10684 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10685 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10686 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10687 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10688
10689 digest[0] = byte_swap_32 (digest[0]);
10690 digest[1] = byte_swap_32 (digest[1]);
10691 digest[2] = byte_swap_32 (digest[2]);
10692 digest[3] = byte_swap_32 (digest[3]);
10693
10694 digest[0] -= MD5M_A;
10695 digest[1] -= MD5M_B;
10696 digest[2] -= MD5M_C;
10697 digest[3] -= MD5M_D;
10698
10699 return (PARSER_OK);
10700 }
10701
10702 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10703 {
10704 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10705
10706 u32 *digest = (u32 *) hash_buf->digest;
10707
10708 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10709 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10710 digest[2] = 0;
10711 digest[3] = 0;
10712
10713 digest[0] = byte_swap_32 (digest[0]);
10714 digest[1] = byte_swap_32 (digest[1]);
10715
10716 return (PARSER_OK);
10717 }
10718
10719 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10720 {
10721 if (data.opts_type & OPTS_TYPE_ST_HEX)
10722 {
10723 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10724 }
10725 else
10726 {
10727 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10728 }
10729
10730 u32 *digest = (u32 *) hash_buf->digest;
10731
10732 salt_t *salt = hash_buf->salt;
10733
10734 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10735 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10736 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10737 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10738
10739 digest[0] = byte_swap_32 (digest[0]);
10740 digest[1] = byte_swap_32 (digest[1]);
10741 digest[2] = byte_swap_32 (digest[2]);
10742 digest[3] = byte_swap_32 (digest[3]);
10743
10744 digest[0] -= MD5M_A;
10745 digest[1] -= MD5M_B;
10746 digest[2] -= MD5M_C;
10747 digest[3] -= MD5M_D;
10748
10749 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10750
10751 uint salt_len = input_len - 32 - 1;
10752
10753 char *salt_buf = input_buf + 32 + 1;
10754
10755 char *salt_buf_ptr = (char *) salt->salt_buf;
10756
10757 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10758
10759 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10760
10761 salt->salt_len = salt_len;
10762
10763 return (PARSER_OK);
10764 }
10765
10766 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10767 {
10768 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10769
10770 u32 *digest = (u32 *) hash_buf->digest;
10771
10772 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10773 | itoa64_to_int (input_buf[ 1]) << 6
10774 | itoa64_to_int (input_buf[ 2]) << 12
10775 | itoa64_to_int (input_buf[ 3]) << 18;
10776 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10777 | itoa64_to_int (input_buf[ 5]) << 6
10778 | itoa64_to_int (input_buf[ 6]) << 12
10779 | itoa64_to_int (input_buf[ 7]) << 18;
10780 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10781 | itoa64_to_int (input_buf[ 9]) << 6
10782 | itoa64_to_int (input_buf[10]) << 12
10783 | itoa64_to_int (input_buf[11]) << 18;
10784 digest[3] = itoa64_to_int (input_buf[12]) << 0
10785 | itoa64_to_int (input_buf[13]) << 6
10786 | itoa64_to_int (input_buf[14]) << 12
10787 | itoa64_to_int (input_buf[15]) << 18;
10788
10789 digest[0] -= MD5M_A;
10790 digest[1] -= MD5M_B;
10791 digest[2] -= MD5M_C;
10792 digest[3] -= MD5M_D;
10793
10794 digest[0] &= 0x00ffffff;
10795 digest[1] &= 0x00ffffff;
10796 digest[2] &= 0x00ffffff;
10797 digest[3] &= 0x00ffffff;
10798
10799 return (PARSER_OK);
10800 }
10801
10802 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10803 {
10804 if (data.opts_type & OPTS_TYPE_ST_HEX)
10805 {
10806 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10807 }
10808 else
10809 {
10810 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10811 }
10812
10813 u32 *digest = (u32 *) hash_buf->digest;
10814
10815 salt_t *salt = hash_buf->salt;
10816
10817 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10818 | itoa64_to_int (input_buf[ 1]) << 6
10819 | itoa64_to_int (input_buf[ 2]) << 12
10820 | itoa64_to_int (input_buf[ 3]) << 18;
10821 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10822 | itoa64_to_int (input_buf[ 5]) << 6
10823 | itoa64_to_int (input_buf[ 6]) << 12
10824 | itoa64_to_int (input_buf[ 7]) << 18;
10825 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10826 | itoa64_to_int (input_buf[ 9]) << 6
10827 | itoa64_to_int (input_buf[10]) << 12
10828 | itoa64_to_int (input_buf[11]) << 18;
10829 digest[3] = itoa64_to_int (input_buf[12]) << 0
10830 | itoa64_to_int (input_buf[13]) << 6
10831 | itoa64_to_int (input_buf[14]) << 12
10832 | itoa64_to_int (input_buf[15]) << 18;
10833
10834 digest[0] -= MD5M_A;
10835 digest[1] -= MD5M_B;
10836 digest[2] -= MD5M_C;
10837 digest[3] -= MD5M_D;
10838
10839 digest[0] &= 0x00ffffff;
10840 digest[1] &= 0x00ffffff;
10841 digest[2] &= 0x00ffffff;
10842 digest[3] &= 0x00ffffff;
10843
10844 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10845
10846 uint salt_len = input_len - 16 - 1;
10847
10848 char *salt_buf = input_buf + 16 + 1;
10849
10850 char *salt_buf_ptr = (char *) salt->salt_buf;
10851
10852 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10853
10854 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10855
10856 salt->salt_len = salt_len;
10857
10858 return (PARSER_OK);
10859 }
10860
10861 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10862 {
10863 key[0] = (nthash[0] >> 0);
10864 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10865 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10866 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10867 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10868 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10869 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10870 key[7] = (nthash[6] << 1);
10871
10872 key[0] |= 0x01;
10873 key[1] |= 0x01;
10874 key[2] |= 0x01;
10875 key[3] |= 0x01;
10876 key[4] |= 0x01;
10877 key[5] |= 0x01;
10878 key[6] |= 0x01;
10879 key[7] |= 0x01;
10880 }
10881
10882 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10883 {
10884 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10885
10886 u32 *digest = (u32 *) hash_buf->digest;
10887
10888 salt_t *salt = hash_buf->salt;
10889
10890 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10891
10892 /**
10893 * parse line
10894 */
10895
10896 char *user_pos = input_buf;
10897
10898 char *unused_pos = strchr (user_pos, ':');
10899
10900 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10901
10902 uint user_len = unused_pos - user_pos;
10903
10904 if (user_len > 60) return (PARSER_SALT_LENGTH);
10905
10906 unused_pos++;
10907
10908 char *domain_pos = strchr (unused_pos, ':');
10909
10910 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10911
10912 uint unused_len = domain_pos - unused_pos;
10913
10914 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10915
10916 domain_pos++;
10917
10918 char *srvchall_pos = strchr (domain_pos, ':');
10919
10920 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10921
10922 uint domain_len = srvchall_pos - domain_pos;
10923
10924 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10925
10926 srvchall_pos++;
10927
10928 char *hash_pos = strchr (srvchall_pos, ':');
10929
10930 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10931
10932 uint srvchall_len = hash_pos - srvchall_pos;
10933
10934 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10935
10936 hash_pos++;
10937
10938 char *clichall_pos = strchr (hash_pos, ':');
10939
10940 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10941
10942 uint hash_len = clichall_pos - hash_pos;
10943
10944 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10945
10946 clichall_pos++;
10947
10948 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10949
10950 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10951
10952 /**
10953 * store some data for later use
10954 */
10955
10956 netntlm->user_len = user_len * 2;
10957 netntlm->domain_len = domain_len * 2;
10958 netntlm->srvchall_len = srvchall_len / 2;
10959 netntlm->clichall_len = clichall_len / 2;
10960
10961 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10962 char *chall_ptr = (char *) netntlm->chall_buf;
10963
10964 /**
10965 * handle username and domainname
10966 */
10967
10968 for (uint i = 0; i < user_len; i++)
10969 {
10970 *userdomain_ptr++ = user_pos[i];
10971 *userdomain_ptr++ = 0;
10972 }
10973
10974 for (uint i = 0; i < domain_len; i++)
10975 {
10976 *userdomain_ptr++ = domain_pos[i];
10977 *userdomain_ptr++ = 0;
10978 }
10979
10980 /**
10981 * handle server challenge encoding
10982 */
10983
10984 for (uint i = 0; i < srvchall_len; i += 2)
10985 {
10986 const char p0 = srvchall_pos[i + 0];
10987 const char p1 = srvchall_pos[i + 1];
10988
10989 *chall_ptr++ = hex_convert (p1) << 0
10990 | hex_convert (p0) << 4;
10991 }
10992
10993 /**
10994 * handle client challenge encoding
10995 */
10996
10997 for (uint i = 0; i < clichall_len; i += 2)
10998 {
10999 const char p0 = clichall_pos[i + 0];
11000 const char p1 = clichall_pos[i + 1];
11001
11002 *chall_ptr++ = hex_convert (p1) << 0
11003 | hex_convert (p0) << 4;
11004 }
11005
11006 /**
11007 * store data
11008 */
11009
11010 char *salt_buf_ptr = (char *) salt->salt_buf;
11011
11012 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11013
11014 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11015
11016 salt->salt_len = salt_len;
11017
11018 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11019 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11020 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11021 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11022
11023 digest[0] = byte_swap_32 (digest[0]);
11024 digest[1] = byte_swap_32 (digest[1]);
11025 digest[2] = byte_swap_32 (digest[2]);
11026 digest[3] = byte_swap_32 (digest[3]);
11027
11028 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11029
11030 uint digest_tmp[2] = { 0 };
11031
11032 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11033 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11034
11035 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11036 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11037
11038 /* special case 2: ESS */
11039
11040 if (srvchall_len == 48)
11041 {
11042 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11043 {
11044 uint w[16] = { 0 };
11045
11046 w[ 0] = netntlm->chall_buf[6];
11047 w[ 1] = netntlm->chall_buf[7];
11048 w[ 2] = netntlm->chall_buf[0];
11049 w[ 3] = netntlm->chall_buf[1];
11050 w[ 4] = 0x80;
11051 w[14] = 16 * 8;
11052
11053 uint dgst[4] = { 0 };
11054
11055 dgst[0] = MAGIC_A;
11056 dgst[1] = MAGIC_B;
11057 dgst[2] = MAGIC_C;
11058 dgst[3] = MAGIC_D;
11059
11060 md5_64 (w, dgst);
11061
11062 salt->salt_buf[0] = dgst[0];
11063 salt->salt_buf[1] = dgst[1];
11064 }
11065 }
11066
11067 /* precompute netntlmv1 exploit start */
11068
11069 for (uint i = 0; i < 0x10000; i++)
11070 {
11071 uint key_md4[2] = { i, 0 };
11072 uint key_des[2] = { 0, 0 };
11073
11074 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11075
11076 uint Kc[16] = { 0 };
11077 uint Kd[16] = { 0 };
11078
11079 _des_keysetup (key_des, Kc, Kd, c_skb);
11080
11081 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11082
11083 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11084
11085 if (data3[0] != digest_tmp[0]) continue;
11086 if (data3[1] != digest_tmp[1]) continue;
11087
11088 salt->salt_buf[2] = i;
11089
11090 salt->salt_len = 24;
11091
11092 break;
11093 }
11094
11095 salt->salt_buf_pc[0] = digest_tmp[0];
11096 salt->salt_buf_pc[1] = digest_tmp[1];
11097
11098 /* precompute netntlmv1 exploit stop */
11099
11100 u32 tt;
11101
11102 IP (digest[0], digest[1], tt);
11103 IP (digest[2], digest[3], tt);
11104
11105 digest[0] = rotr32 (digest[0], 29);
11106 digest[1] = rotr32 (digest[1], 29);
11107 digest[2] = rotr32 (digest[2], 29);
11108 digest[3] = rotr32 (digest[3], 29);
11109
11110 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11111
11112 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11113 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11114
11115 return (PARSER_OK);
11116 }
11117
11118 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11119 {
11120 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11121
11122 u32 *digest = (u32 *) hash_buf->digest;
11123
11124 salt_t *salt = hash_buf->salt;
11125
11126 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11127
11128 /**
11129 * parse line
11130 */
11131
11132 char *user_pos = input_buf;
11133
11134 char *unused_pos = strchr (user_pos, ':');
11135
11136 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11137
11138 uint user_len = unused_pos - user_pos;
11139
11140 if (user_len > 60) return (PARSER_SALT_LENGTH);
11141
11142 unused_pos++;
11143
11144 char *domain_pos = strchr (unused_pos, ':');
11145
11146 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11147
11148 uint unused_len = domain_pos - unused_pos;
11149
11150 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11151
11152 domain_pos++;
11153
11154 char *srvchall_pos = strchr (domain_pos, ':');
11155
11156 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11157
11158 uint domain_len = srvchall_pos - domain_pos;
11159
11160 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11161
11162 srvchall_pos++;
11163
11164 char *hash_pos = strchr (srvchall_pos, ':');
11165
11166 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11167
11168 uint srvchall_len = hash_pos - srvchall_pos;
11169
11170 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11171
11172 hash_pos++;
11173
11174 char *clichall_pos = strchr (hash_pos, ':');
11175
11176 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11177
11178 uint hash_len = clichall_pos - hash_pos;
11179
11180 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11181
11182 clichall_pos++;
11183
11184 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11185
11186 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11187
11188 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11189
11190 /**
11191 * store some data for later use
11192 */
11193
11194 netntlm->user_len = user_len * 2;
11195 netntlm->domain_len = domain_len * 2;
11196 netntlm->srvchall_len = srvchall_len / 2;
11197 netntlm->clichall_len = clichall_len / 2;
11198
11199 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11200 char *chall_ptr = (char *) netntlm->chall_buf;
11201
11202 /**
11203 * handle username and domainname
11204 */
11205
11206 for (uint i = 0; i < user_len; i++)
11207 {
11208 *userdomain_ptr++ = toupper (user_pos[i]);
11209 *userdomain_ptr++ = 0;
11210 }
11211
11212 for (uint i = 0; i < domain_len; i++)
11213 {
11214 *userdomain_ptr++ = domain_pos[i];
11215 *userdomain_ptr++ = 0;
11216 }
11217
11218 *userdomain_ptr++ = 0x80;
11219
11220 /**
11221 * handle server challenge encoding
11222 */
11223
11224 for (uint i = 0; i < srvchall_len; i += 2)
11225 {
11226 const char p0 = srvchall_pos[i + 0];
11227 const char p1 = srvchall_pos[i + 1];
11228
11229 *chall_ptr++ = hex_convert (p1) << 0
11230 | hex_convert (p0) << 4;
11231 }
11232
11233 /**
11234 * handle client challenge encoding
11235 */
11236
11237 for (uint i = 0; i < clichall_len; i += 2)
11238 {
11239 const char p0 = clichall_pos[i + 0];
11240 const char p1 = clichall_pos[i + 1];
11241
11242 *chall_ptr++ = hex_convert (p1) << 0
11243 | hex_convert (p0) << 4;
11244 }
11245
11246 *chall_ptr++ = 0x80;
11247
11248 /**
11249 * handle hash itself
11250 */
11251
11252 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11253 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11254 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11255 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11256
11257 digest[0] = byte_swap_32 (digest[0]);
11258 digest[1] = byte_swap_32 (digest[1]);
11259 digest[2] = byte_swap_32 (digest[2]);
11260 digest[3] = byte_swap_32 (digest[3]);
11261
11262 /**
11263 * reuse challange data as salt_buf, its the buffer that is most likely unique
11264 */
11265
11266 salt->salt_buf[0] = 0;
11267 salt->salt_buf[1] = 0;
11268 salt->salt_buf[2] = 0;
11269 salt->salt_buf[3] = 0;
11270 salt->salt_buf[4] = 0;
11271 salt->salt_buf[5] = 0;
11272 salt->salt_buf[6] = 0;
11273 salt->salt_buf[7] = 0;
11274
11275 uint *uptr;
11276
11277 uptr = (uint *) netntlm->userdomain_buf;
11278
11279 for (uint i = 0; i < 16; i += 16)
11280 {
11281 md5_64 (uptr, salt->salt_buf);
11282 }
11283
11284 uptr = (uint *) netntlm->chall_buf;
11285
11286 for (uint i = 0; i < 256; i += 16)
11287 {
11288 md5_64 (uptr, salt->salt_buf);
11289 }
11290
11291 salt->salt_len = 16;
11292
11293 return (PARSER_OK);
11294 }
11295
11296 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11297 {
11298 if (data.opts_type & OPTS_TYPE_ST_HEX)
11299 {
11300 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11301 }
11302 else
11303 {
11304 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11305 }
11306
11307 u32 *digest = (u32 *) hash_buf->digest;
11308
11309 salt_t *salt = hash_buf->salt;
11310
11311 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11312 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11313 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11314 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11315
11316 digest[0] = byte_swap_32 (digest[0]);
11317 digest[1] = byte_swap_32 (digest[1]);
11318 digest[2] = byte_swap_32 (digest[2]);
11319 digest[3] = byte_swap_32 (digest[3]);
11320
11321 digest[0] -= MD5M_A;
11322 digest[1] -= MD5M_B;
11323 digest[2] -= MD5M_C;
11324 digest[3] -= MD5M_D;
11325
11326 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11327
11328 uint salt_len = input_len - 32 - 1;
11329
11330 char *salt_buf = input_buf + 32 + 1;
11331
11332 char *salt_buf_ptr = (char *) salt->salt_buf;
11333
11334 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11335
11336 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11337
11338 salt->salt_len = salt_len;
11339
11340 return (PARSER_OK);
11341 }
11342
11343 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11344 {
11345 if (data.opts_type & OPTS_TYPE_ST_HEX)
11346 {
11347 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11348 }
11349 else
11350 {
11351 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11352 }
11353
11354 u32 *digest = (u32 *) hash_buf->digest;
11355
11356 salt_t *salt = hash_buf->salt;
11357
11358 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11359 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11360 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11361 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11362
11363 digest[0] = byte_swap_32 (digest[0]);
11364 digest[1] = byte_swap_32 (digest[1]);
11365 digest[2] = byte_swap_32 (digest[2]);
11366 digest[3] = byte_swap_32 (digest[3]);
11367
11368 digest[0] -= MD5M_A;
11369 digest[1] -= MD5M_B;
11370 digest[2] -= MD5M_C;
11371 digest[3] -= MD5M_D;
11372
11373 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11374
11375 uint salt_len = input_len - 32 - 1;
11376
11377 char *salt_buf = input_buf + 32 + 1;
11378
11379 char *salt_buf_ptr = (char *) salt->salt_buf;
11380
11381 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11382
11383 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11384
11385 salt->salt_len = salt_len;
11386
11387 return (PARSER_OK);
11388 }
11389
11390 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11391 {
11392 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11393
11394 u32 *digest = (u32 *) hash_buf->digest;
11395
11396 salt_t *salt = hash_buf->salt;
11397
11398 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11399 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11400 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11401 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11402
11403 digest[0] = byte_swap_32 (digest[0]);
11404 digest[1] = byte_swap_32 (digest[1]);
11405 digest[2] = byte_swap_32 (digest[2]);
11406 digest[3] = byte_swap_32 (digest[3]);
11407
11408 digest[0] -= MD5M_A;
11409 digest[1] -= MD5M_B;
11410 digest[2] -= MD5M_C;
11411 digest[3] -= MD5M_D;
11412
11413 /**
11414 * This is a virtual salt. While the algorithm is basically not salted
11415 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11416 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11417 */
11418
11419 char *salt_buf_ptr = (char *) salt->salt_buf;
11420
11421 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11422
11423 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11424
11425 salt->salt_len = salt_len;
11426
11427 return (PARSER_OK);
11428 }
11429
11430 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11431 {
11432 if (data.opts_type & OPTS_TYPE_ST_HEX)
11433 {
11434 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11435 }
11436 else
11437 {
11438 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11439 }
11440
11441 u32 *digest = (u32 *) hash_buf->digest;
11442
11443 salt_t *salt = hash_buf->salt;
11444
11445 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11446 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11447 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11448 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11449
11450 digest[0] = byte_swap_32 (digest[0]);
11451 digest[1] = byte_swap_32 (digest[1]);
11452 digest[2] = byte_swap_32 (digest[2]);
11453 digest[3] = byte_swap_32 (digest[3]);
11454
11455 digest[0] -= MD5M_A;
11456 digest[1] -= MD5M_B;
11457 digest[2] -= MD5M_C;
11458 digest[3] -= MD5M_D;
11459
11460 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11461
11462 uint salt_len = input_len - 32 - 1;
11463
11464 char *salt_buf = input_buf + 32 + 1;
11465
11466 char *salt_buf_ptr = (char *) salt->salt_buf;
11467
11468 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11469
11470 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11471
11472 salt->salt_len = salt_len;
11473
11474 return (PARSER_OK);
11475 }
11476
11477 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11478 {
11479 if (data.opts_type & OPTS_TYPE_ST_HEX)
11480 {
11481 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11482 }
11483 else
11484 {
11485 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11486 }
11487
11488 u32 *digest = (u32 *) hash_buf->digest;
11489
11490 salt_t *salt = hash_buf->salt;
11491
11492 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11493 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11494 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11495 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11496
11497 digest[0] = byte_swap_32 (digest[0]);
11498 digest[1] = byte_swap_32 (digest[1]);
11499 digest[2] = byte_swap_32 (digest[2]);
11500 digest[3] = byte_swap_32 (digest[3]);
11501
11502 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11503
11504 uint salt_len = input_len - 32 - 1;
11505
11506 char *salt_buf = input_buf + 32 + 1;
11507
11508 char *salt_buf_ptr = (char *) salt->salt_buf;
11509
11510 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11511
11512 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11513
11514 salt->salt_len = salt_len;
11515
11516 return (PARSER_OK);
11517 }
11518
11519 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11520 {
11521 if (data.opts_type & OPTS_TYPE_ST_HEX)
11522 {
11523 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11524 }
11525 else
11526 {
11527 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11528 }
11529
11530 u32 *digest = (u32 *) hash_buf->digest;
11531
11532 salt_t *salt = hash_buf->salt;
11533
11534 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11535 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11536 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11537 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11538
11539 digest[0] = byte_swap_32 (digest[0]);
11540 digest[1] = byte_swap_32 (digest[1]);
11541 digest[2] = byte_swap_32 (digest[2]);
11542 digest[3] = byte_swap_32 (digest[3]);
11543
11544 digest[0] -= MD4M_A;
11545 digest[1] -= MD4M_B;
11546 digest[2] -= MD4M_C;
11547 digest[3] -= MD4M_D;
11548
11549 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11550
11551 uint salt_len = input_len - 32 - 1;
11552
11553 char *salt_buf = input_buf + 32 + 1;
11554
11555 char *salt_buf_ptr = (char *) salt->salt_buf;
11556
11557 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11558
11559 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11560
11561 salt->salt_len = salt_len;
11562
11563 return (PARSER_OK);
11564 }
11565
11566 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11567 {
11568 if (data.opts_type & OPTS_TYPE_ST_HEX)
11569 {
11570 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11571 }
11572 else
11573 {
11574 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11575 }
11576
11577 u32 *digest = (u32 *) hash_buf->digest;
11578
11579 salt_t *salt = hash_buf->salt;
11580
11581 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11582 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11583 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11584 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11585
11586 digest[0] = byte_swap_32 (digest[0]);
11587 digest[1] = byte_swap_32 (digest[1]);
11588 digest[2] = byte_swap_32 (digest[2]);
11589 digest[3] = byte_swap_32 (digest[3]);
11590
11591 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11592
11593 uint salt_len = input_len - 32 - 1;
11594
11595 char *salt_buf = input_buf + 32 + 1;
11596
11597 uint salt_pc_block[16] = { 0 };
11598
11599 char *salt_pc_block_ptr = (char *) salt_pc_block;
11600
11601 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11602
11603 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11604
11605 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11606
11607 salt_pc_block[14] = salt_len * 8;
11608
11609 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11610
11611 md5_64 (salt_pc_block, salt_pc_digest);
11612
11613 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11614 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11615 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11616 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11617
11618 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11619
11620 memcpy (salt_buf_ptr, salt_buf, salt_len);
11621
11622 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11623
11624 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11625 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11626 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11627 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11628
11629 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11630
11631 return (PARSER_OK);
11632 }
11633
11634 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11635 {
11636 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11637
11638 u32 *digest = (u32 *) hash_buf->digest;
11639
11640 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11641 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11642 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11643 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11644 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11645
11646 digest[0] -= SHA1M_A;
11647 digest[1] -= SHA1M_B;
11648 digest[2] -= SHA1M_C;
11649 digest[3] -= SHA1M_D;
11650 digest[4] -= SHA1M_E;
11651
11652 return (PARSER_OK);
11653 }
11654
11655 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11656 {
11657 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11658
11659 u32 *digest = (u32 *) hash_buf->digest;
11660
11661 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11662 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11663 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11664 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11665 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11666
11667 return (PARSER_OK);
11668 }
11669
11670 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11671 {
11672 if (data.opts_type & OPTS_TYPE_ST_HEX)
11673 {
11674 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11675 }
11676 else
11677 {
11678 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11679 }
11680
11681 u32 *digest = (u32 *) hash_buf->digest;
11682
11683 salt_t *salt = hash_buf->salt;
11684
11685 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11686 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11687 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11688 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11689 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11690
11691 digest[0] -= SHA1M_A;
11692 digest[1] -= SHA1M_B;
11693 digest[2] -= SHA1M_C;
11694 digest[3] -= SHA1M_D;
11695 digest[4] -= SHA1M_E;
11696
11697 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11698
11699 uint salt_len = input_len - 40 - 1;
11700
11701 char *salt_buf = input_buf + 40 + 1;
11702
11703 char *salt_buf_ptr = (char *) salt->salt_buf;
11704
11705 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11706
11707 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11708
11709 salt->salt_len = salt_len;
11710
11711 return (PARSER_OK);
11712 }
11713
11714 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11715 {
11716 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11717
11718 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11719
11720 u32 *digest = (u32 *) hash_buf->digest;
11721
11722 u8 tmp_buf[100] = { 0 };
11723
11724 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11725
11726 memcpy (digest, tmp_buf, 20);
11727
11728 digest[0] = byte_swap_32 (digest[0]);
11729 digest[1] = byte_swap_32 (digest[1]);
11730 digest[2] = byte_swap_32 (digest[2]);
11731 digest[3] = byte_swap_32 (digest[3]);
11732 digest[4] = byte_swap_32 (digest[4]);
11733
11734 digest[0] -= SHA1M_A;
11735 digest[1] -= SHA1M_B;
11736 digest[2] -= SHA1M_C;
11737 digest[3] -= SHA1M_D;
11738 digest[4] -= SHA1M_E;
11739
11740 return (PARSER_OK);
11741 }
11742
11743 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11744 {
11745 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11746
11747 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11748
11749 u32 *digest = (u32 *) hash_buf->digest;
11750
11751 salt_t *salt = hash_buf->salt;
11752
11753 u8 tmp_buf[100] = { 0 };
11754
11755 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11756
11757 memcpy (digest, tmp_buf, 20);
11758
11759 salt->salt_len = tmp_len - 20;
11760
11761 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11762
11763 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11764 {
11765 char *ptr = (char *) salt->salt_buf;
11766
11767 ptr[salt->salt_len] = 0x80;
11768 }
11769
11770 digest[0] = byte_swap_32 (digest[0]);
11771 digest[1] = byte_swap_32 (digest[1]);
11772 digest[2] = byte_swap_32 (digest[2]);
11773 digest[3] = byte_swap_32 (digest[3]);
11774 digest[4] = byte_swap_32 (digest[4]);
11775
11776 digest[0] -= SHA1M_A;
11777 digest[1] -= SHA1M_B;
11778 digest[2] -= SHA1M_C;
11779 digest[3] -= SHA1M_D;
11780 digest[4] -= SHA1M_E;
11781
11782 return (PARSER_OK);
11783 }
11784
11785 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11786 {
11787 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11788
11789 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11790
11791 u32 *digest = (u32 *) hash_buf->digest;
11792
11793 salt_t *salt = hash_buf->salt;
11794
11795 char *salt_buf = input_buf + 6;
11796
11797 uint salt_len = 8;
11798
11799 char *salt_buf_ptr = (char *) salt->salt_buf;
11800
11801 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11802
11803 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11804
11805 salt->salt_len = salt_len;
11806
11807 char *hash_pos = input_buf + 6 + 8 + 40;
11808
11809 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11810 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11811 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11812 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11813 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11814
11815 digest[0] -= SHA1M_A;
11816 digest[1] -= SHA1M_B;
11817 digest[2] -= SHA1M_C;
11818 digest[3] -= SHA1M_D;
11819 digest[4] -= SHA1M_E;
11820
11821 return (PARSER_OK);
11822 }
11823
11824 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11825 {
11826 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11827
11828 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11829
11830 u32 *digest = (u32 *) hash_buf->digest;
11831
11832 salt_t *salt = hash_buf->salt;
11833
11834 char *salt_buf = input_buf + 6;
11835
11836 uint salt_len = 8;
11837
11838 char *salt_buf_ptr = (char *) salt->salt_buf;
11839
11840 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11841
11842 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11843
11844 salt->salt_len = salt_len;
11845
11846 char *hash_pos = input_buf + 6 + 8;
11847
11848 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11849 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11850 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11851 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11852 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11853
11854 digest[0] -= SHA1M_A;
11855 digest[1] -= SHA1M_B;
11856 digest[2] -= SHA1M_C;
11857 digest[3] -= SHA1M_D;
11858 digest[4] -= SHA1M_E;
11859
11860 return (PARSER_OK);
11861 }
11862
11863 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11864 {
11865 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11866
11867 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11868
11869 u64 *digest = (u64 *) hash_buf->digest;
11870
11871 salt_t *salt = hash_buf->salt;
11872
11873 char *salt_buf = input_buf + 6;
11874
11875 uint salt_len = 8;
11876
11877 char *salt_buf_ptr = (char *) salt->salt_buf;
11878
11879 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11880
11881 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11882
11883 salt->salt_len = salt_len;
11884
11885 char *hash_pos = input_buf + 6 + 8;
11886
11887 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11888 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11889 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11890 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11891 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11892 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11893 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11894 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11895
11896 digest[0] -= SHA512M_A;
11897 digest[1] -= SHA512M_B;
11898 digest[2] -= SHA512M_C;
11899 digest[3] -= SHA512M_D;
11900 digest[4] -= SHA512M_E;
11901 digest[5] -= SHA512M_F;
11902 digest[6] -= SHA512M_G;
11903 digest[7] -= SHA512M_H;
11904
11905 return (PARSER_OK);
11906 }
11907
11908 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11909 {
11910 if (data.opts_type & OPTS_TYPE_ST_HEX)
11911 {
11912 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11913 }
11914 else
11915 {
11916 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11917 }
11918
11919 u32 *digest = (u32 *) hash_buf->digest;
11920
11921 salt_t *salt = hash_buf->salt;
11922
11923 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11924 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11925 digest[2] = 0;
11926 digest[3] = 0;
11927
11928 digest[0] = byte_swap_32 (digest[0]);
11929 digest[1] = byte_swap_32 (digest[1]);
11930
11931 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11932
11933 uint salt_len = input_len - 16 - 1;
11934
11935 char *salt_buf = input_buf + 16 + 1;
11936
11937 char *salt_buf_ptr = (char *) salt->salt_buf;
11938
11939 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11940
11941 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11942
11943 salt->salt_len = salt_len;
11944
11945 return (PARSER_OK);
11946 }
11947
11948 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11949 {
11950 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11951
11952 u32 *digest = (u32 *) hash_buf->digest;
11953
11954 salt_t *salt = hash_buf->salt;
11955
11956 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11957 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11958 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11959 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11960 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11961
11962 digest[0] -= SHA1M_A;
11963 digest[1] -= SHA1M_B;
11964 digest[2] -= SHA1M_C;
11965 digest[3] -= SHA1M_D;
11966 digest[4] -= SHA1M_E;
11967
11968 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11969
11970 uint salt_len = input_len - 40 - 1;
11971
11972 char *salt_buf = input_buf + 40 + 1;
11973
11974 char *salt_buf_ptr = (char *) salt->salt_buf;
11975
11976 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11977
11978 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11979
11980 salt->salt_len = salt_len;
11981
11982 return (PARSER_OK);
11983 }
11984
11985 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11986 {
11987 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11988
11989 u32 *digest = (u32 *) hash_buf->digest;
11990
11991 salt_t *salt = hash_buf->salt;
11992
11993 char *hash_pos = input_buf;
11994
11995 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11996 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11997 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11998 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11999 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
12000 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
12001 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
12002 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
12003 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12004 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12005 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12006 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12007 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12008 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12009 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12010 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12011
12012 char *salt_pos = input_buf + 128;
12013
12014 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12015 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12016 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12017 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12018
12019 salt->salt_iter = ROUNDS_ORACLET - 1;
12020 salt->salt_len = 16;
12021
12022 return (PARSER_OK);
12023 }
12024
12025 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12026 {
12027 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12028
12029 u32 *digest = (u32 *) hash_buf->digest;
12030
12031 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12032 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12033 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12034 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12035 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12036 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12037 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12038 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12039
12040 digest[0] -= SHA256M_A;
12041 digest[1] -= SHA256M_B;
12042 digest[2] -= SHA256M_C;
12043 digest[3] -= SHA256M_D;
12044 digest[4] -= SHA256M_E;
12045 digest[5] -= SHA256M_F;
12046 digest[6] -= SHA256M_G;
12047 digest[7] -= SHA256M_H;
12048
12049 return (PARSER_OK);
12050 }
12051
12052 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12053 {
12054 if (data.opts_type & OPTS_TYPE_ST_HEX)
12055 {
12056 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12057 }
12058 else
12059 {
12060 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
12061 }
12062
12063 u32 *digest = (u32 *) hash_buf->digest;
12064
12065 salt_t *salt = hash_buf->salt;
12066
12067 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12068 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12069 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12070 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12071 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12072 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12073 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12074 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12075
12076 digest[0] -= SHA256M_A;
12077 digest[1] -= SHA256M_B;
12078 digest[2] -= SHA256M_C;
12079 digest[3] -= SHA256M_D;
12080 digest[4] -= SHA256M_E;
12081 digest[5] -= SHA256M_F;
12082 digest[6] -= SHA256M_G;
12083 digest[7] -= SHA256M_H;
12084
12085 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12086
12087 uint salt_len = input_len - 64 - 1;
12088
12089 char *salt_buf = input_buf + 64 + 1;
12090
12091 char *salt_buf_ptr = (char *) salt->salt_buf;
12092
12093 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12094
12095 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12096
12097 salt->salt_len = salt_len;
12098
12099 return (PARSER_OK);
12100 }
12101
12102 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12103 {
12104 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12105
12106 u64 *digest = (u64 *) hash_buf->digest;
12107
12108 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12109 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12110 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12111 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12112 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12113 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12114 digest[6] = 0;
12115 digest[7] = 0;
12116
12117 digest[0] -= SHA384M_A;
12118 digest[1] -= SHA384M_B;
12119 digest[2] -= SHA384M_C;
12120 digest[3] -= SHA384M_D;
12121 digest[4] -= SHA384M_E;
12122 digest[5] -= SHA384M_F;
12123 digest[6] -= 0;
12124 digest[7] -= 0;
12125
12126 return (PARSER_OK);
12127 }
12128
12129 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12130 {
12131 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12132
12133 u64 *digest = (u64 *) hash_buf->digest;
12134
12135 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12136 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12137 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12138 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12139 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12140 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12141 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12142 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12143
12144 digest[0] -= SHA512M_A;
12145 digest[1] -= SHA512M_B;
12146 digest[2] -= SHA512M_C;
12147 digest[3] -= SHA512M_D;
12148 digest[4] -= SHA512M_E;
12149 digest[5] -= SHA512M_F;
12150 digest[6] -= SHA512M_G;
12151 digest[7] -= SHA512M_H;
12152
12153 return (PARSER_OK);
12154 }
12155
12156 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12157 {
12158 if (data.opts_type & OPTS_TYPE_ST_HEX)
12159 {
12160 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12161 }
12162 else
12163 {
12164 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12165 }
12166
12167 u64 *digest = (u64 *) hash_buf->digest;
12168
12169 salt_t *salt = hash_buf->salt;
12170
12171 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12172 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12173 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12174 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12175 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12176 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12177 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12178 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12179
12180 digest[0] -= SHA512M_A;
12181 digest[1] -= SHA512M_B;
12182 digest[2] -= SHA512M_C;
12183 digest[3] -= SHA512M_D;
12184 digest[4] -= SHA512M_E;
12185 digest[5] -= SHA512M_F;
12186 digest[6] -= SHA512M_G;
12187 digest[7] -= SHA512M_H;
12188
12189 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12190
12191 uint salt_len = input_len - 128 - 1;
12192
12193 char *salt_buf = input_buf + 128 + 1;
12194
12195 char *salt_buf_ptr = (char *) salt->salt_buf;
12196
12197 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12198
12199 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12200
12201 salt->salt_len = salt_len;
12202
12203 return (PARSER_OK);
12204 }
12205
12206 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12207 {
12208 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12209
12210 u64 *digest = (u64 *) hash_buf->digest;
12211
12212 salt_t *salt = hash_buf->salt;
12213
12214 char *salt_pos = input_buf + 3;
12215
12216 uint iterations_len = 0;
12217
12218 if (memcmp (salt_pos, "rounds=", 7) == 0)
12219 {
12220 salt_pos += 7;
12221
12222 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12223
12224 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12225 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12226
12227 salt_pos[0] = 0x0;
12228
12229 salt->salt_iter = atoi (salt_pos - iterations_len);
12230
12231 salt_pos += 1;
12232
12233 iterations_len += 8;
12234 }
12235 else
12236 {
12237 salt->salt_iter = ROUNDS_SHA512CRYPT;
12238 }
12239
12240 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12241
12242 char *hash_pos = strchr (salt_pos, '$');
12243
12244 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12245
12246 uint salt_len = hash_pos - salt_pos;
12247
12248 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12249
12250 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12251
12252 salt->salt_len = salt_len;
12253
12254 hash_pos++;
12255
12256 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12257
12258 return (PARSER_OK);
12259 }
12260
12261 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12262 {
12263 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12264
12265 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12266
12267 u64 *digest = (u64 *) hash_buf->digest;
12268
12269 salt_t *salt = hash_buf->salt;
12270
12271 uint keccak_mdlen = input_len / 2;
12272
12273 for (uint i = 0; i < keccak_mdlen / 8; i++)
12274 {
12275 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12276
12277 digest[i] = byte_swap_64 (digest[i]);
12278 }
12279
12280 salt->keccak_mdlen = keccak_mdlen;
12281
12282 return (PARSER_OK);
12283 }
12284
12285 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12286 {
12287 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12288
12289 u32 *digest = (u32 *) hash_buf->digest;
12290
12291 salt_t *salt = hash_buf->salt;
12292
12293 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12294
12295 /**
12296 * Parse that strange long line
12297 */
12298
12299 char *in_off[9];
12300
12301 size_t in_len[9] = { 0 };
12302
12303 in_off[0] = strtok (input_buf, ":");
12304
12305 in_len[0] = strlen (in_off[0]);
12306
12307 size_t i;
12308
12309 for (i = 1; i < 9; i++)
12310 {
12311 in_off[i] = strtok (NULL, ":");
12312
12313 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12314
12315 in_len[i] = strlen (in_off[i]);
12316 }
12317
12318 char *ptr = (char *) ikepsk->msg_buf;
12319
12320 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12321 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12322 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12323 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12324 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12325 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12326
12327 *ptr = 0x80;
12328
12329 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12330
12331 ptr = (char *) ikepsk->nr_buf;
12332
12333 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12334 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12335
12336 *ptr = 0x80;
12337
12338 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12339
12340 /**
12341 * Store to database
12342 */
12343
12344 ptr = in_off[8];
12345
12346 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12347 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12348 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12349 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12350
12351 digest[0] = byte_swap_32 (digest[0]);
12352 digest[1] = byte_swap_32 (digest[1]);
12353 digest[2] = byte_swap_32 (digest[2]);
12354 digest[3] = byte_swap_32 (digest[3]);
12355
12356 salt->salt_len = 32;
12357
12358 salt->salt_buf[0] = ikepsk->nr_buf[0];
12359 salt->salt_buf[1] = ikepsk->nr_buf[1];
12360 salt->salt_buf[2] = ikepsk->nr_buf[2];
12361 salt->salt_buf[3] = ikepsk->nr_buf[3];
12362 salt->salt_buf[4] = ikepsk->nr_buf[4];
12363 salt->salt_buf[5] = ikepsk->nr_buf[5];
12364 salt->salt_buf[6] = ikepsk->nr_buf[6];
12365 salt->salt_buf[7] = ikepsk->nr_buf[7];
12366
12367 return (PARSER_OK);
12368 }
12369
12370 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12371 {
12372 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12373
12374 u32 *digest = (u32 *) hash_buf->digest;
12375
12376 salt_t *salt = hash_buf->salt;
12377
12378 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12379
12380 /**
12381 * Parse that strange long line
12382 */
12383
12384 char *in_off[9];
12385
12386 size_t in_len[9] = { 0 };
12387
12388 in_off[0] = strtok (input_buf, ":");
12389
12390 in_len[0] = strlen (in_off[0]);
12391
12392 size_t i;
12393
12394 for (i = 1; i < 9; i++)
12395 {
12396 in_off[i] = strtok (NULL, ":");
12397
12398 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12399
12400 in_len[i] = strlen (in_off[i]);
12401 }
12402
12403 char *ptr = (char *) ikepsk->msg_buf;
12404
12405 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12406 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12407 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12408 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12409 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12410 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12411
12412 *ptr = 0x80;
12413
12414 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12415
12416 ptr = (char *) ikepsk->nr_buf;
12417
12418 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12419 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12420
12421 *ptr = 0x80;
12422
12423 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12424
12425 /**
12426 * Store to database
12427 */
12428
12429 ptr = in_off[8];
12430
12431 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12432 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12433 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12434 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12435 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12436
12437 salt->salt_len = 32;
12438
12439 salt->salt_buf[0] = ikepsk->nr_buf[0];
12440 salt->salt_buf[1] = ikepsk->nr_buf[1];
12441 salt->salt_buf[2] = ikepsk->nr_buf[2];
12442 salt->salt_buf[3] = ikepsk->nr_buf[3];
12443 salt->salt_buf[4] = ikepsk->nr_buf[4];
12444 salt->salt_buf[5] = ikepsk->nr_buf[5];
12445 salt->salt_buf[6] = ikepsk->nr_buf[6];
12446 salt->salt_buf[7] = ikepsk->nr_buf[7];
12447
12448 return (PARSER_OK);
12449 }
12450
12451 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12452 {
12453 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12454
12455 u32 *digest = (u32 *) hash_buf->digest;
12456
12457 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12458 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12459 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12460 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12461 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12462
12463 digest[0] = byte_swap_32 (digest[0]);
12464 digest[1] = byte_swap_32 (digest[1]);
12465 digest[2] = byte_swap_32 (digest[2]);
12466 digest[3] = byte_swap_32 (digest[3]);
12467 digest[4] = byte_swap_32 (digest[4]);
12468
12469 return (PARSER_OK);
12470 }
12471
12472 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12473 {
12474 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12475
12476 u32 *digest = (u32 *) hash_buf->digest;
12477
12478 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12479 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12480 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12481 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12482 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12483 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12484 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12485 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12486 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12487 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12488 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12489 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12490 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12491 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12492 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12493 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12494
12495 return (PARSER_OK);
12496 }
12497
12498 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12499 {
12500 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12501
12502 u32 *digest = (u32 *) hash_buf->digest;
12503
12504 salt_t *salt = hash_buf->salt;
12505
12506 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12507 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12508 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12509 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12510 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12511
12512 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12513
12514 uint salt_len = input_len - 40 - 1;
12515
12516 char *salt_buf = input_buf + 40 + 1;
12517
12518 char *salt_buf_ptr = (char *) salt->salt_buf;
12519
12520 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12521
12522 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12523
12524 salt->salt_len = salt_len;
12525
12526 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12527
12528 return (PARSER_OK);
12529 }
12530
12531 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12532 {
12533 u32 *digest = (u32 *) hash_buf->digest;
12534
12535 salt_t *salt = hash_buf->salt;
12536
12537 tc_t *tc = (tc_t *) hash_buf->esalt;
12538
12539 if (input_len == 0)
12540 {
12541 log_error ("TrueCrypt container not specified");
12542
12543 exit (-1);
12544 }
12545
12546 FILE *fp = fopen (input_buf, "rb");
12547
12548 if (fp == NULL)
12549 {
12550 log_error ("%s: %s", input_buf, strerror (errno));
12551
12552 exit (-1);
12553 }
12554
12555 char buf[512] = { 0 };
12556
12557 int n = fread (buf, 1, sizeof (buf), fp);
12558
12559 fclose (fp);
12560
12561 if (n != 512) return (PARSER_TC_FILE_SIZE);
12562
12563 memcpy (tc->salt_buf, buf, 64);
12564
12565 memcpy (tc->data_buf, buf + 64, 512 - 64);
12566
12567 salt->salt_buf[0] = tc->salt_buf[0];
12568
12569 salt->salt_len = 4;
12570
12571 salt->salt_iter = 1000 - 1;
12572
12573 digest[0] = tc->data_buf[0];
12574
12575 return (PARSER_OK);
12576 }
12577
12578 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12579 {
12580 u32 *digest = (u32 *) hash_buf->digest;
12581
12582 salt_t *salt = hash_buf->salt;
12583
12584 tc_t *tc = (tc_t *) hash_buf->esalt;
12585
12586 if (input_len == 0)
12587 {
12588 log_error ("TrueCrypt container not specified");
12589
12590 exit (-1);
12591 }
12592
12593 FILE *fp = fopen (input_buf, "rb");
12594
12595 if (fp == NULL)
12596 {
12597 log_error ("%s: %s", input_buf, strerror (errno));
12598
12599 exit (-1);
12600 }
12601
12602 char buf[512] = { 0 };
12603
12604 int n = fread (buf, 1, sizeof (buf), fp);
12605
12606 fclose (fp);
12607
12608 if (n != 512) return (PARSER_TC_FILE_SIZE);
12609
12610 memcpy (tc->salt_buf, buf, 64);
12611
12612 memcpy (tc->data_buf, buf + 64, 512 - 64);
12613
12614 salt->salt_buf[0] = tc->salt_buf[0];
12615
12616 salt->salt_len = 4;
12617
12618 salt->salt_iter = 2000 - 1;
12619
12620 digest[0] = tc->data_buf[0];
12621
12622 return (PARSER_OK);
12623 }
12624
12625 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12626 {
12627 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12628
12629 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12630
12631 u32 *digest = (u32 *) hash_buf->digest;
12632
12633 salt_t *salt = hash_buf->salt;
12634
12635 char *salt_pos = input_buf + 6;
12636
12637 char *hash_pos = strchr (salt_pos, '$');
12638
12639 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12640
12641 uint salt_len = hash_pos - salt_pos;
12642
12643 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12644
12645 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12646
12647 salt->salt_len = salt_len;
12648
12649 salt->salt_iter = 1000;
12650
12651 hash_pos++;
12652
12653 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12654
12655 return (PARSER_OK);
12656 }
12657
12658 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12659 {
12660 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12661
12662 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12663
12664 u32 *digest = (u32 *) hash_buf->digest;
12665
12666 salt_t *salt = hash_buf->salt;
12667
12668 char *iter_pos = input_buf + 7;
12669
12670 char *salt_pos = strchr (iter_pos, '$');
12671
12672 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12673
12674 salt_pos++;
12675
12676 char *hash_pos = strchr (salt_pos, '$');
12677
12678 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12679
12680 uint salt_len = hash_pos - salt_pos;
12681
12682 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12683
12684 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12685
12686 salt->salt_len = salt_len;
12687
12688 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12689
12690 salt->salt_sign[0] = atoi (salt_iter);
12691
12692 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12693
12694 hash_pos++;
12695
12696 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12697
12698 digest[0] = byte_swap_32 (digest[0]);
12699 digest[1] = byte_swap_32 (digest[1]);
12700 digest[2] = byte_swap_32 (digest[2]);
12701 digest[3] = byte_swap_32 (digest[3]);
12702 digest[4] = byte_swap_32 (digest[4]);
12703
12704 return (PARSER_OK);
12705 }
12706
12707 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12708 {
12709 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12710
12711 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12712
12713 u32 *digest = (u32 *) hash_buf->digest;
12714
12715 salt_t *salt = hash_buf->salt;
12716
12717 char *iter_pos = input_buf + 9;
12718
12719 char *salt_pos = strchr (iter_pos, '$');
12720
12721 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12722
12723 salt_pos++;
12724
12725 char *hash_pos = strchr (salt_pos, '$');
12726
12727 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12728
12729 uint salt_len = hash_pos - salt_pos;
12730
12731 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12732
12733 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12734
12735 salt->salt_len = salt_len;
12736
12737 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12738
12739 salt->salt_sign[0] = atoi (salt_iter);
12740
12741 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12742
12743 hash_pos++;
12744
12745 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12746
12747 digest[0] = byte_swap_32 (digest[0]);
12748 digest[1] = byte_swap_32 (digest[1]);
12749 digest[2] = byte_swap_32 (digest[2]);
12750 digest[3] = byte_swap_32 (digest[3]);
12751 digest[4] = byte_swap_32 (digest[4]);
12752 digest[5] = byte_swap_32 (digest[5]);
12753 digest[6] = byte_swap_32 (digest[6]);
12754 digest[7] = byte_swap_32 (digest[7]);
12755
12756 return (PARSER_OK);
12757 }
12758
12759 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12760 {
12761 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12762
12763 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12764
12765 u64 *digest = (u64 *) hash_buf->digest;
12766
12767 salt_t *salt = hash_buf->salt;
12768
12769 char *iter_pos = input_buf + 9;
12770
12771 char *salt_pos = strchr (iter_pos, '$');
12772
12773 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12774
12775 salt_pos++;
12776
12777 char *hash_pos = strchr (salt_pos, '$');
12778
12779 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12780
12781 uint salt_len = hash_pos - salt_pos;
12782
12783 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12784
12785 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12786
12787 salt->salt_len = salt_len;
12788
12789 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12790
12791 salt->salt_sign[0] = atoi (salt_iter);
12792
12793 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12794
12795 hash_pos++;
12796
12797 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12798
12799 digest[0] = byte_swap_64 (digest[0]);
12800 digest[1] = byte_swap_64 (digest[1]);
12801 digest[2] = byte_swap_64 (digest[2]);
12802 digest[3] = byte_swap_64 (digest[3]);
12803 digest[4] = byte_swap_64 (digest[4]);
12804 digest[5] = byte_swap_64 (digest[5]);
12805 digest[6] = byte_swap_64 (digest[6]);
12806 digest[7] = byte_swap_64 (digest[7]);
12807
12808 return (PARSER_OK);
12809 }
12810
12811 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12812 {
12813 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12814
12815 u32 *digest = (u32 *) hash_buf->digest;
12816
12817 salt_t *salt = hash_buf->salt;
12818
12819 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12820
12821 /**
12822 * parse line
12823 */
12824
12825 char *iterations_pos = input_buf;
12826
12827 char *saltbuf_pos = strchr (iterations_pos, ':');
12828
12829 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12830
12831 uint iterations_len = saltbuf_pos - iterations_pos;
12832
12833 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12834
12835 saltbuf_pos++;
12836
12837 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12838
12839 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12840
12841 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12842
12843 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12844
12845 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12846
12847 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12848
12849 cipherbuf_pos++;
12850
12851 /**
12852 * pbkdf2 iterations
12853 */
12854
12855 salt->salt_iter = atoi (iterations_pos) - 1;
12856
12857 /**
12858 * handle salt encoding
12859 */
12860
12861 char *saltbuf_ptr = (char *) salt->salt_buf;
12862
12863 for (uint i = 0; i < saltbuf_len; i += 2)
12864 {
12865 const char p0 = saltbuf_pos[i + 0];
12866 const char p1 = saltbuf_pos[i + 1];
12867
12868 *saltbuf_ptr++ = hex_convert (p1) << 0
12869 | hex_convert (p0) << 4;
12870 }
12871
12872 salt->salt_len = saltbuf_len / 2;
12873
12874 /**
12875 * handle cipher encoding
12876 */
12877
12878 uint *tmp = (uint *) mymalloc (32);
12879
12880 char *cipherbuf_ptr = (char *) tmp;
12881
12882 for (uint i = 2016; i < cipherbuf_len; i += 2)
12883 {
12884 const char p0 = cipherbuf_pos[i + 0];
12885 const char p1 = cipherbuf_pos[i + 1];
12886
12887 *cipherbuf_ptr++ = hex_convert (p1) << 0
12888 | hex_convert (p0) << 4;
12889 }
12890
12891 // iv is stored at salt_buf 4 (length 16)
12892 // data is stored at salt_buf 8 (length 16)
12893
12894 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12895 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12896 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12897 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12898
12899 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12900 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12901 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12902 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12903
12904 free (tmp);
12905
12906 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12907 {
12908 const char p0 = cipherbuf_pos[j + 0];
12909 const char p1 = cipherbuf_pos[j + 1];
12910
12911 agilekey->cipher[i] = hex_convert (p1) << 0
12912 | hex_convert (p0) << 4;
12913 }
12914
12915 /**
12916 * digest buf
12917 */
12918
12919 digest[0] = 0x10101010;
12920 digest[1] = 0x10101010;
12921 digest[2] = 0x10101010;
12922 digest[3] = 0x10101010;
12923
12924 return (PARSER_OK);
12925 }
12926
12927 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12928 {
12929 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12930
12931 u32 *digest = (u32 *) hash_buf->digest;
12932
12933 salt_t *salt = hash_buf->salt;
12934
12935 char *hashbuf_pos = input_buf;
12936
12937 char *iterations_pos = strchr (hashbuf_pos, ':');
12938
12939 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12940
12941 uint hash_len = iterations_pos - hashbuf_pos;
12942
12943 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12944
12945 iterations_pos++;
12946
12947 char *saltbuf_pos = strchr (iterations_pos, ':');
12948
12949 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12950
12951 uint iterations_len = saltbuf_pos - iterations_pos;
12952
12953 saltbuf_pos++;
12954
12955 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12956
12957 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12958
12959 char *salt_buf_ptr = (char *) salt->salt_buf;
12960
12961 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12962
12963 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12964
12965 salt->salt_len = salt_len;
12966
12967 salt->salt_iter = atoi (iterations_pos) - 1;
12968
12969 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12970 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12971 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12972 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12973
12974 return (PARSER_OK);
12975 }
12976
12977 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12978 {
12979 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12980
12981 u32 *digest = (u32 *) hash_buf->digest;
12982
12983 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12984 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12985 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12986 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12987 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12988 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12989 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12990 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12991
12992 digest[0] = byte_swap_32 (digest[0]);
12993 digest[1] = byte_swap_32 (digest[1]);
12994 digest[2] = byte_swap_32 (digest[2]);
12995 digest[3] = byte_swap_32 (digest[3]);
12996 digest[4] = byte_swap_32 (digest[4]);
12997 digest[5] = byte_swap_32 (digest[5]);
12998 digest[6] = byte_swap_32 (digest[6]);
12999 digest[7] = byte_swap_32 (digest[7]);
13000
13001 return (PARSER_OK);
13002 }
13003
13004 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13005 {
13006 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13007
13008 u32 *digest = (u32 *) hash_buf->digest;
13009
13010 salt_t *salt = hash_buf->salt;
13011
13012 char *salt_pos = input_buf + 3;
13013
13014 uint iterations_len = 0;
13015
13016 if (memcmp (salt_pos, "rounds=", 7) == 0)
13017 {
13018 salt_pos += 7;
13019
13020 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13021
13022 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13023 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13024
13025 salt_pos[0] = 0x0;
13026
13027 salt->salt_iter = atoi (salt_pos - iterations_len);
13028
13029 salt_pos += 1;
13030
13031 iterations_len += 8;
13032 }
13033 else
13034 {
13035 salt->salt_iter = ROUNDS_SHA256CRYPT;
13036 }
13037
13038 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13039
13040 char *hash_pos = strchr (salt_pos, '$');
13041
13042 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13043
13044 uint salt_len = hash_pos - salt_pos;
13045
13046 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13047
13048 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13049
13050 salt->salt_len = salt_len;
13051
13052 hash_pos++;
13053
13054 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13055
13056 return (PARSER_OK);
13057 }
13058
13059 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13060 {
13061 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13062
13063 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13064
13065 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13066
13067 u64 *digest = (u64 *) hash_buf->digest;
13068
13069 salt_t *salt = hash_buf->salt;
13070
13071 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13072
13073 char *iter_pos = input_buf + 4;
13074
13075 char *salt_pos = strchr (iter_pos, '$');
13076
13077 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13078
13079 salt_pos++;
13080
13081 char *hash_pos = strchr (salt_pos, '$');
13082
13083 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13084
13085 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13086
13087 hash_pos++;
13088
13089 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13090 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13091 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13092 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13093 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13094 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13095 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13096 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13097
13098 uint salt_len = hash_pos - salt_pos - 1;
13099
13100 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13101
13102 salt->salt_len = salt_len / 2;
13103
13104 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13105 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13106 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13107 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13108 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13109 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13110 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13111 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13112
13113 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13114 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13115 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13116 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13117 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13118 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13119 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13120 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13121 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13122 pbkdf2_sha512->salt_buf[9] = 0x80;
13123
13124 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13125
13126 salt->salt_iter = atoi (iter_pos) - 1;
13127
13128 return (PARSER_OK);
13129 }
13130
13131 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13132 {
13133 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13134
13135 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13136
13137 u32 *digest = (u32 *) hash_buf->digest;
13138
13139 salt_t *salt = hash_buf->salt;
13140
13141 char *salt_pos = input_buf + 14;
13142
13143 char *hash_pos = strchr (salt_pos, '*');
13144
13145 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13146
13147 hash_pos++;
13148
13149 uint salt_len = hash_pos - salt_pos - 1;
13150
13151 char *salt_buf_ptr = (char *) salt->salt_buf;
13152
13153 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13154
13155 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13156
13157 salt->salt_len = salt_len;
13158
13159 u8 tmp_buf[100] = { 0 };
13160
13161 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13162
13163 memcpy (digest, tmp_buf, 32);
13164
13165 digest[0] = byte_swap_32 (digest[0]);
13166 digest[1] = byte_swap_32 (digest[1]);
13167 digest[2] = byte_swap_32 (digest[2]);
13168 digest[3] = byte_swap_32 (digest[3]);
13169 digest[4] = byte_swap_32 (digest[4]);
13170 digest[5] = byte_swap_32 (digest[5]);
13171 digest[6] = byte_swap_32 (digest[6]);
13172 digest[7] = byte_swap_32 (digest[7]);
13173
13174 digest[0] -= SHA256M_A;
13175 digest[1] -= SHA256M_B;
13176 digest[2] -= SHA256M_C;
13177 digest[3] -= SHA256M_D;
13178 digest[4] -= SHA256M_E;
13179 digest[5] -= SHA256M_F;
13180 digest[6] -= SHA256M_G;
13181 digest[7] -= SHA256M_H;
13182
13183 return (PARSER_OK);
13184 }
13185
13186 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13187 {
13188 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13189
13190 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13191
13192 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13193
13194 u64 *digest = (u64 *) hash_buf->digest;
13195
13196 salt_t *salt = hash_buf->salt;
13197
13198 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13199
13200 char *iter_pos = input_buf + 19;
13201
13202 char *salt_pos = strchr (iter_pos, '.');
13203
13204 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13205
13206 salt_pos++;
13207
13208 char *hash_pos = strchr (salt_pos, '.');
13209
13210 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13211
13212 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13213
13214 hash_pos++;
13215
13216 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13217 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13218 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13219 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13220 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13221 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13222 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13223 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13224
13225 uint salt_len = hash_pos - salt_pos - 1;
13226
13227 salt_len /= 2;
13228
13229 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13230
13231 uint i;
13232
13233 for (i = 0; i < salt_len; i++)
13234 {
13235 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13236 }
13237
13238 salt_buf_ptr[salt_len + 3] = 0x01;
13239 salt_buf_ptr[salt_len + 4] = 0x80;
13240
13241 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13242
13243 salt->salt_len = salt_len;
13244
13245 salt->salt_iter = atoi (iter_pos) - 1;
13246
13247 return (PARSER_OK);
13248 }
13249
13250 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13251 {
13252 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13253
13254 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13255
13256 u64 *digest = (u64 *) hash_buf->digest;
13257
13258 salt_t *salt = hash_buf->salt;
13259
13260 u8 tmp_buf[120] = { 0 };
13261
13262 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13263
13264 memcpy (digest, tmp_buf, 64);
13265
13266 digest[0] = byte_swap_64 (digest[0]);
13267 digest[1] = byte_swap_64 (digest[1]);
13268 digest[2] = byte_swap_64 (digest[2]);
13269 digest[3] = byte_swap_64 (digest[3]);
13270 digest[4] = byte_swap_64 (digest[4]);
13271 digest[5] = byte_swap_64 (digest[5]);
13272 digest[6] = byte_swap_64 (digest[6]);
13273 digest[7] = byte_swap_64 (digest[7]);
13274
13275 digest[0] -= SHA512M_A;
13276 digest[1] -= SHA512M_B;
13277 digest[2] -= SHA512M_C;
13278 digest[3] -= SHA512M_D;
13279 digest[4] -= SHA512M_E;
13280 digest[5] -= SHA512M_F;
13281 digest[6] -= SHA512M_G;
13282 digest[7] -= SHA512M_H;
13283
13284 salt->salt_len = tmp_len - 64;
13285
13286 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13287
13288 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13289 {
13290 char *ptr = (char *) salt->salt_buf;
13291
13292 ptr[salt->salt_len] = 0x80;
13293 }
13294
13295 return (PARSER_OK);
13296 }
13297
13298 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13299 {
13300 if (data.opts_type & OPTS_TYPE_ST_HEX)
13301 {
13302 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13303 }
13304 else
13305 {
13306 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13307 }
13308
13309 u32 *digest = (u32 *) hash_buf->digest;
13310
13311 salt_t *salt = hash_buf->salt;
13312
13313 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13314 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13315 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13316 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13317
13318 digest[0] = byte_swap_32 (digest[0]);
13319 digest[1] = byte_swap_32 (digest[1]);
13320 digest[2] = byte_swap_32 (digest[2]);
13321 digest[3] = byte_swap_32 (digest[3]);
13322
13323 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13324
13325 uint salt_len = input_len - 32 - 1;
13326
13327 char *salt_buf = input_buf + 32 + 1;
13328
13329 char *salt_buf_ptr = (char *) salt->salt_buf;
13330
13331 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13332
13333 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13334
13335 salt->salt_len = salt_len;
13336
13337 return (PARSER_OK);
13338 }
13339
13340 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13341 {
13342 if (data.opts_type & OPTS_TYPE_ST_HEX)
13343 {
13344 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13345 }
13346 else
13347 {
13348 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13349 }
13350
13351 u32 *digest = (u32 *) hash_buf->digest;
13352
13353 salt_t *salt = hash_buf->salt;
13354
13355 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13356 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13357 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13358 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13359 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13360
13361 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13362
13363 uint salt_len = input_len - 40 - 1;
13364
13365 char *salt_buf = input_buf + 40 + 1;
13366
13367 char *salt_buf_ptr = (char *) salt->salt_buf;
13368
13369 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13370
13371 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13372
13373 salt->salt_len = salt_len;
13374
13375 return (PARSER_OK);
13376 }
13377
13378 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13379 {
13380 if (data.opts_type & OPTS_TYPE_ST_HEX)
13381 {
13382 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13383 }
13384 else
13385 {
13386 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13387 }
13388
13389 u32 *digest = (u32 *) hash_buf->digest;
13390
13391 salt_t *salt = hash_buf->salt;
13392
13393 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13394 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13395 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13396 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13397 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13398 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13399 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13400 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13401
13402 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13403
13404 uint salt_len = input_len - 64 - 1;
13405
13406 char *salt_buf = input_buf + 64 + 1;
13407
13408 char *salt_buf_ptr = (char *) salt->salt_buf;
13409
13410 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13411
13412 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13413
13414 salt->salt_len = salt_len;
13415
13416 return (PARSER_OK);
13417 }
13418
13419 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13420 {
13421 if (data.opts_type & OPTS_TYPE_ST_HEX)
13422 {
13423 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13424 }
13425 else
13426 {
13427 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13428 }
13429
13430 u64 *digest = (u64 *) hash_buf->digest;
13431
13432 salt_t *salt = hash_buf->salt;
13433
13434 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13435 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13436 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13437 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13438 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13439 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13440 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13441 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13442
13443 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13444
13445 uint salt_len = input_len - 128 - 1;
13446
13447 char *salt_buf = input_buf + 128 + 1;
13448
13449 char *salt_buf_ptr = (char *) salt->salt_buf;
13450
13451 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13452
13453 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13454
13455 salt->salt_len = salt_len;
13456
13457 return (PARSER_OK);
13458 }
13459
13460 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13461 {
13462 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13463
13464 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13465
13466 u32 *digest = (u32 *) hash_buf->digest;
13467
13468 salt_t *salt = hash_buf->salt;
13469
13470 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13471
13472 /**
13473 * parse line
13474 */
13475
13476 char *user_pos = input_buf + 10 + 1;
13477
13478 char *realm_pos = strchr (user_pos, '$');
13479
13480 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13481
13482 uint user_len = realm_pos - user_pos;
13483
13484 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13485
13486 realm_pos++;
13487
13488 char *salt_pos = strchr (realm_pos, '$');
13489
13490 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13491
13492 uint realm_len = salt_pos - realm_pos;
13493
13494 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13495
13496 salt_pos++;
13497
13498 char *data_pos = strchr (salt_pos, '$');
13499
13500 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13501
13502 uint salt_len = data_pos - salt_pos;
13503
13504 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13505
13506 data_pos++;
13507
13508 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13509
13510 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13511
13512 /**
13513 * copy data
13514 */
13515
13516 memcpy (krb5pa->user, user_pos, user_len);
13517 memcpy (krb5pa->realm, realm_pos, realm_len);
13518 memcpy (krb5pa->salt, salt_pos, salt_len);
13519
13520 char *timestamp_ptr = (char *) krb5pa->timestamp;
13521
13522 for (uint i = 0; i < (36 * 2); i += 2)
13523 {
13524 const char p0 = data_pos[i + 0];
13525 const char p1 = data_pos[i + 1];
13526
13527 *timestamp_ptr++ = hex_convert (p1) << 0
13528 | hex_convert (p0) << 4;
13529 }
13530
13531 char *checksum_ptr = (char *) krb5pa->checksum;
13532
13533 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13534 {
13535 const char p0 = data_pos[i + 0];
13536 const char p1 = data_pos[i + 1];
13537
13538 *checksum_ptr++ = hex_convert (p1) << 0
13539 | hex_convert (p0) << 4;
13540 }
13541
13542 /**
13543 * copy some data to generic buffers to make sorting happy
13544 */
13545
13546 salt->salt_buf[0] = krb5pa->timestamp[0];
13547 salt->salt_buf[1] = krb5pa->timestamp[1];
13548 salt->salt_buf[2] = krb5pa->timestamp[2];
13549 salt->salt_buf[3] = krb5pa->timestamp[3];
13550 salt->salt_buf[4] = krb5pa->timestamp[4];
13551 salt->salt_buf[5] = krb5pa->timestamp[5];
13552 salt->salt_buf[6] = krb5pa->timestamp[6];
13553 salt->salt_buf[7] = krb5pa->timestamp[7];
13554 salt->salt_buf[8] = krb5pa->timestamp[8];
13555
13556 salt->salt_len = 36;
13557
13558 digest[0] = krb5pa->checksum[0];
13559 digest[1] = krb5pa->checksum[1];
13560 digest[2] = krb5pa->checksum[2];
13561 digest[3] = krb5pa->checksum[3];
13562
13563 return (PARSER_OK);
13564 }
13565
13566 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13567 {
13568 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13569
13570 u32 *digest = (u32 *) hash_buf->digest;
13571
13572 salt_t *salt = hash_buf->salt;
13573
13574 /**
13575 * parse line
13576 */
13577
13578 char *salt_pos = input_buf;
13579
13580 char *hash_pos = strchr (salt_pos, '$');
13581
13582 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13583
13584 uint salt_len = hash_pos - salt_pos;
13585
13586 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13587
13588 hash_pos++;
13589
13590 uint hash_len = input_len - 1 - salt_len;
13591
13592 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13593
13594 /**
13595 * valid some data
13596 */
13597
13598 uint user_len = 0;
13599
13600 for (uint i = 0; i < salt_len; i++)
13601 {
13602 if (salt_pos[i] == ' ') continue;
13603
13604 user_len++;
13605 }
13606
13607 // SAP user names cannot be longer than 12 characters
13608 if (user_len > 12) return (PARSER_SALT_LENGTH);
13609
13610 // SAP user name cannot start with ! or ?
13611 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13612
13613 /**
13614 * copy data
13615 */
13616
13617 char *salt_buf_ptr = (char *) salt->salt_buf;
13618
13619 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13620
13621 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13622
13623 salt->salt_len = salt_len;
13624
13625 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13626 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13627 digest[2] = 0;
13628 digest[3] = 0;
13629
13630 digest[0] = byte_swap_32 (digest[0]);
13631 digest[1] = byte_swap_32 (digest[1]);
13632
13633 return (PARSER_OK);
13634 }
13635
13636 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13637 {
13638 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13639
13640 u32 *digest = (u32 *) hash_buf->digest;
13641
13642 salt_t *salt = hash_buf->salt;
13643
13644 /**
13645 * parse line
13646 */
13647
13648 char *salt_pos = input_buf;
13649
13650 char *hash_pos = strchr (salt_pos, '$');
13651
13652 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13653
13654 uint salt_len = hash_pos - salt_pos;
13655
13656 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13657
13658 hash_pos++;
13659
13660 uint hash_len = input_len - 1 - salt_len;
13661
13662 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13663
13664 /**
13665 * valid some data
13666 */
13667
13668 uint user_len = 0;
13669
13670 for (uint i = 0; i < salt_len; i++)
13671 {
13672 if (salt_pos[i] == ' ') continue;
13673
13674 user_len++;
13675 }
13676
13677 // SAP user names cannot be longer than 12 characters
13678 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13679 // so far nobody complained so we stay with this because it helps in optimization
13680 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13681
13682 if (user_len > 12) return (PARSER_SALT_LENGTH);
13683
13684 // SAP user name cannot start with ! or ?
13685 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13686
13687 /**
13688 * copy data
13689 */
13690
13691 char *salt_buf_ptr = (char *) salt->salt_buf;
13692
13693 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13694
13695 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13696
13697 salt->salt_len = salt_len;
13698
13699 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13700 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13701 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13702 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13703 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13704
13705 return (PARSER_OK);
13706 }
13707
13708 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13709 {
13710 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13711
13712 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13713
13714 u64 *digest = (u64 *) hash_buf->digest;
13715
13716 salt_t *salt = hash_buf->salt;
13717
13718 char *iter_pos = input_buf + 3;
13719
13720 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13721
13722 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13723
13724 memcpy ((char *) salt->salt_sign, input_buf, 4);
13725
13726 salt->salt_iter = salt_iter;
13727
13728 char *salt_pos = iter_pos + 1;
13729
13730 uint salt_len = 8;
13731
13732 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13733
13734 salt->salt_len = salt_len;
13735
13736 char *hash_pos = salt_pos + salt_len;
13737
13738 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13739
13740 // ugly hack start
13741
13742 char *tmp = (char *) salt->salt_buf_pc;
13743
13744 tmp[0] = hash_pos[42];
13745
13746 // ugly hack end
13747
13748 digest[ 0] = byte_swap_64 (digest[ 0]);
13749 digest[ 1] = byte_swap_64 (digest[ 1]);
13750 digest[ 2] = byte_swap_64 (digest[ 2]);
13751 digest[ 3] = byte_swap_64 (digest[ 3]);
13752 digest[ 4] = 0;
13753 digest[ 5] = 0;
13754 digest[ 6] = 0;
13755 digest[ 7] = 0;
13756
13757 return (PARSER_OK);
13758 }
13759
13760 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13761 {
13762 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13763
13764 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13765
13766 u32 *digest = (u32 *) hash_buf->digest;
13767
13768 salt_t *salt = hash_buf->salt;
13769
13770 char *salt_buf = input_buf + 6;
13771
13772 uint salt_len = 16;
13773
13774 char *salt_buf_ptr = (char *) salt->salt_buf;
13775
13776 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13777
13778 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13779
13780 salt->salt_len = salt_len;
13781
13782 char *hash_pos = input_buf + 6 + 16;
13783
13784 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13785 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13786 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13787 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13788 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13789 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13790 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13791 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13792
13793 return (PARSER_OK);
13794 }
13795
13796 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13797 {
13798 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13799
13800 u32 *digest = (u32 *) hash_buf->digest;
13801
13802 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13803 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13804 digest[2] = 0;
13805 digest[3] = 0;
13806
13807 return (PARSER_OK);
13808 }
13809
13810 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13811 {
13812 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13813
13814 u32 *digest = (u32 *) hash_buf->digest;
13815
13816 salt_t *salt = hash_buf->salt;
13817
13818 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13819
13820 char *saltbuf_pos = input_buf;
13821
13822 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13823
13824 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13825
13826 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13827
13828 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13829 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13830
13831 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13832
13833 hashbuf_pos++;
13834
13835 uint hashbuf_len = input_len - saltbuf_len - 1;
13836
13837 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13838
13839 char *salt_ptr = (char *) saltbuf_pos;
13840 char *rakp_ptr = (char *) rakp->salt_buf;
13841
13842 uint i;
13843 uint j;
13844
13845 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13846 {
13847 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13848 }
13849
13850 rakp_ptr[j] = 0x80;
13851
13852 rakp->salt_len = j;
13853
13854 for (i = 0; i < 64; i++)
13855 {
13856 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13857 }
13858
13859 salt->salt_buf[0] = rakp->salt_buf[0];
13860 salt->salt_buf[1] = rakp->salt_buf[1];
13861 salt->salt_buf[2] = rakp->salt_buf[2];
13862 salt->salt_buf[3] = rakp->salt_buf[3];
13863 salt->salt_buf[4] = rakp->salt_buf[4];
13864 salt->salt_buf[5] = rakp->salt_buf[5];
13865 salt->salt_buf[6] = rakp->salt_buf[6];
13866 salt->salt_buf[7] = rakp->salt_buf[7];
13867
13868 salt->salt_len = 32; // muss min. 32 haben
13869
13870 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13871 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13872 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13873 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13874 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13875
13876 return (PARSER_OK);
13877 }
13878
13879 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13880 {
13881 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13882
13883 u32 *digest = (u32 *) hash_buf->digest;
13884
13885 salt_t *salt = hash_buf->salt;
13886
13887 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13888
13889 char *salt_pos = input_buf + 1;
13890
13891 memcpy (salt->salt_buf, salt_pos, 8);
13892
13893 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13894 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13895
13896 salt->salt_len = 8;
13897
13898 char *hash_pos = salt_pos + 8;
13899
13900 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13901 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13902 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13903 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13904 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13905
13906 digest[0] -= SHA1M_A;
13907 digest[1] -= SHA1M_B;
13908 digest[2] -= SHA1M_C;
13909 digest[3] -= SHA1M_D;
13910 digest[4] -= SHA1M_E;
13911
13912 return (PARSER_OK);
13913 }
13914
13915 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13916 {
13917 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13918
13919 u32 *digest = (u32 *) hash_buf->digest;
13920
13921 salt_t *salt = hash_buf->salt;
13922
13923 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13924 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13925 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13926 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13927
13928 digest[0] = byte_swap_32 (digest[0]);
13929 digest[1] = byte_swap_32 (digest[1]);
13930 digest[2] = byte_swap_32 (digest[2]);
13931 digest[3] = byte_swap_32 (digest[3]);
13932
13933 digest[0] -= MD5M_A;
13934 digest[1] -= MD5M_B;
13935 digest[2] -= MD5M_C;
13936 digest[3] -= MD5M_D;
13937
13938 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13939
13940 char *salt_buf_ptr = input_buf + 32 + 1;
13941
13942 u32 *salt_buf = salt->salt_buf;
13943
13944 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13945 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13946 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13947 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13948
13949 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13950 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13951 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13952 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13953
13954 salt->salt_len = 16 + 1;
13955
13956 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13957
13958 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13959
13960 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13961
13962 return (PARSER_OK);
13963 }
13964
13965 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13966 {
13967 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13968
13969 u32 *digest = (u32 *) hash_buf->digest;
13970
13971 salt_t *salt = hash_buf->salt;
13972
13973 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13974
13975 /**
13976 * parse line
13977 */
13978
13979 char *hashbuf_pos = input_buf;
13980
13981 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13982
13983 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13984
13985 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13986
13987 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13988
13989 saltbuf_pos++;
13990
13991 char *iteration_pos = strchr (saltbuf_pos, ':');
13992
13993 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13994
13995 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13996
13997 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13998
13999 iteration_pos++;
14000
14001 char *databuf_pos = strchr (iteration_pos, ':');
14002
14003 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14004
14005 const uint iteration_len = databuf_pos - iteration_pos;
14006
14007 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14008 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14009
14010 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14011
14012 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14013 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14014
14015 databuf_pos++;
14016
14017 // digest
14018
14019 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14020 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14021 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14022 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14023 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14024 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14025 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14026 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14027
14028 // salt
14029
14030 char *saltbuf_ptr = (char *) salt->salt_buf;
14031
14032 for (uint i = 0; i < saltbuf_len; i += 2)
14033 {
14034 const char p0 = saltbuf_pos[i + 0];
14035 const char p1 = saltbuf_pos[i + 1];
14036
14037 *saltbuf_ptr++ = hex_convert (p1) << 0
14038 | hex_convert (p0) << 4;
14039 }
14040
14041 salt->salt_buf[4] = 0x01000000;
14042 salt->salt_buf[5] = 0x80;
14043
14044 salt->salt_len = saltbuf_len / 2;
14045
14046 // iteration
14047
14048 salt->salt_iter = atoi (iteration_pos) - 1;
14049
14050 // data
14051
14052 char *databuf_ptr = (char *) cloudkey->data_buf;
14053
14054 for (uint i = 0; i < databuf_len; i += 2)
14055 {
14056 const char p0 = databuf_pos[i + 0];
14057 const char p1 = databuf_pos[i + 1];
14058
14059 *databuf_ptr++ = hex_convert (p1) << 0
14060 | hex_convert (p0) << 4;
14061 }
14062
14063 *databuf_ptr++ = 0x80;
14064
14065 for (uint i = 0; i < 512; i++)
14066 {
14067 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14068 }
14069
14070 cloudkey->data_len = databuf_len / 2;
14071
14072 return (PARSER_OK);
14073 }
14074
14075 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14076 {
14077 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14078
14079 u32 *digest = (u32 *) hash_buf->digest;
14080
14081 salt_t *salt = hash_buf->salt;
14082
14083 /**
14084 * parse line
14085 */
14086
14087 char *hashbuf_pos = input_buf;
14088
14089 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14090
14091 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14092
14093 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14094
14095 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14096
14097 domainbuf_pos++;
14098
14099 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14100
14101 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14102
14103 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14104
14105 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14106
14107 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14108
14109 saltbuf_pos++;
14110
14111 char *iteration_pos = strchr (saltbuf_pos, ':');
14112
14113 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14114
14115 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14116
14117 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14118
14119 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14120
14121 iteration_pos++;
14122
14123 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14124
14125 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14126 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14127
14128 // ok, the plan for this algorithm is the following:
14129 // we have 2 salts here, the domain-name and a random salt
14130 // while both are used in the initial transformation,
14131 // only the random salt is used in the following iterations
14132 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14133 // and one that includes only the real salt (stored into salt_buf[]).
14134 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14135
14136 u8 tmp_buf[100] = { 0 };
14137
14138 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14139
14140 memcpy (digest, tmp_buf, 20);
14141
14142 digest[0] = byte_swap_32 (digest[0]);
14143 digest[1] = byte_swap_32 (digest[1]);
14144 digest[2] = byte_swap_32 (digest[2]);
14145 digest[3] = byte_swap_32 (digest[3]);
14146 digest[4] = byte_swap_32 (digest[4]);
14147
14148 // domain
14149
14150 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14151
14152 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14153
14154 char *len_ptr = NULL;
14155
14156 for (uint i = 0; i < domainbuf_len; i++)
14157 {
14158 if (salt_buf_pc_ptr[i] == '.')
14159 {
14160 len_ptr = &salt_buf_pc_ptr[i];
14161
14162 *len_ptr = 0;
14163 }
14164 else
14165 {
14166 *len_ptr += 1;
14167 }
14168 }
14169
14170 salt->salt_buf_pc[7] = domainbuf_len;
14171
14172 // "real" salt
14173
14174 char *salt_buf_ptr = (char *) salt->salt_buf;
14175
14176 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14177
14178 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14179
14180 salt->salt_len = salt_len;
14181
14182 // iteration
14183
14184 salt->salt_iter = atoi (iteration_pos);
14185
14186 return (PARSER_OK);
14187 }
14188
14189 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14190 {
14191 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14192
14193 u32 *digest = (u32 *) hash_buf->digest;
14194
14195 salt_t *salt = hash_buf->salt;
14196
14197 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14198 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14199 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14200 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14201 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14202
14203 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14204
14205 uint salt_len = input_len - 40 - 1;
14206
14207 char *salt_buf = input_buf + 40 + 1;
14208
14209 char *salt_buf_ptr = (char *) salt->salt_buf;
14210
14211 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14212
14213 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14214
14215 salt->salt_len = salt_len;
14216
14217 return (PARSER_OK);
14218 }
14219
14220 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14221 {
14222 const u8 ascii_to_ebcdic[] =
14223 {
14224 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14225 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14226 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14227 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14228 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14229 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14230 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14231 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14232 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14233 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14234 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14235 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14236 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14237 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14238 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14239 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14240 };
14241
14242 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14243
14244 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14245
14246 u32 *digest = (u32 *) hash_buf->digest;
14247
14248 salt_t *salt = hash_buf->salt;
14249
14250 char *salt_pos = input_buf + 6 + 1;
14251
14252 char *digest_pos = strchr (salt_pos, '*');
14253
14254 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14255
14256 uint salt_len = digest_pos - salt_pos;
14257
14258 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14259
14260 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14261
14262 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14263
14264 digest_pos++;
14265
14266 char *salt_buf_ptr = (char *) salt->salt_buf;
14267 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14268
14269 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14270
14271 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14272
14273 salt->salt_len = salt_len;
14274
14275 for (uint i = 0; i < salt_len; i++)
14276 {
14277 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14278 }
14279 for (uint i = salt_len; i < 8; i++)
14280 {
14281 salt_buf_pc_ptr[i] = 0x40;
14282 }
14283
14284 uint tt;
14285
14286 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14287
14288 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14289 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14290
14291 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14292 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14293
14294 digest[0] = byte_swap_32 (digest[0]);
14295 digest[1] = byte_swap_32 (digest[1]);
14296
14297 IP (digest[0], digest[1], tt);
14298
14299 digest[0] = rotr32 (digest[0], 29);
14300 digest[1] = rotr32 (digest[1], 29);
14301 digest[2] = 0;
14302 digest[3] = 0;
14303
14304 return (PARSER_OK);
14305 }
14306
14307 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14308 {
14309 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14310
14311 u32 *digest = (u32 *) hash_buf->digest;
14312
14313 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14314 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14315 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14316 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14317
14318 digest[0] = byte_swap_32 (digest[0]);
14319 digest[1] = byte_swap_32 (digest[1]);
14320 digest[2] = byte_swap_32 (digest[2]);
14321 digest[3] = byte_swap_32 (digest[3]);
14322
14323 return (PARSER_OK);
14324 }
14325
14326 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14327 {
14328 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14329
14330 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14331
14332 u32 *digest = (u32 *) hash_buf->digest;
14333
14334 salt_t *salt = hash_buf->salt;
14335
14336 u8 tmp_buf[120] = { 0 };
14337
14338 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14339
14340 tmp_buf[3] += -4; // dont ask!
14341
14342 memcpy (salt->salt_buf, tmp_buf, 5);
14343
14344 salt->salt_len = 5;
14345
14346 memcpy (digest, tmp_buf + 5, 9);
14347
14348 // yes, only 9 byte are needed to crack, but 10 to display
14349
14350 salt->salt_buf_pc[7] = input_buf[20];
14351
14352 return (PARSER_OK);
14353 }
14354
14355 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14356 {
14357 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14358
14359 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14360
14361 u32 *digest = (u32 *) hash_buf->digest;
14362
14363 salt_t *salt = hash_buf->salt;
14364
14365 u8 tmp_buf[120] = { 0 };
14366
14367 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14368
14369 tmp_buf[3] += -4; // dont ask!
14370
14371 // salt
14372
14373 memcpy (salt->salt_buf, tmp_buf, 16);
14374
14375 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)
14376
14377 // iteration
14378
14379 char tmp_iter_buf[11] = { 0 };
14380
14381 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14382
14383 tmp_iter_buf[10] = 0;
14384
14385 salt->salt_iter = atoi (tmp_iter_buf);
14386
14387 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14388 {
14389 return (PARSER_SALT_ITERATION);
14390 }
14391
14392 salt->salt_iter--; // first round in init
14393
14394 // 2 additional bytes for display only
14395
14396 salt->salt_buf_pc[0] = tmp_buf[26];
14397 salt->salt_buf_pc[1] = tmp_buf[27];
14398
14399 // digest
14400
14401 memcpy (digest, tmp_buf + 28, 8);
14402
14403 digest[0] = byte_swap_32 (digest[0]);
14404 digest[1] = byte_swap_32 (digest[1]);
14405 digest[2] = 0;
14406 digest[3] = 0;
14407
14408 return (PARSER_OK);
14409 }
14410
14411 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14412 {
14413 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14414
14415 u32 *digest = (u32 *) hash_buf->digest;
14416
14417 salt_t *salt = hash_buf->salt;
14418
14419 char *salt_buf_pos = input_buf;
14420
14421 char *hash_buf_pos = salt_buf_pos + 6;
14422
14423 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14424 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14425 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14426 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14427 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14428 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14429 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14430 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14431
14432 digest[0] -= SHA256M_A;
14433 digest[1] -= SHA256M_B;
14434 digest[2] -= SHA256M_C;
14435 digest[3] -= SHA256M_D;
14436 digest[4] -= SHA256M_E;
14437 digest[5] -= SHA256M_F;
14438 digest[6] -= SHA256M_G;
14439 digest[7] -= SHA256M_H;
14440
14441 char *salt_buf_ptr = (char *) salt->salt_buf;
14442
14443 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14444
14445 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14446
14447 salt->salt_len = salt_len;
14448
14449 return (PARSER_OK);
14450 }
14451
14452 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14453 {
14454 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14455
14456 u32 *digest = (u32 *) hash_buf->digest;
14457
14458 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14459
14460 salt_t *salt = hash_buf->salt;
14461
14462 char *salt_buf = input_buf + 6;
14463
14464 char *digest_buf = strchr (salt_buf, '$');
14465
14466 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14467
14468 uint salt_len = digest_buf - salt_buf;
14469
14470 digest_buf++; // skip the '$' symbol
14471
14472 char *salt_buf_ptr = (char *) salt->salt_buf;
14473
14474 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14475
14476 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14477
14478 salt->salt_len = salt_len;
14479
14480 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14481 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14482 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14483 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14484
14485 digest[0] = byte_swap_32 (digest[0]);
14486 digest[1] = byte_swap_32 (digest[1]);
14487 digest[2] = byte_swap_32 (digest[2]);
14488 digest[3] = byte_swap_32 (digest[3]);
14489
14490 digest[0] -= MD5M_A;
14491 digest[1] -= MD5M_B;
14492 digest[2] -= MD5M_C;
14493 digest[3] -= MD5M_D;
14494
14495 return (PARSER_OK);
14496 }
14497
14498 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14499 {
14500 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14501
14502 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14503
14504 u32 *digest = (u32 *) hash_buf->digest;
14505
14506 salt_t *salt = hash_buf->salt;
14507
14508 char *salt_buf = input_buf + 3;
14509
14510 char *digest_buf = strchr (salt_buf, '$');
14511
14512 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14513
14514 uint salt_len = digest_buf - salt_buf;
14515
14516 digest_buf++; // skip the '$' symbol
14517
14518 char *salt_buf_ptr = (char *) salt->salt_buf;
14519
14520 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14521
14522 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14523
14524 salt_buf_ptr[salt_len] = 0x2d;
14525
14526 salt->salt_len = salt_len + 1;
14527
14528 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14529 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14530 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14531 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14532
14533 digest[0] = byte_swap_32 (digest[0]);
14534 digest[1] = byte_swap_32 (digest[1]);
14535 digest[2] = byte_swap_32 (digest[2]);
14536 digest[3] = byte_swap_32 (digest[3]);
14537
14538 digest[0] -= MD5M_A;
14539 digest[1] -= MD5M_B;
14540 digest[2] -= MD5M_C;
14541 digest[3] -= MD5M_D;
14542
14543 return (PARSER_OK);
14544 }
14545
14546 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14547 {
14548 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14549
14550 u32 *digest = (u32 *) hash_buf->digest;
14551
14552 u8 tmp_buf[100] = { 0 };
14553
14554 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14555
14556 memcpy (digest, tmp_buf, 20);
14557
14558 digest[0] = byte_swap_32 (digest[0]);
14559 digest[1] = byte_swap_32 (digest[1]);
14560 digest[2] = byte_swap_32 (digest[2]);
14561 digest[3] = byte_swap_32 (digest[3]);
14562 digest[4] = byte_swap_32 (digest[4]);
14563
14564 digest[0] -= SHA1M_A;
14565 digest[1] -= SHA1M_B;
14566 digest[2] -= SHA1M_C;
14567 digest[3] -= SHA1M_D;
14568 digest[4] -= SHA1M_E;
14569
14570 return (PARSER_OK);
14571 }
14572
14573 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14574 {
14575 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14576
14577 u32 *digest = (u32 *) hash_buf->digest;
14578
14579 salt_t *salt = hash_buf->salt;
14580
14581 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14582 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14583 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14584 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14585
14586 digest[0] = byte_swap_32 (digest[0]);
14587 digest[1] = byte_swap_32 (digest[1]);
14588 digest[2] = byte_swap_32 (digest[2]);
14589 digest[3] = byte_swap_32 (digest[3]);
14590
14591 digest[0] -= MD5M_A;
14592 digest[1] -= MD5M_B;
14593 digest[2] -= MD5M_C;
14594 digest[3] -= MD5M_D;
14595
14596 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14597
14598 uint salt_len = input_len - 32 - 1;
14599
14600 char *salt_buf = input_buf + 32 + 1;
14601
14602 char *salt_buf_ptr = (char *) salt->salt_buf;
14603
14604 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14605
14606 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14607
14608 /*
14609 * add static "salt" part
14610 */
14611
14612 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14613
14614 salt_len += 8;
14615
14616 salt->salt_len = salt_len;
14617
14618 return (PARSER_OK);
14619 }
14620
14621 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14622 {
14623 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14624
14625 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14626
14627 u32 *digest = (u32 *) hash_buf->digest;
14628
14629 salt_t *salt = hash_buf->salt;
14630
14631 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14632
14633 /**
14634 * parse line
14635 */
14636
14637 char *saltlen_pos = input_buf + 1 + 3 + 1;
14638
14639 char *saltbuf_pos = strchr (saltlen_pos, '$');
14640
14641 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14642
14643 uint saltlen_len = saltbuf_pos - saltlen_pos;
14644
14645 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14646
14647 saltbuf_pos++;
14648
14649 char *keylen_pos = strchr (saltbuf_pos, '$');
14650
14651 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14652
14653 uint saltbuf_len = keylen_pos - saltbuf_pos;
14654
14655 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14656
14657 keylen_pos++;
14658
14659 char *keybuf_pos = strchr (keylen_pos, '$');
14660
14661 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14662
14663 uint keylen_len = keybuf_pos - keylen_pos;
14664
14665 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14666
14667 keybuf_pos++;
14668
14669 char *databuf_pos = strchr (keybuf_pos, '$');
14670
14671 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14672
14673 uint keybuf_len = databuf_pos - keybuf_pos;
14674
14675 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14676
14677 databuf_pos++;
14678
14679 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14680
14681 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14682
14683 /**
14684 * copy data
14685 */
14686
14687 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14688 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14689 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14690 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14691
14692 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14693 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14694 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14695 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14696
14697 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14698 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14699 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14700 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14701
14702 salt->salt_len = 16;
14703 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14704
14705 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14706 {
14707 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14708 }
14709
14710 return (PARSER_OK);
14711 }
14712
14713 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14714 {
14715 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14716
14717 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14718
14719 u32 *digest = (u32 *) hash_buf->digest;
14720
14721 salt_t *salt = hash_buf->salt;
14722
14723 /**
14724 * parse line
14725 */
14726
14727 // first is the N salt parameter
14728
14729 char *N_pos = input_buf + 6;
14730
14731 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14732
14733 N_pos++;
14734
14735 salt->scrypt_N = atoi (N_pos);
14736
14737 // r
14738
14739 char *r_pos = strchr (N_pos, ':');
14740
14741 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14742
14743 r_pos++;
14744
14745 salt->scrypt_r = atoi (r_pos);
14746
14747 // p
14748
14749 char *p_pos = strchr (r_pos, ':');
14750
14751 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14752
14753 p_pos++;
14754
14755 salt->scrypt_p = atoi (p_pos);
14756
14757 // salt
14758
14759 char *saltbuf_pos = strchr (p_pos, ':');
14760
14761 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14762
14763 saltbuf_pos++;
14764
14765 char *hash_pos = strchr (saltbuf_pos, ':');
14766
14767 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14768
14769 hash_pos++;
14770
14771 // base64 decode
14772
14773 u8 tmp_buf[33] = { 0 };
14774
14775 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14776
14777 char *salt_buf_ptr = (char *) salt->salt_buf;
14778
14779 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14780
14781 salt->salt_len = tmp_len;
14782 salt->salt_iter = 1;
14783
14784 // digest - base64 decode
14785
14786 memset (tmp_buf, 0, sizeof (tmp_buf));
14787
14788 tmp_len = input_len - (hash_pos - input_buf);
14789
14790 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14791
14792 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14793
14794 memcpy (digest, tmp_buf, 32);
14795
14796 return (PARSER_OK);
14797 }
14798
14799 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14800 {
14801 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14802
14803 u32 *digest = (u32 *) hash_buf->digest;
14804
14805 salt_t *salt = hash_buf->salt;
14806
14807 /**
14808 * parse line
14809 */
14810
14811 char decrypted[76] = { 0 }; // iv + hash
14812
14813 juniper_decrypt_hash (input_buf, decrypted);
14814
14815 char *md5crypt_hash = decrypted + 12;
14816
14817 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14818
14819 salt->salt_iter = ROUNDS_MD5CRYPT;
14820
14821 char *salt_pos = md5crypt_hash + 3;
14822
14823 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14824
14825 salt->salt_len = hash_pos - salt_pos; // should be 8
14826
14827 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14828
14829 hash_pos++;
14830
14831 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14832
14833 return (PARSER_OK);
14834 }
14835
14836 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14837 {
14838 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14839
14840 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14841
14842 u32 *digest = (u32 *) hash_buf->digest;
14843
14844 salt_t *salt = hash_buf->salt;
14845
14846 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14847
14848 /**
14849 * parse line
14850 */
14851
14852 // first is *raw* salt
14853
14854 char *salt_pos = input_buf + 3;
14855
14856 char *hash_pos = strchr (salt_pos, '$');
14857
14858 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14859
14860 uint salt_len = hash_pos - salt_pos;
14861
14862 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14863
14864 hash_pos++;
14865
14866 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14867
14868 memcpy (salt_buf_ptr, salt_pos, 14);
14869
14870 salt_buf_ptr[17] = 0x01;
14871 salt_buf_ptr[18] = 0x80;
14872
14873 // add some stuff to normal salt to make sorted happy
14874
14875 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14876 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14877 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14878 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14879
14880 salt->salt_len = salt_len;
14881 salt->salt_iter = ROUNDS_CISCO8 - 1;
14882
14883 // base64 decode hash
14884
14885 u8 tmp_buf[100] = { 0 };
14886
14887 uint hash_len = input_len - 3 - salt_len - 1;
14888
14889 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14890
14891 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14892
14893 memcpy (digest, tmp_buf, 32);
14894
14895 digest[0] = byte_swap_32 (digest[0]);
14896 digest[1] = byte_swap_32 (digest[1]);
14897 digest[2] = byte_swap_32 (digest[2]);
14898 digest[3] = byte_swap_32 (digest[3]);
14899 digest[4] = byte_swap_32 (digest[4]);
14900 digest[5] = byte_swap_32 (digest[5]);
14901 digest[6] = byte_swap_32 (digest[6]);
14902 digest[7] = byte_swap_32 (digest[7]);
14903
14904 return (PARSER_OK);
14905 }
14906
14907 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14908 {
14909 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14910
14911 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14912
14913 u32 *digest = (u32 *) hash_buf->digest;
14914
14915 salt_t *salt = hash_buf->salt;
14916
14917 /**
14918 * parse line
14919 */
14920
14921 // first is *raw* salt
14922
14923 char *salt_pos = input_buf + 3;
14924
14925 char *hash_pos = strchr (salt_pos, '$');
14926
14927 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14928
14929 uint salt_len = hash_pos - salt_pos;
14930
14931 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14932
14933 salt->salt_len = salt_len;
14934 hash_pos++;
14935
14936 char *salt_buf_ptr = (char *) salt->salt_buf;
14937
14938 memcpy (salt_buf_ptr, salt_pos, salt_len);
14939 salt_buf_ptr[salt_len] = 0;
14940
14941 // base64 decode hash
14942
14943 u8 tmp_buf[100] = { 0 };
14944
14945 uint hash_len = input_len - 3 - salt_len - 1;
14946
14947 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14948
14949 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14950
14951 memcpy (digest, tmp_buf, 32);
14952
14953 // fixed:
14954 salt->scrypt_N = 16384;
14955 salt->scrypt_r = 1;
14956 salt->scrypt_p = 1;
14957 salt->salt_iter = 1;
14958
14959 return (PARSER_OK);
14960 }
14961
14962 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14963 {
14964 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14965
14966 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14967
14968 u32 *digest = (u32 *) hash_buf->digest;
14969
14970 salt_t *salt = hash_buf->salt;
14971
14972 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14973
14974 /**
14975 * parse line
14976 */
14977
14978 char *version_pos = input_buf + 8 + 1;
14979
14980 char *verifierHashSize_pos = strchr (version_pos, '*');
14981
14982 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14983
14984 u32 version_len = verifierHashSize_pos - version_pos;
14985
14986 if (version_len != 4) return (PARSER_SALT_LENGTH);
14987
14988 verifierHashSize_pos++;
14989
14990 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14991
14992 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14993
14994 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14995
14996 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14997
14998 keySize_pos++;
14999
15000 char *saltSize_pos = strchr (keySize_pos, '*');
15001
15002 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15003
15004 u32 keySize_len = saltSize_pos - keySize_pos;
15005
15006 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15007
15008 saltSize_pos++;
15009
15010 char *osalt_pos = strchr (saltSize_pos, '*');
15011
15012 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15013
15014 u32 saltSize_len = osalt_pos - saltSize_pos;
15015
15016 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15017
15018 osalt_pos++;
15019
15020 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15021
15022 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15023
15024 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15025
15026 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15027
15028 encryptedVerifier_pos++;
15029
15030 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15031
15032 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15033
15034 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15035
15036 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15037
15038 encryptedVerifierHash_pos++;
15039
15040 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;
15041
15042 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15043
15044 const uint version = atoi (version_pos);
15045
15046 if (version != 2007) return (PARSER_SALT_VALUE);
15047
15048 const uint verifierHashSize = atoi (verifierHashSize_pos);
15049
15050 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15051
15052 const uint keySize = atoi (keySize_pos);
15053
15054 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15055
15056 office2007->keySize = keySize;
15057
15058 const uint saltSize = atoi (saltSize_pos);
15059
15060 if (saltSize != 16) return (PARSER_SALT_VALUE);
15061
15062 /**
15063 * salt
15064 */
15065
15066 salt->salt_len = 16;
15067 salt->salt_iter = ROUNDS_OFFICE2007;
15068
15069 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15070 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15071 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15072 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15073
15074 /**
15075 * esalt
15076 */
15077
15078 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15079 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15080 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15081 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15082
15083 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15084 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15085 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15086 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15087 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15088
15089 /**
15090 * digest
15091 */
15092
15093 digest[0] = office2007->encryptedVerifierHash[0];
15094 digest[1] = office2007->encryptedVerifierHash[1];
15095 digest[2] = office2007->encryptedVerifierHash[2];
15096 digest[3] = office2007->encryptedVerifierHash[3];
15097
15098 return (PARSER_OK);
15099 }
15100
15101 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15102 {
15103 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15104
15105 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15106
15107 u32 *digest = (u32 *) hash_buf->digest;
15108
15109 salt_t *salt = hash_buf->salt;
15110
15111 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15112
15113 /**
15114 * parse line
15115 */
15116
15117 char *version_pos = input_buf + 8 + 1;
15118
15119 char *spinCount_pos = strchr (version_pos, '*');
15120
15121 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15122
15123 u32 version_len = spinCount_pos - version_pos;
15124
15125 if (version_len != 4) return (PARSER_SALT_LENGTH);
15126
15127 spinCount_pos++;
15128
15129 char *keySize_pos = strchr (spinCount_pos, '*');
15130
15131 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15132
15133 u32 spinCount_len = keySize_pos - spinCount_pos;
15134
15135 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15136
15137 keySize_pos++;
15138
15139 char *saltSize_pos = strchr (keySize_pos, '*');
15140
15141 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15142
15143 u32 keySize_len = saltSize_pos - keySize_pos;
15144
15145 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15146
15147 saltSize_pos++;
15148
15149 char *osalt_pos = strchr (saltSize_pos, '*');
15150
15151 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15152
15153 u32 saltSize_len = osalt_pos - saltSize_pos;
15154
15155 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15156
15157 osalt_pos++;
15158
15159 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15160
15161 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15162
15163 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15164
15165 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15166
15167 encryptedVerifier_pos++;
15168
15169 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15170
15171 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15172
15173 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15174
15175 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15176
15177 encryptedVerifierHash_pos++;
15178
15179 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;
15180
15181 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15182
15183 const uint version = atoi (version_pos);
15184
15185 if (version != 2010) return (PARSER_SALT_VALUE);
15186
15187 const uint spinCount = atoi (spinCount_pos);
15188
15189 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15190
15191 const uint keySize = atoi (keySize_pos);
15192
15193 if (keySize != 128) return (PARSER_SALT_VALUE);
15194
15195 const uint saltSize = atoi (saltSize_pos);
15196
15197 if (saltSize != 16) return (PARSER_SALT_VALUE);
15198
15199 /**
15200 * salt
15201 */
15202
15203 salt->salt_len = 16;
15204 salt->salt_iter = spinCount;
15205
15206 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15207 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15208 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15209 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15210
15211 /**
15212 * esalt
15213 */
15214
15215 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15216 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15217 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15218 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15219
15220 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15221 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15222 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15223 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15224 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15225 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15226 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15227 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15228
15229 /**
15230 * digest
15231 */
15232
15233 digest[0] = office2010->encryptedVerifierHash[0];
15234 digest[1] = office2010->encryptedVerifierHash[1];
15235 digest[2] = office2010->encryptedVerifierHash[2];
15236 digest[3] = office2010->encryptedVerifierHash[3];
15237
15238 return (PARSER_OK);
15239 }
15240
15241 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15242 {
15243 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15244
15245 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15246
15247 u32 *digest = (u32 *) hash_buf->digest;
15248
15249 salt_t *salt = hash_buf->salt;
15250
15251 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15252
15253 /**
15254 * parse line
15255 */
15256
15257 char *version_pos = input_buf + 8 + 1;
15258
15259 char *spinCount_pos = strchr (version_pos, '*');
15260
15261 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15262
15263 u32 version_len = spinCount_pos - version_pos;
15264
15265 if (version_len != 4) return (PARSER_SALT_LENGTH);
15266
15267 spinCount_pos++;
15268
15269 char *keySize_pos = strchr (spinCount_pos, '*');
15270
15271 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15272
15273 u32 spinCount_len = keySize_pos - spinCount_pos;
15274
15275 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15276
15277 keySize_pos++;
15278
15279 char *saltSize_pos = strchr (keySize_pos, '*');
15280
15281 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15282
15283 u32 keySize_len = saltSize_pos - keySize_pos;
15284
15285 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15286
15287 saltSize_pos++;
15288
15289 char *osalt_pos = strchr (saltSize_pos, '*');
15290
15291 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15292
15293 u32 saltSize_len = osalt_pos - saltSize_pos;
15294
15295 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15296
15297 osalt_pos++;
15298
15299 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15300
15301 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15302
15303 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15304
15305 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15306
15307 encryptedVerifier_pos++;
15308
15309 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15310
15311 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15312
15313 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15314
15315 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15316
15317 encryptedVerifierHash_pos++;
15318
15319 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;
15320
15321 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15322
15323 const uint version = atoi (version_pos);
15324
15325 if (version != 2013) return (PARSER_SALT_VALUE);
15326
15327 const uint spinCount = atoi (spinCount_pos);
15328
15329 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15330
15331 const uint keySize = atoi (keySize_pos);
15332
15333 if (keySize != 256) return (PARSER_SALT_VALUE);
15334
15335 const uint saltSize = atoi (saltSize_pos);
15336
15337 if (saltSize != 16) return (PARSER_SALT_VALUE);
15338
15339 /**
15340 * salt
15341 */
15342
15343 salt->salt_len = 16;
15344 salt->salt_iter = spinCount;
15345
15346 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15347 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15348 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15349 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15350
15351 /**
15352 * esalt
15353 */
15354
15355 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15356 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15357 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15358 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15359
15360 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15361 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15362 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15363 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15364 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15365 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15366 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15367 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15368
15369 /**
15370 * digest
15371 */
15372
15373 digest[0] = office2013->encryptedVerifierHash[0];
15374 digest[1] = office2013->encryptedVerifierHash[1];
15375 digest[2] = office2013->encryptedVerifierHash[2];
15376 digest[3] = office2013->encryptedVerifierHash[3];
15377
15378 return (PARSER_OK);
15379 }
15380
15381 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15382 {
15383 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15384
15385 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15386
15387 u32 *digest = (u32 *) hash_buf->digest;
15388
15389 salt_t *salt = hash_buf->salt;
15390
15391 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15392
15393 /**
15394 * parse line
15395 */
15396
15397 char *version_pos = input_buf + 11;
15398
15399 char *osalt_pos = strchr (version_pos, '*');
15400
15401 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15402
15403 u32 version_len = osalt_pos - version_pos;
15404
15405 if (version_len != 1) return (PARSER_SALT_LENGTH);
15406
15407 osalt_pos++;
15408
15409 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15410
15411 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15412
15413 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15414
15415 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15416
15417 encryptedVerifier_pos++;
15418
15419 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15420
15421 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15422
15423 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15424
15425 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15426
15427 encryptedVerifierHash_pos++;
15428
15429 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15430
15431 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15432
15433 const uint version = *version_pos - 0x30;
15434
15435 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15436
15437 /**
15438 * esalt
15439 */
15440
15441 oldoffice01->version = version;
15442
15443 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15444 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15445 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15446 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15447
15448 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15449 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15450 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15451 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15452
15453 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15454 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15455 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15456 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15457
15458 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15459 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15460 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15461 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15462
15463 /**
15464 * salt
15465 */
15466
15467 salt->salt_len = 16;
15468
15469 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15470 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15471 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15472 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15473
15474 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15475 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15476 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15477 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15478
15479 // this is a workaround as office produces multiple documents with the same salt
15480
15481 salt->salt_len += 32;
15482
15483 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15484 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15485 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15486 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15487 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15488 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15489 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15490 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15491
15492 /**
15493 * digest
15494 */
15495
15496 digest[0] = oldoffice01->encryptedVerifierHash[0];
15497 digest[1] = oldoffice01->encryptedVerifierHash[1];
15498 digest[2] = oldoffice01->encryptedVerifierHash[2];
15499 digest[3] = oldoffice01->encryptedVerifierHash[3];
15500
15501 return (PARSER_OK);
15502 }
15503
15504 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15505 {
15506 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15507 }
15508
15509 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15510 {
15511 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15512
15513 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15514
15515 u32 *digest = (u32 *) hash_buf->digest;
15516
15517 salt_t *salt = hash_buf->salt;
15518
15519 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15520
15521 /**
15522 * parse line
15523 */
15524
15525 char *version_pos = input_buf + 11;
15526
15527 char *osalt_pos = strchr (version_pos, '*');
15528
15529 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15530
15531 u32 version_len = osalt_pos - version_pos;
15532
15533 if (version_len != 1) return (PARSER_SALT_LENGTH);
15534
15535 osalt_pos++;
15536
15537 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15538
15539 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15540
15541 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15542
15543 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15544
15545 encryptedVerifier_pos++;
15546
15547 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15548
15549 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15550
15551 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15552
15553 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15554
15555 encryptedVerifierHash_pos++;
15556
15557 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15558
15559 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15560
15561 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15562
15563 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15564
15565 rc4key_pos++;
15566
15567 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15568
15569 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15570
15571 const uint version = *version_pos - 0x30;
15572
15573 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15574
15575 /**
15576 * esalt
15577 */
15578
15579 oldoffice01->version = version;
15580
15581 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15582 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15583 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15584 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15585
15586 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15587 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15588 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15589 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15590
15591 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15592 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15593 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15594 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15595
15596 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15597 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15598 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15599 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15600
15601 oldoffice01->rc4key[1] = 0;
15602 oldoffice01->rc4key[0] = 0;
15603
15604 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15605 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15606 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15607 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15608 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15609 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15610 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15611 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15612 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15613 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15614
15615 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15616 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15617
15618 /**
15619 * salt
15620 */
15621
15622 salt->salt_len = 16;
15623
15624 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15625 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15626 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15627 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15628
15629 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15630 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15631 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15632 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15633
15634 // this is a workaround as office produces multiple documents with the same salt
15635
15636 salt->salt_len += 32;
15637
15638 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15639 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15640 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15641 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15642 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15643 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15644 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15645 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15646
15647 /**
15648 * digest
15649 */
15650
15651 digest[0] = oldoffice01->rc4key[0];
15652 digest[1] = oldoffice01->rc4key[1];
15653 digest[2] = 0;
15654 digest[3] = 0;
15655
15656 return (PARSER_OK);
15657 }
15658
15659 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15660 {
15661 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15662
15663 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15664
15665 u32 *digest = (u32 *) hash_buf->digest;
15666
15667 salt_t *salt = hash_buf->salt;
15668
15669 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15670
15671 /**
15672 * parse line
15673 */
15674
15675 char *version_pos = input_buf + 11;
15676
15677 char *osalt_pos = strchr (version_pos, '*');
15678
15679 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15680
15681 u32 version_len = osalt_pos - version_pos;
15682
15683 if (version_len != 1) return (PARSER_SALT_LENGTH);
15684
15685 osalt_pos++;
15686
15687 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15688
15689 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15690
15691 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15692
15693 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15694
15695 encryptedVerifier_pos++;
15696
15697 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15698
15699 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15700
15701 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15702
15703 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15704
15705 encryptedVerifierHash_pos++;
15706
15707 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15708
15709 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15710
15711 const uint version = *version_pos - 0x30;
15712
15713 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15714
15715 /**
15716 * esalt
15717 */
15718
15719 oldoffice34->version = version;
15720
15721 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15722 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15723 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15724 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15725
15726 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15727 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15728 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15729 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15730
15731 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15732 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15733 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15734 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15735 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15736
15737 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15738 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15739 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15740 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15741 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15742
15743 /**
15744 * salt
15745 */
15746
15747 salt->salt_len = 16;
15748
15749 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15750 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15751 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15752 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15753
15754 // this is a workaround as office produces multiple documents with the same salt
15755
15756 salt->salt_len += 32;
15757
15758 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15759 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15760 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15761 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15762 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15763 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15764 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15765 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15766
15767 /**
15768 * digest
15769 */
15770
15771 digest[0] = oldoffice34->encryptedVerifierHash[0];
15772 digest[1] = oldoffice34->encryptedVerifierHash[1];
15773 digest[2] = oldoffice34->encryptedVerifierHash[2];
15774 digest[3] = oldoffice34->encryptedVerifierHash[3];
15775
15776 return (PARSER_OK);
15777 }
15778
15779 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15780 {
15781 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15782
15783 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15784 }
15785
15786 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15787 {
15788 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15789
15790 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15791
15792 u32 *digest = (u32 *) hash_buf->digest;
15793
15794 salt_t *salt = hash_buf->salt;
15795
15796 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15797
15798 /**
15799 * parse line
15800 */
15801
15802 char *version_pos = input_buf + 11;
15803
15804 char *osalt_pos = strchr (version_pos, '*');
15805
15806 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15807
15808 u32 version_len = osalt_pos - version_pos;
15809
15810 if (version_len != 1) return (PARSER_SALT_LENGTH);
15811
15812 osalt_pos++;
15813
15814 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15815
15816 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15817
15818 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15819
15820 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15821
15822 encryptedVerifier_pos++;
15823
15824 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15825
15826 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15827
15828 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15829
15830 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15831
15832 encryptedVerifierHash_pos++;
15833
15834 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15835
15836 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15837
15838 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15839
15840 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15841
15842 rc4key_pos++;
15843
15844 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15845
15846 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15847
15848 const uint version = *version_pos - 0x30;
15849
15850 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15851
15852 /**
15853 * esalt
15854 */
15855
15856 oldoffice34->version = version;
15857
15858 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15859 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15860 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15861 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15862
15863 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15864 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15865 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15866 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15867
15868 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15869 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15870 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15871 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15872 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15873
15874 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15875 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15876 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15877 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15878 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15879
15880 oldoffice34->rc4key[1] = 0;
15881 oldoffice34->rc4key[0] = 0;
15882
15883 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15884 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15885 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15886 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15887 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15888 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15889 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15890 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15891 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15892 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15893
15894 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15895 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15896
15897 /**
15898 * salt
15899 */
15900
15901 salt->salt_len = 16;
15902
15903 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15904 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15905 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15906 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15907
15908 // this is a workaround as office produces multiple documents with the same salt
15909
15910 salt->salt_len += 32;
15911
15912 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15913 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15914 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15915 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15916 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15917 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15918 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15919 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15920
15921 /**
15922 * digest
15923 */
15924
15925 digest[0] = oldoffice34->rc4key[0];
15926 digest[1] = oldoffice34->rc4key[1];
15927 digest[2] = 0;
15928 digest[3] = 0;
15929
15930 return (PARSER_OK);
15931 }
15932
15933 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15934 {
15935 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15936
15937 u32 *digest = (u32 *) hash_buf->digest;
15938
15939 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15940 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15941 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15942 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15943
15944 digest[0] = byte_swap_32 (digest[0]);
15945 digest[1] = byte_swap_32 (digest[1]);
15946 digest[2] = byte_swap_32 (digest[2]);
15947 digest[3] = byte_swap_32 (digest[3]);
15948
15949 return (PARSER_OK);
15950 }
15951
15952 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15953 {
15954 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15955
15956 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15957
15958 u32 *digest = (u32 *) hash_buf->digest;
15959
15960 salt_t *salt = hash_buf->salt;
15961
15962 char *signature_pos = input_buf;
15963
15964 char *salt_pos = strchr (signature_pos, '$');
15965
15966 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15967
15968 u32 signature_len = salt_pos - signature_pos;
15969
15970 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15971
15972 salt_pos++;
15973
15974 char *hash_pos = strchr (salt_pos, '$');
15975
15976 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15977
15978 u32 salt_len = hash_pos - salt_pos;
15979
15980 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15981
15982 hash_pos++;
15983
15984 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15985
15986 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15987
15988 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15989 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15990 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15991 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15992 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15993
15994 digest[0] -= SHA1M_A;
15995 digest[1] -= SHA1M_B;
15996 digest[2] -= SHA1M_C;
15997 digest[3] -= SHA1M_D;
15998 digest[4] -= SHA1M_E;
15999
16000 char *salt_buf_ptr = (char *) salt->salt_buf;
16001
16002 memcpy (salt_buf_ptr, salt_pos, salt_len);
16003
16004 salt->salt_len = salt_len;
16005
16006 return (PARSER_OK);
16007 }
16008
16009 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16010 {
16011 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16012
16013 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16014
16015 u32 *digest = (u32 *) hash_buf->digest;
16016
16017 salt_t *salt = hash_buf->salt;
16018
16019 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16020
16021 /**
16022 * parse line
16023 */
16024
16025 char *iter_pos = input_buf + 14;
16026
16027 const int iter = atoi (iter_pos);
16028
16029 if (iter < 1) return (PARSER_SALT_ITERATION);
16030
16031 salt->salt_iter = iter - 1;
16032
16033 char *salt_pos = strchr (iter_pos, '$');
16034
16035 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16036
16037 salt_pos++;
16038
16039 char *hash_pos = strchr (salt_pos, '$');
16040
16041 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16042
16043 const uint salt_len = hash_pos - salt_pos;
16044
16045 hash_pos++;
16046
16047 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16048
16049 memcpy (salt_buf_ptr, salt_pos, salt_len);
16050
16051 salt->salt_len = salt_len;
16052
16053 salt_buf_ptr[salt_len + 3] = 0x01;
16054 salt_buf_ptr[salt_len + 4] = 0x80;
16055
16056 // add some stuff to normal salt to make sorted happy
16057
16058 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16059 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16060 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16061 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16062 salt->salt_buf[4] = salt->salt_iter;
16063
16064 // base64 decode hash
16065
16066 u8 tmp_buf[100] = { 0 };
16067
16068 uint hash_len = input_len - (hash_pos - input_buf);
16069
16070 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16071
16072 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16073
16074 memcpy (digest, tmp_buf, 32);
16075
16076 digest[0] = byte_swap_32 (digest[0]);
16077 digest[1] = byte_swap_32 (digest[1]);
16078 digest[2] = byte_swap_32 (digest[2]);
16079 digest[3] = byte_swap_32 (digest[3]);
16080 digest[4] = byte_swap_32 (digest[4]);
16081 digest[5] = byte_swap_32 (digest[5]);
16082 digest[6] = byte_swap_32 (digest[6]);
16083 digest[7] = byte_swap_32 (digest[7]);
16084
16085 return (PARSER_OK);
16086 }
16087
16088 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16089 {
16090 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16091
16092 u32 *digest = (u32 *) hash_buf->digest;
16093
16094 salt_t *salt = hash_buf->salt;
16095
16096 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16097 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16098 digest[2] = 0;
16099 digest[3] = 0;
16100
16101 digest[0] = byte_swap_32 (digest[0]);
16102 digest[1] = byte_swap_32 (digest[1]);
16103
16104 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16105 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16106 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16107
16108 char iter_c = input_buf[17];
16109 char iter_d = input_buf[19];
16110
16111 // atm only defaults, let's see if there's more request
16112 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16113 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16114
16115 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16116
16117 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16118 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16119 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16120 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16121
16122 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16123 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16124 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16125 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16126
16127 salt->salt_len = 16;
16128
16129 return (PARSER_OK);
16130 }
16131
16132 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16133 {
16134 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16135
16136 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16137
16138 u32 *digest = (u32 *) hash_buf->digest;
16139
16140 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16141
16142 salt_t *salt = hash_buf->salt;
16143
16144 char *salt_pos = input_buf + 10;
16145
16146 char *hash_pos = strchr (salt_pos, '$');
16147
16148 uint salt_len = hash_pos - salt_pos;
16149
16150 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16151
16152 hash_pos++;
16153
16154 uint hash_len = input_len - 10 - salt_len - 1;
16155
16156 // base64 decode salt
16157
16158 u8 tmp_buf[100] = { 0 };
16159
16160 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16161
16162 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16163
16164 tmp_buf[salt_len] = 0x80;
16165
16166 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16167
16168 salt->salt_len = salt_len;
16169
16170 // base64 decode salt
16171
16172 memset (tmp_buf, 0, sizeof (tmp_buf));
16173
16174 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16175
16176 uint user_len = hash_len - 32;
16177
16178 const u8 *tmp_hash = tmp_buf + user_len;
16179
16180 user_len--; // skip the trailing space
16181
16182 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16183 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16184 digest[2] = hex_to_u32 (&tmp_hash[16]);
16185 digest[3] = hex_to_u32 (&tmp_hash[24]);
16186
16187 digest[0] = byte_swap_32 (digest[0]);
16188 digest[1] = byte_swap_32 (digest[1]);
16189 digest[2] = byte_swap_32 (digest[2]);
16190 digest[3] = byte_swap_32 (digest[3]);
16191
16192 // store username for host only (output hash if cracked)
16193
16194 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16195 memcpy (cram_md5->user, tmp_buf, user_len);
16196
16197 return (PARSER_OK);
16198 }
16199
16200 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16201 {
16202 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16203
16204 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16205
16206 u32 *digest = (u32 *) hash_buf->digest;
16207
16208 salt_t *salt = hash_buf->salt;
16209
16210 char *iter_pos = input_buf + 10;
16211
16212 u32 iter = atoi (iter_pos);
16213
16214 if (iter < 1)
16215 {
16216 return (PARSER_SALT_ITERATION);
16217 }
16218
16219 iter--; // first iteration is special
16220
16221 salt->salt_iter = iter;
16222
16223 char *base64_pos = strchr (iter_pos, '}');
16224
16225 if (base64_pos == NULL)
16226 {
16227 return (PARSER_SIGNATURE_UNMATCHED);
16228 }
16229
16230 base64_pos++;
16231
16232 // base64 decode salt
16233
16234 u32 base64_len = input_len - (base64_pos - input_buf);
16235
16236 u8 tmp_buf[100] = { 0 };
16237
16238 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16239
16240 if (decoded_len < 24)
16241 {
16242 return (PARSER_SALT_LENGTH);
16243 }
16244
16245 // copy the salt
16246
16247 uint salt_len = decoded_len - 20;
16248
16249 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16250 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16251
16252 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16253
16254 salt->salt_len = salt_len;
16255
16256 // set digest
16257
16258 u32 *digest_ptr = (u32*) tmp_buf;
16259
16260 digest[0] = byte_swap_32 (digest_ptr[0]);
16261 digest[1] = byte_swap_32 (digest_ptr[1]);
16262 digest[2] = byte_swap_32 (digest_ptr[2]);
16263 digest[3] = byte_swap_32 (digest_ptr[3]);
16264 digest[4] = byte_swap_32 (digest_ptr[4]);
16265
16266 return (PARSER_OK);
16267 }
16268
16269 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16270 {
16271 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16272
16273 u32 *digest = (u32 *) hash_buf->digest;
16274
16275 salt_t *salt = hash_buf->salt;
16276
16277 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16278 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16279 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16280 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16281 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16282
16283 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16284
16285 uint salt_len = input_len - 40 - 1;
16286
16287 char *salt_buf = input_buf + 40 + 1;
16288
16289 char *salt_buf_ptr = (char *) salt->salt_buf;
16290
16291 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16292
16293 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16294
16295 salt->salt_len = salt_len;
16296
16297 return (PARSER_OK);
16298 }
16299
16300 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16301 {
16302 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16303
16304 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16305
16306 u32 *digest = (u32 *) hash_buf->digest;
16307
16308 salt_t *salt = hash_buf->salt;
16309
16310 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16311
16312 /**
16313 * parse line
16314 */
16315
16316 char *V_pos = input_buf + 5;
16317
16318 char *R_pos = strchr (V_pos, '*');
16319
16320 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16321
16322 u32 V_len = R_pos - V_pos;
16323
16324 R_pos++;
16325
16326 char *bits_pos = strchr (R_pos, '*');
16327
16328 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16329
16330 u32 R_len = bits_pos - R_pos;
16331
16332 bits_pos++;
16333
16334 char *P_pos = strchr (bits_pos, '*');
16335
16336 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16337
16338 u32 bits_len = P_pos - bits_pos;
16339
16340 P_pos++;
16341
16342 char *enc_md_pos = strchr (P_pos, '*');
16343
16344 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16345
16346 u32 P_len = enc_md_pos - P_pos;
16347
16348 enc_md_pos++;
16349
16350 char *id_len_pos = strchr (enc_md_pos, '*');
16351
16352 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16353
16354 u32 enc_md_len = id_len_pos - enc_md_pos;
16355
16356 id_len_pos++;
16357
16358 char *id_buf_pos = strchr (id_len_pos, '*');
16359
16360 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16361
16362 u32 id_len_len = id_buf_pos - id_len_pos;
16363
16364 id_buf_pos++;
16365
16366 char *u_len_pos = strchr (id_buf_pos, '*');
16367
16368 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16369
16370 u32 id_buf_len = u_len_pos - id_buf_pos;
16371
16372 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16373
16374 u_len_pos++;
16375
16376 char *u_buf_pos = strchr (u_len_pos, '*');
16377
16378 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16379
16380 u32 u_len_len = u_buf_pos - u_len_pos;
16381
16382 u_buf_pos++;
16383
16384 char *o_len_pos = strchr (u_buf_pos, '*');
16385
16386 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16387
16388 u32 u_buf_len = o_len_pos - u_buf_pos;
16389
16390 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16391
16392 o_len_pos++;
16393
16394 char *o_buf_pos = strchr (o_len_pos, '*');
16395
16396 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16397
16398 u32 o_len_len = o_buf_pos - o_len_pos;
16399
16400 o_buf_pos++;
16401
16402 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;
16403
16404 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16405
16406 // validate data
16407
16408 const int V = atoi (V_pos);
16409 const int R = atoi (R_pos);
16410 const int P = atoi (P_pos);
16411
16412 if (V != 1) return (PARSER_SALT_VALUE);
16413 if (R != 2) return (PARSER_SALT_VALUE);
16414
16415 const int enc_md = atoi (enc_md_pos);
16416
16417 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16418
16419 const int id_len = atoi (id_len_pos);
16420 const int u_len = atoi (u_len_pos);
16421 const int o_len = atoi (o_len_pos);
16422
16423 if (id_len != 16) return (PARSER_SALT_VALUE);
16424 if (u_len != 32) return (PARSER_SALT_VALUE);
16425 if (o_len != 32) return (PARSER_SALT_VALUE);
16426
16427 const int bits = atoi (bits_pos);
16428
16429 if (bits != 40) return (PARSER_SALT_VALUE);
16430
16431 // copy data to esalt
16432
16433 pdf->V = V;
16434 pdf->R = R;
16435 pdf->P = P;
16436
16437 pdf->enc_md = enc_md;
16438
16439 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16440 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16441 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16442 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16443 pdf->id_len = id_len;
16444
16445 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16446 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16447 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16448 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16449 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16450 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16451 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16452 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16453 pdf->u_len = u_len;
16454
16455 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16456 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16457 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16458 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16459 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16460 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16461 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16462 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16463 pdf->o_len = o_len;
16464
16465 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16466 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16467 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16468 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16469
16470 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16471 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16472 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16473 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16474 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16475 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16476 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16477 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16478
16479 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16480 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16481 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16482 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16483 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16484 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16485 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16486 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16487
16488 // we use ID for salt, maybe needs to change, we will see...
16489
16490 salt->salt_buf[0] = pdf->id_buf[0];
16491 salt->salt_buf[1] = pdf->id_buf[1];
16492 salt->salt_buf[2] = pdf->id_buf[2];
16493 salt->salt_buf[3] = pdf->id_buf[3];
16494 salt->salt_len = pdf->id_len;
16495
16496 digest[0] = pdf->u_buf[0];
16497 digest[1] = pdf->u_buf[1];
16498 digest[2] = pdf->u_buf[2];
16499 digest[3] = pdf->u_buf[3];
16500
16501 return (PARSER_OK);
16502 }
16503
16504 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16505 {
16506 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16507 }
16508
16509 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16510 {
16511 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16512
16513 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16514
16515 u32 *digest = (u32 *) hash_buf->digest;
16516
16517 salt_t *salt = hash_buf->salt;
16518
16519 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16520
16521 /**
16522 * parse line
16523 */
16524
16525 char *V_pos = input_buf + 5;
16526
16527 char *R_pos = strchr (V_pos, '*');
16528
16529 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16530
16531 u32 V_len = R_pos - V_pos;
16532
16533 R_pos++;
16534
16535 char *bits_pos = strchr (R_pos, '*');
16536
16537 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16538
16539 u32 R_len = bits_pos - R_pos;
16540
16541 bits_pos++;
16542
16543 char *P_pos = strchr (bits_pos, '*');
16544
16545 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16546
16547 u32 bits_len = P_pos - bits_pos;
16548
16549 P_pos++;
16550
16551 char *enc_md_pos = strchr (P_pos, '*');
16552
16553 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16554
16555 u32 P_len = enc_md_pos - P_pos;
16556
16557 enc_md_pos++;
16558
16559 char *id_len_pos = strchr (enc_md_pos, '*');
16560
16561 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16562
16563 u32 enc_md_len = id_len_pos - enc_md_pos;
16564
16565 id_len_pos++;
16566
16567 char *id_buf_pos = strchr (id_len_pos, '*');
16568
16569 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16570
16571 u32 id_len_len = id_buf_pos - id_len_pos;
16572
16573 id_buf_pos++;
16574
16575 char *u_len_pos = strchr (id_buf_pos, '*');
16576
16577 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16578
16579 u32 id_buf_len = u_len_pos - id_buf_pos;
16580
16581 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16582
16583 u_len_pos++;
16584
16585 char *u_buf_pos = strchr (u_len_pos, '*');
16586
16587 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16588
16589 u32 u_len_len = u_buf_pos - u_len_pos;
16590
16591 u_buf_pos++;
16592
16593 char *o_len_pos = strchr (u_buf_pos, '*');
16594
16595 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16596
16597 u32 u_buf_len = o_len_pos - u_buf_pos;
16598
16599 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16600
16601 o_len_pos++;
16602
16603 char *o_buf_pos = strchr (o_len_pos, '*');
16604
16605 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16606
16607 u32 o_len_len = o_buf_pos - o_len_pos;
16608
16609 o_buf_pos++;
16610
16611 char *rc4key_pos = strchr (o_buf_pos, ':');
16612
16613 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16614
16615 u32 o_buf_len = rc4key_pos - o_buf_pos;
16616
16617 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16618
16619 rc4key_pos++;
16620
16621 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;
16622
16623 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16624
16625 // validate data
16626
16627 const int V = atoi (V_pos);
16628 const int R = atoi (R_pos);
16629 const int P = atoi (P_pos);
16630
16631 if (V != 1) return (PARSER_SALT_VALUE);
16632 if (R != 2) return (PARSER_SALT_VALUE);
16633
16634 const int enc_md = atoi (enc_md_pos);
16635
16636 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16637
16638 const int id_len = atoi (id_len_pos);
16639 const int u_len = atoi (u_len_pos);
16640 const int o_len = atoi (o_len_pos);
16641
16642 if (id_len != 16) return (PARSER_SALT_VALUE);
16643 if (u_len != 32) return (PARSER_SALT_VALUE);
16644 if (o_len != 32) return (PARSER_SALT_VALUE);
16645
16646 const int bits = atoi (bits_pos);
16647
16648 if (bits != 40) return (PARSER_SALT_VALUE);
16649
16650 // copy data to esalt
16651
16652 pdf->V = V;
16653 pdf->R = R;
16654 pdf->P = P;
16655
16656 pdf->enc_md = enc_md;
16657
16658 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16659 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16660 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16661 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16662 pdf->id_len = id_len;
16663
16664 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16665 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16666 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16667 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16668 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16669 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16670 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16671 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16672 pdf->u_len = u_len;
16673
16674 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16675 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16676 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16677 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16678 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16679 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16680 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16681 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16682 pdf->o_len = o_len;
16683
16684 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16685 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16686 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16687 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16688
16689 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16690 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16691 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16692 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16693 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16694 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16695 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16696 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16697
16698 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16699 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16700 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16701 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16702 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16703 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16704 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16705 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16706
16707 pdf->rc4key[1] = 0;
16708 pdf->rc4key[0] = 0;
16709
16710 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16711 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16712 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16713 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16714 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16715 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16716 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16717 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16718 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16719 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16720
16721 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16722 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16723
16724 // we use ID for salt, maybe needs to change, we will see...
16725
16726 salt->salt_buf[0] = pdf->id_buf[0];
16727 salt->salt_buf[1] = pdf->id_buf[1];
16728 salt->salt_buf[2] = pdf->id_buf[2];
16729 salt->salt_buf[3] = pdf->id_buf[3];
16730 salt->salt_buf[4] = pdf->u_buf[0];
16731 salt->salt_buf[5] = pdf->u_buf[1];
16732 salt->salt_buf[6] = pdf->o_buf[0];
16733 salt->salt_buf[7] = pdf->o_buf[1];
16734 salt->salt_len = pdf->id_len + 16;
16735
16736 digest[0] = pdf->rc4key[0];
16737 digest[1] = pdf->rc4key[1];
16738 digest[2] = 0;
16739 digest[3] = 0;
16740
16741 return (PARSER_OK);
16742 }
16743
16744 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16745 {
16746 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16747
16748 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16749
16750 u32 *digest = (u32 *) hash_buf->digest;
16751
16752 salt_t *salt = hash_buf->salt;
16753
16754 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16755
16756 /**
16757 * parse line
16758 */
16759
16760 char *V_pos = input_buf + 5;
16761
16762 char *R_pos = strchr (V_pos, '*');
16763
16764 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16765
16766 u32 V_len = R_pos - V_pos;
16767
16768 R_pos++;
16769
16770 char *bits_pos = strchr (R_pos, '*');
16771
16772 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16773
16774 u32 R_len = bits_pos - R_pos;
16775
16776 bits_pos++;
16777
16778 char *P_pos = strchr (bits_pos, '*');
16779
16780 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16781
16782 u32 bits_len = P_pos - bits_pos;
16783
16784 P_pos++;
16785
16786 char *enc_md_pos = strchr (P_pos, '*');
16787
16788 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16789
16790 u32 P_len = enc_md_pos - P_pos;
16791
16792 enc_md_pos++;
16793
16794 char *id_len_pos = strchr (enc_md_pos, '*');
16795
16796 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16797
16798 u32 enc_md_len = id_len_pos - enc_md_pos;
16799
16800 id_len_pos++;
16801
16802 char *id_buf_pos = strchr (id_len_pos, '*');
16803
16804 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16805
16806 u32 id_len_len = id_buf_pos - id_len_pos;
16807
16808 id_buf_pos++;
16809
16810 char *u_len_pos = strchr (id_buf_pos, '*');
16811
16812 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16813
16814 u32 id_buf_len = u_len_pos - id_buf_pos;
16815
16816 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16817
16818 u_len_pos++;
16819
16820 char *u_buf_pos = strchr (u_len_pos, '*');
16821
16822 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16823
16824 u32 u_len_len = u_buf_pos - u_len_pos;
16825
16826 u_buf_pos++;
16827
16828 char *o_len_pos = strchr (u_buf_pos, '*');
16829
16830 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16831
16832 u32 u_buf_len = o_len_pos - u_buf_pos;
16833
16834 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16835
16836 o_len_pos++;
16837
16838 char *o_buf_pos = strchr (o_len_pos, '*');
16839
16840 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16841
16842 u32 o_len_len = o_buf_pos - o_len_pos;
16843
16844 o_buf_pos++;
16845
16846 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;
16847
16848 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16849
16850 // validate data
16851
16852 const int V = atoi (V_pos);
16853 const int R = atoi (R_pos);
16854 const int P = atoi (P_pos);
16855
16856 int vr_ok = 0;
16857
16858 if ((V == 2) && (R == 3)) vr_ok = 1;
16859 if ((V == 4) && (R == 4)) vr_ok = 1;
16860
16861 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16862
16863 const int id_len = atoi (id_len_pos);
16864 const int u_len = atoi (u_len_pos);
16865 const int o_len = atoi (o_len_pos);
16866
16867 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16868
16869 if (u_len != 32) return (PARSER_SALT_VALUE);
16870 if (o_len != 32) return (PARSER_SALT_VALUE);
16871
16872 const int bits = atoi (bits_pos);
16873
16874 if (bits != 128) return (PARSER_SALT_VALUE);
16875
16876 int enc_md = 1;
16877
16878 if (R >= 4)
16879 {
16880 enc_md = atoi (enc_md_pos);
16881 }
16882
16883 // copy data to esalt
16884
16885 pdf->V = V;
16886 pdf->R = R;
16887 pdf->P = P;
16888
16889 pdf->enc_md = enc_md;
16890
16891 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16892 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16893 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16894 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16895
16896 if (id_len == 32)
16897 {
16898 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16899 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16900 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16901 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16902 }
16903
16904 pdf->id_len = id_len;
16905
16906 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16907 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16908 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16909 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16910 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16911 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16912 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16913 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16914 pdf->u_len = u_len;
16915
16916 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16917 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16918 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16919 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16920 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16921 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16922 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16923 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16924 pdf->o_len = o_len;
16925
16926 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16927 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16928 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16929 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16930
16931 if (id_len == 32)
16932 {
16933 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16934 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16935 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16936 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16937 }
16938
16939 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16940 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16941 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16942 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16943 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16944 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16945 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16946 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16947
16948 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16949 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16950 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16951 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16952 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16953 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16954 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16955 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16956
16957 // precompute rc4 data for later use
16958
16959 uint padding[8] =
16960 {
16961 0x5e4ebf28,
16962 0x418a754e,
16963 0x564e0064,
16964 0x0801faff,
16965 0xb6002e2e,
16966 0x803e68d0,
16967 0xfea90c2f,
16968 0x7a695364
16969 };
16970
16971 // md5
16972
16973 uint salt_pc_block[32] = { 0 };
16974
16975 char *salt_pc_ptr = (char *) salt_pc_block;
16976
16977 memcpy (salt_pc_ptr, padding, 32);
16978 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16979
16980 uint salt_pc_digest[4] = { 0 };
16981
16982 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16983
16984 pdf->rc4data[0] = salt_pc_digest[0];
16985 pdf->rc4data[1] = salt_pc_digest[1];
16986
16987 // we use ID for salt, maybe needs to change, we will see...
16988
16989 salt->salt_buf[0] = pdf->id_buf[0];
16990 salt->salt_buf[1] = pdf->id_buf[1];
16991 salt->salt_buf[2] = pdf->id_buf[2];
16992 salt->salt_buf[3] = pdf->id_buf[3];
16993 salt->salt_buf[4] = pdf->u_buf[0];
16994 salt->salt_buf[5] = pdf->u_buf[1];
16995 salt->salt_buf[6] = pdf->o_buf[0];
16996 salt->salt_buf[7] = pdf->o_buf[1];
16997 salt->salt_len = pdf->id_len + 16;
16998
16999 salt->salt_iter = ROUNDS_PDF14;
17000
17001 digest[0] = pdf->u_buf[0];
17002 digest[1] = pdf->u_buf[1];
17003 digest[2] = 0;
17004 digest[3] = 0;
17005
17006 return (PARSER_OK);
17007 }
17008
17009 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17010 {
17011 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17012
17013 if (ret != PARSER_OK)
17014 {
17015 return ret;
17016 }
17017
17018 u32 *digest = (u32 *) hash_buf->digest;
17019
17020 salt_t *salt = hash_buf->salt;
17021
17022 digest[0] -= SHA256M_A;
17023 digest[1] -= SHA256M_B;
17024 digest[2] -= SHA256M_C;
17025 digest[3] -= SHA256M_D;
17026 digest[4] -= SHA256M_E;
17027 digest[5] -= SHA256M_F;
17028 digest[6] -= SHA256M_G;
17029 digest[7] -= SHA256M_H;
17030
17031 salt->salt_buf[2] = 0x80;
17032
17033 return (PARSER_OK);
17034 }
17035
17036 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17037 {
17038 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17039
17040 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17041
17042 u32 *digest = (u32 *) hash_buf->digest;
17043
17044 salt_t *salt = hash_buf->salt;
17045
17046 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17047
17048 /**
17049 * parse line
17050 */
17051
17052 char *V_pos = input_buf + 5;
17053
17054 char *R_pos = strchr (V_pos, '*');
17055
17056 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17057
17058 u32 V_len = R_pos - V_pos;
17059
17060 R_pos++;
17061
17062 char *bits_pos = strchr (R_pos, '*');
17063
17064 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17065
17066 u32 R_len = bits_pos - R_pos;
17067
17068 bits_pos++;
17069
17070 char *P_pos = strchr (bits_pos, '*');
17071
17072 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17073
17074 u32 bits_len = P_pos - bits_pos;
17075
17076 P_pos++;
17077
17078 char *enc_md_pos = strchr (P_pos, '*');
17079
17080 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17081
17082 u32 P_len = enc_md_pos - P_pos;
17083
17084 enc_md_pos++;
17085
17086 char *id_len_pos = strchr (enc_md_pos, '*');
17087
17088 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17089
17090 u32 enc_md_len = id_len_pos - enc_md_pos;
17091
17092 id_len_pos++;
17093
17094 char *id_buf_pos = strchr (id_len_pos, '*');
17095
17096 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17097
17098 u32 id_len_len = id_buf_pos - id_len_pos;
17099
17100 id_buf_pos++;
17101
17102 char *u_len_pos = strchr (id_buf_pos, '*');
17103
17104 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17105
17106 u32 id_buf_len = u_len_pos - id_buf_pos;
17107
17108 u_len_pos++;
17109
17110 char *u_buf_pos = strchr (u_len_pos, '*');
17111
17112 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17113
17114 u32 u_len_len = u_buf_pos - u_len_pos;
17115
17116 u_buf_pos++;
17117
17118 char *o_len_pos = strchr (u_buf_pos, '*');
17119
17120 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17121
17122 u32 u_buf_len = o_len_pos - u_buf_pos;
17123
17124 o_len_pos++;
17125
17126 char *o_buf_pos = strchr (o_len_pos, '*');
17127
17128 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17129
17130 u32 o_len_len = o_buf_pos - o_len_pos;
17131
17132 o_buf_pos++;
17133
17134 char *last = strchr (o_buf_pos, '*');
17135
17136 if (last == NULL) last = input_buf + input_len;
17137
17138 u32 o_buf_len = last - o_buf_pos;
17139
17140 // validate data
17141
17142 const int V = atoi (V_pos);
17143 const int R = atoi (R_pos);
17144
17145 int vr_ok = 0;
17146
17147 if ((V == 5) && (R == 5)) vr_ok = 1;
17148 if ((V == 5) && (R == 6)) vr_ok = 1;
17149
17150 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17151
17152 const int bits = atoi (bits_pos);
17153
17154 if (bits != 256) return (PARSER_SALT_VALUE);
17155
17156 int enc_md = atoi (enc_md_pos);
17157
17158 if (enc_md != 1) return (PARSER_SALT_VALUE);
17159
17160 const uint id_len = atoi (id_len_pos);
17161 const uint u_len = atoi (u_len_pos);
17162 const uint o_len = atoi (o_len_pos);
17163
17164 if (V_len > 6) return (PARSER_SALT_LENGTH);
17165 if (R_len > 6) return (PARSER_SALT_LENGTH);
17166 if (P_len > 6) return (PARSER_SALT_LENGTH);
17167 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17168 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17169 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17170 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17171 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17172
17173 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17174 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17175 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17176
17177 // copy data to esalt
17178
17179 if (u_len < 40) return (PARSER_SALT_VALUE);
17180
17181 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17182 {
17183 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17184 }
17185
17186 salt->salt_buf[0] = pdf->u_buf[8];
17187 salt->salt_buf[1] = pdf->u_buf[9];
17188
17189 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17190 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17191
17192 salt->salt_len = 8;
17193 salt->salt_iter = ROUNDS_PDF17L8;
17194
17195 digest[0] = pdf->u_buf[0];
17196 digest[1] = pdf->u_buf[1];
17197 digest[2] = pdf->u_buf[2];
17198 digest[3] = pdf->u_buf[3];
17199 digest[4] = pdf->u_buf[4];
17200 digest[5] = pdf->u_buf[5];
17201 digest[6] = pdf->u_buf[6];
17202 digest[7] = pdf->u_buf[7];
17203
17204 return (PARSER_OK);
17205 }
17206
17207 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17208 {
17209 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17210
17211 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17212
17213 u32 *digest = (u32 *) hash_buf->digest;
17214
17215 salt_t *salt = hash_buf->salt;
17216
17217 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17218
17219 /**
17220 * parse line
17221 */
17222
17223 // iterations
17224
17225 char *iter_pos = input_buf + 7;
17226
17227 u32 iter = atoi (iter_pos);
17228
17229 if (iter < 1) return (PARSER_SALT_ITERATION);
17230 if (iter > 999999) return (PARSER_SALT_ITERATION);
17231
17232 // first is *raw* salt
17233
17234 char *salt_pos = strchr (iter_pos, ':');
17235
17236 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17237
17238 salt_pos++;
17239
17240 char *hash_pos = strchr (salt_pos, ':');
17241
17242 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17243
17244 u32 salt_len = hash_pos - salt_pos;
17245
17246 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17247
17248 hash_pos++;
17249
17250 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17251
17252 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17253
17254 // decode salt
17255
17256 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17257
17258 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17259
17260 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17261
17262 salt_buf_ptr[salt_len + 3] = 0x01;
17263 salt_buf_ptr[salt_len + 4] = 0x80;
17264
17265 salt->salt_len = salt_len;
17266 salt->salt_iter = iter - 1;
17267
17268 // decode hash
17269
17270 u8 tmp_buf[100] = { 0 };
17271
17272 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17273
17274 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17275
17276 memcpy (digest, tmp_buf, 16);
17277
17278 digest[0] = byte_swap_32 (digest[0]);
17279 digest[1] = byte_swap_32 (digest[1]);
17280 digest[2] = byte_swap_32 (digest[2]);
17281 digest[3] = byte_swap_32 (digest[3]);
17282
17283 // add some stuff to normal salt to make sorted happy
17284
17285 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17286 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17287 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17288 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17289 salt->salt_buf[4] = salt->salt_iter;
17290
17291 return (PARSER_OK);
17292 }
17293
17294 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17295 {
17296 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17297
17298 u32 *digest = (u32 *) hash_buf->digest;
17299
17300 salt_t *salt = hash_buf->salt;
17301
17302 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17303 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17304 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17305 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17306
17307 digest[0] = byte_swap_32 (digest[0]);
17308 digest[1] = byte_swap_32 (digest[1]);
17309 digest[2] = byte_swap_32 (digest[2]);
17310 digest[3] = byte_swap_32 (digest[3]);
17311
17312 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17313
17314 uint salt_len = input_len - 32 - 1;
17315
17316 char *salt_buf = input_buf + 32 + 1;
17317
17318 char *salt_buf_ptr = (char *) salt->salt_buf;
17319
17320 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17321
17322 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17323
17324 salt->salt_len = salt_len;
17325
17326 return (PARSER_OK);
17327 }
17328
17329 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17330 {
17331 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17332
17333 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17334
17335 u32 *digest = (u32 *) hash_buf->digest;
17336
17337 salt_t *salt = hash_buf->salt;
17338
17339 char *user_pos = input_buf + 10;
17340
17341 char *salt_pos = strchr (user_pos, '*');
17342
17343 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17344
17345 salt_pos++;
17346
17347 char *hash_pos = strchr (salt_pos, '*');
17348
17349 hash_pos++;
17350
17351 uint hash_len = input_len - (hash_pos - input_buf);
17352
17353 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17354
17355 uint user_len = salt_pos - user_pos - 1;
17356
17357 uint salt_len = hash_pos - salt_pos - 1;
17358
17359 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17360
17361 /*
17362 * store digest
17363 */
17364
17365 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17366 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17367 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17368 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17369
17370 digest[0] = byte_swap_32 (digest[0]);
17371 digest[1] = byte_swap_32 (digest[1]);
17372 digest[2] = byte_swap_32 (digest[2]);
17373 digest[3] = byte_swap_32 (digest[3]);
17374
17375 digest[0] -= MD5M_A;
17376 digest[1] -= MD5M_B;
17377 digest[2] -= MD5M_C;
17378 digest[3] -= MD5M_D;
17379
17380 /*
17381 * store salt
17382 */
17383
17384 char *salt_buf_ptr = (char *) salt->salt_buf;
17385
17386 // first 4 bytes are the "challenge"
17387
17388 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17389 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17390 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17391 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17392
17393 // append the user name
17394
17395 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17396
17397 salt->salt_len = 4 + user_len;
17398
17399 return (PARSER_OK);
17400 }
17401
17402 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17403 {
17404 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17405
17406 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17407
17408 u32 *digest = (u32 *) hash_buf->digest;
17409
17410 salt_t *salt = hash_buf->salt;
17411
17412 char *salt_pos = input_buf + 9;
17413
17414 char *hash_pos = strchr (salt_pos, '*');
17415
17416 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17417
17418 hash_pos++;
17419
17420 uint hash_len = input_len - (hash_pos - input_buf);
17421
17422 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17423
17424 uint salt_len = hash_pos - salt_pos - 1;
17425
17426 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17427
17428 /*
17429 * store digest
17430 */
17431
17432 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17433 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17434 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17435 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17436 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17437
17438 /*
17439 * store salt
17440 */
17441
17442 char *salt_buf_ptr = (char *) salt->salt_buf;
17443
17444 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17445
17446 salt->salt_len = salt_len;
17447
17448 return (PARSER_OK);
17449 }
17450
17451 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17452 {
17453 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17454
17455 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17456
17457 u32 *digest = (u32 *) hash_buf->digest;
17458
17459 salt_t *salt = hash_buf->salt;
17460
17461 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17462
17463 /**
17464 * parse line
17465 */
17466
17467 char *cry_master_len_pos = input_buf + 9;
17468
17469 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17470
17471 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17472
17473 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17474
17475 cry_master_buf_pos++;
17476
17477 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17478
17479 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17480
17481 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17482
17483 cry_salt_len_pos++;
17484
17485 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17486
17487 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17488
17489 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17490
17491 cry_salt_buf_pos++;
17492
17493 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17494
17495 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17496
17497 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17498
17499 cry_rounds_pos++;
17500
17501 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17502
17503 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17504
17505 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17506
17507 ckey_len_pos++;
17508
17509 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17510
17511 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17512
17513 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17514
17515 ckey_buf_pos++;
17516
17517 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17518
17519 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17520
17521 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17522
17523 public_key_len_pos++;
17524
17525 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17526
17527 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17528
17529 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17530
17531 public_key_buf_pos++;
17532
17533 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;
17534
17535 const uint cry_master_len = atoi (cry_master_len_pos);
17536 const uint cry_salt_len = atoi (cry_salt_len_pos);
17537 const uint ckey_len = atoi (ckey_len_pos);
17538 const uint public_key_len = atoi (public_key_len_pos);
17539
17540 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17541 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17542 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17543 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17544
17545 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17546 {
17547 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17548
17549 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17550 }
17551
17552 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17553 {
17554 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17555
17556 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17557 }
17558
17559 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17560 {
17561 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17562
17563 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17564 }
17565
17566 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17567 bitcoin_wallet->ckey_len = ckey_len / 2;
17568 bitcoin_wallet->public_key_len = public_key_len / 2;
17569
17570 /*
17571 * store digest (should be unique enought, hopefully)
17572 */
17573
17574 digest[0] = bitcoin_wallet->cry_master_buf[0];
17575 digest[1] = bitcoin_wallet->cry_master_buf[1];
17576 digest[2] = bitcoin_wallet->cry_master_buf[2];
17577 digest[3] = bitcoin_wallet->cry_master_buf[3];
17578
17579 /*
17580 * store salt
17581 */
17582
17583 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17584
17585 const uint cry_rounds = atoi (cry_rounds_pos);
17586
17587 salt->salt_iter = cry_rounds - 1;
17588
17589 char *salt_buf_ptr = (char *) salt->salt_buf;
17590
17591 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17592
17593 salt->salt_len = salt_len;
17594
17595 return (PARSER_OK);
17596 }
17597
17598 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17599 {
17600 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17601
17602 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17603
17604 u32 *digest = (u32 *) hash_buf->digest;
17605
17606 salt_t *salt = hash_buf->salt;
17607
17608 sip_t *sip = (sip_t *) hash_buf->esalt;
17609
17610 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17611
17612 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17613
17614 memcpy (temp_input_buf, input_buf, input_len);
17615
17616 // URI_server:
17617
17618 char *URI_server_pos = temp_input_buf + 6;
17619
17620 char *URI_client_pos = strchr (URI_server_pos, '*');
17621
17622 if (URI_client_pos == NULL)
17623 {
17624 myfree (temp_input_buf);
17625
17626 return (PARSER_SEPARATOR_UNMATCHED);
17627 }
17628
17629 URI_client_pos[0] = 0;
17630 URI_client_pos++;
17631
17632 uint URI_server_len = strlen (URI_server_pos);
17633
17634 if (URI_server_len > 512)
17635 {
17636 myfree (temp_input_buf);
17637
17638 return (PARSER_SALT_LENGTH);
17639 }
17640
17641 // URI_client:
17642
17643 char *user_pos = strchr (URI_client_pos, '*');
17644
17645 if (user_pos == NULL)
17646 {
17647 myfree (temp_input_buf);
17648
17649 return (PARSER_SEPARATOR_UNMATCHED);
17650 }
17651
17652 user_pos[0] = 0;
17653 user_pos++;
17654
17655 uint URI_client_len = strlen (URI_client_pos);
17656
17657 if (URI_client_len > 512)
17658 {
17659 myfree (temp_input_buf);
17660
17661 return (PARSER_SALT_LENGTH);
17662 }
17663
17664 // user:
17665
17666 char *realm_pos = strchr (user_pos, '*');
17667
17668 if (realm_pos == NULL)
17669 {
17670 myfree (temp_input_buf);
17671
17672 return (PARSER_SEPARATOR_UNMATCHED);
17673 }
17674
17675 realm_pos[0] = 0;
17676 realm_pos++;
17677
17678 uint user_len = strlen (user_pos);
17679
17680 if (user_len > 116)
17681 {
17682 myfree (temp_input_buf);
17683
17684 return (PARSER_SALT_LENGTH);
17685 }
17686
17687 // realm:
17688
17689 char *method_pos = strchr (realm_pos, '*');
17690
17691 if (method_pos == NULL)
17692 {
17693 myfree (temp_input_buf);
17694
17695 return (PARSER_SEPARATOR_UNMATCHED);
17696 }
17697
17698 method_pos[0] = 0;
17699 method_pos++;
17700
17701 uint realm_len = strlen (realm_pos);
17702
17703 if (realm_len > 116)
17704 {
17705 myfree (temp_input_buf);
17706
17707 return (PARSER_SALT_LENGTH);
17708 }
17709
17710 // method:
17711
17712 char *URI_prefix_pos = strchr (method_pos, '*');
17713
17714 if (URI_prefix_pos == NULL)
17715 {
17716 myfree (temp_input_buf);
17717
17718 return (PARSER_SEPARATOR_UNMATCHED);
17719 }
17720
17721 URI_prefix_pos[0] = 0;
17722 URI_prefix_pos++;
17723
17724 uint method_len = strlen (method_pos);
17725
17726 if (method_len > 246)
17727 {
17728 myfree (temp_input_buf);
17729
17730 return (PARSER_SALT_LENGTH);
17731 }
17732
17733 // URI_prefix:
17734
17735 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17736
17737 if (URI_resource_pos == NULL)
17738 {
17739 myfree (temp_input_buf);
17740
17741 return (PARSER_SEPARATOR_UNMATCHED);
17742 }
17743
17744 URI_resource_pos[0] = 0;
17745 URI_resource_pos++;
17746
17747 uint URI_prefix_len = strlen (URI_prefix_pos);
17748
17749 if (URI_prefix_len > 245)
17750 {
17751 myfree (temp_input_buf);
17752
17753 return (PARSER_SALT_LENGTH);
17754 }
17755
17756 // URI_resource:
17757
17758 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17759
17760 if (URI_suffix_pos == NULL)
17761 {
17762 myfree (temp_input_buf);
17763
17764 return (PARSER_SEPARATOR_UNMATCHED);
17765 }
17766
17767 URI_suffix_pos[0] = 0;
17768 URI_suffix_pos++;
17769
17770 uint URI_resource_len = strlen (URI_resource_pos);
17771
17772 if (URI_resource_len < 1 || URI_resource_len > 246)
17773 {
17774 myfree (temp_input_buf);
17775
17776 return (PARSER_SALT_LENGTH);
17777 }
17778
17779 // URI_suffix:
17780
17781 char *nonce_pos = strchr (URI_suffix_pos, '*');
17782
17783 if (nonce_pos == NULL)
17784 {
17785 myfree (temp_input_buf);
17786
17787 return (PARSER_SEPARATOR_UNMATCHED);
17788 }
17789
17790 nonce_pos[0] = 0;
17791 nonce_pos++;
17792
17793 uint URI_suffix_len = strlen (URI_suffix_pos);
17794
17795 if (URI_suffix_len > 245)
17796 {
17797 myfree (temp_input_buf);
17798
17799 return (PARSER_SALT_LENGTH);
17800 }
17801
17802 // nonce:
17803
17804 char *nonce_client_pos = strchr (nonce_pos, '*');
17805
17806 if (nonce_client_pos == NULL)
17807 {
17808 myfree (temp_input_buf);
17809
17810 return (PARSER_SEPARATOR_UNMATCHED);
17811 }
17812
17813 nonce_client_pos[0] = 0;
17814 nonce_client_pos++;
17815
17816 uint nonce_len = strlen (nonce_pos);
17817
17818 if (nonce_len < 1 || nonce_len > 50)
17819 {
17820 myfree (temp_input_buf);
17821
17822 return (PARSER_SALT_LENGTH);
17823 }
17824
17825 // nonce_client:
17826
17827 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17828
17829 if (nonce_count_pos == NULL)
17830 {
17831 myfree (temp_input_buf);
17832
17833 return (PARSER_SEPARATOR_UNMATCHED);
17834 }
17835
17836 nonce_count_pos[0] = 0;
17837 nonce_count_pos++;
17838
17839 uint nonce_client_len = strlen (nonce_client_pos);
17840
17841 if (nonce_client_len > 50)
17842 {
17843 myfree (temp_input_buf);
17844
17845 return (PARSER_SALT_LENGTH);
17846 }
17847
17848 // nonce_count:
17849
17850 char *qop_pos = strchr (nonce_count_pos, '*');
17851
17852 if (qop_pos == NULL)
17853 {
17854 myfree (temp_input_buf);
17855
17856 return (PARSER_SEPARATOR_UNMATCHED);
17857 }
17858
17859 qop_pos[0] = 0;
17860 qop_pos++;
17861
17862 uint nonce_count_len = strlen (nonce_count_pos);
17863
17864 if (nonce_count_len > 50)
17865 {
17866 myfree (temp_input_buf);
17867
17868 return (PARSER_SALT_LENGTH);
17869 }
17870
17871 // qop:
17872
17873 char *directive_pos = strchr (qop_pos, '*');
17874
17875 if (directive_pos == NULL)
17876 {
17877 myfree (temp_input_buf);
17878
17879 return (PARSER_SEPARATOR_UNMATCHED);
17880 }
17881
17882 directive_pos[0] = 0;
17883 directive_pos++;
17884
17885 uint qop_len = strlen (qop_pos);
17886
17887 if (qop_len > 50)
17888 {
17889 myfree (temp_input_buf);
17890
17891 return (PARSER_SALT_LENGTH);
17892 }
17893
17894 // directive
17895
17896 char *digest_pos = strchr (directive_pos, '*');
17897
17898 if (digest_pos == NULL)
17899 {
17900 myfree (temp_input_buf);
17901
17902 return (PARSER_SEPARATOR_UNMATCHED);
17903 }
17904
17905 digest_pos[0] = 0;
17906 digest_pos++;
17907
17908 uint directive_len = strlen (directive_pos);
17909
17910 if (directive_len != 3)
17911 {
17912 myfree (temp_input_buf);
17913
17914 return (PARSER_SALT_LENGTH);
17915 }
17916
17917 if (memcmp (directive_pos, "MD5", 3))
17918 {
17919 log_info ("ERROR: only the MD5 directive is currently supported\n");
17920
17921 myfree (temp_input_buf);
17922
17923 return (PARSER_SIP_AUTH_DIRECTIVE);
17924 }
17925
17926 /*
17927 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17928 */
17929
17930 uint md5_len = 0;
17931
17932 uint md5_max_len = 4 * 64;
17933
17934 uint md5_remaining_len = md5_max_len;
17935
17936 uint tmp_md5_buf[64] = { 0 };
17937
17938 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17939
17940 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17941
17942 md5_len += method_len + 1;
17943 tmp_md5_ptr += method_len + 1;
17944
17945 if (URI_prefix_len > 0)
17946 {
17947 md5_remaining_len = md5_max_len - md5_len;
17948
17949 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17950
17951 md5_len += URI_prefix_len + 1;
17952 tmp_md5_ptr += URI_prefix_len + 1;
17953 }
17954
17955 md5_remaining_len = md5_max_len - md5_len;
17956
17957 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17958
17959 md5_len += URI_resource_len;
17960 tmp_md5_ptr += URI_resource_len;
17961
17962 if (URI_suffix_len > 0)
17963 {
17964 md5_remaining_len = md5_max_len - md5_len;
17965
17966 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17967
17968 md5_len += 1 + URI_suffix_len;
17969 }
17970
17971 uint tmp_digest[4] = { 0 };
17972
17973 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17974
17975 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17976 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17977 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17978 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17979
17980 /*
17981 * esalt
17982 */
17983
17984 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17985
17986 uint esalt_len = 0;
17987
17988 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17989
17990 // there are 2 possibilities for the esalt:
17991
17992 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17993 {
17994 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17995
17996 if (esalt_len > max_esalt_len)
17997 {
17998 myfree (temp_input_buf);
17999
18000 return (PARSER_SALT_LENGTH);
18001 }
18002
18003 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18004 nonce_pos,
18005 nonce_count_pos,
18006 nonce_client_pos,
18007 qop_pos,
18008 tmp_digest[0],
18009 tmp_digest[1],
18010 tmp_digest[2],
18011 tmp_digest[3]);
18012 }
18013 else
18014 {
18015 esalt_len = 1 + nonce_len + 1 + 32;
18016
18017 if (esalt_len > max_esalt_len)
18018 {
18019 myfree (temp_input_buf);
18020
18021 return (PARSER_SALT_LENGTH);
18022 }
18023
18024 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18025 nonce_pos,
18026 tmp_digest[0],
18027 tmp_digest[1],
18028 tmp_digest[2],
18029 tmp_digest[3]);
18030 }
18031
18032 // add 0x80 to esalt
18033
18034 esalt_buf_ptr[esalt_len] = 0x80;
18035
18036 sip->esalt_len = esalt_len;
18037
18038 /*
18039 * actual salt
18040 */
18041
18042 char *sip_salt_ptr = (char *) sip->salt_buf;
18043
18044 uint salt_len = user_len + 1 + realm_len + 1;
18045
18046 uint max_salt_len = 119;
18047
18048 if (salt_len > max_salt_len)
18049 {
18050 myfree (temp_input_buf);
18051
18052 return (PARSER_SALT_LENGTH);
18053 }
18054
18055 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18056
18057 sip->salt_len = salt_len;
18058
18059 /*
18060 * fake salt (for sorting)
18061 */
18062
18063 char *salt_buf_ptr = (char *) salt->salt_buf;
18064
18065 max_salt_len = 55;
18066
18067 uint fake_salt_len = salt_len;
18068
18069 if (fake_salt_len > max_salt_len)
18070 {
18071 fake_salt_len = max_salt_len;
18072 }
18073
18074 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18075
18076 salt->salt_len = fake_salt_len;
18077
18078 /*
18079 * digest
18080 */
18081
18082 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18083 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18084 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18085 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18086
18087 digest[0] = byte_swap_32 (digest[0]);
18088 digest[1] = byte_swap_32 (digest[1]);
18089 digest[2] = byte_swap_32 (digest[2]);
18090 digest[3] = byte_swap_32 (digest[3]);
18091
18092 myfree (temp_input_buf);
18093
18094 return (PARSER_OK);
18095 }
18096
18097 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18098 {
18099 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18100
18101 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18102
18103 u32 *digest = (u32 *) hash_buf->digest;
18104
18105 salt_t *salt = hash_buf->salt;
18106
18107 // digest
18108
18109 char *digest_pos = input_buf;
18110
18111 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18112 digest[1] = 0;
18113 digest[2] = 0;
18114 digest[3] = 0;
18115
18116 // salt
18117
18118 char *salt_buf = input_buf + 8 + 1;
18119
18120 uint salt_len = 8;
18121
18122 char *salt_buf_ptr = (char *) salt->salt_buf;
18123
18124 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18125
18126 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18127
18128 salt->salt_len = salt_len;
18129
18130 return (PARSER_OK);
18131 }
18132
18133 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18134 {
18135 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18136
18137 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18138
18139 u32 *digest = (u32 *) hash_buf->digest;
18140
18141 salt_t *salt = hash_buf->salt;
18142
18143 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18144
18145 /**
18146 * parse line
18147 */
18148
18149 char *p_buf_pos = input_buf + 4;
18150
18151 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18152
18153 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18154
18155 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18156
18157 NumCyclesPower_pos++;
18158
18159 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18160
18161 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18162
18163 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18164
18165 salt_len_pos++;
18166
18167 char *salt_buf_pos = strchr (salt_len_pos, '$');
18168
18169 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18170
18171 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18172
18173 salt_buf_pos++;
18174
18175 char *iv_len_pos = strchr (salt_buf_pos, '$');
18176
18177 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18178
18179 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18180
18181 iv_len_pos++;
18182
18183 char *iv_buf_pos = strchr (iv_len_pos, '$');
18184
18185 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18186
18187 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18188
18189 iv_buf_pos++;
18190
18191 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18192
18193 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18194
18195 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18196
18197 crc_buf_pos++;
18198
18199 char *data_len_pos = strchr (crc_buf_pos, '$');
18200
18201 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18202
18203 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18204
18205 data_len_pos++;
18206
18207 char *unpack_size_pos = strchr (data_len_pos, '$');
18208
18209 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18210
18211 u32 data_len_len = unpack_size_pos - data_len_pos;
18212
18213 unpack_size_pos++;
18214
18215 char *data_buf_pos = strchr (unpack_size_pos, '$');
18216
18217 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18218
18219 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18220
18221 data_buf_pos++;
18222
18223 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;
18224
18225 const uint iter = atoi (NumCyclesPower_pos);
18226 const uint crc = atoi (crc_buf_pos);
18227 const uint p_buf = atoi (p_buf_pos);
18228 const uint salt_len = atoi (salt_len_pos);
18229 const uint iv_len = atoi (iv_len_pos);
18230 const uint unpack_size = atoi (unpack_size_pos);
18231 const uint data_len = atoi (data_len_pos);
18232
18233 /**
18234 * verify some data
18235 */
18236
18237 if (p_buf != 0) return (PARSER_SALT_VALUE);
18238 if (salt_len != 0) return (PARSER_SALT_VALUE);
18239
18240 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18241
18242 if (data_len > 384) return (PARSER_SALT_VALUE);
18243
18244 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18245
18246 /**
18247 * store data
18248 */
18249
18250 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18251 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18252 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18253 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18254
18255 seven_zip->iv_len = iv_len;
18256
18257 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18258
18259 seven_zip->salt_len = 0;
18260
18261 seven_zip->crc = crc;
18262
18263 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18264 {
18265 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18266
18267 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18268 }
18269
18270 seven_zip->data_len = data_len;
18271
18272 seven_zip->unpack_size = unpack_size;
18273
18274 // real salt
18275
18276 salt->salt_buf[0] = seven_zip->data_buf[0];
18277 salt->salt_buf[1] = seven_zip->data_buf[1];
18278 salt->salt_buf[2] = seven_zip->data_buf[2];
18279 salt->salt_buf[3] = seven_zip->data_buf[3];
18280
18281 salt->salt_len = 16;
18282
18283 salt->salt_sign[0] = iter;
18284
18285 salt->salt_iter = 1 << iter;
18286
18287 /**
18288 * digest
18289 */
18290
18291 digest[0] = crc;
18292 digest[1] = 0;
18293 digest[2] = 0;
18294 digest[3] = 0;
18295
18296 return (PARSER_OK);
18297 }
18298
18299 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18300 {
18301 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18302
18303 u32 *digest = (u32 *) hash_buf->digest;
18304
18305 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18306 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18307 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18308 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18309 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18310 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18311 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18312 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18313
18314 digest[0] = byte_swap_32 (digest[0]);
18315 digest[1] = byte_swap_32 (digest[1]);
18316 digest[2] = byte_swap_32 (digest[2]);
18317 digest[3] = byte_swap_32 (digest[3]);
18318 digest[4] = byte_swap_32 (digest[4]);
18319 digest[5] = byte_swap_32 (digest[5]);
18320 digest[6] = byte_swap_32 (digest[6]);
18321 digest[7] = byte_swap_32 (digest[7]);
18322
18323 return (PARSER_OK);
18324 }
18325
18326 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18327 {
18328 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18329
18330 u32 *digest = (u32 *) hash_buf->digest;
18331
18332 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18333 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18334 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18335 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18336 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18337 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18338 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18339 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18340 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18341 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18342 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18343 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18344 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18345 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18346 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18347 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18348
18349 digest[ 0] = byte_swap_32 (digest[ 0]);
18350 digest[ 1] = byte_swap_32 (digest[ 1]);
18351 digest[ 2] = byte_swap_32 (digest[ 2]);
18352 digest[ 3] = byte_swap_32 (digest[ 3]);
18353 digest[ 4] = byte_swap_32 (digest[ 4]);
18354 digest[ 5] = byte_swap_32 (digest[ 5]);
18355 digest[ 6] = byte_swap_32 (digest[ 6]);
18356 digest[ 7] = byte_swap_32 (digest[ 7]);
18357 digest[ 8] = byte_swap_32 (digest[ 8]);
18358 digest[ 9] = byte_swap_32 (digest[ 9]);
18359 digest[10] = byte_swap_32 (digest[10]);
18360 digest[11] = byte_swap_32 (digest[11]);
18361 digest[12] = byte_swap_32 (digest[12]);
18362 digest[13] = byte_swap_32 (digest[13]);
18363 digest[14] = byte_swap_32 (digest[14]);
18364 digest[15] = byte_swap_32 (digest[15]);
18365
18366 return (PARSER_OK);
18367 }
18368
18369 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18370 {
18371 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18372
18373 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18374
18375 u32 *digest = (u32 *) hash_buf->digest;
18376
18377 salt_t *salt = hash_buf->salt;
18378
18379 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18380
18381 /**
18382 * parse line
18383 */
18384
18385 // iterations
18386
18387 char *iter_pos = input_buf + 4;
18388
18389 u32 iter = atoi (iter_pos);
18390
18391 if (iter < 1) return (PARSER_SALT_ITERATION);
18392 if (iter > 999999) return (PARSER_SALT_ITERATION);
18393
18394 // first is *raw* salt
18395
18396 char *salt_pos = strchr (iter_pos, ':');
18397
18398 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18399
18400 salt_pos++;
18401
18402 char *hash_pos = strchr (salt_pos, ':');
18403
18404 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18405
18406 u32 salt_len = hash_pos - salt_pos;
18407
18408 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18409
18410 hash_pos++;
18411
18412 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18413
18414 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18415
18416 // decode salt
18417
18418 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18419
18420 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18421
18422 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18423
18424 salt_buf_ptr[salt_len + 3] = 0x01;
18425 salt_buf_ptr[salt_len + 4] = 0x80;
18426
18427 salt->salt_len = salt_len;
18428 salt->salt_iter = iter - 1;
18429
18430 // decode hash
18431
18432 u8 tmp_buf[100] = { 0 };
18433
18434 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18435
18436 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18437
18438 memcpy (digest, tmp_buf, 16);
18439
18440 // add some stuff to normal salt to make sorted happy
18441
18442 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18443 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18444 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18445 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18446 salt->salt_buf[4] = salt->salt_iter;
18447
18448 return (PARSER_OK);
18449 }
18450
18451 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18452 {
18453 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18454
18455 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18456
18457 u32 *digest = (u32 *) hash_buf->digest;
18458
18459 salt_t *salt = hash_buf->salt;
18460
18461 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18462
18463 /**
18464 * parse line
18465 */
18466
18467 // iterations
18468
18469 char *iter_pos = input_buf + 5;
18470
18471 u32 iter = atoi (iter_pos);
18472
18473 if (iter < 1) return (PARSER_SALT_ITERATION);
18474 if (iter > 999999) return (PARSER_SALT_ITERATION);
18475
18476 // first is *raw* salt
18477
18478 char *salt_pos = strchr (iter_pos, ':');
18479
18480 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18481
18482 salt_pos++;
18483
18484 char *hash_pos = strchr (salt_pos, ':');
18485
18486 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18487
18488 u32 salt_len = hash_pos - salt_pos;
18489
18490 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18491
18492 hash_pos++;
18493
18494 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18495
18496 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18497
18498 // decode salt
18499
18500 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18501
18502 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18503
18504 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18505
18506 salt_buf_ptr[salt_len + 3] = 0x01;
18507 salt_buf_ptr[salt_len + 4] = 0x80;
18508
18509 salt->salt_len = salt_len;
18510 salt->salt_iter = iter - 1;
18511
18512 // decode hash
18513
18514 u8 tmp_buf[100] = { 0 };
18515
18516 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18517
18518 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18519
18520 memcpy (digest, tmp_buf, 16);
18521
18522 digest[0] = byte_swap_32 (digest[0]);
18523 digest[1] = byte_swap_32 (digest[1]);
18524 digest[2] = byte_swap_32 (digest[2]);
18525 digest[3] = byte_swap_32 (digest[3]);
18526
18527 // add some stuff to normal salt to make sorted happy
18528
18529 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18530 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18531 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18532 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18533 salt->salt_buf[4] = salt->salt_iter;
18534
18535 return (PARSER_OK);
18536 }
18537
18538 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18539 {
18540 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18541
18542 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18543
18544 u64 *digest = (u64 *) hash_buf->digest;
18545
18546 salt_t *salt = hash_buf->salt;
18547
18548 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18549
18550 /**
18551 * parse line
18552 */
18553
18554 // iterations
18555
18556 char *iter_pos = input_buf + 7;
18557
18558 u32 iter = atoi (iter_pos);
18559
18560 if (iter < 1) return (PARSER_SALT_ITERATION);
18561 if (iter > 999999) return (PARSER_SALT_ITERATION);
18562
18563 // first is *raw* salt
18564
18565 char *salt_pos = strchr (iter_pos, ':');
18566
18567 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18568
18569 salt_pos++;
18570
18571 char *hash_pos = strchr (salt_pos, ':');
18572
18573 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18574
18575 u32 salt_len = hash_pos - salt_pos;
18576
18577 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18578
18579 hash_pos++;
18580
18581 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18582
18583 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18584
18585 // decode salt
18586
18587 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18588
18589 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18590
18591 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18592
18593 salt_buf_ptr[salt_len + 3] = 0x01;
18594 salt_buf_ptr[salt_len + 4] = 0x80;
18595
18596 salt->salt_len = salt_len;
18597 salt->salt_iter = iter - 1;
18598
18599 // decode hash
18600
18601 u8 tmp_buf[100] = { 0 };
18602
18603 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18604
18605 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18606
18607 memcpy (digest, tmp_buf, 64);
18608
18609 digest[0] = byte_swap_64 (digest[0]);
18610 digest[1] = byte_swap_64 (digest[1]);
18611 digest[2] = byte_swap_64 (digest[2]);
18612 digest[3] = byte_swap_64 (digest[3]);
18613 digest[4] = byte_swap_64 (digest[4]);
18614 digest[5] = byte_swap_64 (digest[5]);
18615 digest[6] = byte_swap_64 (digest[6]);
18616 digest[7] = byte_swap_64 (digest[7]);
18617
18618 // add some stuff to normal salt to make sorted happy
18619
18620 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18621 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18622 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18623 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18624 salt->salt_buf[4] = salt->salt_iter;
18625
18626 return (PARSER_OK);
18627 }
18628
18629 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18630 {
18631 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18632
18633 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18634
18635 uint *digest = (uint *) hash_buf->digest;
18636
18637 salt_t *salt = hash_buf->salt;
18638
18639 /**
18640 * parse line
18641 */
18642
18643 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18644
18645 char *hash_pos = strchr (salt_pos, '$');
18646
18647 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18648
18649 u32 salt_len = hash_pos - salt_pos;
18650
18651 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18652
18653 hash_pos++;
18654
18655 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18656
18657 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18658
18659 // decode hash
18660
18661 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18662 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18663 digest[ 2] = 0;
18664 digest[ 3] = 0;
18665 digest[ 4] = 0;
18666 digest[ 5] = 0;
18667 digest[ 6] = 0;
18668 digest[ 7] = 0;
18669 digest[ 8] = 0;
18670 digest[ 9] = 0;
18671 digest[10] = 0;
18672 digest[11] = 0;
18673 digest[12] = 0;
18674 digest[13] = 0;
18675 digest[14] = 0;
18676 digest[15] = 0;
18677
18678 // decode salt
18679
18680 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18681 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18682
18683 salt->salt_iter = ROUNDS_ECRYPTFS;
18684 salt->salt_len = 8;
18685
18686 return (PARSER_OK);
18687 }
18688
18689 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18690 {
18691 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18692
18693 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18694
18695 unsigned char c19 = itoa64_to_int (input_buf[19]);
18696
18697 if (c19 & 3) return (PARSER_HASH_VALUE);
18698
18699 salt_t *salt = hash_buf->salt;
18700
18701 u32 *digest = (u32 *) hash_buf->digest;
18702
18703 // iteration count
18704
18705 salt->salt_iter = itoa64_to_int (input_buf[1])
18706 | itoa64_to_int (input_buf[2]) << 6
18707 | itoa64_to_int (input_buf[3]) << 12
18708 | itoa64_to_int (input_buf[4]) << 18;
18709
18710 // set salt
18711
18712 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18713 | itoa64_to_int (input_buf[6]) << 6
18714 | itoa64_to_int (input_buf[7]) << 12
18715 | itoa64_to_int (input_buf[8]) << 18;
18716
18717 salt->salt_len = 4;
18718
18719 u8 tmp_buf[100] = { 0 };
18720
18721 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18722
18723 memcpy (digest, tmp_buf, 8);
18724
18725 uint tt;
18726
18727 IP (digest[0], digest[1], tt);
18728
18729 digest[0] = rotr32 (digest[0], 31);
18730 digest[1] = rotr32 (digest[1], 31);
18731 digest[2] = 0;
18732 digest[3] = 0;
18733
18734 return (PARSER_OK);
18735 }
18736
18737 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18738 {
18739 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18740
18741 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18742
18743 u32 *digest = (u32 *) hash_buf->digest;
18744
18745 salt_t *salt = hash_buf->salt;
18746
18747 /**
18748 * parse line
18749 */
18750
18751 char *type_pos = input_buf + 6 + 1;
18752
18753 char *salt_pos = strchr (type_pos, '*');
18754
18755 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18756
18757 u32 type_len = salt_pos - type_pos;
18758
18759 if (type_len != 1) return (PARSER_SALT_LENGTH);
18760
18761 salt_pos++;
18762
18763 char *crypted_pos = strchr (salt_pos, '*');
18764
18765 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18766
18767 u32 salt_len = crypted_pos - salt_pos;
18768
18769 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18770
18771 crypted_pos++;
18772
18773 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18774
18775 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18776
18777 /**
18778 * copy data
18779 */
18780
18781 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18782 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18783
18784 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18785 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18786
18787 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18788 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18789 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18790 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18791
18792 salt->salt_len = 24;
18793 salt->salt_iter = ROUNDS_RAR3;
18794
18795 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18796 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18797
18798 digest[0] = 0xc43d7b00;
18799 digest[1] = 0x40070000;
18800 digest[2] = 0;
18801 digest[3] = 0;
18802
18803 return (PARSER_OK);
18804 }
18805
18806 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18807 {
18808 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18809
18810 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18811
18812 u32 *digest = (u32 *) hash_buf->digest;
18813
18814 salt_t *salt = hash_buf->salt;
18815
18816 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18817
18818 /**
18819 * parse line
18820 */
18821
18822 char *param0_pos = input_buf + 1 + 4 + 1;
18823
18824 char *param1_pos = strchr (param0_pos, '$');
18825
18826 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18827
18828 u32 param0_len = param1_pos - param0_pos;
18829
18830 param1_pos++;
18831
18832 char *param2_pos = strchr (param1_pos, '$');
18833
18834 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18835
18836 u32 param1_len = param2_pos - param1_pos;
18837
18838 param2_pos++;
18839
18840 char *param3_pos = strchr (param2_pos, '$');
18841
18842 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18843
18844 u32 param2_len = param3_pos - param2_pos;
18845
18846 param3_pos++;
18847
18848 char *param4_pos = strchr (param3_pos, '$');
18849
18850 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18851
18852 u32 param3_len = param4_pos - param3_pos;
18853
18854 param4_pos++;
18855
18856 char *param5_pos = strchr (param4_pos, '$');
18857
18858 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18859
18860 u32 param4_len = param5_pos - param4_pos;
18861
18862 param5_pos++;
18863
18864 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18865
18866 char *salt_buf = param1_pos;
18867 char *iv = param3_pos;
18868 char *pswcheck = param5_pos;
18869
18870 const uint salt_len = atoi (param0_pos);
18871 const uint iterations = atoi (param2_pos);
18872 const uint pswcheck_len = atoi (param4_pos);
18873
18874 /**
18875 * verify some data
18876 */
18877
18878 if (param1_len != 32) return (PARSER_SALT_VALUE);
18879 if (param3_len != 32) return (PARSER_SALT_VALUE);
18880 if (param5_len != 16) return (PARSER_SALT_VALUE);
18881
18882 if (salt_len != 16) return (PARSER_SALT_VALUE);
18883 if (iterations == 0) return (PARSER_SALT_VALUE);
18884 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18885
18886 /**
18887 * store data
18888 */
18889
18890 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18891 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18892 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18893 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18894
18895 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18896 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18897 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18898 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18899
18900 salt->salt_len = 16;
18901
18902 salt->salt_sign[0] = iterations;
18903
18904 salt->salt_iter = ((1 << iterations) + 32) - 1;
18905
18906 /**
18907 * digest buf
18908 */
18909
18910 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18911 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18912 digest[2] = 0;
18913 digest[3] = 0;
18914
18915 return (PARSER_OK);
18916 }
18917
18918 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18919 {
18920 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18921
18922 u32 *digest = (u32 *) hash_buf->digest;
18923
18924 salt_t *salt = hash_buf->salt;
18925
18926 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18927 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18928 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18929 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18930 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18931 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18932 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18933 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18934
18935 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18936
18937 uint salt_len = input_len - 64 - 1;
18938
18939 char *salt_buf = input_buf + 64 + 1;
18940
18941 char *salt_buf_ptr = (char *) salt->salt_buf;
18942
18943 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18944
18945 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18946
18947 salt->salt_len = salt_len;
18948
18949 /**
18950 * we can precompute the first sha256 transform
18951 */
18952
18953 uint w[16] = { 0 };
18954
18955 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18956 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18957 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18958 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18959 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18960 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18961 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18962 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18963 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18964 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18965 w[10] = byte_swap_32 (salt->salt_buf[10]);
18966 w[11] = byte_swap_32 (salt->salt_buf[11]);
18967 w[12] = byte_swap_32 (salt->salt_buf[12]);
18968 w[13] = byte_swap_32 (salt->salt_buf[13]);
18969 w[14] = byte_swap_32 (salt->salt_buf[14]);
18970 w[15] = byte_swap_32 (salt->salt_buf[15]);
18971
18972 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
18973
18974 sha256_64 (w, pc256);
18975
18976 salt->salt_buf_pc[0] = pc256[0];
18977 salt->salt_buf_pc[1] = pc256[1];
18978 salt->salt_buf_pc[2] = pc256[2];
18979 salt->salt_buf_pc[3] = pc256[3];
18980 salt->salt_buf_pc[4] = pc256[4];
18981 salt->salt_buf_pc[5] = pc256[5];
18982 salt->salt_buf_pc[6] = pc256[6];
18983 salt->salt_buf_pc[7] = pc256[7];
18984
18985 digest[0] -= pc256[0];
18986 digest[1] -= pc256[1];
18987 digest[2] -= pc256[2];
18988 digest[3] -= pc256[3];
18989 digest[4] -= pc256[4];
18990 digest[5] -= pc256[5];
18991 digest[6] -= pc256[6];
18992 digest[7] -= pc256[7];
18993
18994 return (PARSER_OK);
18995 }
18996
18997 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18998 {
18999 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
19000
19001 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
19002
19003 u32 *digest = (u32 *) hash_buf->digest;
19004
19005 salt_t *salt = hash_buf->salt;
19006
19007 /**
19008 * parse line
19009 */
19010
19011 char *data_len_pos = input_buf + 1 + 10 + 1;
19012
19013 char *data_buf_pos = strchr (data_len_pos, '$');
19014
19015 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19016
19017 u32 data_len_len = data_buf_pos - data_len_pos;
19018
19019 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
19020 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
19021
19022 data_buf_pos++;
19023
19024 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
19025
19026 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
19027
19028 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
19029
19030 u32 data_len = atoi (data_len_pos);
19031
19032 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
19033
19034 /**
19035 * salt
19036 */
19037
19038 char *salt_pos = data_buf_pos;
19039
19040 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
19041 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
19042 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
19043 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
19044
19045 // this is actually the CT, which is also the hash later (if matched)
19046
19047 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
19048 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
19049 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
19050 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
19051
19052 salt->salt_len = 32; // note we need to fix this to 16 in kernel
19053
19054 salt->salt_iter = 10 - 1;
19055
19056 /**
19057 * digest buf
19058 */
19059
19060 digest[0] = salt->salt_buf[4];
19061 digest[1] = salt->salt_buf[5];
19062 digest[2] = salt->salt_buf[6];
19063 digest[3] = salt->salt_buf[7];
19064
19065 return (PARSER_OK);
19066 }
19067
19068 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19069 {
19070 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
19071
19072 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19073
19074 u32 *digest = (u32 *) hash_buf->digest;
19075
19076 salt_t *salt = hash_buf->salt;
19077
19078 /**
19079 * parse line
19080 */
19081
19082 char *salt_pos = input_buf + 11 + 1;
19083
19084 char *iter_pos = strchr (salt_pos, ',');
19085
19086 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19087
19088 u32 salt_len = iter_pos - salt_pos;
19089
19090 if (salt_len != 20) return (PARSER_SALT_LENGTH);
19091
19092 iter_pos++;
19093
19094 char *hash_pos = strchr (iter_pos, ',');
19095
19096 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19097
19098 u32 iter_len = hash_pos - iter_pos;
19099
19100 if (iter_len > 5) return (PARSER_SALT_LENGTH);
19101
19102 hash_pos++;
19103
19104 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
19105
19106 if (hash_len != 64) return (PARSER_HASH_LENGTH);
19107
19108 /**
19109 * salt
19110 */
19111
19112 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
19113 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
19114 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
19115 salt->salt_buf[3] = 0x00018000;
19116
19117 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19118 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19119 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
19120 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
19121
19122 salt->salt_len = salt_len / 2;
19123
19124 salt->salt_iter = atoi (iter_pos) - 1;
19125
19126 /**
19127 * digest buf
19128 */
19129
19130 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19131 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19132 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19133 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19134 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19135 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19136 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19137 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19138
19139 return (PARSER_OK);
19140 }
19141
19142 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19143 {
19144 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
19145
19146 u32 *digest = (u32 *) hash_buf->digest;
19147
19148 salt_t *salt = hash_buf->salt;
19149
19150 /**
19151 * parse line
19152 */
19153
19154 char *hash_pos = input_buf + 64;
19155 char *salt1_pos = input_buf + 128;
19156 char *salt2_pos = input_buf;
19157
19158 /**
19159 * salt
19160 */
19161
19162 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
19163 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
19164 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
19165 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
19166
19167 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
19168 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
19169 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
19170 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
19171
19172 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
19173 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
19174 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
19175 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
19176
19177 salt->salt_len = 48;
19178
19179 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
19180
19181 /**
19182 * digest buf
19183 */
19184
19185 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19186 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19187 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19188 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19189 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19190 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19191 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19192 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19193
19194 return (PARSER_OK);
19195 }
19196
19197 /**
19198 * parallel running threads
19199 */
19200
19201 #ifdef WIN
19202
19203 BOOL WINAPI sigHandler_default (DWORD sig)
19204 {
19205 switch (sig)
19206 {
19207 case CTRL_CLOSE_EVENT:
19208
19209 /*
19210 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
19211 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
19212 * function otherwise it is too late (e.g. after returning from this function)
19213 */
19214
19215 myabort ();
19216
19217 SetConsoleCtrlHandler (NULL, TRUE);
19218
19219 hc_sleep (10);
19220
19221 return TRUE;
19222
19223 case CTRL_C_EVENT:
19224 case CTRL_LOGOFF_EVENT:
19225 case CTRL_SHUTDOWN_EVENT:
19226
19227 myabort ();
19228
19229 SetConsoleCtrlHandler (NULL, TRUE);
19230
19231 return TRUE;
19232 }
19233
19234 return FALSE;
19235 }
19236
19237 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19238 {
19239 switch (sig)
19240 {
19241 case CTRL_CLOSE_EVENT:
19242
19243 myabort ();
19244
19245 SetConsoleCtrlHandler (NULL, TRUE);
19246
19247 hc_sleep (10);
19248
19249 return TRUE;
19250
19251 case CTRL_C_EVENT:
19252 case CTRL_LOGOFF_EVENT:
19253 case CTRL_SHUTDOWN_EVENT:
19254
19255 myquit ();
19256
19257 SetConsoleCtrlHandler (NULL, TRUE);
19258
19259 return TRUE;
19260 }
19261
19262 return FALSE;
19263 }
19264
19265 void hc_signal (BOOL WINAPI (callback) (DWORD))
19266 {
19267 if (callback == NULL)
19268 {
19269 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19270 }
19271 else
19272 {
19273 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19274 }
19275 }
19276
19277 #else
19278
19279 void sigHandler_default (int sig)
19280 {
19281 myabort ();
19282
19283 signal (sig, NULL);
19284 }
19285
19286 void sigHandler_benchmark (int sig)
19287 {
19288 myquit ();
19289
19290 signal (sig, NULL);
19291 }
19292
19293 void hc_signal (void (callback) (int))
19294 {
19295 if (callback == NULL) callback = SIG_DFL;
19296
19297 signal (SIGINT, callback);
19298 signal (SIGTERM, callback);
19299 signal (SIGABRT, callback);
19300 }
19301
19302 #endif
19303
19304 void status_display ();
19305
19306 void *thread_keypress (void *p)
19307 {
19308 int benchmark = *((int *) p);
19309
19310 uint quiet = data.quiet;
19311
19312 tty_break();
19313
19314 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19315 {
19316 int ch = tty_getchar();
19317
19318 if (ch == -1) break;
19319
19320 if (ch == 0) continue;
19321
19322 #ifdef _POSIX
19323 if (ch != '\n')
19324 #endif
19325
19326 hc_thread_mutex_lock (mux_display);
19327
19328 log_info ("");
19329
19330 switch (ch)
19331 {
19332 case 's':
19333 case '\n':
19334
19335 log_info ("");
19336
19337 status_display ();
19338
19339 log_info ("");
19340
19341 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19342 if (quiet == 0) fflush (stdout);
19343
19344 break;
19345
19346 case 'b':
19347
19348 log_info ("");
19349
19350 bypass ();
19351
19352 log_info ("");
19353
19354 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19355 if (quiet == 0) fflush (stdout);
19356
19357 break;
19358
19359 case 'p':
19360
19361 log_info ("");
19362
19363 SuspendThreads ();
19364
19365 log_info ("");
19366
19367 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19368 if (quiet == 0) fflush (stdout);
19369
19370 break;
19371
19372 case 'r':
19373
19374 log_info ("");
19375
19376 ResumeThreads ();
19377
19378 log_info ("");
19379
19380 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19381 if (quiet == 0) fflush (stdout);
19382
19383 break;
19384
19385 case 'c':
19386
19387 log_info ("");
19388
19389 if (benchmark == 1) break;
19390
19391 stop_at_checkpoint ();
19392
19393 log_info ("");
19394
19395 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19396 if (quiet == 0) fflush (stdout);
19397
19398 break;
19399
19400 case 'q':
19401
19402 log_info ("");
19403
19404 if (benchmark == 1)
19405 {
19406 myquit ();
19407 }
19408 else
19409 {
19410 myabort ();
19411 }
19412
19413 break;
19414 }
19415
19416 hc_thread_mutex_unlock (mux_display);
19417 }
19418
19419 tty_fix();
19420
19421 return (p);
19422 }
19423
19424 /**
19425 * rules common
19426 */
19427
19428 bool class_num (const u8 c)
19429 {
19430 return ((c >= '0') && (c <= '9'));
19431 }
19432
19433 bool class_lower (const u8 c)
19434 {
19435 return ((c >= 'a') && (c <= 'z'));
19436 }
19437
19438 bool class_upper (const u8 c)
19439 {
19440 return ((c >= 'A') && (c <= 'Z'));
19441 }
19442
19443 bool class_alpha (const u8 c)
19444 {
19445 return (class_lower (c) || class_upper (c));
19446 }
19447
19448 int conv_ctoi (const u8 c)
19449 {
19450 if (class_num (c))
19451 {
19452 return c - '0';
19453 }
19454 else if (class_upper (c))
19455 {
19456 return c - 'A' + 10;
19457 }
19458
19459 return -1;
19460 }
19461
19462 int conv_itoc (const u8 c)
19463 {
19464 if (c < 10)
19465 {
19466 return c + '0';
19467 }
19468 else if (c < 37)
19469 {
19470 return c + 'A' - 10;
19471 }
19472
19473 return -1;
19474 }
19475
19476 /**
19477 * device rules
19478 */
19479
19480 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19481 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19482 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19483 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19484 #define MAX_KERNEL_RULES 255
19485 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19486 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19487 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19488
19489 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19490 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19491 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19492 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19493
19494 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19495 {
19496 uint rule_pos;
19497 uint rule_cnt;
19498
19499 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19500 {
19501 switch (rule_buf[rule_pos])
19502 {
19503 case ' ':
19504 rule_cnt--;
19505 break;
19506
19507 case RULE_OP_MANGLE_NOOP:
19508 SET_NAME (rule, rule_buf[rule_pos]);
19509 break;
19510
19511 case RULE_OP_MANGLE_LREST:
19512 SET_NAME (rule, rule_buf[rule_pos]);
19513 break;
19514
19515 case RULE_OP_MANGLE_UREST:
19516 SET_NAME (rule, rule_buf[rule_pos]);
19517 break;
19518
19519 case RULE_OP_MANGLE_LREST_UFIRST:
19520 SET_NAME (rule, rule_buf[rule_pos]);
19521 break;
19522
19523 case RULE_OP_MANGLE_UREST_LFIRST:
19524 SET_NAME (rule, rule_buf[rule_pos]);
19525 break;
19526
19527 case RULE_OP_MANGLE_TREST:
19528 SET_NAME (rule, rule_buf[rule_pos]);
19529 break;
19530
19531 case RULE_OP_MANGLE_TOGGLE_AT:
19532 SET_NAME (rule, rule_buf[rule_pos]);
19533 SET_P0_CONV (rule, rule_buf[rule_pos]);
19534 break;
19535
19536 case RULE_OP_MANGLE_REVERSE:
19537 SET_NAME (rule, rule_buf[rule_pos]);
19538 break;
19539
19540 case RULE_OP_MANGLE_DUPEWORD:
19541 SET_NAME (rule, rule_buf[rule_pos]);
19542 break;
19543
19544 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19545 SET_NAME (rule, rule_buf[rule_pos]);
19546 SET_P0_CONV (rule, rule_buf[rule_pos]);
19547 break;
19548
19549 case RULE_OP_MANGLE_REFLECT:
19550 SET_NAME (rule, rule_buf[rule_pos]);
19551 break;
19552
19553 case RULE_OP_MANGLE_ROTATE_LEFT:
19554 SET_NAME (rule, rule_buf[rule_pos]);
19555 break;
19556
19557 case RULE_OP_MANGLE_ROTATE_RIGHT:
19558 SET_NAME (rule, rule_buf[rule_pos]);
19559 break;
19560
19561 case RULE_OP_MANGLE_APPEND:
19562 SET_NAME (rule, rule_buf[rule_pos]);
19563 SET_P0 (rule, rule_buf[rule_pos]);
19564 break;
19565
19566 case RULE_OP_MANGLE_PREPEND:
19567 SET_NAME (rule, rule_buf[rule_pos]);
19568 SET_P0 (rule, rule_buf[rule_pos]);
19569 break;
19570
19571 case RULE_OP_MANGLE_DELETE_FIRST:
19572 SET_NAME (rule, rule_buf[rule_pos]);
19573 break;
19574
19575 case RULE_OP_MANGLE_DELETE_LAST:
19576 SET_NAME (rule, rule_buf[rule_pos]);
19577 break;
19578
19579 case RULE_OP_MANGLE_DELETE_AT:
19580 SET_NAME (rule, rule_buf[rule_pos]);
19581 SET_P0_CONV (rule, rule_buf[rule_pos]);
19582 break;
19583
19584 case RULE_OP_MANGLE_EXTRACT:
19585 SET_NAME (rule, rule_buf[rule_pos]);
19586 SET_P0_CONV (rule, rule_buf[rule_pos]);
19587 SET_P1_CONV (rule, rule_buf[rule_pos]);
19588 break;
19589
19590 case RULE_OP_MANGLE_OMIT:
19591 SET_NAME (rule, rule_buf[rule_pos]);
19592 SET_P0_CONV (rule, rule_buf[rule_pos]);
19593 SET_P1_CONV (rule, rule_buf[rule_pos]);
19594 break;
19595
19596 case RULE_OP_MANGLE_INSERT:
19597 SET_NAME (rule, rule_buf[rule_pos]);
19598 SET_P0_CONV (rule, rule_buf[rule_pos]);
19599 SET_P1 (rule, rule_buf[rule_pos]);
19600 break;
19601
19602 case RULE_OP_MANGLE_OVERSTRIKE:
19603 SET_NAME (rule, rule_buf[rule_pos]);
19604 SET_P0_CONV (rule, rule_buf[rule_pos]);
19605 SET_P1 (rule, rule_buf[rule_pos]);
19606 break;
19607
19608 case RULE_OP_MANGLE_TRUNCATE_AT:
19609 SET_NAME (rule, rule_buf[rule_pos]);
19610 SET_P0_CONV (rule, rule_buf[rule_pos]);
19611 break;
19612
19613 case RULE_OP_MANGLE_REPLACE:
19614 SET_NAME (rule, rule_buf[rule_pos]);
19615 SET_P0 (rule, rule_buf[rule_pos]);
19616 SET_P1 (rule, rule_buf[rule_pos]);
19617 break;
19618
19619 case RULE_OP_MANGLE_PURGECHAR:
19620 return (-1);
19621 break;
19622
19623 case RULE_OP_MANGLE_TOGGLECASE_REC:
19624 return (-1);
19625 break;
19626
19627 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19628 SET_NAME (rule, rule_buf[rule_pos]);
19629 SET_P0_CONV (rule, rule_buf[rule_pos]);
19630 break;
19631
19632 case RULE_OP_MANGLE_DUPECHAR_LAST:
19633 SET_NAME (rule, rule_buf[rule_pos]);
19634 SET_P0_CONV (rule, rule_buf[rule_pos]);
19635 break;
19636
19637 case RULE_OP_MANGLE_DUPECHAR_ALL:
19638 SET_NAME (rule, rule_buf[rule_pos]);
19639 break;
19640
19641 case RULE_OP_MANGLE_SWITCH_FIRST:
19642 SET_NAME (rule, rule_buf[rule_pos]);
19643 break;
19644
19645 case RULE_OP_MANGLE_SWITCH_LAST:
19646 SET_NAME (rule, rule_buf[rule_pos]);
19647 break;
19648
19649 case RULE_OP_MANGLE_SWITCH_AT:
19650 SET_NAME (rule, rule_buf[rule_pos]);
19651 SET_P0_CONV (rule, rule_buf[rule_pos]);
19652 SET_P1_CONV (rule, rule_buf[rule_pos]);
19653 break;
19654
19655 case RULE_OP_MANGLE_CHR_SHIFTL:
19656 SET_NAME (rule, rule_buf[rule_pos]);
19657 SET_P0_CONV (rule, rule_buf[rule_pos]);
19658 break;
19659
19660 case RULE_OP_MANGLE_CHR_SHIFTR:
19661 SET_NAME (rule, rule_buf[rule_pos]);
19662 SET_P0_CONV (rule, rule_buf[rule_pos]);
19663 break;
19664
19665 case RULE_OP_MANGLE_CHR_INCR:
19666 SET_NAME (rule, rule_buf[rule_pos]);
19667 SET_P0_CONV (rule, rule_buf[rule_pos]);
19668 break;
19669
19670 case RULE_OP_MANGLE_CHR_DECR:
19671 SET_NAME (rule, rule_buf[rule_pos]);
19672 SET_P0_CONV (rule, rule_buf[rule_pos]);
19673 break;
19674
19675 case RULE_OP_MANGLE_REPLACE_NP1:
19676 SET_NAME (rule, rule_buf[rule_pos]);
19677 SET_P0_CONV (rule, rule_buf[rule_pos]);
19678 break;
19679
19680 case RULE_OP_MANGLE_REPLACE_NM1:
19681 SET_NAME (rule, rule_buf[rule_pos]);
19682 SET_P0_CONV (rule, rule_buf[rule_pos]);
19683 break;
19684
19685 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19686 SET_NAME (rule, rule_buf[rule_pos]);
19687 SET_P0_CONV (rule, rule_buf[rule_pos]);
19688 break;
19689
19690 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19691 SET_NAME (rule, rule_buf[rule_pos]);
19692 SET_P0_CONV (rule, rule_buf[rule_pos]);
19693 break;
19694
19695 case RULE_OP_MANGLE_TITLE:
19696 SET_NAME (rule, rule_buf[rule_pos]);
19697 break;
19698
19699 default:
19700 return (-1);
19701 break;
19702 }
19703 }
19704
19705 if (rule_pos < rule_len) return (-1);
19706
19707 return (0);
19708 }
19709
19710 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19711 {
19712 uint rule_cnt;
19713 uint rule_pos;
19714 uint rule_len = BUFSIZ - 1; // maximum possible len
19715
19716 char rule_cmd;
19717
19718 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19719 {
19720 GET_NAME (rule);
19721
19722 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19723
19724 switch (rule_cmd)
19725 {
19726 case RULE_OP_MANGLE_NOOP:
19727 rule_buf[rule_pos] = rule_cmd;
19728 break;
19729
19730 case RULE_OP_MANGLE_LREST:
19731 rule_buf[rule_pos] = rule_cmd;
19732 break;
19733
19734 case RULE_OP_MANGLE_UREST:
19735 rule_buf[rule_pos] = rule_cmd;
19736 break;
19737
19738 case RULE_OP_MANGLE_LREST_UFIRST:
19739 rule_buf[rule_pos] = rule_cmd;
19740 break;
19741
19742 case RULE_OP_MANGLE_UREST_LFIRST:
19743 rule_buf[rule_pos] = rule_cmd;
19744 break;
19745
19746 case RULE_OP_MANGLE_TREST:
19747 rule_buf[rule_pos] = rule_cmd;
19748 break;
19749
19750 case RULE_OP_MANGLE_TOGGLE_AT:
19751 rule_buf[rule_pos] = rule_cmd;
19752 GET_P0_CONV (rule);
19753 break;
19754
19755 case RULE_OP_MANGLE_REVERSE:
19756 rule_buf[rule_pos] = rule_cmd;
19757 break;
19758
19759 case RULE_OP_MANGLE_DUPEWORD:
19760 rule_buf[rule_pos] = rule_cmd;
19761 break;
19762
19763 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19764 rule_buf[rule_pos] = rule_cmd;
19765 GET_P0_CONV (rule);
19766 break;
19767
19768 case RULE_OP_MANGLE_REFLECT:
19769 rule_buf[rule_pos] = rule_cmd;
19770 break;
19771
19772 case RULE_OP_MANGLE_ROTATE_LEFT:
19773 rule_buf[rule_pos] = rule_cmd;
19774 break;
19775
19776 case RULE_OP_MANGLE_ROTATE_RIGHT:
19777 rule_buf[rule_pos] = rule_cmd;
19778 break;
19779
19780 case RULE_OP_MANGLE_APPEND:
19781 rule_buf[rule_pos] = rule_cmd;
19782 GET_P0 (rule);
19783 break;
19784
19785 case RULE_OP_MANGLE_PREPEND:
19786 rule_buf[rule_pos] = rule_cmd;
19787 GET_P0 (rule);
19788 break;
19789
19790 case RULE_OP_MANGLE_DELETE_FIRST:
19791 rule_buf[rule_pos] = rule_cmd;
19792 break;
19793
19794 case RULE_OP_MANGLE_DELETE_LAST:
19795 rule_buf[rule_pos] = rule_cmd;
19796 break;
19797
19798 case RULE_OP_MANGLE_DELETE_AT:
19799 rule_buf[rule_pos] = rule_cmd;
19800 GET_P0_CONV (rule);
19801 break;
19802
19803 case RULE_OP_MANGLE_EXTRACT:
19804 rule_buf[rule_pos] = rule_cmd;
19805 GET_P0_CONV (rule);
19806 GET_P1_CONV (rule);
19807 break;
19808
19809 case RULE_OP_MANGLE_OMIT:
19810 rule_buf[rule_pos] = rule_cmd;
19811 GET_P0_CONV (rule);
19812 GET_P1_CONV (rule);
19813 break;
19814
19815 case RULE_OP_MANGLE_INSERT:
19816 rule_buf[rule_pos] = rule_cmd;
19817 GET_P0_CONV (rule);
19818 GET_P1 (rule);
19819 break;
19820
19821 case RULE_OP_MANGLE_OVERSTRIKE:
19822 rule_buf[rule_pos] = rule_cmd;
19823 GET_P0_CONV (rule);
19824 GET_P1 (rule);
19825 break;
19826
19827 case RULE_OP_MANGLE_TRUNCATE_AT:
19828 rule_buf[rule_pos] = rule_cmd;
19829 GET_P0_CONV (rule);
19830 break;
19831
19832 case RULE_OP_MANGLE_REPLACE:
19833 rule_buf[rule_pos] = rule_cmd;
19834 GET_P0 (rule);
19835 GET_P1 (rule);
19836 break;
19837
19838 case RULE_OP_MANGLE_PURGECHAR:
19839 return (-1);
19840 break;
19841
19842 case RULE_OP_MANGLE_TOGGLECASE_REC:
19843 return (-1);
19844 break;
19845
19846 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19847 rule_buf[rule_pos] = rule_cmd;
19848 GET_P0_CONV (rule);
19849 break;
19850
19851 case RULE_OP_MANGLE_DUPECHAR_LAST:
19852 rule_buf[rule_pos] = rule_cmd;
19853 GET_P0_CONV (rule);
19854 break;
19855
19856 case RULE_OP_MANGLE_DUPECHAR_ALL:
19857 rule_buf[rule_pos] = rule_cmd;
19858 break;
19859
19860 case RULE_OP_MANGLE_SWITCH_FIRST:
19861 rule_buf[rule_pos] = rule_cmd;
19862 break;
19863
19864 case RULE_OP_MANGLE_SWITCH_LAST:
19865 rule_buf[rule_pos] = rule_cmd;
19866 break;
19867
19868 case RULE_OP_MANGLE_SWITCH_AT:
19869 rule_buf[rule_pos] = rule_cmd;
19870 GET_P0_CONV (rule);
19871 GET_P1_CONV (rule);
19872 break;
19873
19874 case RULE_OP_MANGLE_CHR_SHIFTL:
19875 rule_buf[rule_pos] = rule_cmd;
19876 GET_P0_CONV (rule);
19877 break;
19878
19879 case RULE_OP_MANGLE_CHR_SHIFTR:
19880 rule_buf[rule_pos] = rule_cmd;
19881 GET_P0_CONV (rule);
19882 break;
19883
19884 case RULE_OP_MANGLE_CHR_INCR:
19885 rule_buf[rule_pos] = rule_cmd;
19886 GET_P0_CONV (rule);
19887 break;
19888
19889 case RULE_OP_MANGLE_CHR_DECR:
19890 rule_buf[rule_pos] = rule_cmd;
19891 GET_P0_CONV (rule);
19892 break;
19893
19894 case RULE_OP_MANGLE_REPLACE_NP1:
19895 rule_buf[rule_pos] = rule_cmd;
19896 GET_P0_CONV (rule);
19897 break;
19898
19899 case RULE_OP_MANGLE_REPLACE_NM1:
19900 rule_buf[rule_pos] = rule_cmd;
19901 GET_P0_CONV (rule);
19902 break;
19903
19904 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19905 rule_buf[rule_pos] = rule_cmd;
19906 GET_P0_CONV (rule);
19907 break;
19908
19909 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19910 rule_buf[rule_pos] = rule_cmd;
19911 GET_P0_CONV (rule);
19912 break;
19913
19914 case RULE_OP_MANGLE_TITLE:
19915 rule_buf[rule_pos] = rule_cmd;
19916 break;
19917
19918 case 0:
19919 return rule_pos - 1;
19920 break;
19921
19922 default:
19923 return (-1);
19924 break;
19925 }
19926 }
19927
19928 if (rule_cnt > 0)
19929 {
19930 return rule_pos;
19931 }
19932
19933 return (-1);
19934 }
19935
19936 /**
19937 * CPU rules : this is from hashcat sources, cpu based rules
19938 */
19939
19940 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19941 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19942
19943 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19944 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19945 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19946
19947 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19948 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19949 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19950
19951 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19952 {
19953 int pos;
19954
19955 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19956
19957 return (arr_len);
19958 }
19959
19960 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19961 {
19962 int pos;
19963
19964 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19965
19966 return (arr_len);
19967 }
19968
19969 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19970 {
19971 int pos;
19972
19973 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19974
19975 return (arr_len);
19976 }
19977
19978 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19979 {
19980 int l;
19981 int r;
19982
19983 for (l = 0; l < arr_len; l++)
19984 {
19985 r = arr_len - 1 - l;
19986
19987 if (l >= r) break;
19988
19989 MANGLE_SWITCH (arr, l, r);
19990 }
19991
19992 return (arr_len);
19993 }
19994
19995 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19996 {
19997 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19998
19999 memcpy (&arr[arr_len], arr, (size_t) arr_len);
20000
20001 return (arr_len * 2);
20002 }
20003
20004 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
20005 {
20006 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
20007
20008 int orig_len = arr_len;
20009
20010 int i;
20011
20012 for (i = 0; i < times; i++)
20013 {
20014 memcpy (&arr[arr_len], arr, orig_len);
20015
20016 arr_len += orig_len;
20017 }
20018
20019 return (arr_len);
20020 }
20021
20022 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
20023 {
20024 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
20025
20026 mangle_double (arr, arr_len);
20027
20028 mangle_reverse (arr + arr_len, arr_len);
20029
20030 return (arr_len * 2);
20031 }
20032
20033 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
20034 {
20035 int l;
20036 int r;
20037
20038 for (l = 0, r = arr_len - 1; r > 0; r--)
20039 {
20040 MANGLE_SWITCH (arr, l, r);
20041 }
20042
20043 return (arr_len);
20044 }
20045
20046 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
20047 {
20048 int l;
20049 int r;
20050
20051 for (l = 0, r = arr_len - 1; l < r; l++)
20052 {
20053 MANGLE_SWITCH (arr, l, r);
20054 }
20055
20056 return (arr_len);
20057 }
20058
20059 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
20060 {
20061 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20062
20063 arr[arr_len] = c;
20064
20065 return (arr_len + 1);
20066 }
20067
20068 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
20069 {
20070 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20071
20072 int arr_pos;
20073
20074 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20075 {
20076 arr[arr_pos + 1] = arr[arr_pos];
20077 }
20078
20079 arr[0] = c;
20080
20081 return (arr_len + 1);
20082 }
20083
20084 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
20085 {
20086 if (upos >= arr_len) return (arr_len);
20087
20088 int arr_pos;
20089
20090 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
20091 {
20092 arr[arr_pos] = arr[arr_pos + 1];
20093 }
20094
20095 return (arr_len - 1);
20096 }
20097
20098 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20099 {
20100 if (upos >= arr_len) return (arr_len);
20101
20102 if ((upos + ulen) > arr_len) return (arr_len);
20103
20104 int arr_pos;
20105
20106 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
20107 {
20108 arr[arr_pos] = arr[upos + arr_pos];
20109 }
20110
20111 return (ulen);
20112 }
20113
20114 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20115 {
20116 if (upos >= arr_len) return (arr_len);
20117
20118 if ((upos + ulen) >= arr_len) return (arr_len);
20119
20120 int arr_pos;
20121
20122 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
20123 {
20124 arr[arr_pos] = arr[arr_pos + ulen];
20125 }
20126
20127 return (arr_len - ulen);
20128 }
20129
20130 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20131 {
20132 if (upos >= arr_len) return (arr_len);
20133
20134 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20135
20136 int arr_pos;
20137
20138 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
20139 {
20140 arr[arr_pos + 1] = arr[arr_pos];
20141 }
20142
20143 arr[upos] = c;
20144
20145 return (arr_len + 1);
20146 }
20147
20148 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)
20149 {
20150 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20151
20152 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
20153
20154 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
20155
20156 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
20157
20158 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
20159
20160 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
20161
20162 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
20163
20164 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
20165
20166 return (arr_len + arr2_cpy);
20167 }
20168
20169 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20170 {
20171 if (upos >= arr_len) return (arr_len);
20172
20173 arr[upos] = c;
20174
20175 return (arr_len);
20176 }
20177
20178 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
20179 {
20180 if (upos >= arr_len) return (arr_len);
20181
20182 memset (arr + upos, 0, arr_len - upos);
20183
20184 return (upos);
20185 }
20186
20187 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
20188 {
20189 int arr_pos;
20190
20191 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
20192 {
20193 if (arr[arr_pos] != oldc) continue;
20194
20195 arr[arr_pos] = newc;
20196 }
20197
20198 return (arr_len);
20199 }
20200
20201 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
20202 {
20203 int arr_pos;
20204
20205 int ret_len;
20206
20207 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
20208 {
20209 if (arr[arr_pos] == c) continue;
20210
20211 arr[ret_len] = arr[arr_pos];
20212
20213 ret_len++;
20214 }
20215
20216 return (ret_len);
20217 }
20218
20219 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
20220 {
20221 if (ulen > arr_len) return (arr_len);
20222
20223 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20224
20225 char cs[100] = { 0 };
20226
20227 memcpy (cs, arr, ulen);
20228
20229 int i;
20230
20231 for (i = 0; i < ulen; i++)
20232 {
20233 char c = cs[i];
20234
20235 arr_len = mangle_insert (arr, arr_len, i, c);
20236 }
20237
20238 return (arr_len);
20239 }
20240
20241 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20242 {
20243 if (ulen > arr_len) return (arr_len);
20244
20245 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20246
20247 int upos = arr_len - ulen;
20248
20249 int i;
20250
20251 for (i = 0; i < ulen; i++)
20252 {
20253 char c = arr[upos + i];
20254
20255 arr_len = mangle_append (arr, arr_len, c);
20256 }
20257
20258 return (arr_len);
20259 }
20260
20261 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20262 {
20263 if ( arr_len == 0) return (arr_len);
20264 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20265
20266 char c = arr[upos];
20267
20268 int i;
20269
20270 for (i = 0; i < ulen; i++)
20271 {
20272 arr_len = mangle_insert (arr, arr_len, upos, c);
20273 }
20274
20275 return (arr_len);
20276 }
20277
20278 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20279 {
20280 if ( arr_len == 0) return (arr_len);
20281 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20282
20283 int arr_pos;
20284
20285 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20286 {
20287 int new_pos = arr_pos * 2;
20288
20289 arr[new_pos] = arr[arr_pos];
20290
20291 arr[new_pos + 1] = arr[arr_pos];
20292 }
20293
20294 return (arr_len * 2);
20295 }
20296
20297 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20298 {
20299 if (upos >= arr_len) return (arr_len);
20300 if (upos2 >= arr_len) return (arr_len);
20301
20302 MANGLE_SWITCH (arr, upos, upos2);
20303
20304 return (arr_len);
20305 }
20306
20307 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20308 {
20309 MANGLE_SWITCH (arr, upos, upos2);
20310
20311 return (arr_len);
20312 }
20313
20314 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20315 {
20316 if (upos >= arr_len) return (arr_len);
20317
20318 arr[upos] <<= 1;
20319
20320 return (arr_len);
20321 }
20322
20323 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20324 {
20325 if (upos >= arr_len) return (arr_len);
20326
20327 arr[upos] >>= 1;
20328
20329 return (arr_len);
20330 }
20331
20332 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20333 {
20334 if (upos >= arr_len) return (arr_len);
20335
20336 arr[upos] += 1;
20337
20338 return (arr_len);
20339 }
20340
20341 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20342 {
20343 if (upos >= arr_len) return (arr_len);
20344
20345 arr[upos] -= 1;
20346
20347 return (arr_len);
20348 }
20349
20350 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20351 {
20352 int upper_next = 1;
20353
20354 int pos;
20355
20356 for (pos = 0; pos < arr_len; pos++)
20357 {
20358 if (arr[pos] == ' ')
20359 {
20360 upper_next = 1;
20361
20362 continue;
20363 }
20364
20365 if (upper_next)
20366 {
20367 upper_next = 0;
20368
20369 MANGLE_UPPER_AT (arr, pos);
20370 }
20371 else
20372 {
20373 MANGLE_LOWER_AT (arr, pos);
20374 }
20375 }
20376
20377 return (arr_len);
20378 }
20379
20380 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20381 {
20382 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20383
20384 u32 j;
20385
20386 u32 rule_pos = 0;
20387
20388 for (j = 0; j < rp_gen_num; j++)
20389 {
20390 u32 r = 0;
20391 u32 p1 = 0;
20392 u32 p2 = 0;
20393 u32 p3 = 0;
20394
20395 switch ((char) get_random_num (0, 9))
20396 {
20397 case 0:
20398 r = get_random_num (0, sizeof (grp_op_nop));
20399 rule_buf[rule_pos++] = grp_op_nop[r];
20400 break;
20401
20402 case 1:
20403 r = get_random_num (0, sizeof (grp_op_pos_p0));
20404 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20405 p1 = get_random_num (0, sizeof (grp_pos));
20406 rule_buf[rule_pos++] = grp_pos[p1];
20407 break;
20408
20409 case 2:
20410 r = get_random_num (0, sizeof (grp_op_pos_p1));
20411 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20412 p1 = get_random_num (1, 6);
20413 rule_buf[rule_pos++] = grp_pos[p1];
20414 break;
20415
20416 case 3:
20417 r = get_random_num (0, sizeof (grp_op_chr));
20418 rule_buf[rule_pos++] = grp_op_chr[r];
20419 p1 = get_random_num (0x20, 0x7e);
20420 rule_buf[rule_pos++] = (char) p1;
20421 break;
20422
20423 case 4:
20424 r = get_random_num (0, sizeof (grp_op_chr_chr));
20425 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20426 p1 = get_random_num (0x20, 0x7e);
20427 rule_buf[rule_pos++] = (char) p1;
20428 p2 = get_random_num (0x20, 0x7e);
20429 while (p1 == p2)
20430 p2 = get_random_num (0x20, 0x7e);
20431 rule_buf[rule_pos++] = (char) p2;
20432 break;
20433
20434 case 5:
20435 r = get_random_num (0, sizeof (grp_op_pos_chr));
20436 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20437 p1 = get_random_num (0, sizeof (grp_pos));
20438 rule_buf[rule_pos++] = grp_pos[p1];
20439 p2 = get_random_num (0x20, 0x7e);
20440 rule_buf[rule_pos++] = (char) p2;
20441 break;
20442
20443 case 6:
20444 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20445 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20446 p1 = get_random_num (0, sizeof (grp_pos));
20447 rule_buf[rule_pos++] = grp_pos[p1];
20448 p2 = get_random_num (0, sizeof (grp_pos));
20449 while (p1 == p2)
20450 p2 = get_random_num (0, sizeof (grp_pos));
20451 rule_buf[rule_pos++] = grp_pos[p2];
20452 break;
20453
20454 case 7:
20455 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20456 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20457 p1 = get_random_num (0, sizeof (grp_pos));
20458 rule_buf[rule_pos++] = grp_pos[p1];
20459 p2 = get_random_num (1, sizeof (grp_pos));
20460 while (p1 == p2)
20461 p2 = get_random_num (1, sizeof (grp_pos));
20462 rule_buf[rule_pos++] = grp_pos[p2];
20463 break;
20464
20465 case 8:
20466 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20467 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20468 p1 = get_random_num (0, sizeof (grp_pos));
20469 rule_buf[rule_pos++] = grp_pos[p1];
20470 p2 = get_random_num (1, sizeof (grp_pos));
20471 rule_buf[rule_pos++] = grp_pos[p1];
20472 p3 = get_random_num (0, sizeof (grp_pos));
20473 rule_buf[rule_pos++] = grp_pos[p3];
20474 break;
20475 }
20476 }
20477
20478 return (rule_pos);
20479 }
20480
20481 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20482 {
20483 char mem[BLOCK_SIZE] = { 0 };
20484
20485 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20486
20487 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20488
20489 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20490
20491 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20492
20493 int out_len = in_len;
20494 int mem_len = in_len;
20495
20496 memcpy (out, in, out_len);
20497
20498 int rule_pos;
20499
20500 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20501 {
20502 int upos, upos2;
20503 int ulen;
20504
20505 switch (rule[rule_pos])
20506 {
20507 case ' ':
20508 break;
20509
20510 case RULE_OP_MANGLE_NOOP:
20511 break;
20512
20513 case RULE_OP_MANGLE_LREST:
20514 out_len = mangle_lrest (out, out_len);
20515 break;
20516
20517 case RULE_OP_MANGLE_UREST:
20518 out_len = mangle_urest (out, out_len);
20519 break;
20520
20521 case RULE_OP_MANGLE_LREST_UFIRST:
20522 out_len = mangle_lrest (out, out_len);
20523 if (out_len) MANGLE_UPPER_AT (out, 0);
20524 break;
20525
20526 case RULE_OP_MANGLE_UREST_LFIRST:
20527 out_len = mangle_urest (out, out_len);
20528 if (out_len) MANGLE_LOWER_AT (out, 0);
20529 break;
20530
20531 case RULE_OP_MANGLE_TREST:
20532 out_len = mangle_trest (out, out_len);
20533 break;
20534
20535 case RULE_OP_MANGLE_TOGGLE_AT:
20536 NEXT_RULEPOS (rule_pos);
20537 NEXT_RPTOI (rule, rule_pos, upos);
20538 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20539 break;
20540
20541 case RULE_OP_MANGLE_REVERSE:
20542 out_len = mangle_reverse (out, out_len);
20543 break;
20544
20545 case RULE_OP_MANGLE_DUPEWORD:
20546 out_len = mangle_double (out, out_len);
20547 break;
20548
20549 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20550 NEXT_RULEPOS (rule_pos);
20551 NEXT_RPTOI (rule, rule_pos, ulen);
20552 out_len = mangle_double_times (out, out_len, ulen);
20553 break;
20554
20555 case RULE_OP_MANGLE_REFLECT:
20556 out_len = mangle_reflect (out, out_len);
20557 break;
20558
20559 case RULE_OP_MANGLE_ROTATE_LEFT:
20560 mangle_rotate_left (out, out_len);
20561 break;
20562
20563 case RULE_OP_MANGLE_ROTATE_RIGHT:
20564 mangle_rotate_right (out, out_len);
20565 break;
20566
20567 case RULE_OP_MANGLE_APPEND:
20568 NEXT_RULEPOS (rule_pos);
20569 out_len = mangle_append (out, out_len, rule[rule_pos]);
20570 break;
20571
20572 case RULE_OP_MANGLE_PREPEND:
20573 NEXT_RULEPOS (rule_pos);
20574 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20575 break;
20576
20577 case RULE_OP_MANGLE_DELETE_FIRST:
20578 out_len = mangle_delete_at (out, out_len, 0);
20579 break;
20580
20581 case RULE_OP_MANGLE_DELETE_LAST:
20582 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20583 break;
20584
20585 case RULE_OP_MANGLE_DELETE_AT:
20586 NEXT_RULEPOS (rule_pos);
20587 NEXT_RPTOI (rule, rule_pos, upos);
20588 out_len = mangle_delete_at (out, out_len, upos);
20589 break;
20590
20591 case RULE_OP_MANGLE_EXTRACT:
20592 NEXT_RULEPOS (rule_pos);
20593 NEXT_RPTOI (rule, rule_pos, upos);
20594 NEXT_RULEPOS (rule_pos);
20595 NEXT_RPTOI (rule, rule_pos, ulen);
20596 out_len = mangle_extract (out, out_len, upos, ulen);
20597 break;
20598
20599 case RULE_OP_MANGLE_OMIT:
20600 NEXT_RULEPOS (rule_pos);
20601 NEXT_RPTOI (rule, rule_pos, upos);
20602 NEXT_RULEPOS (rule_pos);
20603 NEXT_RPTOI (rule, rule_pos, ulen);
20604 out_len = mangle_omit (out, out_len, upos, ulen);
20605 break;
20606
20607 case RULE_OP_MANGLE_INSERT:
20608 NEXT_RULEPOS (rule_pos);
20609 NEXT_RPTOI (rule, rule_pos, upos);
20610 NEXT_RULEPOS (rule_pos);
20611 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20612 break;
20613
20614 case RULE_OP_MANGLE_OVERSTRIKE:
20615 NEXT_RULEPOS (rule_pos);
20616 NEXT_RPTOI (rule, rule_pos, upos);
20617 NEXT_RULEPOS (rule_pos);
20618 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20619 break;
20620
20621 case RULE_OP_MANGLE_TRUNCATE_AT:
20622 NEXT_RULEPOS (rule_pos);
20623 NEXT_RPTOI (rule, rule_pos, upos);
20624 out_len = mangle_truncate_at (out, out_len, upos);
20625 break;
20626
20627 case RULE_OP_MANGLE_REPLACE:
20628 NEXT_RULEPOS (rule_pos);
20629 NEXT_RULEPOS (rule_pos);
20630 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20631 break;
20632
20633 case RULE_OP_MANGLE_PURGECHAR:
20634 NEXT_RULEPOS (rule_pos);
20635 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20636 break;
20637
20638 case RULE_OP_MANGLE_TOGGLECASE_REC:
20639 /* todo */
20640 break;
20641
20642 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20643 NEXT_RULEPOS (rule_pos);
20644 NEXT_RPTOI (rule, rule_pos, ulen);
20645 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20646 break;
20647
20648 case RULE_OP_MANGLE_DUPECHAR_LAST:
20649 NEXT_RULEPOS (rule_pos);
20650 NEXT_RPTOI (rule, rule_pos, ulen);
20651 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20652 break;
20653
20654 case RULE_OP_MANGLE_DUPECHAR_ALL:
20655 out_len = mangle_dupechar (out, out_len);
20656 break;
20657
20658 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20659 NEXT_RULEPOS (rule_pos);
20660 NEXT_RPTOI (rule, rule_pos, ulen);
20661 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20662 break;
20663
20664 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20665 NEXT_RULEPOS (rule_pos);
20666 NEXT_RPTOI (rule, rule_pos, ulen);
20667 out_len = mangle_dupeblock_append (out, out_len, ulen);
20668 break;
20669
20670 case RULE_OP_MANGLE_SWITCH_FIRST:
20671 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20672 break;
20673
20674 case RULE_OP_MANGLE_SWITCH_LAST:
20675 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20676 break;
20677
20678 case RULE_OP_MANGLE_SWITCH_AT:
20679 NEXT_RULEPOS (rule_pos);
20680 NEXT_RPTOI (rule, rule_pos, upos);
20681 NEXT_RULEPOS (rule_pos);
20682 NEXT_RPTOI (rule, rule_pos, upos2);
20683 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20684 break;
20685
20686 case RULE_OP_MANGLE_CHR_SHIFTL:
20687 NEXT_RULEPOS (rule_pos);
20688 NEXT_RPTOI (rule, rule_pos, upos);
20689 mangle_chr_shiftl (out, out_len, upos);
20690 break;
20691
20692 case RULE_OP_MANGLE_CHR_SHIFTR:
20693 NEXT_RULEPOS (rule_pos);
20694 NEXT_RPTOI (rule, rule_pos, upos);
20695 mangle_chr_shiftr (out, out_len, upos);
20696 break;
20697
20698 case RULE_OP_MANGLE_CHR_INCR:
20699 NEXT_RULEPOS (rule_pos);
20700 NEXT_RPTOI (rule, rule_pos, upos);
20701 mangle_chr_incr (out, out_len, upos);
20702 break;
20703
20704 case RULE_OP_MANGLE_CHR_DECR:
20705 NEXT_RULEPOS (rule_pos);
20706 NEXT_RPTOI (rule, rule_pos, upos);
20707 mangle_chr_decr (out, out_len, upos);
20708 break;
20709
20710 case RULE_OP_MANGLE_REPLACE_NP1:
20711 NEXT_RULEPOS (rule_pos);
20712 NEXT_RPTOI (rule, rule_pos, upos);
20713 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20714 break;
20715
20716 case RULE_OP_MANGLE_REPLACE_NM1:
20717 NEXT_RULEPOS (rule_pos);
20718 NEXT_RPTOI (rule, rule_pos, upos);
20719 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20720 break;
20721
20722 case RULE_OP_MANGLE_TITLE:
20723 out_len = mangle_title (out, out_len);
20724 break;
20725
20726 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20727 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20728 NEXT_RULEPOS (rule_pos);
20729 NEXT_RPTOI (rule, rule_pos, upos);
20730 NEXT_RULEPOS (rule_pos);
20731 NEXT_RPTOI (rule, rule_pos, ulen);
20732 NEXT_RULEPOS (rule_pos);
20733 NEXT_RPTOI (rule, rule_pos, upos2);
20734 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20735 break;
20736
20737 case RULE_OP_MANGLE_APPEND_MEMORY:
20738 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20739 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20740 memcpy (out + out_len, mem, mem_len);
20741 out_len += mem_len;
20742 break;
20743
20744 case RULE_OP_MANGLE_PREPEND_MEMORY:
20745 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20746 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20747 memcpy (mem + mem_len, out, out_len);
20748 out_len += mem_len;
20749 memcpy (out, mem, out_len);
20750 break;
20751
20752 case RULE_OP_MEMORIZE_WORD:
20753 memcpy (mem, out, out_len);
20754 mem_len = out_len;
20755 break;
20756
20757 case RULE_OP_REJECT_LESS:
20758 NEXT_RULEPOS (rule_pos);
20759 NEXT_RPTOI (rule, rule_pos, upos);
20760 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20761 break;
20762
20763 case RULE_OP_REJECT_GREATER:
20764 NEXT_RULEPOS (rule_pos);
20765 NEXT_RPTOI (rule, rule_pos, upos);
20766 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20767 break;
20768
20769 case RULE_OP_REJECT_CONTAIN:
20770 NEXT_RULEPOS (rule_pos);
20771 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20772 break;
20773
20774 case RULE_OP_REJECT_NOT_CONTAIN:
20775 NEXT_RULEPOS (rule_pos);
20776 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20777 break;
20778
20779 case RULE_OP_REJECT_EQUAL_FIRST:
20780 NEXT_RULEPOS (rule_pos);
20781 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20782 break;
20783
20784 case RULE_OP_REJECT_EQUAL_LAST:
20785 NEXT_RULEPOS (rule_pos);
20786 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20787 break;
20788
20789 case RULE_OP_REJECT_EQUAL_AT:
20790 NEXT_RULEPOS (rule_pos);
20791 NEXT_RPTOI (rule, rule_pos, upos);
20792 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20793 NEXT_RULEPOS (rule_pos);
20794 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20795 break;
20796
20797 case RULE_OP_REJECT_CONTAINS:
20798 NEXT_RULEPOS (rule_pos);
20799 NEXT_RPTOI (rule, rule_pos, upos);
20800 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20801 NEXT_RULEPOS (rule_pos);
20802 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20803 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20804 break;
20805
20806 case RULE_OP_REJECT_MEMORY:
20807 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20808 break;
20809
20810 default:
20811 return (RULE_RC_SYNTAX_ERROR);
20812 break;
20813 }
20814 }
20815
20816 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20817
20818 return (out_len);
20819 }