6af7ca815d7769534ee2ea9681567101df457994
[hashcat.git] / src / shared.c
1 /**
2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
4 *
5 * License.....: MIT
6 */
7
8 #ifdef OSX
9 #include <stdio.h>
10 #endif
11
12 #include <shared.h>
13 #include <limits.h>
14
15 /**
16 * tuning tools
17 */
18
19 #define GET_ACCEL(x) KERNEL_ACCEL_ ## x
20 #define GET_LOOPS(x) KERNEL_LOOPS_ ## x
21
22 /**
23 * basic bit handling
24 */
25
26 u32 rotl32 (const u32 a, const u32 n)
27 {
28 return ((a << n) | (a >> (32 - n)));
29 }
30
31 u32 rotr32 (const u32 a, const u32 n)
32 {
33 return ((a >> n) | (a << (32 - n)));
34 }
35
36 u64 rotl64 (const u64 a, const u64 n)
37 {
38 return ((a << n) | (a >> (64 - n)));
39 }
40
41 u64 rotr64 (const u64 a, const u64 n)
42 {
43 return ((a >> n) | (a << (64 - n)));
44 }
45
46 u32 byte_swap_32 (const u32 n)
47 {
48 return (n & 0xff000000) >> 24
49 | (n & 0x00ff0000) >> 8
50 | (n & 0x0000ff00) << 8
51 | (n & 0x000000ff) << 24;
52 }
53
54 u64 byte_swap_64 (const u64 n)
55 {
56 return (n & 0xff00000000000000ULL) >> 56
57 | (n & 0x00ff000000000000ULL) >> 40
58 | (n & 0x0000ff0000000000ULL) >> 24
59 | (n & 0x000000ff00000000ULL) >> 8
60 | (n & 0x00000000ff000000ULL) << 8
61 | (n & 0x0000000000ff0000ULL) << 24
62 | (n & 0x000000000000ff00ULL) << 40
63 | (n & 0x00000000000000ffULL) << 56;
64 }
65
66 /**
67 * ciphers for use on cpu
68 */
69
70 #include "cpu-des.c"
71 #include "cpu-aes.c"
72
73 /**
74 * hashes for use on cpu
75 */
76
77 #include "cpu-md5.c"
78 #include "cpu-sha256.c"
79
80 /**
81 * logging
82 */
83
84 int last_len = 0;
85
86 void log_final (FILE *fp, const char *fmt, va_list ap)
87 {
88 if (last_len)
89 {
90 fputc ('\r', fp);
91
92 for (int i = 0; i < last_len; i++)
93 {
94 fputc (' ', fp);
95 }
96
97 fputc ('\r', fp);
98 }
99
100 char s[4096];
101
102 int max_len = (int) sizeof (s);
103
104 int len = vsnprintf (s, max_len, fmt, ap);
105
106 if (len > max_len) len = max_len;
107
108 fwrite (s, len, 1, fp);
109
110 fflush (fp);
111
112 last_len = len;
113 }
114
115 void log_out_nn (FILE *fp, const char *fmt, ...)
116 {
117 if (SUPPRESS_OUTPUT) return;
118
119 va_list ap;
120
121 va_start (ap, fmt);
122
123 log_final (fp, fmt, ap);
124
125 va_end (ap);
126 }
127
128 void log_info_nn (const char *fmt, ...)
129 {
130 if (SUPPRESS_OUTPUT) return;
131
132 va_list ap;
133
134 va_start (ap, fmt);
135
136 log_final (stdout, fmt, ap);
137
138 va_end (ap);
139 }
140
141 void log_error_nn (const char *fmt, ...)
142 {
143 if (SUPPRESS_OUTPUT) return;
144
145 va_list ap;
146
147 va_start (ap, fmt);
148
149 log_final (stderr, fmt, ap);
150
151 va_end (ap);
152 }
153
154 void log_out (FILE *fp, const char *fmt, ...)
155 {
156 if (SUPPRESS_OUTPUT) return;
157
158 va_list ap;
159
160 va_start (ap, fmt);
161
162 log_final (fp, fmt, ap);
163
164 va_end (ap);
165
166 fputc ('\n', fp);
167
168 last_len = 0;
169 }
170
171 void log_info (const char *fmt, ...)
172 {
173 if (SUPPRESS_OUTPUT) return;
174
175 va_list ap;
176
177 va_start (ap, fmt);
178
179 log_final (stdout, fmt, ap);
180
181 va_end (ap);
182
183 fputc ('\n', stdout);
184
185 last_len = 0;
186 }
187
188 void log_error (const char *fmt, ...)
189 {
190 if (SUPPRESS_OUTPUT) return;
191
192 fputc ('\n', stderr);
193 fputc ('\n', stderr);
194
195 va_list ap;
196
197 va_start (ap, fmt);
198
199 log_final (stderr, fmt, ap);
200
201 va_end (ap);
202
203 fputc ('\n', stderr);
204 fputc ('\n', stderr);
205
206 last_len = 0;
207 }
208
209 /**
210 * converter
211 */
212
213 u8 int_to_base32 (const u8 c)
214 {
215 static const u8 tbl[0x20] =
216 {
217 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
218 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
219 };
220
221 return tbl[c];
222 }
223
224 u8 base32_to_int (const u8 c)
225 {
226 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
227 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
228
229 return 0;
230 }
231
232 u8 int_to_itoa32 (const u8 c)
233 {
234 static const u8 tbl[0x20] =
235 {
236 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
237 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
238 };
239
240 return tbl[c];
241 }
242
243 u8 itoa32_to_int (const u8 c)
244 {
245 if ((c >= '0') && (c <= '9')) return c - '0';
246 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
247
248 return 0;
249 }
250
251 u8 int_to_itoa64 (const u8 c)
252 {
253 static const u8 tbl[0x40] =
254 {
255 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
256 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
257 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
258 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
259 };
260
261 return tbl[c];
262 }
263
264 u8 itoa64_to_int (const u8 c)
265 {
266 static const u8 tbl[0x100] =
267 {
268 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
269 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
270 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
271 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
272 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
273 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
274 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
275 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
276 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
277 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
278 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
279 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
280 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
281 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
282 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
283 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
284 };
285
286 return tbl[c];
287 }
288
289 u8 int_to_base64 (const u8 c)
290 {
291 static const u8 tbl[0x40] =
292 {
293 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
294 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
295 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
296 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
297 };
298
299 return tbl[c];
300 }
301
302 u8 base64_to_int (const u8 c)
303 {
304 static const u8 tbl[0x100] =
305 {
306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
309 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
311 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
313 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 };
323
324 return tbl[c];
325 }
326
327 u8 int_to_bf64 (const u8 c)
328 {
329 static const u8 tbl[0x40] =
330 {
331 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
332 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
333 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
334 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
335 };
336
337 return tbl[c];
338 }
339
340 u8 bf64_to_int (const u8 c)
341 {
342 static const u8 tbl[0x100] =
343 {
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
347 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
349 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
351 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 };
361
362 return tbl[c];
363 }
364
365 u8 int_to_lotus64 (const u8 c)
366 {
367 if (c < 10) return '0' + c;
368 else if (c < 36) return 'A' + c - 10;
369 else if (c < 62) return 'a' + c - 36;
370 else if (c == 62) return '+';
371 else if (c == 63) return '/';
372
373 return 0;
374 }
375
376 u8 lotus64_to_int (const u8 c)
377 {
378 if ((c >= '0') && (c <= '9')) return c - '0';
379 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
380 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
381 else if (c == '+') return 62;
382 else if (c == '/') return 63;
383 else
384
385 return 0;
386 }
387
388 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
389 {
390 const u8 *in_ptr = in_buf;
391
392 u8 *out_ptr = out_buf;
393
394 for (int i = 0; i < in_len; i += 8)
395 {
396 const u8 out_val0 = f (in_ptr[0] & 0x7f);
397 const u8 out_val1 = f (in_ptr[1] & 0x7f);
398 const u8 out_val2 = f (in_ptr[2] & 0x7f);
399 const u8 out_val3 = f (in_ptr[3] & 0x7f);
400 const u8 out_val4 = f (in_ptr[4] & 0x7f);
401 const u8 out_val5 = f (in_ptr[5] & 0x7f);
402 const u8 out_val6 = f (in_ptr[6] & 0x7f);
403 const u8 out_val7 = f (in_ptr[7] & 0x7f);
404
405 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
406 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
407 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
408 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
409 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
410
411 in_ptr += 8;
412 out_ptr += 5;
413 }
414
415 for (int i = 0; i < in_len; i++)
416 {
417 if (in_buf[i] != '=') continue;
418
419 in_len = i;
420 }
421
422 int out_len = (in_len * 5) / 8;
423
424 return out_len;
425 }
426
427 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
428 {
429 const u8 *in_ptr = in_buf;
430
431 u8 *out_ptr = out_buf;
432
433 for (int i = 0; i < in_len; i += 5)
434 {
435 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
436 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
437 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
438 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
439 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
440 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
441 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
442 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
443
444 out_ptr[0] = out_val0 & 0x7f;
445 out_ptr[1] = out_val1 & 0x7f;
446 out_ptr[2] = out_val2 & 0x7f;
447 out_ptr[3] = out_val3 & 0x7f;
448 out_ptr[4] = out_val4 & 0x7f;
449 out_ptr[5] = out_val5 & 0x7f;
450 out_ptr[6] = out_val6 & 0x7f;
451 out_ptr[7] = out_val7 & 0x7f;
452
453 in_ptr += 5;
454 out_ptr += 8;
455 }
456
457 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
458
459 while (out_len % 8)
460 {
461 out_buf[out_len] = '=';
462
463 out_len++;
464 }
465
466 return out_len;
467 }
468
469 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
470 {
471 const u8 *in_ptr = in_buf;
472
473 u8 *out_ptr = out_buf;
474
475 for (int i = 0; i < in_len; i += 4)
476 {
477 const u8 out_val0 = f (in_ptr[0] & 0x7f);
478 const u8 out_val1 = f (in_ptr[1] & 0x7f);
479 const u8 out_val2 = f (in_ptr[2] & 0x7f);
480 const u8 out_val3 = f (in_ptr[3] & 0x7f);
481
482 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
483 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
484 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
485
486 in_ptr += 4;
487 out_ptr += 3;
488 }
489
490 for (int i = 0; i < in_len; i++)
491 {
492 if (in_buf[i] != '=') continue;
493
494 in_len = i;
495 }
496
497 int out_len = (in_len * 6) / 8;
498
499 return out_len;
500 }
501
502 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
503 {
504 const u8 *in_ptr = in_buf;
505
506 u8 *out_ptr = out_buf;
507
508 for (int i = 0; i < in_len; i += 3)
509 {
510 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
511 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
512 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
513 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
514
515 out_ptr[0] = out_val0 & 0x7f;
516 out_ptr[1] = out_val1 & 0x7f;
517 out_ptr[2] = out_val2 & 0x7f;
518 out_ptr[3] = out_val3 & 0x7f;
519
520 in_ptr += 3;
521 out_ptr += 4;
522 }
523
524 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
525
526 while (out_len % 4)
527 {
528 out_buf[out_len] = '=';
529
530 out_len++;
531 }
532
533 return out_len;
534 }
535
536 int is_valid_hex_char (const u8 c)
537 {
538 if ((c >= '0') && (c <= '9')) return 1;
539 if ((c >= 'A') && (c <= 'F')) return 1;
540 if ((c >= 'a') && (c <= 'f')) return 1;
541
542 return 0;
543 }
544
545 u8 hex_convert (const u8 c)
546 {
547 return (c & 15) + (c >> 6) * 9;
548 }
549
550 u8 hex_to_u8 (const u8 hex[2])
551 {
552 u8 v = 0;
553
554 v |= (hex_convert (hex[1]) << 0);
555 v |= (hex_convert (hex[0]) << 4);
556
557 return (v);
558 }
559
560 u32 hex_to_u32 (const u8 hex[8])
561 {
562 u32 v = 0;
563
564 v |= ((u32) hex_convert (hex[7])) << 0;
565 v |= ((u32) hex_convert (hex[6])) << 4;
566 v |= ((u32) hex_convert (hex[5])) << 8;
567 v |= ((u32) hex_convert (hex[4])) << 12;
568 v |= ((u32) hex_convert (hex[3])) << 16;
569 v |= ((u32) hex_convert (hex[2])) << 20;
570 v |= ((u32) hex_convert (hex[1])) << 24;
571 v |= ((u32) hex_convert (hex[0])) << 28;
572
573 return (v);
574 }
575
576 u64 hex_to_u64 (const u8 hex[16])
577 {
578 u64 v = 0;
579
580 v |= ((u64) hex_convert (hex[15]) << 0);
581 v |= ((u64) hex_convert (hex[14]) << 4);
582 v |= ((u64) hex_convert (hex[13]) << 8);
583 v |= ((u64) hex_convert (hex[12]) << 12);
584 v |= ((u64) hex_convert (hex[11]) << 16);
585 v |= ((u64) hex_convert (hex[10]) << 20);
586 v |= ((u64) hex_convert (hex[ 9]) << 24);
587 v |= ((u64) hex_convert (hex[ 8]) << 28);
588 v |= ((u64) hex_convert (hex[ 7]) << 32);
589 v |= ((u64) hex_convert (hex[ 6]) << 36);
590 v |= ((u64) hex_convert (hex[ 5]) << 40);
591 v |= ((u64) hex_convert (hex[ 4]) << 44);
592 v |= ((u64) hex_convert (hex[ 3]) << 48);
593 v |= ((u64) hex_convert (hex[ 2]) << 52);
594 v |= ((u64) hex_convert (hex[ 1]) << 56);
595 v |= ((u64) hex_convert (hex[ 0]) << 60);
596
597 return (v);
598 }
599
600 void bin_to_hex_lower (const u32 v, u8 hex[8])
601 {
602 hex[0] = v >> 28 & 15;
603 hex[1] = v >> 24 & 15;
604 hex[2] = v >> 20 & 15;
605 hex[3] = v >> 16 & 15;
606 hex[4] = v >> 12 & 15;
607 hex[5] = v >> 8 & 15;
608 hex[6] = v >> 4 & 15;
609 hex[7] = v >> 0 & 15;
610
611 u32 add;
612
613 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
614 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
615 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
616 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
617 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
618 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
619 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
620 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
621 }
622
623 /**
624 * decoder
625 */
626
627 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
628 {
629 AES_KEY skey;
630
631 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
632
633 u32 _iv[4];
634
635 _iv[0] = iv[0];
636 _iv[1] = iv[1];
637 _iv[2] = iv[2];
638 _iv[3] = iv[3];
639
640 for (int i = 0; i < 16; i += 4)
641 {
642 u32 _in[4];
643 u32 _out[4];
644
645 _in[0] = in[i + 0];
646 _in[1] = in[i + 1];
647 _in[2] = in[i + 2];
648 _in[3] = in[i + 3];
649
650 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
651
652 _out[0] ^= _iv[0];
653 _out[1] ^= _iv[1];
654 _out[2] ^= _iv[2];
655 _out[3] ^= _iv[3];
656
657 out[i + 0] = _out[0];
658 out[i + 1] = _out[1];
659 out[i + 2] = _out[2];
660 out[i + 3] = _out[3];
661
662 _iv[0] = _in[0];
663 _iv[1] = _in[1];
664 _iv[2] = _in[2];
665 _iv[3] = _in[3];
666 }
667 }
668
669 static void juniper_decrypt_hash (char *in, char *out)
670 {
671 // base64 decode
672
673 u8 base64_buf[100];
674
675 memset (base64_buf, 0, sizeof (base64_buf));
676
677 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
678
679 // iv stuff
680
681 u32 juniper_iv[4] = { 0 };
682
683 memcpy (juniper_iv, base64_buf, 12);
684
685 memcpy (out, juniper_iv, 12);
686
687 // reversed key
688
689 u32 juniper_key[4];
690
691 juniper_key[0] = byte_swap_32 (0xa6707a7e);
692 juniper_key[1] = byte_swap_32 (0x8df91059);
693 juniper_key[2] = byte_swap_32 (0xdea70ae5);
694 juniper_key[3] = byte_swap_32 (0x2f9c2442);
695
696 // AES decrypt
697
698 u32 *in_ptr = (u32 *) (base64_buf + 12);
699 u32 *out_ptr = (u32 *) (out + 12);
700
701 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
702 }
703
704 void phpass_decode (u8 digest[16], u8 buf[22])
705 {
706 int l;
707
708 l = itoa64_to_int (buf[ 0]) << 0;
709 l |= itoa64_to_int (buf[ 1]) << 6;
710 l |= itoa64_to_int (buf[ 2]) << 12;
711 l |= itoa64_to_int (buf[ 3]) << 18;
712
713 digest[ 0] = (l >> 0) & 0xff;
714 digest[ 1] = (l >> 8) & 0xff;
715 digest[ 2] = (l >> 16) & 0xff;
716
717 l = itoa64_to_int (buf[ 4]) << 0;
718 l |= itoa64_to_int (buf[ 5]) << 6;
719 l |= itoa64_to_int (buf[ 6]) << 12;
720 l |= itoa64_to_int (buf[ 7]) << 18;
721
722 digest[ 3] = (l >> 0) & 0xff;
723 digest[ 4] = (l >> 8) & 0xff;
724 digest[ 5] = (l >> 16) & 0xff;
725
726 l = itoa64_to_int (buf[ 8]) << 0;
727 l |= itoa64_to_int (buf[ 9]) << 6;
728 l |= itoa64_to_int (buf[10]) << 12;
729 l |= itoa64_to_int (buf[11]) << 18;
730
731 digest[ 6] = (l >> 0) & 0xff;
732 digest[ 7] = (l >> 8) & 0xff;
733 digest[ 8] = (l >> 16) & 0xff;
734
735 l = itoa64_to_int (buf[12]) << 0;
736 l |= itoa64_to_int (buf[13]) << 6;
737 l |= itoa64_to_int (buf[14]) << 12;
738 l |= itoa64_to_int (buf[15]) << 18;
739
740 digest[ 9] = (l >> 0) & 0xff;
741 digest[10] = (l >> 8) & 0xff;
742 digest[11] = (l >> 16) & 0xff;
743
744 l = itoa64_to_int (buf[16]) << 0;
745 l |= itoa64_to_int (buf[17]) << 6;
746 l |= itoa64_to_int (buf[18]) << 12;
747 l |= itoa64_to_int (buf[19]) << 18;
748
749 digest[12] = (l >> 0) & 0xff;
750 digest[13] = (l >> 8) & 0xff;
751 digest[14] = (l >> 16) & 0xff;
752
753 l = itoa64_to_int (buf[20]) << 0;
754 l |= itoa64_to_int (buf[21]) << 6;
755
756 digest[15] = (l >> 0) & 0xff;
757 }
758
759 void phpass_encode (u8 digest[16], u8 buf[22])
760 {
761 int l;
762
763 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
764
765 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
766 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
767 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
768 buf[ 3] = int_to_itoa64 (l & 0x3f);
769
770 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
771
772 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
773 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
774 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
775 buf[ 7] = int_to_itoa64 (l & 0x3f);
776
777 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
778
779 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
781 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
782 buf[11] = int_to_itoa64 (l & 0x3f);
783
784 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
785
786 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
788 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
789 buf[15] = int_to_itoa64 (l & 0x3f);
790
791 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
792
793 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
794 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
795 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
796 buf[19] = int_to_itoa64 (l & 0x3f);
797
798 l = (digest[15] << 0);
799
800 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
801 buf[21] = int_to_itoa64 (l & 0x3f);
802 }
803
804 void md5crypt_decode (u8 digest[16], u8 buf[22])
805 {
806 int l;
807
808 l = itoa64_to_int (buf[ 0]) << 0;
809 l |= itoa64_to_int (buf[ 1]) << 6;
810 l |= itoa64_to_int (buf[ 2]) << 12;
811 l |= itoa64_to_int (buf[ 3]) << 18;
812
813 digest[ 0] = (l >> 16) & 0xff;
814 digest[ 6] = (l >> 8) & 0xff;
815 digest[12] = (l >> 0) & 0xff;
816
817 l = itoa64_to_int (buf[ 4]) << 0;
818 l |= itoa64_to_int (buf[ 5]) << 6;
819 l |= itoa64_to_int (buf[ 6]) << 12;
820 l |= itoa64_to_int (buf[ 7]) << 18;
821
822 digest[ 1] = (l >> 16) & 0xff;
823 digest[ 7] = (l >> 8) & 0xff;
824 digest[13] = (l >> 0) & 0xff;
825
826 l = itoa64_to_int (buf[ 8]) << 0;
827 l |= itoa64_to_int (buf[ 9]) << 6;
828 l |= itoa64_to_int (buf[10]) << 12;
829 l |= itoa64_to_int (buf[11]) << 18;
830
831 digest[ 2] = (l >> 16) & 0xff;
832 digest[ 8] = (l >> 8) & 0xff;
833 digest[14] = (l >> 0) & 0xff;
834
835 l = itoa64_to_int (buf[12]) << 0;
836 l |= itoa64_to_int (buf[13]) << 6;
837 l |= itoa64_to_int (buf[14]) << 12;
838 l |= itoa64_to_int (buf[15]) << 18;
839
840 digest[ 3] = (l >> 16) & 0xff;
841 digest[ 9] = (l >> 8) & 0xff;
842 digest[15] = (l >> 0) & 0xff;
843
844 l = itoa64_to_int (buf[16]) << 0;
845 l |= itoa64_to_int (buf[17]) << 6;
846 l |= itoa64_to_int (buf[18]) << 12;
847 l |= itoa64_to_int (buf[19]) << 18;
848
849 digest[ 4] = (l >> 16) & 0xff;
850 digest[10] = (l >> 8) & 0xff;
851 digest[ 5] = (l >> 0) & 0xff;
852
853 l = itoa64_to_int (buf[20]) << 0;
854 l |= itoa64_to_int (buf[21]) << 6;
855
856 digest[11] = (l >> 0) & 0xff;
857 }
858
859 void md5crypt_encode (u8 digest[16], u8 buf[22])
860 {
861 int l;
862
863 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
864
865 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
866 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
867 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
868 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
869
870 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
871
872 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
873 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
874 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
875 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
876
877 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
878
879 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
881 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
882 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
883
884 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
885
886 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
888 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
889 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
890
891 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
892
893 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
894 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
895 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
896 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
897
898 l = (digest[11] << 0);
899
900 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
901 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
902 }
903
904 void sha512crypt_decode (u8 digest[64], u8 buf[86])
905 {
906 int l;
907
908 l = itoa64_to_int (buf[ 0]) << 0;
909 l |= itoa64_to_int (buf[ 1]) << 6;
910 l |= itoa64_to_int (buf[ 2]) << 12;
911 l |= itoa64_to_int (buf[ 3]) << 18;
912
913 digest[ 0] = (l >> 16) & 0xff;
914 digest[21] = (l >> 8) & 0xff;
915 digest[42] = (l >> 0) & 0xff;
916
917 l = itoa64_to_int (buf[ 4]) << 0;
918 l |= itoa64_to_int (buf[ 5]) << 6;
919 l |= itoa64_to_int (buf[ 6]) << 12;
920 l |= itoa64_to_int (buf[ 7]) << 18;
921
922 digest[22] = (l >> 16) & 0xff;
923 digest[43] = (l >> 8) & 0xff;
924 digest[ 1] = (l >> 0) & 0xff;
925
926 l = itoa64_to_int (buf[ 8]) << 0;
927 l |= itoa64_to_int (buf[ 9]) << 6;
928 l |= itoa64_to_int (buf[10]) << 12;
929 l |= itoa64_to_int (buf[11]) << 18;
930
931 digest[44] = (l >> 16) & 0xff;
932 digest[ 2] = (l >> 8) & 0xff;
933 digest[23] = (l >> 0) & 0xff;
934
935 l = itoa64_to_int (buf[12]) << 0;
936 l |= itoa64_to_int (buf[13]) << 6;
937 l |= itoa64_to_int (buf[14]) << 12;
938 l |= itoa64_to_int (buf[15]) << 18;
939
940 digest[ 3] = (l >> 16) & 0xff;
941 digest[24] = (l >> 8) & 0xff;
942 digest[45] = (l >> 0) & 0xff;
943
944 l = itoa64_to_int (buf[16]) << 0;
945 l |= itoa64_to_int (buf[17]) << 6;
946 l |= itoa64_to_int (buf[18]) << 12;
947 l |= itoa64_to_int (buf[19]) << 18;
948
949 digest[25] = (l >> 16) & 0xff;
950 digest[46] = (l >> 8) & 0xff;
951 digest[ 4] = (l >> 0) & 0xff;
952
953 l = itoa64_to_int (buf[20]) << 0;
954 l |= itoa64_to_int (buf[21]) << 6;
955 l |= itoa64_to_int (buf[22]) << 12;
956 l |= itoa64_to_int (buf[23]) << 18;
957
958 digest[47] = (l >> 16) & 0xff;
959 digest[ 5] = (l >> 8) & 0xff;
960 digest[26] = (l >> 0) & 0xff;
961
962 l = itoa64_to_int (buf[24]) << 0;
963 l |= itoa64_to_int (buf[25]) << 6;
964 l |= itoa64_to_int (buf[26]) << 12;
965 l |= itoa64_to_int (buf[27]) << 18;
966
967 digest[ 6] = (l >> 16) & 0xff;
968 digest[27] = (l >> 8) & 0xff;
969 digest[48] = (l >> 0) & 0xff;
970
971 l = itoa64_to_int (buf[28]) << 0;
972 l |= itoa64_to_int (buf[29]) << 6;
973 l |= itoa64_to_int (buf[30]) << 12;
974 l |= itoa64_to_int (buf[31]) << 18;
975
976 digest[28] = (l >> 16) & 0xff;
977 digest[49] = (l >> 8) & 0xff;
978 digest[ 7] = (l >> 0) & 0xff;
979
980 l = itoa64_to_int (buf[32]) << 0;
981 l |= itoa64_to_int (buf[33]) << 6;
982 l |= itoa64_to_int (buf[34]) << 12;
983 l |= itoa64_to_int (buf[35]) << 18;
984
985 digest[50] = (l >> 16) & 0xff;
986 digest[ 8] = (l >> 8) & 0xff;
987 digest[29] = (l >> 0) & 0xff;
988
989 l = itoa64_to_int (buf[36]) << 0;
990 l |= itoa64_to_int (buf[37]) << 6;
991 l |= itoa64_to_int (buf[38]) << 12;
992 l |= itoa64_to_int (buf[39]) << 18;
993
994 digest[ 9] = (l >> 16) & 0xff;
995 digest[30] = (l >> 8) & 0xff;
996 digest[51] = (l >> 0) & 0xff;
997
998 l = itoa64_to_int (buf[40]) << 0;
999 l |= itoa64_to_int (buf[41]) << 6;
1000 l |= itoa64_to_int (buf[42]) << 12;
1001 l |= itoa64_to_int (buf[43]) << 18;
1002
1003 digest[31] = (l >> 16) & 0xff;
1004 digest[52] = (l >> 8) & 0xff;
1005 digest[10] = (l >> 0) & 0xff;
1006
1007 l = itoa64_to_int (buf[44]) << 0;
1008 l |= itoa64_to_int (buf[45]) << 6;
1009 l |= itoa64_to_int (buf[46]) << 12;
1010 l |= itoa64_to_int (buf[47]) << 18;
1011
1012 digest[53] = (l >> 16) & 0xff;
1013 digest[11] = (l >> 8) & 0xff;
1014 digest[32] = (l >> 0) & 0xff;
1015
1016 l = itoa64_to_int (buf[48]) << 0;
1017 l |= itoa64_to_int (buf[49]) << 6;
1018 l |= itoa64_to_int (buf[50]) << 12;
1019 l |= itoa64_to_int (buf[51]) << 18;
1020
1021 digest[12] = (l >> 16) & 0xff;
1022 digest[33] = (l >> 8) & 0xff;
1023 digest[54] = (l >> 0) & 0xff;
1024
1025 l = itoa64_to_int (buf[52]) << 0;
1026 l |= itoa64_to_int (buf[53]) << 6;
1027 l |= itoa64_to_int (buf[54]) << 12;
1028 l |= itoa64_to_int (buf[55]) << 18;
1029
1030 digest[34] = (l >> 16) & 0xff;
1031 digest[55] = (l >> 8) & 0xff;
1032 digest[13] = (l >> 0) & 0xff;
1033
1034 l = itoa64_to_int (buf[56]) << 0;
1035 l |= itoa64_to_int (buf[57]) << 6;
1036 l |= itoa64_to_int (buf[58]) << 12;
1037 l |= itoa64_to_int (buf[59]) << 18;
1038
1039 digest[56] = (l >> 16) & 0xff;
1040 digest[14] = (l >> 8) & 0xff;
1041 digest[35] = (l >> 0) & 0xff;
1042
1043 l = itoa64_to_int (buf[60]) << 0;
1044 l |= itoa64_to_int (buf[61]) << 6;
1045 l |= itoa64_to_int (buf[62]) << 12;
1046 l |= itoa64_to_int (buf[63]) << 18;
1047
1048 digest[15] = (l >> 16) & 0xff;
1049 digest[36] = (l >> 8) & 0xff;
1050 digest[57] = (l >> 0) & 0xff;
1051
1052 l = itoa64_to_int (buf[64]) << 0;
1053 l |= itoa64_to_int (buf[65]) << 6;
1054 l |= itoa64_to_int (buf[66]) << 12;
1055 l |= itoa64_to_int (buf[67]) << 18;
1056
1057 digest[37] = (l >> 16) & 0xff;
1058 digest[58] = (l >> 8) & 0xff;
1059 digest[16] = (l >> 0) & 0xff;
1060
1061 l = itoa64_to_int (buf[68]) << 0;
1062 l |= itoa64_to_int (buf[69]) << 6;
1063 l |= itoa64_to_int (buf[70]) << 12;
1064 l |= itoa64_to_int (buf[71]) << 18;
1065
1066 digest[59] = (l >> 16) & 0xff;
1067 digest[17] = (l >> 8) & 0xff;
1068 digest[38] = (l >> 0) & 0xff;
1069
1070 l = itoa64_to_int (buf[72]) << 0;
1071 l |= itoa64_to_int (buf[73]) << 6;
1072 l |= itoa64_to_int (buf[74]) << 12;
1073 l |= itoa64_to_int (buf[75]) << 18;
1074
1075 digest[18] = (l >> 16) & 0xff;
1076 digest[39] = (l >> 8) & 0xff;
1077 digest[60] = (l >> 0) & 0xff;
1078
1079 l = itoa64_to_int (buf[76]) << 0;
1080 l |= itoa64_to_int (buf[77]) << 6;
1081 l |= itoa64_to_int (buf[78]) << 12;
1082 l |= itoa64_to_int (buf[79]) << 18;
1083
1084 digest[40] = (l >> 16) & 0xff;
1085 digest[61] = (l >> 8) & 0xff;
1086 digest[19] = (l >> 0) & 0xff;
1087
1088 l = itoa64_to_int (buf[80]) << 0;
1089 l |= itoa64_to_int (buf[81]) << 6;
1090 l |= itoa64_to_int (buf[82]) << 12;
1091 l |= itoa64_to_int (buf[83]) << 18;
1092
1093 digest[62] = (l >> 16) & 0xff;
1094 digest[20] = (l >> 8) & 0xff;
1095 digest[41] = (l >> 0) & 0xff;
1096
1097 l = itoa64_to_int (buf[84]) << 0;
1098 l |= itoa64_to_int (buf[85]) << 6;
1099
1100 digest[63] = (l >> 0) & 0xff;
1101 }
1102
1103 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1104 {
1105 int l;
1106
1107 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1108
1109 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1112 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1113
1114 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1115
1116 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1119 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1120
1121 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1122
1123 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1126 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1127
1128 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1129
1130 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1133 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1134
1135 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1136
1137 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1140 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1141
1142 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1143
1144 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1147 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1148
1149 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1150
1151 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1154 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1155
1156 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1157
1158 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1161 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1162
1163 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1164
1165 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1168 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1169
1170 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1171
1172 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1175 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1176
1177 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1178
1179 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1182 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1183
1184 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1185
1186 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1189 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1190
1191 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1192
1193 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1196 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1197
1198 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1199
1200 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1203 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1204
1205 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1206
1207 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1210 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1211
1212 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1213
1214 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1217 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1218
1219 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1220
1221 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1224 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1225
1226 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1227
1228 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1231 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1232
1233 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1234
1235 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1238 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1239
1240 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1241
1242 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1245 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1246
1247 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1248
1249 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1250 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1252 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1253
1254 l = 0 | 0 | (digest[63] << 0);
1255
1256 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1257 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1258 }
1259
1260 void sha1aix_decode (u8 digest[20], u8 buf[27])
1261 {
1262 int l;
1263
1264 l = itoa64_to_int (buf[ 0]) << 0;
1265 l |= itoa64_to_int (buf[ 1]) << 6;
1266 l |= itoa64_to_int (buf[ 2]) << 12;
1267 l |= itoa64_to_int (buf[ 3]) << 18;
1268
1269 digest[ 2] = (l >> 0) & 0xff;
1270 digest[ 1] = (l >> 8) & 0xff;
1271 digest[ 0] = (l >> 16) & 0xff;
1272
1273 l = itoa64_to_int (buf[ 4]) << 0;
1274 l |= itoa64_to_int (buf[ 5]) << 6;
1275 l |= itoa64_to_int (buf[ 6]) << 12;
1276 l |= itoa64_to_int (buf[ 7]) << 18;
1277
1278 digest[ 5] = (l >> 0) & 0xff;
1279 digest[ 4] = (l >> 8) & 0xff;
1280 digest[ 3] = (l >> 16) & 0xff;
1281
1282 l = itoa64_to_int (buf[ 8]) << 0;
1283 l |= itoa64_to_int (buf[ 9]) << 6;
1284 l |= itoa64_to_int (buf[10]) << 12;
1285 l |= itoa64_to_int (buf[11]) << 18;
1286
1287 digest[ 8] = (l >> 0) & 0xff;
1288 digest[ 7] = (l >> 8) & 0xff;
1289 digest[ 6] = (l >> 16) & 0xff;
1290
1291 l = itoa64_to_int (buf[12]) << 0;
1292 l |= itoa64_to_int (buf[13]) << 6;
1293 l |= itoa64_to_int (buf[14]) << 12;
1294 l |= itoa64_to_int (buf[15]) << 18;
1295
1296 digest[11] = (l >> 0) & 0xff;
1297 digest[10] = (l >> 8) & 0xff;
1298 digest[ 9] = (l >> 16) & 0xff;
1299
1300 l = itoa64_to_int (buf[16]) << 0;
1301 l |= itoa64_to_int (buf[17]) << 6;
1302 l |= itoa64_to_int (buf[18]) << 12;
1303 l |= itoa64_to_int (buf[19]) << 18;
1304
1305 digest[14] = (l >> 0) & 0xff;
1306 digest[13] = (l >> 8) & 0xff;
1307 digest[12] = (l >> 16) & 0xff;
1308
1309 l = itoa64_to_int (buf[20]) << 0;
1310 l |= itoa64_to_int (buf[21]) << 6;
1311 l |= itoa64_to_int (buf[22]) << 12;
1312 l |= itoa64_to_int (buf[23]) << 18;
1313
1314 digest[17] = (l >> 0) & 0xff;
1315 digest[16] = (l >> 8) & 0xff;
1316 digest[15] = (l >> 16) & 0xff;
1317
1318 l = itoa64_to_int (buf[24]) << 0;
1319 l |= itoa64_to_int (buf[25]) << 6;
1320 l |= itoa64_to_int (buf[26]) << 12;
1321
1322 digest[19] = (l >> 8) & 0xff;
1323 digest[18] = (l >> 16) & 0xff;
1324 }
1325
1326 void sha1aix_encode (u8 digest[20], u8 buf[27])
1327 {
1328 int l;
1329
1330 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1331
1332 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1333 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1334 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1335 buf[ 3] = int_to_itoa64 (l & 0x3f);
1336
1337 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1338
1339 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1340 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1341 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1342 buf[ 7] = int_to_itoa64 (l & 0x3f);
1343
1344 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1345
1346 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1348 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1349 buf[11] = int_to_itoa64 (l & 0x3f);
1350
1351 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1352
1353 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1355 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1356 buf[15] = int_to_itoa64 (l & 0x3f);
1357
1358 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1359
1360 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1362 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1363 buf[19] = int_to_itoa64 (l & 0x3f);
1364
1365 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1366
1367 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1368 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1369 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1370 buf[23] = int_to_itoa64 (l & 0x3f);
1371
1372 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1373
1374 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1375 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1376 buf[26] = int_to_itoa64 (l & 0x3f);
1377 }
1378
1379 void sha256aix_decode (u8 digest[32], u8 buf[43])
1380 {
1381 int l;
1382
1383 l = itoa64_to_int (buf[ 0]) << 0;
1384 l |= itoa64_to_int (buf[ 1]) << 6;
1385 l |= itoa64_to_int (buf[ 2]) << 12;
1386 l |= itoa64_to_int (buf[ 3]) << 18;
1387
1388 digest[ 2] = (l >> 0) & 0xff;
1389 digest[ 1] = (l >> 8) & 0xff;
1390 digest[ 0] = (l >> 16) & 0xff;
1391
1392 l = itoa64_to_int (buf[ 4]) << 0;
1393 l |= itoa64_to_int (buf[ 5]) << 6;
1394 l |= itoa64_to_int (buf[ 6]) << 12;
1395 l |= itoa64_to_int (buf[ 7]) << 18;
1396
1397 digest[ 5] = (l >> 0) & 0xff;
1398 digest[ 4] = (l >> 8) & 0xff;
1399 digest[ 3] = (l >> 16) & 0xff;
1400
1401 l = itoa64_to_int (buf[ 8]) << 0;
1402 l |= itoa64_to_int (buf[ 9]) << 6;
1403 l |= itoa64_to_int (buf[10]) << 12;
1404 l |= itoa64_to_int (buf[11]) << 18;
1405
1406 digest[ 8] = (l >> 0) & 0xff;
1407 digest[ 7] = (l >> 8) & 0xff;
1408 digest[ 6] = (l >> 16) & 0xff;
1409
1410 l = itoa64_to_int (buf[12]) << 0;
1411 l |= itoa64_to_int (buf[13]) << 6;
1412 l |= itoa64_to_int (buf[14]) << 12;
1413 l |= itoa64_to_int (buf[15]) << 18;
1414
1415 digest[11] = (l >> 0) & 0xff;
1416 digest[10] = (l >> 8) & 0xff;
1417 digest[ 9] = (l >> 16) & 0xff;
1418
1419 l = itoa64_to_int (buf[16]) << 0;
1420 l |= itoa64_to_int (buf[17]) << 6;
1421 l |= itoa64_to_int (buf[18]) << 12;
1422 l |= itoa64_to_int (buf[19]) << 18;
1423
1424 digest[14] = (l >> 0) & 0xff;
1425 digest[13] = (l >> 8) & 0xff;
1426 digest[12] = (l >> 16) & 0xff;
1427
1428 l = itoa64_to_int (buf[20]) << 0;
1429 l |= itoa64_to_int (buf[21]) << 6;
1430 l |= itoa64_to_int (buf[22]) << 12;
1431 l |= itoa64_to_int (buf[23]) << 18;
1432
1433 digest[17] = (l >> 0) & 0xff;
1434 digest[16] = (l >> 8) & 0xff;
1435 digest[15] = (l >> 16) & 0xff;
1436
1437 l = itoa64_to_int (buf[24]) << 0;
1438 l |= itoa64_to_int (buf[25]) << 6;
1439 l |= itoa64_to_int (buf[26]) << 12;
1440 l |= itoa64_to_int (buf[27]) << 18;
1441
1442 digest[20] = (l >> 0) & 0xff;
1443 digest[19] = (l >> 8) & 0xff;
1444 digest[18] = (l >> 16) & 0xff;
1445
1446 l = itoa64_to_int (buf[28]) << 0;
1447 l |= itoa64_to_int (buf[29]) << 6;
1448 l |= itoa64_to_int (buf[30]) << 12;
1449 l |= itoa64_to_int (buf[31]) << 18;
1450
1451 digest[23] = (l >> 0) & 0xff;
1452 digest[22] = (l >> 8) & 0xff;
1453 digest[21] = (l >> 16) & 0xff;
1454
1455 l = itoa64_to_int (buf[32]) << 0;
1456 l |= itoa64_to_int (buf[33]) << 6;
1457 l |= itoa64_to_int (buf[34]) << 12;
1458 l |= itoa64_to_int (buf[35]) << 18;
1459
1460 digest[26] = (l >> 0) & 0xff;
1461 digest[25] = (l >> 8) & 0xff;
1462 digest[24] = (l >> 16) & 0xff;
1463
1464 l = itoa64_to_int (buf[36]) << 0;
1465 l |= itoa64_to_int (buf[37]) << 6;
1466 l |= itoa64_to_int (buf[38]) << 12;
1467 l |= itoa64_to_int (buf[39]) << 18;
1468
1469 digest[29] = (l >> 0) & 0xff;
1470 digest[28] = (l >> 8) & 0xff;
1471 digest[27] = (l >> 16) & 0xff;
1472
1473 l = itoa64_to_int (buf[40]) << 0;
1474 l |= itoa64_to_int (buf[41]) << 6;
1475 l |= itoa64_to_int (buf[42]) << 12;
1476
1477 //digest[32] = (l >> 0) & 0xff;
1478 digest[31] = (l >> 8) & 0xff;
1479 digest[30] = (l >> 16) & 0xff;
1480 }
1481
1482 void sha256aix_encode (u8 digest[32], u8 buf[43])
1483 {
1484 int l;
1485
1486 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1487
1488 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1489 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1490 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1491 buf[ 3] = int_to_itoa64 (l & 0x3f);
1492
1493 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1494
1495 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1496 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1497 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1498 buf[ 7] = int_to_itoa64 (l & 0x3f);
1499
1500 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1501
1502 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1504 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1505 buf[11] = int_to_itoa64 (l & 0x3f);
1506
1507 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1508
1509 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1511 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1512 buf[15] = int_to_itoa64 (l & 0x3f);
1513
1514 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1515
1516 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1518 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1519 buf[19] = int_to_itoa64 (l & 0x3f);
1520
1521 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1522
1523 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1525 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1526 buf[23] = int_to_itoa64 (l & 0x3f);
1527
1528 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1529
1530 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1532 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1533 buf[27] = int_to_itoa64 (l & 0x3f);
1534
1535 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1536
1537 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1539 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1540 buf[31] = int_to_itoa64 (l & 0x3f);
1541
1542 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1543
1544 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1546 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1547 buf[35] = int_to_itoa64 (l & 0x3f);
1548
1549 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1550
1551 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1552 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1553 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1554 buf[39] = int_to_itoa64 (l & 0x3f);
1555
1556 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1557
1558 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1559 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1560 buf[42] = int_to_itoa64 (l & 0x3f);
1561 }
1562
1563 void sha512aix_decode (u8 digest[64], u8 buf[86])
1564 {
1565 int l;
1566
1567 l = itoa64_to_int (buf[ 0]) << 0;
1568 l |= itoa64_to_int (buf[ 1]) << 6;
1569 l |= itoa64_to_int (buf[ 2]) << 12;
1570 l |= itoa64_to_int (buf[ 3]) << 18;
1571
1572 digest[ 2] = (l >> 0) & 0xff;
1573 digest[ 1] = (l >> 8) & 0xff;
1574 digest[ 0] = (l >> 16) & 0xff;
1575
1576 l = itoa64_to_int (buf[ 4]) << 0;
1577 l |= itoa64_to_int (buf[ 5]) << 6;
1578 l |= itoa64_to_int (buf[ 6]) << 12;
1579 l |= itoa64_to_int (buf[ 7]) << 18;
1580
1581 digest[ 5] = (l >> 0) & 0xff;
1582 digest[ 4] = (l >> 8) & 0xff;
1583 digest[ 3] = (l >> 16) & 0xff;
1584
1585 l = itoa64_to_int (buf[ 8]) << 0;
1586 l |= itoa64_to_int (buf[ 9]) << 6;
1587 l |= itoa64_to_int (buf[10]) << 12;
1588 l |= itoa64_to_int (buf[11]) << 18;
1589
1590 digest[ 8] = (l >> 0) & 0xff;
1591 digest[ 7] = (l >> 8) & 0xff;
1592 digest[ 6] = (l >> 16) & 0xff;
1593
1594 l = itoa64_to_int (buf[12]) << 0;
1595 l |= itoa64_to_int (buf[13]) << 6;
1596 l |= itoa64_to_int (buf[14]) << 12;
1597 l |= itoa64_to_int (buf[15]) << 18;
1598
1599 digest[11] = (l >> 0) & 0xff;
1600 digest[10] = (l >> 8) & 0xff;
1601 digest[ 9] = (l >> 16) & 0xff;
1602
1603 l = itoa64_to_int (buf[16]) << 0;
1604 l |= itoa64_to_int (buf[17]) << 6;
1605 l |= itoa64_to_int (buf[18]) << 12;
1606 l |= itoa64_to_int (buf[19]) << 18;
1607
1608 digest[14] = (l >> 0) & 0xff;
1609 digest[13] = (l >> 8) & 0xff;
1610 digest[12] = (l >> 16) & 0xff;
1611
1612 l = itoa64_to_int (buf[20]) << 0;
1613 l |= itoa64_to_int (buf[21]) << 6;
1614 l |= itoa64_to_int (buf[22]) << 12;
1615 l |= itoa64_to_int (buf[23]) << 18;
1616
1617 digest[17] = (l >> 0) & 0xff;
1618 digest[16] = (l >> 8) & 0xff;
1619 digest[15] = (l >> 16) & 0xff;
1620
1621 l = itoa64_to_int (buf[24]) << 0;
1622 l |= itoa64_to_int (buf[25]) << 6;
1623 l |= itoa64_to_int (buf[26]) << 12;
1624 l |= itoa64_to_int (buf[27]) << 18;
1625
1626 digest[20] = (l >> 0) & 0xff;
1627 digest[19] = (l >> 8) & 0xff;
1628 digest[18] = (l >> 16) & 0xff;
1629
1630 l = itoa64_to_int (buf[28]) << 0;
1631 l |= itoa64_to_int (buf[29]) << 6;
1632 l |= itoa64_to_int (buf[30]) << 12;
1633 l |= itoa64_to_int (buf[31]) << 18;
1634
1635 digest[23] = (l >> 0) & 0xff;
1636 digest[22] = (l >> 8) & 0xff;
1637 digest[21] = (l >> 16) & 0xff;
1638
1639 l = itoa64_to_int (buf[32]) << 0;
1640 l |= itoa64_to_int (buf[33]) << 6;
1641 l |= itoa64_to_int (buf[34]) << 12;
1642 l |= itoa64_to_int (buf[35]) << 18;
1643
1644 digest[26] = (l >> 0) & 0xff;
1645 digest[25] = (l >> 8) & 0xff;
1646 digest[24] = (l >> 16) & 0xff;
1647
1648 l = itoa64_to_int (buf[36]) << 0;
1649 l |= itoa64_to_int (buf[37]) << 6;
1650 l |= itoa64_to_int (buf[38]) << 12;
1651 l |= itoa64_to_int (buf[39]) << 18;
1652
1653 digest[29] = (l >> 0) & 0xff;
1654 digest[28] = (l >> 8) & 0xff;
1655 digest[27] = (l >> 16) & 0xff;
1656
1657 l = itoa64_to_int (buf[40]) << 0;
1658 l |= itoa64_to_int (buf[41]) << 6;
1659 l |= itoa64_to_int (buf[42]) << 12;
1660 l |= itoa64_to_int (buf[43]) << 18;
1661
1662 digest[32] = (l >> 0) & 0xff;
1663 digest[31] = (l >> 8) & 0xff;
1664 digest[30] = (l >> 16) & 0xff;
1665
1666 l = itoa64_to_int (buf[44]) << 0;
1667 l |= itoa64_to_int (buf[45]) << 6;
1668 l |= itoa64_to_int (buf[46]) << 12;
1669 l |= itoa64_to_int (buf[47]) << 18;
1670
1671 digest[35] = (l >> 0) & 0xff;
1672 digest[34] = (l >> 8) & 0xff;
1673 digest[33] = (l >> 16) & 0xff;
1674
1675 l = itoa64_to_int (buf[48]) << 0;
1676 l |= itoa64_to_int (buf[49]) << 6;
1677 l |= itoa64_to_int (buf[50]) << 12;
1678 l |= itoa64_to_int (buf[51]) << 18;
1679
1680 digest[38] = (l >> 0) & 0xff;
1681 digest[37] = (l >> 8) & 0xff;
1682 digest[36] = (l >> 16) & 0xff;
1683
1684 l = itoa64_to_int (buf[52]) << 0;
1685 l |= itoa64_to_int (buf[53]) << 6;
1686 l |= itoa64_to_int (buf[54]) << 12;
1687 l |= itoa64_to_int (buf[55]) << 18;
1688
1689 digest[41] = (l >> 0) & 0xff;
1690 digest[40] = (l >> 8) & 0xff;
1691 digest[39] = (l >> 16) & 0xff;
1692
1693 l = itoa64_to_int (buf[56]) << 0;
1694 l |= itoa64_to_int (buf[57]) << 6;
1695 l |= itoa64_to_int (buf[58]) << 12;
1696 l |= itoa64_to_int (buf[59]) << 18;
1697
1698 digest[44] = (l >> 0) & 0xff;
1699 digest[43] = (l >> 8) & 0xff;
1700 digest[42] = (l >> 16) & 0xff;
1701
1702 l = itoa64_to_int (buf[60]) << 0;
1703 l |= itoa64_to_int (buf[61]) << 6;
1704 l |= itoa64_to_int (buf[62]) << 12;
1705 l |= itoa64_to_int (buf[63]) << 18;
1706
1707 digest[47] = (l >> 0) & 0xff;
1708 digest[46] = (l >> 8) & 0xff;
1709 digest[45] = (l >> 16) & 0xff;
1710
1711 l = itoa64_to_int (buf[64]) << 0;
1712 l |= itoa64_to_int (buf[65]) << 6;
1713 l |= itoa64_to_int (buf[66]) << 12;
1714 l |= itoa64_to_int (buf[67]) << 18;
1715
1716 digest[50] = (l >> 0) & 0xff;
1717 digest[49] = (l >> 8) & 0xff;
1718 digest[48] = (l >> 16) & 0xff;
1719
1720 l = itoa64_to_int (buf[68]) << 0;
1721 l |= itoa64_to_int (buf[69]) << 6;
1722 l |= itoa64_to_int (buf[70]) << 12;
1723 l |= itoa64_to_int (buf[71]) << 18;
1724
1725 digest[53] = (l >> 0) & 0xff;
1726 digest[52] = (l >> 8) & 0xff;
1727 digest[51] = (l >> 16) & 0xff;
1728
1729 l = itoa64_to_int (buf[72]) << 0;
1730 l |= itoa64_to_int (buf[73]) << 6;
1731 l |= itoa64_to_int (buf[74]) << 12;
1732 l |= itoa64_to_int (buf[75]) << 18;
1733
1734 digest[56] = (l >> 0) & 0xff;
1735 digest[55] = (l >> 8) & 0xff;
1736 digest[54] = (l >> 16) & 0xff;
1737
1738 l = itoa64_to_int (buf[76]) << 0;
1739 l |= itoa64_to_int (buf[77]) << 6;
1740 l |= itoa64_to_int (buf[78]) << 12;
1741 l |= itoa64_to_int (buf[79]) << 18;
1742
1743 digest[59] = (l >> 0) & 0xff;
1744 digest[58] = (l >> 8) & 0xff;
1745 digest[57] = (l >> 16) & 0xff;
1746
1747 l = itoa64_to_int (buf[80]) << 0;
1748 l |= itoa64_to_int (buf[81]) << 6;
1749 l |= itoa64_to_int (buf[82]) << 12;
1750 l |= itoa64_to_int (buf[83]) << 18;
1751
1752 digest[62] = (l >> 0) & 0xff;
1753 digest[61] = (l >> 8) & 0xff;
1754 digest[60] = (l >> 16) & 0xff;
1755
1756 l = itoa64_to_int (buf[84]) << 0;
1757 l |= itoa64_to_int (buf[85]) << 6;
1758
1759 digest[63] = (l >> 16) & 0xff;
1760 }
1761
1762 void sha512aix_encode (u8 digest[64], u8 buf[86])
1763 {
1764 int l;
1765
1766 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1767
1768 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1769 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1770 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1771 buf[ 3] = int_to_itoa64 (l & 0x3f);
1772
1773 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1774
1775 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1776 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1777 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1778 buf[ 7] = int_to_itoa64 (l & 0x3f);
1779
1780 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1781
1782 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1784 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1785 buf[11] = int_to_itoa64 (l & 0x3f);
1786
1787 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1788
1789 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1791 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1792 buf[15] = int_to_itoa64 (l & 0x3f);
1793
1794 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1795
1796 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1798 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1799 buf[19] = int_to_itoa64 (l & 0x3f);
1800
1801 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1802
1803 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1805 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1806 buf[23] = int_to_itoa64 (l & 0x3f);
1807
1808 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1809
1810 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1812 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1813 buf[27] = int_to_itoa64 (l & 0x3f);
1814
1815 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1816
1817 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1819 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1820 buf[31] = int_to_itoa64 (l & 0x3f);
1821
1822 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1823
1824 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1826 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1827 buf[35] = int_to_itoa64 (l & 0x3f);
1828
1829 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1830
1831 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1833 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1834 buf[39] = int_to_itoa64 (l & 0x3f);
1835
1836 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1837
1838 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1840 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1841 buf[43] = int_to_itoa64 (l & 0x3f);
1842
1843 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1844
1845 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1847 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1848 buf[47] = int_to_itoa64 (l & 0x3f);
1849
1850 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1851
1852 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1854 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1855 buf[51] = int_to_itoa64 (l & 0x3f);
1856
1857 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1858
1859 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1861 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1862 buf[55] = int_to_itoa64 (l & 0x3f);
1863
1864 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1865
1866 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1868 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1869 buf[59] = int_to_itoa64 (l & 0x3f);
1870
1871 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1872
1873 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1875 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1876 buf[63] = int_to_itoa64 (l & 0x3f);
1877
1878 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1879
1880 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1882 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1883 buf[67] = int_to_itoa64 (l & 0x3f);
1884
1885 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1886
1887 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1889 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1890 buf[71] = int_to_itoa64 (l & 0x3f);
1891
1892 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1893
1894 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1896 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1897 buf[75] = int_to_itoa64 (l & 0x3f);
1898
1899 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1900
1901 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1903 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1904 buf[79] = int_to_itoa64 (l & 0x3f);
1905
1906 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1907
1908 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1909 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1910 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1911 buf[83] = int_to_itoa64 (l & 0x3f);
1912
1913 l = 0 | 0 | (digest[63] << 16);
1914
1915 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1916 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1917 }
1918
1919 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1920 {
1921 int l;
1922
1923 l = itoa64_to_int (buf[ 0]) << 0;
1924 l |= itoa64_to_int (buf[ 1]) << 6;
1925 l |= itoa64_to_int (buf[ 2]) << 12;
1926 l |= itoa64_to_int (buf[ 3]) << 18;
1927
1928 digest[ 0] = (l >> 16) & 0xff;
1929 digest[10] = (l >> 8) & 0xff;
1930 digest[20] = (l >> 0) & 0xff;
1931
1932 l = itoa64_to_int (buf[ 4]) << 0;
1933 l |= itoa64_to_int (buf[ 5]) << 6;
1934 l |= itoa64_to_int (buf[ 6]) << 12;
1935 l |= itoa64_to_int (buf[ 7]) << 18;
1936
1937 digest[21] = (l >> 16) & 0xff;
1938 digest[ 1] = (l >> 8) & 0xff;
1939 digest[11] = (l >> 0) & 0xff;
1940
1941 l = itoa64_to_int (buf[ 8]) << 0;
1942 l |= itoa64_to_int (buf[ 9]) << 6;
1943 l |= itoa64_to_int (buf[10]) << 12;
1944 l |= itoa64_to_int (buf[11]) << 18;
1945
1946 digest[12] = (l >> 16) & 0xff;
1947 digest[22] = (l >> 8) & 0xff;
1948 digest[ 2] = (l >> 0) & 0xff;
1949
1950 l = itoa64_to_int (buf[12]) << 0;
1951 l |= itoa64_to_int (buf[13]) << 6;
1952 l |= itoa64_to_int (buf[14]) << 12;
1953 l |= itoa64_to_int (buf[15]) << 18;
1954
1955 digest[ 3] = (l >> 16) & 0xff;
1956 digest[13] = (l >> 8) & 0xff;
1957 digest[23] = (l >> 0) & 0xff;
1958
1959 l = itoa64_to_int (buf[16]) << 0;
1960 l |= itoa64_to_int (buf[17]) << 6;
1961 l |= itoa64_to_int (buf[18]) << 12;
1962 l |= itoa64_to_int (buf[19]) << 18;
1963
1964 digest[24] = (l >> 16) & 0xff;
1965 digest[ 4] = (l >> 8) & 0xff;
1966 digest[14] = (l >> 0) & 0xff;
1967
1968 l = itoa64_to_int (buf[20]) << 0;
1969 l |= itoa64_to_int (buf[21]) << 6;
1970 l |= itoa64_to_int (buf[22]) << 12;
1971 l |= itoa64_to_int (buf[23]) << 18;
1972
1973 digest[15] = (l >> 16) & 0xff;
1974 digest[25] = (l >> 8) & 0xff;
1975 digest[ 5] = (l >> 0) & 0xff;
1976
1977 l = itoa64_to_int (buf[24]) << 0;
1978 l |= itoa64_to_int (buf[25]) << 6;
1979 l |= itoa64_to_int (buf[26]) << 12;
1980 l |= itoa64_to_int (buf[27]) << 18;
1981
1982 digest[ 6] = (l >> 16) & 0xff;
1983 digest[16] = (l >> 8) & 0xff;
1984 digest[26] = (l >> 0) & 0xff;
1985
1986 l = itoa64_to_int (buf[28]) << 0;
1987 l |= itoa64_to_int (buf[29]) << 6;
1988 l |= itoa64_to_int (buf[30]) << 12;
1989 l |= itoa64_to_int (buf[31]) << 18;
1990
1991 digest[27] = (l >> 16) & 0xff;
1992 digest[ 7] = (l >> 8) & 0xff;
1993 digest[17] = (l >> 0) & 0xff;
1994
1995 l = itoa64_to_int (buf[32]) << 0;
1996 l |= itoa64_to_int (buf[33]) << 6;
1997 l |= itoa64_to_int (buf[34]) << 12;
1998 l |= itoa64_to_int (buf[35]) << 18;
1999
2000 digest[18] = (l >> 16) & 0xff;
2001 digest[28] = (l >> 8) & 0xff;
2002 digest[ 8] = (l >> 0) & 0xff;
2003
2004 l = itoa64_to_int (buf[36]) << 0;
2005 l |= itoa64_to_int (buf[37]) << 6;
2006 l |= itoa64_to_int (buf[38]) << 12;
2007 l |= itoa64_to_int (buf[39]) << 18;
2008
2009 digest[ 9] = (l >> 16) & 0xff;
2010 digest[19] = (l >> 8) & 0xff;
2011 digest[29] = (l >> 0) & 0xff;
2012
2013 l = itoa64_to_int (buf[40]) << 0;
2014 l |= itoa64_to_int (buf[41]) << 6;
2015 l |= itoa64_to_int (buf[42]) << 12;
2016
2017 digest[31] = (l >> 8) & 0xff;
2018 digest[30] = (l >> 0) & 0xff;
2019 }
2020
2021 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2022 {
2023 int l;
2024
2025 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2026
2027 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2030 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2031
2032 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2033
2034 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2037 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2038
2039 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2040
2041 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2044 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2045
2046 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2047
2048 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2051 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2052
2053 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2054
2055 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2058 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2059
2060 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2061
2062 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2065 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2066
2067 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2068
2069 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2072 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2073
2074 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2075
2076 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2079 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2080
2081 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2082
2083 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2086 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2087
2088 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2089
2090 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2091 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2093 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2094
2095 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2096
2097 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2098 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2099 buf[42] = int_to_itoa64 (l & 0x3f);
2100 }
2101
2102 void drupal7_decode (u8 digest[64], u8 buf[44])
2103 {
2104 int l;
2105
2106 l = itoa64_to_int (buf[ 0]) << 0;
2107 l |= itoa64_to_int (buf[ 1]) << 6;
2108 l |= itoa64_to_int (buf[ 2]) << 12;
2109 l |= itoa64_to_int (buf[ 3]) << 18;
2110
2111 digest[ 0] = (l >> 0) & 0xff;
2112 digest[ 1] = (l >> 8) & 0xff;
2113 digest[ 2] = (l >> 16) & 0xff;
2114
2115 l = itoa64_to_int (buf[ 4]) << 0;
2116 l |= itoa64_to_int (buf[ 5]) << 6;
2117 l |= itoa64_to_int (buf[ 6]) << 12;
2118 l |= itoa64_to_int (buf[ 7]) << 18;
2119
2120 digest[ 3] = (l >> 0) & 0xff;
2121 digest[ 4] = (l >> 8) & 0xff;
2122 digest[ 5] = (l >> 16) & 0xff;
2123
2124 l = itoa64_to_int (buf[ 8]) << 0;
2125 l |= itoa64_to_int (buf[ 9]) << 6;
2126 l |= itoa64_to_int (buf[10]) << 12;
2127 l |= itoa64_to_int (buf[11]) << 18;
2128
2129 digest[ 6] = (l >> 0) & 0xff;
2130 digest[ 7] = (l >> 8) & 0xff;
2131 digest[ 8] = (l >> 16) & 0xff;
2132
2133 l = itoa64_to_int (buf[12]) << 0;
2134 l |= itoa64_to_int (buf[13]) << 6;
2135 l |= itoa64_to_int (buf[14]) << 12;
2136 l |= itoa64_to_int (buf[15]) << 18;
2137
2138 digest[ 9] = (l >> 0) & 0xff;
2139 digest[10] = (l >> 8) & 0xff;
2140 digest[11] = (l >> 16) & 0xff;
2141
2142 l = itoa64_to_int (buf[16]) << 0;
2143 l |= itoa64_to_int (buf[17]) << 6;
2144 l |= itoa64_to_int (buf[18]) << 12;
2145 l |= itoa64_to_int (buf[19]) << 18;
2146
2147 digest[12] = (l >> 0) & 0xff;
2148 digest[13] = (l >> 8) & 0xff;
2149 digest[14] = (l >> 16) & 0xff;
2150
2151 l = itoa64_to_int (buf[20]) << 0;
2152 l |= itoa64_to_int (buf[21]) << 6;
2153 l |= itoa64_to_int (buf[22]) << 12;
2154 l |= itoa64_to_int (buf[23]) << 18;
2155
2156 digest[15] = (l >> 0) & 0xff;
2157 digest[16] = (l >> 8) & 0xff;
2158 digest[17] = (l >> 16) & 0xff;
2159
2160 l = itoa64_to_int (buf[24]) << 0;
2161 l |= itoa64_to_int (buf[25]) << 6;
2162 l |= itoa64_to_int (buf[26]) << 12;
2163 l |= itoa64_to_int (buf[27]) << 18;
2164
2165 digest[18] = (l >> 0) & 0xff;
2166 digest[19] = (l >> 8) & 0xff;
2167 digest[20] = (l >> 16) & 0xff;
2168
2169 l = itoa64_to_int (buf[28]) << 0;
2170 l |= itoa64_to_int (buf[29]) << 6;
2171 l |= itoa64_to_int (buf[30]) << 12;
2172 l |= itoa64_to_int (buf[31]) << 18;
2173
2174 digest[21] = (l >> 0) & 0xff;
2175 digest[22] = (l >> 8) & 0xff;
2176 digest[23] = (l >> 16) & 0xff;
2177
2178 l = itoa64_to_int (buf[32]) << 0;
2179 l |= itoa64_to_int (buf[33]) << 6;
2180 l |= itoa64_to_int (buf[34]) << 12;
2181 l |= itoa64_to_int (buf[35]) << 18;
2182
2183 digest[24] = (l >> 0) & 0xff;
2184 digest[25] = (l >> 8) & 0xff;
2185 digest[26] = (l >> 16) & 0xff;
2186
2187 l = itoa64_to_int (buf[36]) << 0;
2188 l |= itoa64_to_int (buf[37]) << 6;
2189 l |= itoa64_to_int (buf[38]) << 12;
2190 l |= itoa64_to_int (buf[39]) << 18;
2191
2192 digest[27] = (l >> 0) & 0xff;
2193 digest[28] = (l >> 8) & 0xff;
2194 digest[29] = (l >> 16) & 0xff;
2195
2196 l = itoa64_to_int (buf[40]) << 0;
2197 l |= itoa64_to_int (buf[41]) << 6;
2198 l |= itoa64_to_int (buf[42]) << 12;
2199 l |= itoa64_to_int (buf[43]) << 18;
2200
2201 digest[30] = (l >> 0) & 0xff;
2202 digest[31] = (l >> 8) & 0xff;
2203 digest[32] = (l >> 16) & 0xff;
2204
2205 digest[33] = 0;
2206 digest[34] = 0;
2207 digest[35] = 0;
2208 digest[36] = 0;
2209 digest[37] = 0;
2210 digest[38] = 0;
2211 digest[39] = 0;
2212 digest[40] = 0;
2213 digest[41] = 0;
2214 digest[42] = 0;
2215 digest[43] = 0;
2216 digest[44] = 0;
2217 digest[45] = 0;
2218 digest[46] = 0;
2219 digest[47] = 0;
2220 digest[48] = 0;
2221 digest[49] = 0;
2222 digest[50] = 0;
2223 digest[51] = 0;
2224 digest[52] = 0;
2225 digest[53] = 0;
2226 digest[54] = 0;
2227 digest[55] = 0;
2228 digest[56] = 0;
2229 digest[57] = 0;
2230 digest[58] = 0;
2231 digest[59] = 0;
2232 digest[60] = 0;
2233 digest[61] = 0;
2234 digest[62] = 0;
2235 digest[63] = 0;
2236 }
2237
2238 void drupal7_encode (u8 digest[64], u8 buf[43])
2239 {
2240 int l;
2241
2242 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2243
2244 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2245 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2246 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2247 buf[ 3] = int_to_itoa64 (l & 0x3f);
2248
2249 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2250
2251 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2252 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2253 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2254 buf[ 7] = int_to_itoa64 (l & 0x3f);
2255
2256 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2257
2258 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2260 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2261 buf[11] = int_to_itoa64 (l & 0x3f);
2262
2263 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2264
2265 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2267 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2268 buf[15] = int_to_itoa64 (l & 0x3f);
2269
2270 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2271
2272 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2274 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2275 buf[19] = int_to_itoa64 (l & 0x3f);
2276
2277 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2278
2279 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2281 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2282 buf[23] = int_to_itoa64 (l & 0x3f);
2283
2284 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2285
2286 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2288 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2289 buf[27] = int_to_itoa64 (l & 0x3f);
2290
2291 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2292
2293 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2295 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2296 buf[31] = int_to_itoa64 (l & 0x3f);
2297
2298 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2299
2300 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2302 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2303 buf[35] = int_to_itoa64 (l & 0x3f);
2304
2305 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2306
2307 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2309 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2310 buf[39] = int_to_itoa64 (l & 0x3f);
2311
2312 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2313
2314 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2315 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2316 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2317 //buf[43] = int_to_itoa64 (l & 0x3f);
2318 }
2319
2320 /**
2321 * tty
2322 */
2323
2324 #ifdef LINUX
2325 static struct termio savemodes;
2326 static int havemodes = 0;
2327
2328 int tty_break()
2329 {
2330 struct termio modmodes;
2331
2332 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2333
2334 havemodes = 1;
2335
2336 modmodes = savemodes;
2337 modmodes.c_lflag &= ~ICANON;
2338 modmodes.c_cc[VMIN] = 1;
2339 modmodes.c_cc[VTIME] = 0;
2340
2341 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2342 }
2343
2344 int tty_getchar()
2345 {
2346 fd_set rfds;
2347
2348 FD_ZERO (&rfds);
2349
2350 FD_SET (fileno (stdin), &rfds);
2351
2352 struct timeval tv;
2353
2354 tv.tv_sec = 1;
2355 tv.tv_usec = 0;
2356
2357 int retval = select (1, &rfds, NULL, NULL, &tv);
2358
2359 if (retval == 0) return 0;
2360 if (retval == -1) return -1;
2361
2362 return getchar();
2363 }
2364
2365 int tty_fix()
2366 {
2367 if (!havemodes) return 0;
2368
2369 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2370 }
2371 #endif
2372
2373 #ifdef OSX
2374 static struct termios savemodes;
2375 static int havemodes = 0;
2376
2377 int tty_break()
2378 {
2379 struct termios modmodes;
2380
2381 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2382
2383 havemodes = 1;
2384
2385 modmodes = savemodes;
2386 modmodes.c_lflag &= ~ICANON;
2387 modmodes.c_cc[VMIN] = 1;
2388 modmodes.c_cc[VTIME] = 0;
2389
2390 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2391 }
2392
2393 int tty_getchar()
2394 {
2395 fd_set rfds;
2396
2397 FD_ZERO (&rfds);
2398
2399 FD_SET (fileno (stdin), &rfds);
2400
2401 struct timeval tv;
2402
2403 tv.tv_sec = 1;
2404 tv.tv_usec = 0;
2405
2406 int retval = select (1, &rfds, NULL, NULL, &tv);
2407
2408 if (retval == 0) return 0;
2409 if (retval == -1) return -1;
2410
2411 return getchar();
2412 }
2413
2414 int tty_fix()
2415 {
2416 if (!havemodes) return 0;
2417
2418 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2419 }
2420 #endif
2421
2422 #ifdef WIN
2423 static DWORD saveMode = 0;
2424
2425 int tty_break()
2426 {
2427 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2428
2429 GetConsoleMode (stdinHandle, &saveMode);
2430 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2431
2432 return 0;
2433 }
2434
2435 int tty_getchar()
2436 {
2437 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2438
2439 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2440
2441 if (rc == WAIT_TIMEOUT) return 0;
2442 if (rc == WAIT_ABANDONED) return -1;
2443 if (rc == WAIT_FAILED) return -1;
2444
2445 // The whole ReadConsoleInput () part is a workaround.
2446 // For some unknown reason, maybe a mingw bug, a random signal
2447 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2448 // Then it wants to read with getche () a keyboard input
2449 // which has never been made.
2450
2451 INPUT_RECORD buf[100];
2452
2453 DWORD num = 0;
2454
2455 ReadConsoleInput (stdinHandle, buf, 100, &num);
2456
2457 FlushConsoleInputBuffer (stdinHandle);
2458
2459 for (uint i = 0; i < num; i++)
2460 {
2461 if (buf[i].EventType != KEY_EVENT) continue;
2462
2463 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2464
2465 if (KeyEvent.bKeyDown != TRUE) continue;
2466
2467 return KeyEvent.uChar.AsciiChar;
2468 }
2469
2470 return 0;
2471 }
2472
2473 int tty_fix()
2474 {
2475 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2476
2477 SetConsoleMode (stdinHandle, saveMode);
2478
2479 return 0;
2480 }
2481 #endif
2482
2483 /**
2484 * mem alloc
2485 */
2486
2487 #define MSG_ENOMEM "Insufficient memory available"
2488
2489 void *mycalloc (size_t nmemb, size_t size)
2490 {
2491 void *p = calloc (nmemb, size);
2492
2493 if (p == NULL)
2494 {
2495 log_error ("ERROR: %s", MSG_ENOMEM);
2496
2497 exit (-1);
2498 }
2499
2500 return (p);
2501 }
2502
2503 void *mymalloc (size_t size)
2504 {
2505 void *p = malloc (size);
2506
2507 if (p == NULL)
2508 {
2509 log_error ("ERROR: %s", MSG_ENOMEM);
2510
2511 exit (-1);
2512 }
2513
2514 memset (p, 0, size);
2515
2516 return (p);
2517 }
2518
2519 void myfree (void *ptr)
2520 {
2521 if (ptr == NULL) return;
2522
2523 free (ptr);
2524 }
2525
2526 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2527 {
2528 void *p = realloc (ptr, oldsz + add);
2529
2530 if (p == NULL)
2531 {
2532 log_error ("ERROR: %s", MSG_ENOMEM);
2533
2534 exit (-1);
2535 }
2536
2537 memset ((char *) p + oldsz, 0, add);
2538
2539 return (p);
2540 }
2541
2542 char *mystrdup (const char *s)
2543 {
2544 const size_t len = strlen (s);
2545
2546 char *b = (char *) mymalloc (len + 1);
2547
2548 memcpy (b, s, len);
2549
2550 return (b);
2551 }
2552
2553 FILE *logfile_open (char *logfile)
2554 {
2555 FILE *fp = fopen (logfile, "ab");
2556
2557 if (fp == NULL)
2558 {
2559 fp = stdout;
2560 }
2561
2562 return fp;
2563 }
2564
2565 void logfile_close (FILE *fp)
2566 {
2567 if (fp == stdout) return;
2568
2569 fclose (fp);
2570 }
2571
2572 void logfile_append (const char *fmt, ...)
2573 {
2574 if (data.logfile_disable == 1) return;
2575
2576 FILE *fp = logfile_open (data.logfile);
2577
2578 va_list ap;
2579
2580 va_start (ap, fmt);
2581
2582 vfprintf (fp, fmt, ap);
2583
2584 va_end (ap);
2585
2586 fputc ('\n', fp);
2587
2588 fflush (fp);
2589
2590 logfile_close (fp);
2591 }
2592
2593 int logfile_generate_id ()
2594 {
2595 const int n = rand ();
2596
2597 time_t t;
2598
2599 time (&t);
2600
2601 return t + n;
2602 }
2603
2604 char *logfile_generate_topid ()
2605 {
2606 const int id = logfile_generate_id ();
2607
2608 char *topid = (char *) mymalloc (1 + 16 + 1);
2609
2610 sprintf (topid, "TOP%08x", id);
2611
2612 return topid;
2613 }
2614
2615 char *logfile_generate_subid ()
2616 {
2617 const int id = logfile_generate_id ();
2618
2619 char *subid = (char *) mymalloc (1 + 16 + 1);
2620
2621 sprintf (subid, "SUB%08x", id);
2622
2623 return subid;
2624 }
2625
2626 /**
2627 * system
2628 */
2629
2630 #ifdef _WIN
2631 void fsync (int fd)
2632 {
2633 HANDLE h = (HANDLE) _get_osfhandle (fd);
2634
2635 FlushFileBuffers (h);
2636 }
2637 #endif
2638
2639 /**
2640 * thermal
2641 */
2642
2643 #ifdef HAVE_HWMON
2644 #if defined(_WIN) && defined(HAVE_NVAPI)
2645 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2646 {
2647 NvU32 pGpuCount;
2648
2649 if (hc_NvAPI_EnumPhysicalGPUs (nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2650
2651 if (pGpuCount == 0)
2652 {
2653 log_info ("WARN: No NvAPI adapters found");
2654
2655 return (0);
2656 }
2657
2658 return (pGpuCount);
2659 }
2660 #endif // _WIN && HAVE_NVAPI
2661
2662 #if defined(LINUX) && defined(HAVE_NVML)
2663 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2664 {
2665 int pGpuCount = 0;
2666
2667 for (uint i = 0; i < DEVICES_MAX; i++)
2668 {
2669 if (hc_NVML_nvmlDeviceGetHandleByIndex (data.hm_dll_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2670
2671 // can be used to determine if the device by index matches the cuda device by index
2672 // char name[100]; memset (name, 0, sizeof (name));
2673 // hc_NVML_nvmlDeviceGetName (data.hm_dll_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2674
2675 pGpuCount++;
2676 }
2677
2678 if (pGpuCount == 0)
2679 {
2680 log_info ("WARN: No NVML adapters found");
2681
2682 return (0);
2683 }
2684
2685 return (pGpuCount);
2686 }
2687 #endif // LINUX && HAVE_NVML
2688
2689 #if defined(HAVE_ADL) || defined(HAVE_NVML)
2690 void hm_close (HM_LIB hm_dll)
2691 {
2692 #ifdef _POSIX
2693 dlclose (hm_dll);
2694
2695 #elif _WIN
2696 FreeLibrary (hm_dll);
2697
2698 #endif
2699 }
2700
2701 HM_LIB hm_init (const cl_uint vendor_id)
2702 {
2703 HM_LIB hm_dll = NULL;
2704
2705 #ifdef HAVE_ADL
2706 if (vendor_id == VENDOR_ID_AMD)
2707 {
2708 #ifdef _POSIX
2709 hm_dll = dlopen ("libatiadlxx.so", RTLD_LAZY | RTLD_GLOBAL);
2710
2711 #elif _WIN
2712 hm_dll = LoadLibrary ("atiadlxx.dll");
2713
2714 if (hm_dll == NULL)
2715 {
2716 hm_dll = LoadLibrary ("atiadlxy.dll");
2717 }
2718
2719 #endif
2720 }
2721 #endif
2722
2723 #if defined(LINUX) && defined(HAVE_NVML)
2724 if (vendor_id == VENDOR_ID_NV)
2725 {
2726 hm_dll = dlopen ("libnvidia-ml.so", RTLD_LAZY | RTLD_GLOBAL);
2727 }
2728 #endif
2729
2730 return hm_dll;
2731 }
2732 #endif // HAVE_ADL || HAVE_NVML
2733
2734 #ifdef HAVE_ADL
2735 int get_adapters_num_amd (HM_LIB hm_dll_amd, int *iNumberAdapters)
2736 {
2737 if (hc_ADL_Adapter_NumberOfAdapters_Get (hm_dll_amd, iNumberAdapters) != ADL_OK) return -1;
2738
2739 if (iNumberAdapters == 0)
2740 {
2741 log_info ("WARN: No ADL adapters found.");
2742
2743 return -1;
2744 }
2745
2746 return 0;
2747 }
2748
2749 /*
2750 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2751 {
2752 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2753 ADLODParameters lpOdParameters;
2754
2755 lpOdParameters.iSize = sizeof (ADLODParameters);
2756 size_t plevels_size = 0;
2757
2758 if (hc_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2759
2760 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2761 __func__, iAdapterIndex,
2762 lpOdParameters.iNumberOfPerformanceLevels,
2763 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2764 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2765
2766 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2767
2768 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2769
2770 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2771
2772 if (hc_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2773
2774 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2775 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2776 __func__, iAdapterIndex, j,
2777 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2778
2779 myfree (lpOdPerformanceLevels);
2780
2781 return 0;
2782 }
2783 */
2784
2785 LPAdapterInfo hm_get_adapter_info_amd (HM_LIB hm_dll_amd, int iNumberAdapters)
2786 {
2787 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2788
2789 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2790
2791 if (hc_ADL_Adapter_AdapterInfo_Get (hm_dll_amd, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2792
2793 return lpAdapterInfo;
2794 }
2795
2796 /*
2797 //
2798 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2799 //
2800
2801 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2802 {
2803 u32 idx = -1;
2804
2805 for (uint i = 0; i < num_adl_adapters; i++)
2806 {
2807 int opencl_bus_num = hm_device[i].busid;
2808 int opencl_dev_num = hm_device[i].devid;
2809
2810 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2811 {
2812 idx = i;
2813
2814 break;
2815 }
2816 }
2817
2818 if (idx >= DEVICES_MAX) return -1;
2819
2820 return idx;
2821 }
2822
2823 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2824 {
2825 for (uint i = 0; i < opencl_num_devices; i++)
2826 {
2827 cl_device_topology_amd device_topology;
2828
2829 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2830
2831 hm_device[i].busid = device_topology.pcie.bus;
2832 hm_device[i].devid = device_topology.pcie.device;
2833 }
2834 }
2835 */
2836
2837 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2838 {
2839 // basically bubble sort
2840
2841 for (int i = 0; i < num_adl_adapters; i++)
2842 {
2843 for (int j = 0; j < num_adl_adapters - 1; j++)
2844 {
2845 // get info of adapter [x]
2846
2847 u32 adapter_index_x = valid_adl_device_list[j];
2848 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2849
2850 u32 bus_num_x = info_x.iBusNumber;
2851 u32 dev_num_x = info_x.iDeviceNumber;
2852
2853 // get info of adapter [y]
2854
2855 u32 adapter_index_y = valid_adl_device_list[j + 1];
2856 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2857
2858 u32 bus_num_y = info_y.iBusNumber;
2859 u32 dev_num_y = info_y.iDeviceNumber;
2860
2861 uint need_swap = 0;
2862
2863 if (bus_num_y < bus_num_x)
2864 {
2865 need_swap = 1;
2866 }
2867 else if (bus_num_y == bus_num_x)
2868 {
2869 if (dev_num_y < dev_num_x)
2870 {
2871 need_swap = 1;
2872 }
2873 }
2874
2875 if (need_swap == 1)
2876 {
2877 u32 temp = valid_adl_device_list[j + 1];
2878
2879 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2880 valid_adl_device_list[j + 0] = temp;
2881 }
2882 }
2883 }
2884 }
2885
2886 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2887 {
2888 *num_adl_adapters = 0;
2889
2890 u32 *adl_adapters = NULL;
2891
2892 int *bus_numbers = NULL;
2893 int *device_numbers = NULL;
2894
2895 for (int i = 0; i < iNumberAdapters; i++)
2896 {
2897 AdapterInfo info = lpAdapterInfo[i];
2898
2899 if (strlen (info.strUDID) < 1) continue;
2900
2901 #ifdef WIN
2902 if (info.iVendorID != 1002) continue;
2903 #else
2904 if (info.iVendorID != 0x1002) continue;
2905 #endif
2906
2907 if (info.iBusNumber < 0) continue;
2908 if (info.iDeviceNumber < 0) continue;
2909
2910 int found = 0;
2911
2912 for (int pos = 0; pos < *num_adl_adapters; pos++)
2913 {
2914 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2915 {
2916 found = 1;
2917 break;
2918 }
2919 }
2920
2921 if (found) continue;
2922
2923 // add it to the list
2924
2925 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2926
2927 adl_adapters[*num_adl_adapters] = i;
2928
2929 // rest is just bookkeeping
2930
2931 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2932 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2933
2934 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2935 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2936
2937 (*num_adl_adapters)++;
2938 }
2939
2940 myfree (bus_numbers);
2941 myfree (device_numbers);
2942
2943 // sort the list by increasing bus id, device id number
2944
2945 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2946
2947 return adl_adapters;
2948 }
2949
2950 int hm_check_fanspeed_control (HM_LIB hm_dll_amd, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2951 {
2952 // loop through all valid devices
2953
2954 for (int i = 0; i < num_adl_adapters; i++)
2955 {
2956 u32 adapter_index = valid_adl_device_list[i];
2957
2958 // get AdapterInfo
2959
2960 AdapterInfo info = lpAdapterInfo[adapter_index];
2961
2962 // unfortunately this doesn't work since bus id and dev id are not unique
2963 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2964 // if (opencl_device_index == -1) continue;
2965
2966 int opencl_device_index = i;
2967
2968 // if (hm_show_performance_level (hm_dll_amd, info.iAdapterIndex) != 0) return -1;
2969
2970 // get fanspeed info
2971
2972 if (hm_device[opencl_device_index].od_version == 5)
2973 {
2974 ADLFanSpeedInfo FanSpeedInfo;
2975
2976 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2977
2978 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2979
2980 if (hc_ADL_Overdrive5_FanSpeedInfo_Get (hm_dll_amd, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2981
2982 // check read and write capability in fanspeedinfo
2983
2984 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2985 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2986 {
2987 hm_device[opencl_device_index].fan_supported = 1;
2988 }
2989 else
2990 {
2991 hm_device[opencl_device_index].fan_supported = 0;
2992 }
2993 }
2994 else // od_version == 6
2995 {
2996 ADLOD6FanSpeedInfo faninfo;
2997
2998 memset (&faninfo, 0, sizeof (faninfo));
2999
3000 if (hc_ADL_Overdrive6_FanSpeed_Get (hm_dll_amd, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
3001
3002 // check read capability in fanspeedinfo
3003
3004 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
3005 {
3006 hm_device[opencl_device_index].fan_supported = 1;
3007 }
3008 else
3009 {
3010 hm_device[opencl_device_index].fan_supported = 0;
3011 }
3012 }
3013 }
3014
3015 return 0;
3016 }
3017
3018 int hm_get_overdrive_version (HM_LIB hm_dll_amd, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3019 {
3020 for (int i = 0; i < num_adl_adapters; i++)
3021 {
3022 u32 adapter_index = valid_adl_device_list[i];
3023
3024 // get AdapterInfo
3025
3026 AdapterInfo info = lpAdapterInfo[adapter_index];
3027
3028 // get overdrive version
3029
3030 int od_supported = 0;
3031 int od_enabled = 0;
3032 int od_version = 0;
3033
3034 if (hc_ADL_Overdrive_Caps (hm_dll_amd, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3035
3036 // store the overdrive version in hm_device
3037
3038 // unfortunately this doesn't work since bus id and dev id are not unique
3039 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3040 // if (opencl_device_index == -1) continue;
3041
3042 int opencl_device_index = i;
3043
3044 hm_device[opencl_device_index].od_version = od_version;
3045 }
3046
3047 return 0;
3048 }
3049
3050 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3051 {
3052 for (int i = 0; i < num_adl_adapters; i++)
3053 {
3054 u32 adapter_index = valid_adl_device_list[i];
3055
3056 // get AdapterInfo
3057
3058 AdapterInfo info = lpAdapterInfo[adapter_index];
3059
3060 // store the iAdapterIndex in hm_device
3061
3062 // unfortunately this doesn't work since bus id and dev id are not unique
3063 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3064 // if (opencl_device_index == -1) continue;
3065
3066 int opencl_device_index = i;
3067
3068 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3069 }
3070
3071 return num_adl_adapters;
3072 }
3073 #endif // HAVE_ADL
3074
3075 int hm_get_temperature_with_device_id (const uint device_id)
3076 {
3077 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3078
3079 #ifdef HAVE_ADL
3080 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3081 {
3082 if (data.hm_dll_amd)
3083 {
3084 if (data.hm_device[device_id].od_version == 5)
3085 {
3086 ADLTemperature Temperature;
3087
3088 Temperature.iSize = sizeof (ADLTemperature);
3089
3090 if (hc_ADL_Overdrive5_Temperature_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3091
3092 return Temperature.iTemperature / 1000;
3093 }
3094 else if (data.hm_device[device_id].od_version == 6)
3095 {
3096 int Temperature = 0;
3097
3098 if (hc_ADL_Overdrive6_Temperature_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3099
3100 return Temperature / 1000;
3101 }
3102 }
3103 }
3104 #endif
3105
3106 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3107 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3108 {
3109 #if defined(LINUX) && defined(HAVE_NVML)
3110 int temperature = 0;
3111
3112 hc_NVML_nvmlDeviceGetTemperature (data.hm_dll_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3113
3114 return temperature;
3115 #endif
3116
3117 #if defined(WIN) && defined(HAVE_NVAPI)
3118 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3119
3120 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3121 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3122 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3123 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3124
3125 if (hc_NvAPI_GPU_GetThermalSettings (data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3126
3127 return pThermalSettings.sensor[0].currentTemp;
3128 #endif // WIN && HAVE_NVAPI
3129 }
3130 #endif // HAVE_NVML || HAVE_NVAPI
3131
3132 return -1;
3133 }
3134
3135 int hm_get_fanspeed_with_device_id (const uint device_id)
3136 {
3137 // we shouldn't really need this extra CL_DEVICE_TYPE_GPU check, because fan_supported should not be set w/ CPUs
3138 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3139
3140 if (data.hm_device[device_id].fan_supported == 1)
3141 {
3142 #ifdef HAVE_ADL
3143 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3144 {
3145 if (data.hm_dll_amd)
3146 {
3147 if (data.hm_device[device_id].od_version == 5)
3148 {
3149 ADLFanSpeedValue lpFanSpeedValue;
3150
3151 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3152
3153 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3154 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3155 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3156
3157 if (hc_ADL_Overdrive5_FanSpeed_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3158
3159 return lpFanSpeedValue.iFanSpeed;
3160 }
3161 else // od_version == 6
3162 {
3163 ADLOD6FanSpeedInfo faninfo;
3164
3165 memset (&faninfo, 0, sizeof (faninfo));
3166
3167 if (hc_ADL_Overdrive6_FanSpeed_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3168
3169 return faninfo.iFanSpeedPercent;
3170 }
3171 }
3172 }
3173 #endif // HAVE_ADL
3174
3175 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3176 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3177 {
3178 #if defined(LINUX) && defined(HAVE_NVML)
3179 int speed = 0;
3180
3181 hc_NVML_nvmlDeviceGetFanSpeed (data.hm_dll_nv, 1, data.hm_device[device_id].adapter_index.nv, (unsigned int *) &speed);
3182
3183 return speed;
3184 #endif
3185
3186 #if defined(WIN) && defined(HAVE_NVAPI)
3187 NvU32 speed = 0;
3188
3189 hc_NvAPI_GPU_GetTachReading (data.hm_device[device_id].adapter_index.nv, &speed);
3190
3191 return speed;
3192 #endif
3193 }
3194 #endif // HAVE_NVML || HAVE_NVAPI
3195 }
3196
3197 return -1;
3198 }
3199
3200 int hm_get_utilization_with_device_id (const uint device_id)
3201 {
3202 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3203
3204 #ifdef HAVE_ADL
3205 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3206 {
3207 if (data.hm_dll_amd)
3208 {
3209 ADLPMActivity PMActivity;
3210
3211 PMActivity.iSize = sizeof (ADLPMActivity);
3212
3213 if (hc_ADL_Overdrive_CurrentActivity_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3214
3215 return PMActivity.iActivityPercent;
3216 }
3217 }
3218 #endif // HAVE_ADL
3219
3220 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3221 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3222 {
3223 #if defined(LINUX) && defined(HAVE_NVML)
3224 nvmlUtilization_t utilization;
3225
3226 hc_NVML_nvmlDeviceGetUtilizationRates (data.hm_dll_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3227
3228 return utilization.gpu;
3229 #endif
3230
3231 #if defined(WIN) && defined(HAVE_NVAPI)
3232 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3233
3234 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3235
3236 if (hc_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3237
3238 return pDynamicPstatesInfoEx.utilization[0].percentage;
3239 #endif
3240 }
3241 #endif // HAVE_NVML || HAVE_NVAPI
3242
3243 return -1;
3244 }
3245
3246 #ifdef HAVE_ADL
3247 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3248 {
3249 if (data.hm_device[device_id].fan_supported == 1)
3250 {
3251 if (data.hm_dll_amd)
3252 {
3253 if (data.hm_device[device_id].od_version == 5)
3254 {
3255 ADLFanSpeedValue lpFanSpeedValue;
3256
3257 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3258
3259 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3260 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3261 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3262 lpFanSpeedValue.iFanSpeed = fanspeed;
3263
3264 if (hc_ADL_Overdrive5_FanSpeed_Set (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3265
3266 return 0;
3267 }
3268 else // od_version == 6
3269 {
3270 ADLOD6FanSpeedValue fan_speed_value;
3271
3272 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3273
3274 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3275 fan_speed_value.iFanSpeed = fanspeed;
3276
3277 if (hc_ADL_Overdrive6_FanSpeed_Set (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3278
3279 return 0;
3280 }
3281 }
3282 }
3283
3284 return -1;
3285 }
3286 #endif
3287
3288 // helper function for status display
3289
3290 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3291 {
3292 #define VALUE_NOT_AVAILABLE "N/A"
3293
3294 if (value == -1)
3295 {
3296 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3297 }
3298 else
3299 {
3300 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3301 }
3302 }
3303 #endif // HAVE_HWMON
3304
3305 /**
3306 * maskprocessor
3307 */
3308
3309 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3310 {
3311 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3312
3313 if (css_cnt > SP_PW_MAX)
3314 {
3315 log_error ("ERROR: mask length is too long");
3316
3317 exit (-1);
3318 }
3319
3320 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3321 {
3322 uint *uniq_tbl = uniq_tbls[css_pos];
3323
3324 uint *cs_buf = css[css_pos].cs_buf;
3325 uint cs_len = css[css_pos].cs_len;
3326
3327 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3328 {
3329 uint c = cs_buf[cs_pos] & 0xff;
3330
3331 uniq_tbl[c] = 1;
3332 }
3333 }
3334 }
3335
3336 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3337 {
3338 cs_t *cs = &css[css_cnt];
3339
3340 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3341
3342 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3343
3344 memset (css_uniq, 0, css_uniq_sz);
3345
3346 size_t i;
3347
3348 for (i = 0; i < cs->cs_len; i++)
3349 {
3350 const uint u = cs->cs_buf[i];
3351
3352 css_uniq[u] = 1;
3353 }
3354
3355 for (i = 0; i < in_len; i++)
3356 {
3357 uint u = in_buf[i] & 0xff;
3358
3359 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3360
3361 if (css_uniq[u] == 1) continue;
3362
3363 css_uniq[u] = 1;
3364
3365 cs->cs_buf[cs->cs_len] = u;
3366
3367 cs->cs_len++;
3368 }
3369
3370 myfree (css_uniq);
3371 }
3372
3373 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3374 {
3375 size_t in_pos;
3376
3377 for (in_pos = 0; in_pos < in_len; in_pos++)
3378 {
3379 uint p0 = in_buf[in_pos] & 0xff;
3380
3381 if (interpret == 1 && p0 == '?')
3382 {
3383 in_pos++;
3384
3385 if (in_pos == in_len) break;
3386
3387 uint p1 = in_buf[in_pos] & 0xff;
3388
3389 switch (p1)
3390 {
3391 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3392 break;
3393 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3394 break;
3395 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3396 break;
3397 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3398 break;
3399 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3400 break;
3401 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3402 break;
3403 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3404 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3405 break;
3406 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3407 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3408 break;
3409 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3410 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3411 break;
3412 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3413 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3414 break;
3415 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3416 break;
3417 default: log_error ("Syntax error: %s", in_buf);
3418 exit (-1);
3419 }
3420 }
3421 else
3422 {
3423 if (data.hex_charset)
3424 {
3425 in_pos++;
3426
3427 if (in_pos == in_len)
3428 {
3429 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3430
3431 exit (-1);
3432 }
3433
3434 uint p1 = in_buf[in_pos] & 0xff;
3435
3436 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3437 {
3438 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3439
3440 exit (-1);
3441 }
3442
3443 uint chr = 0;
3444
3445 chr = hex_convert (p1) << 0;
3446 chr |= hex_convert (p0) << 4;
3447
3448 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3449 }
3450 else
3451 {
3452 uint chr = p0;
3453
3454 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3455 }
3456 }
3457 }
3458 }
3459
3460 u64 mp_get_sum (uint css_cnt, cs_t *css)
3461 {
3462 u64 sum = 1;
3463
3464 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3465 {
3466 sum *= css[css_pos].cs_len;
3467 }
3468
3469 return (sum);
3470 }
3471
3472 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3473 {
3474 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3475
3476 uint mask_pos;
3477 uint css_pos;
3478
3479 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3480 {
3481 char p0 = mask_buf[mask_pos];
3482
3483 if (p0 == '?')
3484 {
3485 mask_pos++;
3486
3487 if (mask_pos == mask_len) break;
3488
3489 char p1 = mask_buf[mask_pos];
3490
3491 uint chr = p1;
3492
3493 switch (p1)
3494 {
3495 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3496 break;
3497 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3498 break;
3499 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3500 break;
3501 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3502 break;
3503 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3504 break;
3505 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3506 break;
3507 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3508 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3509 break;
3510 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3511 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3512 break;
3513 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3514 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3515 break;
3516 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3517 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3518 break;
3519 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3520 break;
3521 default: log_error ("ERROR: syntax error: %s", mask_buf);
3522 exit (-1);
3523 }
3524 }
3525 else
3526 {
3527 if (data.hex_charset)
3528 {
3529 mask_pos++;
3530
3531 // if there is no 2nd hex character, show an error:
3532
3533 if (mask_pos == mask_len)
3534 {
3535 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3536
3537 exit (-1);
3538 }
3539
3540 char p1 = mask_buf[mask_pos];
3541
3542 // if they are not valid hex character, show an error:
3543
3544 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3545 {
3546 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3547
3548 exit (-1);
3549 }
3550
3551 uint chr = 0;
3552
3553 chr |= hex_convert (p1) << 0;
3554 chr |= hex_convert (p0) << 4;
3555
3556 mp_add_cs_buf (&chr, 1, css, css_pos);
3557 }
3558 else
3559 {
3560 uint chr = p0;
3561
3562 mp_add_cs_buf (&chr, 1, css, css_pos);
3563 }
3564 }
3565 }
3566
3567 if (css_pos == 0)
3568 {
3569 log_error ("ERROR: invalid mask length (0)");
3570
3571 exit (-1);
3572 }
3573
3574 *css_cnt = css_pos;
3575
3576 return (css);
3577 }
3578
3579 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3580 {
3581 for (int i = 0; i < css_cnt; i++)
3582 {
3583 uint len = css[i].cs_len;
3584 u64 next = val / len;
3585 uint pos = val % len;
3586 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3587 val = next;
3588 }
3589 }
3590
3591 void mp_cut_at (char *mask, uint max)
3592 {
3593 uint i;
3594 uint j;
3595 uint mask_len = strlen (mask);
3596
3597 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3598 {
3599 if (mask[i] == '?') i++;
3600 }
3601
3602 mask[i] = 0;
3603 }
3604
3605 void mp_setup_sys (cs_t *mp_sys)
3606 {
3607 uint pos;
3608 uint chr;
3609 uint donec[CHARSIZ];
3610
3611 memset (donec, 0, sizeof (donec));
3612
3613 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3614 mp_sys[0].cs_buf[pos++] = chr;
3615 mp_sys[0].cs_len = pos; }
3616
3617 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3618 mp_sys[1].cs_buf[pos++] = chr;
3619 mp_sys[1].cs_len = pos; }
3620
3621 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3622 mp_sys[2].cs_buf[pos++] = chr;
3623 mp_sys[2].cs_len = pos; }
3624
3625 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3626 mp_sys[3].cs_buf[pos++] = chr;
3627 mp_sys[3].cs_len = pos; }
3628
3629 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3630 mp_sys[4].cs_len = pos; }
3631
3632 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3633 mp_sys[5].cs_len = pos; }
3634 }
3635
3636 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3637 {
3638 FILE *fp = fopen (buf, "rb");
3639
3640 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3641 {
3642 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3643 }
3644 else
3645 {
3646 char mp_file[1024];
3647
3648 memset (mp_file, 0, sizeof (mp_file));
3649
3650 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3651
3652 fclose (fp);
3653
3654 len = in_superchop (mp_file);
3655
3656 if (len == 0)
3657 {
3658 log_info ("WARNING: charset file corrupted");
3659
3660 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3661 }
3662 else
3663 {
3664 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3665 }
3666 }
3667 }
3668
3669 void mp_reset_usr (cs_t *mp_usr, uint index)
3670 {
3671 mp_usr[index].cs_len = 0;
3672
3673 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3674 }
3675
3676 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3677 {
3678 char *new_mask_buf = (char *) mymalloc (256);
3679
3680 uint mask_pos;
3681
3682 uint css_pos;
3683
3684 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3685 {
3686 if (css_pos == len) break;
3687
3688 char p0 = mask_buf[mask_pos];
3689
3690 new_mask_buf[mask_pos] = p0;
3691
3692 if (p0 == '?')
3693 {
3694 mask_pos++;
3695
3696 if (mask_pos == mask_len) break;
3697
3698 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3699 }
3700 else
3701 {
3702 if (data.hex_charset)
3703 {
3704 mask_pos++;
3705
3706 if (mask_pos == mask_len)
3707 {
3708 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3709
3710 exit (-1);
3711 }
3712
3713 char p1 = mask_buf[mask_pos];
3714
3715 // if they are not valid hex character, show an error:
3716
3717 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3718 {
3719 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3720
3721 exit (-1);
3722 }
3723
3724 new_mask_buf[mask_pos] = p1;
3725 }
3726 }
3727 }
3728
3729 if (css_pos == len) return (new_mask_buf);
3730
3731 myfree (new_mask_buf);
3732
3733 return (NULL);
3734 }
3735
3736 /**
3737 * statprocessor
3738 */
3739
3740 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3741 {
3742 u64 sum = 1;
3743
3744 uint i;
3745
3746 for (i = start; i < stop; i++)
3747 {
3748 sum *= root_css_buf[i].cs_len;
3749 }
3750
3751 return (sum);
3752 }
3753
3754 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3755 {
3756 u64 v = ctx;
3757
3758 cs_t *cs = &root_css_buf[start];
3759
3760 uint i;
3761
3762 for (i = start; i < stop; i++)
3763 {
3764 const u64 m = v % cs->cs_len;
3765 const u64 d = v / cs->cs_len;
3766
3767 v = d;
3768
3769 const uint k = cs->cs_buf[m];
3770
3771 pw_buf[i - start] = (char) k;
3772
3773 cs = &markov_css_buf[(i * CHARSIZ) + k];
3774 }
3775 }
3776
3777 int sp_comp_val (const void *p1, const void *p2)
3778 {
3779 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3780 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3781
3782 return b2->val - b1->val;
3783 }
3784
3785 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)
3786 {
3787 uint i;
3788 uint j;
3789 uint k;
3790
3791 /**
3792 * Initialize hcstats
3793 */
3794
3795 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3796
3797 u64 *root_stats_ptr = root_stats_buf;
3798
3799 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3800
3801 for (i = 0; i < SP_PW_MAX; i++)
3802 {
3803 root_stats_buf_by_pos[i] = root_stats_ptr;
3804
3805 root_stats_ptr += CHARSIZ;
3806 }
3807
3808 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3809
3810 u64 *markov_stats_ptr = markov_stats_buf;
3811
3812 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3813
3814 for (i = 0; i < SP_PW_MAX; i++)
3815 {
3816 for (j = 0; j < CHARSIZ; j++)
3817 {
3818 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3819
3820 markov_stats_ptr += CHARSIZ;
3821 }
3822 }
3823
3824 /**
3825 * Load hcstats File
3826 */
3827
3828 if (hcstat == NULL)
3829 {
3830 char hcstat_tmp[256];
3831
3832 memset (hcstat_tmp, 0, sizeof (hcstat_tmp));
3833
3834 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3835
3836 hcstat = hcstat_tmp;
3837 }
3838
3839 FILE *fd = fopen (hcstat, "rb");
3840
3841 if (fd == NULL)
3842 {
3843 log_error ("%s: %s", hcstat, strerror (errno));
3844
3845 exit (-1);
3846 }
3847
3848 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3849 {
3850 log_error ("%s: Could not load data", hcstat);
3851
3852 exit (-1);
3853 }
3854
3855 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3856 {
3857 log_error ("%s: Could not load data", hcstat);
3858
3859 exit (-1);
3860 }
3861
3862 fclose (fd);
3863
3864 /**
3865 * Markov modifier of hcstat_table on user request
3866 */
3867
3868 if (disable)
3869 {
3870 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3871 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3872 }
3873
3874 if (classic)
3875 {
3876 /* Add all stats to first position */
3877
3878 for (i = 1; i < SP_PW_MAX; i++)
3879 {
3880 u64 *out = root_stats_buf_by_pos[0];
3881 u64 *in = root_stats_buf_by_pos[i];
3882
3883 for (j = 0; j < CHARSIZ; j++)
3884 {
3885 *out++ += *in++;
3886 }
3887 }
3888
3889 for (i = 1; i < SP_PW_MAX; i++)
3890 {
3891 u64 *out = markov_stats_buf_by_key[0][0];
3892 u64 *in = markov_stats_buf_by_key[i][0];
3893
3894 for (j = 0; j < CHARSIZ; j++)
3895 {
3896 for (k = 0; k < CHARSIZ; k++)
3897 {
3898 *out++ += *in++;
3899 }
3900 }
3901 }
3902
3903 /* copy them to all pw_positions */
3904
3905 for (i = 1; i < SP_PW_MAX; i++)
3906 {
3907 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
3908 }
3909
3910 for (i = 1; i < SP_PW_MAX; i++)
3911 {
3912 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
3913 }
3914 }
3915
3916 /**
3917 * Initialize tables
3918 */
3919
3920 hcstat_table_t *root_table_ptr = root_table_buf;
3921
3922 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3923
3924 for (i = 0; i < SP_PW_MAX; i++)
3925 {
3926 root_table_buf_by_pos[i] = root_table_ptr;
3927
3928 root_table_ptr += CHARSIZ;
3929 }
3930
3931 hcstat_table_t *markov_table_ptr = markov_table_buf;
3932
3933 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3934
3935 for (i = 0; i < SP_PW_MAX; i++)
3936 {
3937 for (j = 0; j < CHARSIZ; j++)
3938 {
3939 markov_table_buf_by_key[i][j] = markov_table_ptr;
3940
3941 markov_table_ptr += CHARSIZ;
3942 }
3943 }
3944
3945 /**
3946 * Convert hcstat to tables
3947 */
3948
3949 for (i = 0; i < SP_ROOT_CNT; i++)
3950 {
3951 uint key = i % CHARSIZ;
3952
3953 root_table_buf[i].key = key;
3954 root_table_buf[i].val = root_stats_buf[i];
3955 }
3956
3957 for (i = 0; i < SP_MARKOV_CNT; i++)
3958 {
3959 uint key = i % CHARSIZ;
3960
3961 markov_table_buf[i].key = key;
3962 markov_table_buf[i].val = markov_stats_buf[i];
3963 }
3964
3965 myfree (root_stats_buf);
3966 myfree (markov_stats_buf);
3967
3968 /**
3969 * Finally sort them
3970 */
3971
3972 for (i = 0; i < SP_PW_MAX; i++)
3973 {
3974 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3975 }
3976
3977 for (i = 0; i < SP_PW_MAX; i++)
3978 {
3979 for (j = 0; j < CHARSIZ; j++)
3980 {
3981 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3982 }
3983 }
3984 }
3985
3986 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])
3987 {
3988 /**
3989 * Convert tables to css
3990 */
3991
3992 for (uint i = 0; i < SP_ROOT_CNT; i++)
3993 {
3994 uint pw_pos = i / CHARSIZ;
3995
3996 cs_t *cs = &root_css_buf[pw_pos];
3997
3998 if (cs->cs_len == threshold) continue;
3999
4000 uint key = root_table_buf[i].key;
4001
4002 if (uniq_tbls[pw_pos][key] == 0) continue;
4003
4004 cs->cs_buf[cs->cs_len] = key;
4005
4006 cs->cs_len++;
4007 }
4008
4009 /**
4010 * Convert table to css
4011 */
4012
4013 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4014 {
4015 uint c = i / CHARSIZ;
4016
4017 cs_t *cs = &markov_css_buf[c];
4018
4019 if (cs->cs_len == threshold) continue;
4020
4021 uint pw_pos = c / CHARSIZ;
4022
4023 uint key = markov_table_buf[i].key;
4024
4025 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4026
4027 cs->cs_buf[cs->cs_len] = key;
4028
4029 cs->cs_len++;
4030 }
4031
4032 /*
4033 for (uint i = 0; i < 8; i++)
4034 {
4035 for (uint j = 0x20; j < 0x80; j++)
4036 {
4037 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4038
4039 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4040
4041 for (uint k = 0; k < 10; k++)
4042 {
4043 printf (" %u\n", ptr->cs_buf[k]);
4044 }
4045 }
4046 }
4047 */
4048 }
4049
4050 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4051 {
4052 for (uint i = 0; i < SP_PW_MAX; i += 2)
4053 {
4054 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4055
4056 out += CHARSIZ;
4057 in += CHARSIZ;
4058
4059 out->key = 0;
4060 out->val = 1;
4061
4062 out++;
4063
4064 for (uint j = 1; j < CHARSIZ; j++)
4065 {
4066 out->key = j;
4067 out->val = 0;
4068
4069 out++;
4070 }
4071 }
4072 }
4073
4074 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4075 {
4076 for (uint i = 0; i < SP_PW_MAX; i += 2)
4077 {
4078 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4079
4080 out += CHARSIZ * CHARSIZ;
4081 in += CHARSIZ * CHARSIZ;
4082
4083 for (uint j = 0; j < CHARSIZ; j++)
4084 {
4085 out->key = 0;
4086 out->val = 1;
4087
4088 out++;
4089
4090 for (uint k = 1; k < CHARSIZ; k++)
4091 {
4092 out->key = k;
4093 out->val = 0;
4094
4095 out++;
4096 }
4097 }
4098 }
4099 }
4100
4101 /**
4102 * mixed shared functions
4103 */
4104
4105 void dump_hex (const u8 *s, const int sz)
4106 {
4107 for (int i = 0; i < sz; i++)
4108 {
4109 log_info_nn ("%02x ", s[i]);
4110 }
4111
4112 log_info ("");
4113 }
4114
4115 void usage_mini_print (const char *progname)
4116 {
4117 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4118 }
4119
4120 void usage_big_print (const char *progname)
4121 {
4122 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4123 }
4124
4125 char *get_exec_path ()
4126 {
4127 int exec_path_len = 1024;
4128
4129 char *exec_path = (char *) mymalloc (exec_path_len);
4130
4131 #ifdef LINUX
4132
4133 char tmp[32];
4134
4135 sprintf (tmp, "/proc/%d/exe", getpid ());
4136
4137 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4138
4139 #elif WIN
4140
4141 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4142
4143 #elif OSX
4144
4145 uint size = exec_path_len;
4146
4147 if (_NSGetExecutablePath (exec_path, &size) != 0)
4148 {
4149 log_error("! executable path buffer too small\n");
4150
4151 exit (-1);
4152 }
4153
4154 const int len = strlen (exec_path);
4155
4156 #else
4157 #error Your Operating System is not supported or detected
4158 #endif
4159
4160 exec_path[len] = 0;
4161
4162 return exec_path;
4163 }
4164
4165 char *get_install_dir (const char *progname)
4166 {
4167 char *install_dir = mystrdup (progname);
4168 char *last_slash = NULL;
4169
4170 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4171 {
4172 *last_slash = 0;
4173 }
4174 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4175 {
4176 *last_slash = 0;
4177 }
4178 else
4179 {
4180 install_dir[0] = '.';
4181 install_dir[1] = 0;
4182 }
4183
4184 return (install_dir);
4185 }
4186
4187 char *get_profile_dir (const char *homedir)
4188 {
4189 #define DOT_HASHCAT ".hashcat"
4190
4191 char *profile_dir = (char *) mymalloc (strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1);
4192
4193 sprintf (profile_dir, "%s/%s", homedir, DOT_HASHCAT);
4194
4195 return profile_dir;
4196 }
4197
4198 char *get_session_dir (const char *profile_dir)
4199 {
4200 #define SESSIONS_FOLDER "sessions"
4201
4202 char *session_dir = (char *) mymalloc (strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1);
4203
4204 sprintf (session_dir, "%s/%s", profile_dir, SESSIONS_FOLDER);
4205
4206 return session_dir;
4207 }
4208
4209 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4210 {
4211 uint crc = ~0;
4212
4213 FILE *fd = fopen (filename, "rb");
4214
4215 if (fd == NULL)
4216 {
4217 log_error ("%s: %s", filename, strerror (errno));
4218
4219 exit (-1);
4220 }
4221
4222 #define MAX_KEY_SIZE (1024 * 1024)
4223
4224 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4225
4226 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4227
4228 fclose (fd);
4229
4230 int kpos = 0;
4231
4232 for (int fpos = 0; fpos < nread; fpos++)
4233 {
4234 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4235
4236 keytab[kpos++] += (crc >> 24) & 0xff;
4237 keytab[kpos++] += (crc >> 16) & 0xff;
4238 keytab[kpos++] += (crc >> 8) & 0xff;
4239 keytab[kpos++] += (crc >> 0) & 0xff;
4240
4241 if (kpos >= 64) kpos = 0;
4242 }
4243
4244 myfree (buf);
4245 }
4246
4247 void set_cpu_affinity (char *cpu_affinity)
4248 {
4249 #ifdef WIN
4250 DWORD_PTR aff_mask = 0;
4251 #elif LINUX
4252 cpu_set_t cpuset;
4253 CPU_ZERO (&cpuset);
4254 #endif
4255
4256 if (cpu_affinity)
4257 {
4258 char *devices = strdup (cpu_affinity);
4259
4260 char *next = strtok (devices, ",");
4261
4262 do
4263 {
4264 uint cpu_id = atoi (next);
4265
4266 if (cpu_id == 0)
4267 {
4268 #ifdef WIN
4269 aff_mask = 0;
4270 #elif LINUX
4271 CPU_ZERO (&cpuset);
4272 #endif
4273
4274 break;
4275 }
4276
4277 if (cpu_id > 32)
4278 {
4279 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4280
4281 exit (-1);
4282 }
4283
4284 #ifdef WIN
4285 aff_mask |= 1 << (cpu_id - 1);
4286 #elif LINUX
4287 CPU_SET ((cpu_id - 1), &cpuset);
4288 #endif
4289
4290 } while ((next = strtok (NULL, ",")) != NULL);
4291
4292 free (devices);
4293 }
4294
4295 #ifdef WIN
4296 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4297 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4298 #elif LINUX
4299 pthread_t thread = pthread_self ();
4300 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4301 #endif
4302 }
4303
4304 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4305 {
4306 char *element, *end;
4307
4308 end = (char *) base + nmemb * size;
4309
4310 for (element = (char *) base; element < end; element += size)
4311 if (!compar (element, key))
4312 return element;
4313
4314 return NULL;
4315 }
4316
4317 int sort_by_salt (const void *v1, const void *v2)
4318 {
4319 const salt_t *s1 = (const salt_t *) v1;
4320 const salt_t *s2 = (const salt_t *) v2;
4321
4322 const int res1 = s1->salt_len - s2->salt_len;
4323
4324 if (res1 != 0) return (res1);
4325
4326 const int res2 = s1->salt_iter - s2->salt_iter;
4327
4328 if (res2 != 0) return (res2);
4329
4330 uint n;
4331
4332 n = 12;
4333
4334 while (n--)
4335 {
4336 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4337 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4338 }
4339
4340 n = 8;
4341
4342 while (n--)
4343 {
4344 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4345 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4346 }
4347
4348 return (0);
4349 }
4350
4351 int sort_by_salt_buf (const void *v1, const void *v2)
4352 {
4353 const pot_t *p1 = (const pot_t *) v1;
4354 const pot_t *p2 = (const pot_t *) v2;
4355
4356 const hash_t *h1 = &p1->hash;
4357 const hash_t *h2 = &p2->hash;
4358
4359 const salt_t *s1 = h1->salt;
4360 const salt_t *s2 = h2->salt;
4361
4362 uint n = 12;
4363
4364 while (n--)
4365 {
4366 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4367 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4368 }
4369
4370 return 0;
4371 }
4372
4373 int sort_by_hash_t_salt (const void *v1, const void *v2)
4374 {
4375 const hash_t *h1 = (const hash_t *) v1;
4376 const hash_t *h2 = (const hash_t *) v2;
4377
4378 const salt_t *s1 = h1->salt;
4379 const salt_t *s2 = h2->salt;
4380
4381 // testphase: this should work
4382 uint n = 12;
4383
4384 while (n--)
4385 {
4386 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4387 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4388 }
4389
4390 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4391 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4392 if (s1->salt_len > s2->salt_len) return ( 1);
4393 if (s1->salt_len < s2->salt_len) return (-1);
4394
4395 uint n = s1->salt_len;
4396
4397 while (n--)
4398 {
4399 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4400 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4401 }
4402 */
4403
4404 return 0;
4405 }
4406
4407 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4408 {
4409 const hash_t *h1 = (const hash_t *) v1;
4410 const hash_t *h2 = (const hash_t *) v2;
4411
4412 const salt_t *s1 = h1->salt;
4413 const salt_t *s2 = h2->salt;
4414
4415 // 12 - 2 (since last 2 uints contain the digest)
4416 uint n = 10;
4417
4418 while (n--)
4419 {
4420 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4421 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4422 }
4423
4424 return 0;
4425 }
4426
4427 int sort_by_hash_no_salt (const void *v1, const void *v2)
4428 {
4429 const hash_t *h1 = (const hash_t *) v1;
4430 const hash_t *h2 = (const hash_t *) v2;
4431
4432 const void *d1 = h1->digest;
4433 const void *d2 = h2->digest;
4434
4435 return data.sort_by_digest (d1, d2);
4436 }
4437
4438 int sort_by_hash (const void *v1, const void *v2)
4439 {
4440 const hash_t *h1 = (const hash_t *) v1;
4441 const hash_t *h2 = (const hash_t *) v2;
4442
4443 if (data.isSalted)
4444 {
4445 const salt_t *s1 = h1->salt;
4446 const salt_t *s2 = h2->salt;
4447
4448 int res = sort_by_salt (s1, s2);
4449
4450 if (res != 0) return (res);
4451 }
4452
4453 const void *d1 = h1->digest;
4454 const void *d2 = h2->digest;
4455
4456 return data.sort_by_digest (d1, d2);
4457 }
4458
4459 int sort_by_pot (const void *v1, const void *v2)
4460 {
4461 const pot_t *p1 = (const pot_t *) v1;
4462 const pot_t *p2 = (const pot_t *) v2;
4463
4464 const hash_t *h1 = &p1->hash;
4465 const hash_t *h2 = &p2->hash;
4466
4467 return sort_by_hash (h1, h2);
4468 }
4469
4470 int sort_by_mtime (const void *p1, const void *p2)
4471 {
4472 const char **f1 = (const char **) p1;
4473 const char **f2 = (const char **) p2;
4474
4475 struct stat s1; stat (*f1, &s1);
4476 struct stat s2; stat (*f2, &s2);
4477
4478 return s2.st_mtime - s1.st_mtime;
4479 }
4480
4481 int sort_by_cpu_rule (const void *p1, const void *p2)
4482 {
4483 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4484 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4485
4486 return memcmp (r1, r2, sizeof (cpu_rule_t));
4487 }
4488
4489 int sort_by_kernel_rule (const void *p1, const void *p2)
4490 {
4491 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4492 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4493
4494 return memcmp (r1, r2, sizeof (kernel_rule_t));
4495 }
4496
4497 int sort_by_stringptr (const void *p1, const void *p2)
4498 {
4499 const char **s1 = (const char **) p1;
4500 const char **s2 = (const char **) p2;
4501
4502 return strcmp (*s1, *s2);
4503 }
4504
4505 int sort_by_dictstat (const void *s1, const void *s2)
4506 {
4507 dictstat_t *d1 = (dictstat_t *) s1;
4508 dictstat_t *d2 = (dictstat_t *) s2;
4509
4510 #ifdef LINUX
4511 d2->stat.st_atim = d1->stat.st_atim;
4512 #else
4513 d2->stat.st_atime = d1->stat.st_atime;
4514 #endif
4515
4516 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4517 }
4518
4519 int sort_by_bitmap (const void *p1, const void *p2)
4520 {
4521 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4522 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4523
4524 return b1->collisions - b2->collisions;
4525 }
4526
4527 int sort_by_digest_4_2 (const void *v1, const void *v2)
4528 {
4529 const u32 *d1 = (const u32 *) v1;
4530 const u32 *d2 = (const u32 *) v2;
4531
4532 uint n = 2;
4533
4534 while (n--)
4535 {
4536 if (d1[n] > d2[n]) return ( 1);
4537 if (d1[n] < d2[n]) return (-1);
4538 }
4539
4540 return (0);
4541 }
4542
4543 int sort_by_digest_4_4 (const void *v1, const void *v2)
4544 {
4545 const u32 *d1 = (const u32 *) v1;
4546 const u32 *d2 = (const u32 *) v2;
4547
4548 uint n = 4;
4549
4550 while (n--)
4551 {
4552 if (d1[n] > d2[n]) return ( 1);
4553 if (d1[n] < d2[n]) return (-1);
4554 }
4555
4556 return (0);
4557 }
4558
4559 int sort_by_digest_4_5 (const void *v1, const void *v2)
4560 {
4561 const u32 *d1 = (const u32 *) v1;
4562 const u32 *d2 = (const u32 *) v2;
4563
4564 uint n = 5;
4565
4566 while (n--)
4567 {
4568 if (d1[n] > d2[n]) return ( 1);
4569 if (d1[n] < d2[n]) return (-1);
4570 }
4571
4572 return (0);
4573 }
4574
4575 int sort_by_digest_4_6 (const void *v1, const void *v2)
4576 {
4577 const u32 *d1 = (const u32 *) v1;
4578 const u32 *d2 = (const u32 *) v2;
4579
4580 uint n = 6;
4581
4582 while (n--)
4583 {
4584 if (d1[n] > d2[n]) return ( 1);
4585 if (d1[n] < d2[n]) return (-1);
4586 }
4587
4588 return (0);
4589 }
4590
4591 int sort_by_digest_4_8 (const void *v1, const void *v2)
4592 {
4593 const u32 *d1 = (const u32 *) v1;
4594 const u32 *d2 = (const u32 *) v2;
4595
4596 uint n = 8;
4597
4598 while (n--)
4599 {
4600 if (d1[n] > d2[n]) return ( 1);
4601 if (d1[n] < d2[n]) return (-1);
4602 }
4603
4604 return (0);
4605 }
4606
4607 int sort_by_digest_4_16 (const void *v1, const void *v2)
4608 {
4609 const u32 *d1 = (const u32 *) v1;
4610 const u32 *d2 = (const u32 *) v2;
4611
4612 uint n = 16;
4613
4614 while (n--)
4615 {
4616 if (d1[n] > d2[n]) return ( 1);
4617 if (d1[n] < d2[n]) return (-1);
4618 }
4619
4620 return (0);
4621 }
4622
4623 int sort_by_digest_4_32 (const void *v1, const void *v2)
4624 {
4625 const u32 *d1 = (const u32 *) v1;
4626 const u32 *d2 = (const u32 *) v2;
4627
4628 uint n = 32;
4629
4630 while (n--)
4631 {
4632 if (d1[n] > d2[n]) return ( 1);
4633 if (d1[n] < d2[n]) return (-1);
4634 }
4635
4636 return (0);
4637 }
4638
4639 int sort_by_digest_4_64 (const void *v1, const void *v2)
4640 {
4641 const u32 *d1 = (const u32 *) v1;
4642 const u32 *d2 = (const u32 *) v2;
4643
4644 uint n = 64;
4645
4646 while (n--)
4647 {
4648 if (d1[n] > d2[n]) return ( 1);
4649 if (d1[n] < d2[n]) return (-1);
4650 }
4651
4652 return (0);
4653 }
4654
4655 int sort_by_digest_8_8 (const void *v1, const void *v2)
4656 {
4657 const u64 *d1 = (const u64 *) v1;
4658 const u64 *d2 = (const u64 *) v2;
4659
4660 uint n = 8;
4661
4662 while (n--)
4663 {
4664 if (d1[n] > d2[n]) return ( 1);
4665 if (d1[n] < d2[n]) return (-1);
4666 }
4667
4668 return (0);
4669 }
4670
4671 int sort_by_digest_8_16 (const void *v1, const void *v2)
4672 {
4673 const u64 *d1 = (const u64 *) v1;
4674 const u64 *d2 = (const u64 *) v2;
4675
4676 uint n = 16;
4677
4678 while (n--)
4679 {
4680 if (d1[n] > d2[n]) return ( 1);
4681 if (d1[n] < d2[n]) return (-1);
4682 }
4683
4684 return (0);
4685 }
4686
4687 int sort_by_digest_8_25 (const void *v1, const void *v2)
4688 {
4689 const u64 *d1 = (const u64 *) v1;
4690 const u64 *d2 = (const u64 *) v2;
4691
4692 uint n = 25;
4693
4694 while (n--)
4695 {
4696 if (d1[n] > d2[n]) return ( 1);
4697 if (d1[n] < d2[n]) return (-1);
4698 }
4699
4700 return (0);
4701 }
4702
4703 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4704 {
4705 const u32 *d1 = (const u32 *) v1;
4706 const u32 *d2 = (const u32 *) v2;
4707
4708 const uint dgst_pos0 = data.dgst_pos0;
4709 const uint dgst_pos1 = data.dgst_pos1;
4710 const uint dgst_pos2 = data.dgst_pos2;
4711 const uint dgst_pos3 = data.dgst_pos3;
4712
4713 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4714 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4715 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4716 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4717 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4718 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4719 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4720 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4721
4722 return (0);
4723 }
4724
4725 void format_debug (char *debug_file, uint debug_mode, unsigned char *orig_plain_ptr, uint orig_plain_len, unsigned char *mod_plain_ptr, uint mod_plain_len, char *rule_buf, int rule_len)
4726 {
4727 uint outfile_autohex = data.outfile_autohex;
4728
4729 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4730
4731 FILE *debug_fp = NULL;
4732
4733 if (debug_file != NULL)
4734 {
4735 debug_fp = fopen (debug_file, "ab");
4736 }
4737 else
4738 {
4739 debug_fp = stderr;
4740 }
4741
4742 if (debug_fp == NULL)
4743 {
4744 log_info ("WARNING: Could not open debug-file for writing");
4745 }
4746 else
4747 {
4748 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4749 {
4750 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4751
4752 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4753 }
4754
4755 fwrite (rule_ptr, rule_len, 1, debug_fp);
4756
4757 if (debug_mode == 4)
4758 {
4759 fputc (':', debug_fp);
4760
4761 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4762 }
4763
4764 fputc ('\n', debug_fp);
4765
4766 if (debug_file != NULL) fclose (debug_fp);
4767 }
4768 }
4769
4770 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4771 {
4772 int needs_hexify = 0;
4773
4774 if (outfile_autohex == 1)
4775 {
4776 for (uint i = 0; i < plain_len; i++)
4777 {
4778 if (plain_ptr[i] < 0x20)
4779 {
4780 needs_hexify = 1;
4781
4782 break;
4783 }
4784
4785 if (plain_ptr[i] > 0x7f)
4786 {
4787 needs_hexify = 1;
4788
4789 break;
4790 }
4791 }
4792 }
4793
4794 if (needs_hexify == 1)
4795 {
4796 fprintf (fp, "$HEX[");
4797
4798 for (uint i = 0; i < plain_len; i++)
4799 {
4800 fprintf (fp, "%02x", plain_ptr[i]);
4801 }
4802
4803 fprintf (fp, "]");
4804 }
4805 else
4806 {
4807 fwrite (plain_ptr, plain_len, 1, fp);
4808 }
4809 }
4810
4811 void format_output (FILE *out_fp, char *out_buf, unsigned char *plain_ptr, const uint plain_len, const u64 crackpos, unsigned char *username, const uint user_len)
4812 {
4813 uint outfile_format = data.outfile_format;
4814
4815 char separator = data.separator;
4816
4817 if (outfile_format & OUTFILE_FMT_HASH)
4818 {
4819 fprintf (out_fp, "%s", out_buf);
4820
4821 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4822 {
4823 fputc (separator, out_fp);
4824 }
4825 }
4826 else if (data.username)
4827 {
4828 if (username != NULL)
4829 {
4830 for (uint i = 0; i < user_len; i++)
4831 {
4832 fprintf (out_fp, "%c", username[i]);
4833 }
4834
4835 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4836 {
4837 fputc (separator, out_fp);
4838 }
4839 }
4840 }
4841
4842 if (outfile_format & OUTFILE_FMT_PLAIN)
4843 {
4844 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4845
4846 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4847 {
4848 fputc (separator, out_fp);
4849 }
4850 }
4851
4852 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4853 {
4854 for (uint i = 0; i < plain_len; i++)
4855 {
4856 fprintf (out_fp, "%02x", plain_ptr[i]);
4857 }
4858
4859 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4860 {
4861 fputc (separator, out_fp);
4862 }
4863 }
4864
4865 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4866 {
4867 #ifdef _WIN
4868 __mingw_fprintf (out_fp, "%llu", crackpos);
4869 #endif
4870
4871 #ifdef _POSIX
4872 #ifdef __x86_64__
4873 fprintf (out_fp, "%lu", (unsigned long) crackpos);
4874 #else
4875 fprintf (out_fp, "%llu", crackpos);
4876 #endif
4877 #endif
4878 }
4879
4880 fputc ('\n', out_fp);
4881 }
4882
4883 void handle_show_request (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hashes_buf, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
4884 {
4885 pot_t pot_key;
4886
4887 pot_key.hash.salt = hashes_buf->salt;
4888 pot_key.hash.digest = hashes_buf->digest;
4889
4890 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4891
4892 if (pot_ptr)
4893 {
4894 log_info_nn ("");
4895
4896 input_buf[input_len] = 0;
4897
4898 // user
4899 unsigned char *username = NULL;
4900 uint user_len = 0;
4901
4902 if (data.username)
4903 {
4904 user_t *user = hashes_buf->hash_info->user;
4905
4906 if (user)
4907 {
4908 username = (unsigned char *) (user->user_name);
4909
4910 user_len = user->user_len;
4911 }
4912 }
4913
4914 // do output the line
4915 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4916 }
4917 }
4918
4919 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4920 #define LM_MASKED_PLAIN "[notfound]"
4921
4922 void handle_show_request_lm (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hash_left, hash_t *hash_right, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
4923 {
4924 // left
4925
4926 pot_t pot_left_key;
4927
4928 pot_left_key.hash.salt = hash_left->salt;
4929 pot_left_key.hash.digest = hash_left->digest;
4930
4931 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4932
4933 // right
4934
4935 uint weak_hash_found = 0;
4936
4937 pot_t pot_right_key;
4938
4939 pot_right_key.hash.salt = hash_right->salt;
4940 pot_right_key.hash.digest = hash_right->digest;
4941
4942 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4943
4944 if (pot_right_ptr == NULL)
4945 {
4946 // special case, if "weak hash"
4947
4948 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4949 {
4950 weak_hash_found = 1;
4951
4952 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4953
4954 // in theory this is not needed, but we are paranoia:
4955
4956 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4957 pot_right_ptr->plain_len = 0;
4958 }
4959 }
4960
4961 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4962 {
4963 if (weak_hash_found == 1) myfree (pot_right_ptr); // this shouldn't happen at all: if weak_hash_found == 1, than pot_right_ptr is not NULL for sure
4964
4965 return;
4966 }
4967
4968 // at least one half was found:
4969
4970 log_info_nn ("");
4971
4972 input_buf[input_len] = 0;
4973
4974 // user
4975
4976 unsigned char *username = NULL;
4977 uint user_len = 0;
4978
4979 if (data.username)
4980 {
4981 user_t *user = hash_left->hash_info->user;
4982
4983 if (user)
4984 {
4985 username = (unsigned char *) (user->user_name);
4986
4987 user_len = user->user_len;
4988 }
4989 }
4990
4991 // mask the part which was not found
4992
4993 uint left_part_masked = 0;
4994 uint right_part_masked = 0;
4995
4996 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
4997
4998 if (pot_left_ptr == NULL)
4999 {
5000 left_part_masked = 1;
5001
5002 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5003
5004 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5005
5006 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5007 pot_left_ptr->plain_len = mask_plain_len;
5008 }
5009
5010 if (pot_right_ptr == NULL)
5011 {
5012 right_part_masked = 1;
5013
5014 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5015
5016 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5017
5018 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5019 pot_right_ptr->plain_len = mask_plain_len;
5020 }
5021
5022 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5023
5024 pot_t pot_ptr;
5025
5026 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5027
5028 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5029
5030 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5031
5032 // do output the line
5033
5034 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5035
5036 if (weak_hash_found == 1) myfree (pot_right_ptr);
5037
5038 if (left_part_masked == 1) myfree (pot_left_ptr);
5039 if (right_part_masked == 1) myfree (pot_right_ptr);
5040 }
5041
5042 void handle_left_request (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hashes_buf, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
5043 {
5044 pot_t pot_key;
5045
5046 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5047
5048 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5049
5050 if (pot_ptr == NULL)
5051 {
5052 log_info_nn ("");
5053
5054 input_buf[input_len] = 0;
5055
5056 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5057 }
5058 }
5059
5060 void handle_left_request_lm (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hash_left, hash_t *hash_right, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
5061 {
5062 // left
5063
5064 pot_t pot_left_key;
5065
5066 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5067
5068 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5069
5070 // right
5071
5072 pot_t pot_right_key;
5073
5074 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5075
5076 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5077
5078 uint weak_hash_found = 0;
5079
5080 if (pot_right_ptr == NULL)
5081 {
5082 // special case, if "weak hash"
5083
5084 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5085 {
5086 weak_hash_found = 1;
5087
5088 // we just need that pot_right_ptr is not a NULL pointer
5089
5090 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5091 }
5092 }
5093
5094 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5095 {
5096 if (weak_hash_found == 1) myfree (pot_right_ptr);
5097
5098 return;
5099 }
5100
5101 // ... at least one part was not cracked
5102
5103 log_info_nn ("");
5104
5105 input_buf[input_len] = 0;
5106
5107 // only show the hash part which is still not cracked
5108
5109 uint user_len = input_len - 32;
5110
5111 char *hash_output = (char *) mymalloc (33);
5112
5113 memcpy (hash_output, input_buf, input_len);
5114
5115 if (pot_left_ptr != NULL)
5116 {
5117 // only show right part (because left part was already found)
5118
5119 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5120
5121 hash_output[user_len + 16] = 0;
5122 }
5123
5124 if (pot_right_ptr != NULL)
5125 {
5126 // only show left part (because right part was already found)
5127
5128 memcpy (hash_output + user_len, input_buf + user_len, 16);
5129
5130 hash_output[user_len + 16] = 0;
5131 }
5132
5133 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5134
5135 myfree (hash_output);
5136
5137 if (weak_hash_found == 1) myfree (pot_right_ptr);
5138 }
5139
5140 uint setup_opencl_platforms_filter (char *opencl_platforms)
5141 {
5142 uint opencl_platforms_filter = 0;
5143
5144 if (opencl_platforms)
5145 {
5146 char *platforms = strdup (opencl_platforms);
5147
5148 char *next = strtok (platforms, ",");
5149
5150 do
5151 {
5152 int platform = atoi (next);
5153
5154 if (platform < 1 || platform > 32)
5155 {
5156 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5157
5158 exit (-1);
5159 }
5160
5161 opencl_platforms_filter |= 1 << (platform - 1);
5162
5163 } while ((next = strtok (NULL, ",")) != NULL);
5164
5165 free (platforms);
5166 }
5167 else
5168 {
5169 opencl_platforms_filter = -1;
5170 }
5171
5172 return opencl_platforms_filter;
5173 }
5174
5175 u32 setup_devices_filter (char *opencl_devices)
5176 {
5177 u32 devices_filter = 0;
5178
5179 if (opencl_devices)
5180 {
5181 char *devices = strdup (opencl_devices);
5182
5183 char *next = strtok (devices, ",");
5184
5185 do
5186 {
5187 int device_id = atoi (next);
5188
5189 if (device_id < 1 || device_id > 32)
5190 {
5191 log_error ("ERROR: invalid device_id %u specified", device_id);
5192
5193 exit (-1);
5194 }
5195
5196 devices_filter |= 1 << (device_id - 1);
5197
5198 } while ((next = strtok (NULL, ",")) != NULL);
5199
5200 free (devices);
5201 }
5202 else
5203 {
5204 devices_filter = -1;
5205 }
5206
5207 return devices_filter;
5208 }
5209
5210 cl_device_type setup_device_types_filter (char *opencl_device_types)
5211 {
5212 cl_device_type device_types_filter = 0;
5213
5214 if (opencl_device_types)
5215 {
5216 char *device_types = strdup (opencl_device_types);
5217
5218 char *next = strtok (device_types, ",");
5219
5220 do
5221 {
5222 int device_type = atoi (next);
5223
5224 if (device_type < 1 || device_type > 3)
5225 {
5226 log_error ("ERROR: invalid device_type %u specified", device_type);
5227
5228 exit (-1);
5229 }
5230
5231 device_types_filter |= 1 << device_type;
5232
5233 } while ((next = strtok (NULL, ",")) != NULL);
5234
5235 free (device_types);
5236 }
5237 else
5238 {
5239 // Do not use CPU by default, this often reduces GPU performance because
5240 // the CPU is too busy to handle GPU synchronization
5241
5242 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5243 }
5244
5245 return device_types_filter;
5246 }
5247
5248 u32 get_random_num (const u32 min, const u32 max)
5249 {
5250 if (min == max) return (min);
5251
5252 return ((rand () % (max - min)) + min);
5253 }
5254
5255 u32 mydivc32 (const u32 dividend, const u32 divisor)
5256 {
5257 u32 quotient = dividend / divisor;
5258
5259 if (dividend % divisor) quotient++;
5260
5261 return quotient;
5262 }
5263
5264 u64 mydivc64 (const u64 dividend, const u64 divisor)
5265 {
5266 u64 quotient = dividend / divisor;
5267
5268 if (dividend % divisor) quotient++;
5269
5270 return quotient;
5271 }
5272
5273 void format_timer_display (struct tm *tm, char *buf, size_t len)
5274 {
5275 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5276 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5277
5278 if (tm->tm_year - 70)
5279 {
5280 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5281 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5282
5283 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5284 }
5285 else if (tm->tm_yday)
5286 {
5287 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5288 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5289
5290 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5291 }
5292 else if (tm->tm_hour)
5293 {
5294 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5295 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5296
5297 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5298 }
5299 else if (tm->tm_min)
5300 {
5301 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5302 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5303
5304 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5305 }
5306 else
5307 {
5308 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5309
5310 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5311 }
5312 }
5313
5314 void format_speed_display (float val, char *buf, size_t len)
5315 {
5316 if (val <= 0)
5317 {
5318 buf[0] = '0';
5319 buf[1] = ' ';
5320 buf[2] = 0;
5321
5322 return;
5323 }
5324
5325 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5326
5327 uint level = 0;
5328
5329 while (val > 99999)
5330 {
5331 val /= 1000;
5332
5333 level++;
5334 }
5335
5336 /* generate output */
5337
5338 if (level == 0)
5339 {
5340 snprintf (buf, len - 1, "%.0f ", val);
5341 }
5342 else
5343 {
5344 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5345 }
5346 }
5347
5348 void lowercase (u8 *buf, int len)
5349 {
5350 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5351 }
5352
5353 void uppercase (u8 *buf, int len)
5354 {
5355 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5356 }
5357
5358 int fgetl (FILE *fp, char *line_buf)
5359 {
5360 int line_len = 0;
5361
5362 while (!feof (fp))
5363 {
5364 const int c = fgetc (fp);
5365
5366 if (c == EOF) break;
5367
5368 line_buf[line_len] = (char) c;
5369
5370 line_len++;
5371
5372 if (line_len == BUFSIZ) line_len--;
5373
5374 if (c == '\n') break;
5375 }
5376
5377 if (line_len == 0) return 0;
5378
5379 if (line_buf[line_len - 1] == '\n')
5380 {
5381 line_len--;
5382
5383 line_buf[line_len] = 0;
5384 }
5385
5386 if (line_len == 0) return 0;
5387
5388 if (line_buf[line_len - 1] == '\r')
5389 {
5390 line_len--;
5391
5392 line_buf[line_len] = 0;
5393 }
5394
5395 return (line_len);
5396 }
5397
5398 int in_superchop (char *buf)
5399 {
5400 int len = strlen (buf);
5401
5402 while (len)
5403 {
5404 if (buf[len - 1] == '\n')
5405 {
5406 len--;
5407
5408 continue;
5409 }
5410
5411 if (buf[len - 1] == '\r')
5412 {
5413 len--;
5414
5415 continue;
5416 }
5417
5418 break;
5419 }
5420
5421 buf[len] = 0;
5422
5423 return len;
5424 }
5425
5426 char **scan_directory (const char *path)
5427 {
5428 char *tmp_path = mystrdup (path);
5429
5430 size_t tmp_path_len = strlen (tmp_path);
5431
5432 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5433 {
5434 tmp_path[tmp_path_len - 1] = 0;
5435
5436 tmp_path_len = strlen (tmp_path);
5437 }
5438
5439 char **files = NULL;
5440
5441 int num_files = 0;
5442
5443 DIR *d = NULL;
5444
5445 if ((d = opendir (tmp_path)) != NULL)
5446 {
5447 #ifdef OSX
5448 struct dirent e;
5449
5450 for (;;) {
5451 memset (&e, 0, sizeof (e));
5452 struct dirent *de = NULL;
5453
5454 if (readdir_r (d, &e, &de) != 0)
5455 {
5456 log_error ("ERROR: readdir_r() failed");
5457
5458 break;
5459 }
5460
5461 if (de == NULL) break;
5462 #else
5463 struct dirent *de;
5464
5465 while ((de = readdir (d)) != NULL)
5466 {
5467 #endif
5468 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5469
5470 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5471
5472 char *path_file = (char *) mymalloc (path_size + 1);
5473
5474 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5475
5476 path_file[path_size] = 0;
5477
5478 DIR *d_test;
5479
5480 if ((d_test = opendir (path_file)) != NULL)
5481 {
5482 closedir (d_test);
5483
5484 myfree (path_file);
5485 }
5486 else
5487 {
5488 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5489
5490 num_files++;
5491
5492 files[num_files - 1] = path_file;
5493 }
5494 }
5495
5496 closedir (d);
5497 }
5498 else if (errno == ENOTDIR)
5499 {
5500 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5501
5502 num_files++;
5503
5504 files[num_files - 1] = mystrdup (path);
5505 }
5506
5507 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5508
5509 num_files++;
5510
5511 files[num_files - 1] = NULL;
5512
5513 myfree (tmp_path);
5514
5515 return (files);
5516 }
5517
5518 int count_dictionaries (char **dictionary_files)
5519 {
5520 if (dictionary_files == NULL) return 0;
5521
5522 int cnt = 0;
5523
5524 for (int d = 0; dictionary_files[d] != NULL; d++)
5525 {
5526 cnt++;
5527 }
5528
5529 return (cnt);
5530 }
5531
5532 char *stroptitype (const uint opti_type)
5533 {
5534 switch (opti_type)
5535 {
5536 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5537 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5538 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5539 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5540 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5541 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5542 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5543 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5544 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5545 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5546 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5547 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5548 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5549 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5550 }
5551
5552 return (NULL);
5553 }
5554
5555 char *strparser (const uint parser_status)
5556 {
5557 switch (parser_status)
5558 {
5559 case PARSER_OK: return ((char *) PA_000); break;
5560 case PARSER_COMMENT: return ((char *) PA_001); break;
5561 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5562 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5563 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5564 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5565 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5566 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5567 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5568 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5569 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5570 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5571 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5572 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5573 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5574 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5575 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5576 }
5577
5578 return ((char *) PA_255);
5579 }
5580
5581 char *strhashtype (const uint hash_mode)
5582 {
5583 switch (hash_mode)
5584 {
5585 case 0: return ((char *) HT_00000); break;
5586 case 10: return ((char *) HT_00010); break;
5587 case 11: return ((char *) HT_00011); break;
5588 case 12: return ((char *) HT_00012); break;
5589 case 20: return ((char *) HT_00020); break;
5590 case 21: return ((char *) HT_00021); break;
5591 case 22: return ((char *) HT_00022); break;
5592 case 23: return ((char *) HT_00023); break;
5593 case 30: return ((char *) HT_00030); break;
5594 case 40: return ((char *) HT_00040); break;
5595 case 50: return ((char *) HT_00050); break;
5596 case 60: return ((char *) HT_00060); break;
5597 case 100: return ((char *) HT_00100); break;
5598 case 101: return ((char *) HT_00101); break;
5599 case 110: return ((char *) HT_00110); break;
5600 case 111: return ((char *) HT_00111); break;
5601 case 112: return ((char *) HT_00112); break;
5602 case 120: return ((char *) HT_00120); break;
5603 case 121: return ((char *) HT_00121); break;
5604 case 122: return ((char *) HT_00122); break;
5605 case 124: return ((char *) HT_00124); break;
5606 case 130: return ((char *) HT_00130); break;
5607 case 131: return ((char *) HT_00131); break;
5608 case 132: return ((char *) HT_00132); break;
5609 case 133: return ((char *) HT_00133); break;
5610 case 140: return ((char *) HT_00140); break;
5611 case 141: return ((char *) HT_00141); break;
5612 case 150: return ((char *) HT_00150); break;
5613 case 160: return ((char *) HT_00160); break;
5614 case 190: return ((char *) HT_00190); break;
5615 case 200: return ((char *) HT_00200); break;
5616 case 300: return ((char *) HT_00300); break;
5617 case 400: return ((char *) HT_00400); break;
5618 case 500: return ((char *) HT_00500); break;
5619 case 501: return ((char *) HT_00501); break;
5620 case 900: return ((char *) HT_00900); break;
5621 case 910: return ((char *) HT_00910); break;
5622 case 1000: return ((char *) HT_01000); break;
5623 case 1100: return ((char *) HT_01100); break;
5624 case 1400: return ((char *) HT_01400); break;
5625 case 1410: return ((char *) HT_01410); break;
5626 case 1420: return ((char *) HT_01420); break;
5627 case 1421: return ((char *) HT_01421); break;
5628 case 1430: return ((char *) HT_01430); break;
5629 case 1440: return ((char *) HT_01440); break;
5630 case 1441: return ((char *) HT_01441); break;
5631 case 1450: return ((char *) HT_01450); break;
5632 case 1460: return ((char *) HT_01460); break;
5633 case 1500: return ((char *) HT_01500); break;
5634 case 1600: return ((char *) HT_01600); break;
5635 case 1700: return ((char *) HT_01700); break;
5636 case 1710: return ((char *) HT_01710); break;
5637 case 1711: return ((char *) HT_01711); break;
5638 case 1720: return ((char *) HT_01720); break;
5639 case 1722: return ((char *) HT_01722); break;
5640 case 1730: return ((char *) HT_01730); break;
5641 case 1731: return ((char *) HT_01731); break;
5642 case 1740: return ((char *) HT_01740); break;
5643 case 1750: return ((char *) HT_01750); break;
5644 case 1760: return ((char *) HT_01760); break;
5645 case 1800: return ((char *) HT_01800); break;
5646 case 2100: return ((char *) HT_02100); break;
5647 case 2400: return ((char *) HT_02400); break;
5648 case 2410: return ((char *) HT_02410); break;
5649 case 2500: return ((char *) HT_02500); break;
5650 case 2600: return ((char *) HT_02600); break;
5651 case 2611: return ((char *) HT_02611); break;
5652 case 2612: return ((char *) HT_02612); break;
5653 case 2711: return ((char *) HT_02711); break;
5654 case 2811: return ((char *) HT_02811); break;
5655 case 3000: return ((char *) HT_03000); break;
5656 case 3100: return ((char *) HT_03100); break;
5657 case 3200: return ((char *) HT_03200); break;
5658 case 3710: return ((char *) HT_03710); break;
5659 case 3711: return ((char *) HT_03711); break;
5660 case 3800: return ((char *) HT_03800); break;
5661 case 4300: return ((char *) HT_04300); break;
5662 case 4400: return ((char *) HT_04400); break;
5663 case 4500: return ((char *) HT_04500); break;
5664 case 4700: return ((char *) HT_04700); break;
5665 case 4800: return ((char *) HT_04800); break;
5666 case 4900: return ((char *) HT_04900); break;
5667 case 5000: return ((char *) HT_05000); break;
5668 case 5100: return ((char *) HT_05100); break;
5669 case 5200: return ((char *) HT_05200); break;
5670 case 5300: return ((char *) HT_05300); break;
5671 case 5400: return ((char *) HT_05400); break;
5672 case 5500: return ((char *) HT_05500); break;
5673 case 5600: return ((char *) HT_05600); break;
5674 case 5700: return ((char *) HT_05700); break;
5675 case 5800: return ((char *) HT_05800); break;
5676 case 6000: return ((char *) HT_06000); break;
5677 case 6100: return ((char *) HT_06100); break;
5678 case 6211: return ((char *) HT_06211); break;
5679 case 6212: return ((char *) HT_06212); break;
5680 case 6213: return ((char *) HT_06213); break;
5681 case 6221: return ((char *) HT_06221); break;
5682 case 6222: return ((char *) HT_06222); break;
5683 case 6223: return ((char *) HT_06223); break;
5684 case 6231: return ((char *) HT_06231); break;
5685 case 6232: return ((char *) HT_06232); break;
5686 case 6233: return ((char *) HT_06233); break;
5687 case 6241: return ((char *) HT_06241); break;
5688 case 6242: return ((char *) HT_06242); break;
5689 case 6243: return ((char *) HT_06243); break;
5690 case 6300: return ((char *) HT_06300); break;
5691 case 6400: return ((char *) HT_06400); break;
5692 case 6500: return ((char *) HT_06500); break;
5693 case 6600: return ((char *) HT_06600); break;
5694 case 6700: return ((char *) HT_06700); break;
5695 case 6800: return ((char *) HT_06800); break;
5696 case 6900: return ((char *) HT_06900); break;
5697 case 7100: return ((char *) HT_07100); break;
5698 case 7200: return ((char *) HT_07200); break;
5699 case 7300: return ((char *) HT_07300); break;
5700 case 7400: return ((char *) HT_07400); break;
5701 case 7500: return ((char *) HT_07500); break;
5702 case 7600: return ((char *) HT_07600); break;
5703 case 7700: return ((char *) HT_07700); break;
5704 case 7800: return ((char *) HT_07800); break;
5705 case 7900: return ((char *) HT_07900); break;
5706 case 8000: return ((char *) HT_08000); break;
5707 case 8100: return ((char *) HT_08100); break;
5708 case 8200: return ((char *) HT_08200); break;
5709 case 8300: return ((char *) HT_08300); break;
5710 case 8400: return ((char *) HT_08400); break;
5711 case 8500: return ((char *) HT_08500); break;
5712 case 8600: return ((char *) HT_08600); break;
5713 case 8700: return ((char *) HT_08700); break;
5714 case 8800: return ((char *) HT_08800); break;
5715 case 8900: return ((char *) HT_08900); break;
5716 case 9000: return ((char *) HT_09000); break;
5717 case 9100: return ((char *) HT_09100); break;
5718 case 9200: return ((char *) HT_09200); break;
5719 case 9300: return ((char *) HT_09300); break;
5720 case 9400: return ((char *) HT_09400); break;
5721 case 9500: return ((char *) HT_09500); break;
5722 case 9600: return ((char *) HT_09600); break;
5723 case 9700: return ((char *) HT_09700); break;
5724 case 9710: return ((char *) HT_09710); break;
5725 case 9720: return ((char *) HT_09720); break;
5726 case 9800: return ((char *) HT_09800); break;
5727 case 9810: return ((char *) HT_09810); break;
5728 case 9820: return ((char *) HT_09820); break;
5729 case 9900: return ((char *) HT_09900); break;
5730 case 10000: return ((char *) HT_10000); break;
5731 case 10100: return ((char *) HT_10100); break;
5732 case 10200: return ((char *) HT_10200); break;
5733 case 10300: return ((char *) HT_10300); break;
5734 case 10400: return ((char *) HT_10400); break;
5735 case 10410: return ((char *) HT_10410); break;
5736 case 10420: return ((char *) HT_10420); break;
5737 case 10500: return ((char *) HT_10500); break;
5738 case 10600: return ((char *) HT_10600); break;
5739 case 10700: return ((char *) HT_10700); break;
5740 case 10800: return ((char *) HT_10800); break;
5741 case 10900: return ((char *) HT_10900); break;
5742 case 11000: return ((char *) HT_11000); break;
5743 case 11100: return ((char *) HT_11100); break;
5744 case 11200: return ((char *) HT_11200); break;
5745 case 11300: return ((char *) HT_11300); break;
5746 case 11400: return ((char *) HT_11400); break;
5747 case 11500: return ((char *) HT_11500); break;
5748 case 11600: return ((char *) HT_11600); break;
5749 case 11700: return ((char *) HT_11700); break;
5750 case 11800: return ((char *) HT_11800); break;
5751 case 11900: return ((char *) HT_11900); break;
5752 case 12000: return ((char *) HT_12000); break;
5753 case 12100: return ((char *) HT_12100); break;
5754 case 12200: return ((char *) HT_12200); break;
5755 case 12300: return ((char *) HT_12300); break;
5756 case 12400: return ((char *) HT_12400); break;
5757 case 12500: return ((char *) HT_12500); break;
5758 case 12600: return ((char *) HT_12600); break;
5759 case 12700: return ((char *) HT_12700); break;
5760 case 12800: return ((char *) HT_12800); break;
5761 case 12900: return ((char *) HT_12900); break;
5762 case 13000: return ((char *) HT_13000); break;
5763 }
5764
5765 return ((char *) "Unknown");
5766 }
5767
5768 char *strstatus (const uint devices_status)
5769 {
5770 switch (devices_status)
5771 {
5772 case STATUS_INIT: return ((char *) ST_0000); break;
5773 case STATUS_STARTING: return ((char *) ST_0001); break;
5774 case STATUS_RUNNING: return ((char *) ST_0002); break;
5775 case STATUS_PAUSED: return ((char *) ST_0003); break;
5776 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5777 case STATUS_CRACKED: return ((char *) ST_0005); break;
5778 case STATUS_ABORTED: return ((char *) ST_0006); break;
5779 case STATUS_QUIT: return ((char *) ST_0007); break;
5780 case STATUS_BYPASS: return ((char *) ST_0008); break;
5781 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5782 }
5783
5784 return ((char *) "Unknown");
5785 }
5786
5787 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5788 {
5789 uint hash_type = data.hash_type;
5790 uint hash_mode = data.hash_mode;
5791 uint salt_type = data.salt_type;
5792 uint opts_type = data.opts_type;
5793 uint opti_type = data.opti_type;
5794 uint dgst_size = data.dgst_size;
5795
5796 char *hashfile = data.hashfile;
5797
5798 uint len = 4096;
5799
5800 uint digest_buf[64];
5801
5802 u64 *digest_buf64 = (u64 *) digest_buf;
5803
5804 char *digests_buf_ptr = (char *) data.digests_buf;
5805
5806 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5807
5808 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5809 {
5810 uint tt;
5811
5812 switch (hash_type)
5813 {
5814 case HASH_TYPE_DESCRYPT:
5815 FP (digest_buf[1], digest_buf[0], tt);
5816 break;
5817
5818 case HASH_TYPE_DESRACF:
5819 digest_buf[0] = rotl32 (digest_buf[0], 29);
5820 digest_buf[1] = rotl32 (digest_buf[1], 29);
5821
5822 FP (digest_buf[1], digest_buf[0], tt);
5823 break;
5824
5825 case HASH_TYPE_LM:
5826 FP (digest_buf[1], digest_buf[0], tt);
5827 break;
5828
5829 case HASH_TYPE_NETNTLM:
5830 digest_buf[0] = rotl32 (digest_buf[0], 29);
5831 digest_buf[1] = rotl32 (digest_buf[1], 29);
5832 digest_buf[2] = rotl32 (digest_buf[2], 29);
5833 digest_buf[3] = rotl32 (digest_buf[3], 29);
5834
5835 FP (digest_buf[1], digest_buf[0], tt);
5836 FP (digest_buf[3], digest_buf[2], tt);
5837 break;
5838
5839 case HASH_TYPE_BSDICRYPT:
5840 digest_buf[0] = rotl32 (digest_buf[0], 31);
5841 digest_buf[1] = rotl32 (digest_buf[1], 31);
5842
5843 FP (digest_buf[1], digest_buf[0], tt);
5844 break;
5845 }
5846 }
5847
5848 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5849 {
5850 switch (hash_type)
5851 {
5852 case HASH_TYPE_MD4:
5853 digest_buf[0] += MD4M_A;
5854 digest_buf[1] += MD4M_B;
5855 digest_buf[2] += MD4M_C;
5856 digest_buf[3] += MD4M_D;
5857 break;
5858
5859 case HASH_TYPE_MD5:
5860 digest_buf[0] += MD5M_A;
5861 digest_buf[1] += MD5M_B;
5862 digest_buf[2] += MD5M_C;
5863 digest_buf[3] += MD5M_D;
5864 break;
5865
5866 case HASH_TYPE_SHA1:
5867 digest_buf[0] += SHA1M_A;
5868 digest_buf[1] += SHA1M_B;
5869 digest_buf[2] += SHA1M_C;
5870 digest_buf[3] += SHA1M_D;
5871 digest_buf[4] += SHA1M_E;
5872 break;
5873
5874 case HASH_TYPE_SHA256:
5875 digest_buf[0] += SHA256M_A;
5876 digest_buf[1] += SHA256M_B;
5877 digest_buf[2] += SHA256M_C;
5878 digest_buf[3] += SHA256M_D;
5879 digest_buf[4] += SHA256M_E;
5880 digest_buf[5] += SHA256M_F;
5881 digest_buf[6] += SHA256M_G;
5882 digest_buf[7] += SHA256M_H;
5883 break;
5884
5885 case HASH_TYPE_SHA384:
5886 digest_buf64[0] += SHA384M_A;
5887 digest_buf64[1] += SHA384M_B;
5888 digest_buf64[2] += SHA384M_C;
5889 digest_buf64[3] += SHA384M_D;
5890 digest_buf64[4] += SHA384M_E;
5891 digest_buf64[5] += SHA384M_F;
5892 digest_buf64[6] += 0;
5893 digest_buf64[7] += 0;
5894 break;
5895
5896 case HASH_TYPE_SHA512:
5897 digest_buf64[0] += SHA512M_A;
5898 digest_buf64[1] += SHA512M_B;
5899 digest_buf64[2] += SHA512M_C;
5900 digest_buf64[3] += SHA512M_D;
5901 digest_buf64[4] += SHA512M_E;
5902 digest_buf64[5] += SHA512M_F;
5903 digest_buf64[6] += SHA512M_G;
5904 digest_buf64[7] += SHA512M_H;
5905 break;
5906 }
5907 }
5908
5909 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5910 {
5911 if (dgst_size == DGST_SIZE_4_2)
5912 {
5913 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5914 }
5915 else if (dgst_size == DGST_SIZE_4_4)
5916 {
5917 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5918 }
5919 else if (dgst_size == DGST_SIZE_4_5)
5920 {
5921 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5922 }
5923 else if (dgst_size == DGST_SIZE_4_6)
5924 {
5925 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5926 }
5927 else if (dgst_size == DGST_SIZE_4_8)
5928 {
5929 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5930 }
5931 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5932 {
5933 if (hash_type == HASH_TYPE_WHIRLPOOL)
5934 {
5935 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5936 }
5937 else if (hash_type == HASH_TYPE_SHA384)
5938 {
5939 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5940 }
5941 else if (hash_type == HASH_TYPE_SHA512)
5942 {
5943 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5944 }
5945 else if (hash_type == HASH_TYPE_GOST)
5946 {
5947 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5948 }
5949 }
5950 else if (dgst_size == DGST_SIZE_4_64)
5951 {
5952 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5953 }
5954 else if (dgst_size == DGST_SIZE_8_25)
5955 {
5956 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5957 }
5958 }
5959
5960 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5961 | (data.salt_type == SALT_TYPE_EXTERN)
5962 | (data.salt_type == SALT_TYPE_EMBEDDED));
5963
5964 salt_t salt;
5965
5966 if (isSalted)
5967 {
5968 memset (&salt, 0, sizeof (salt_t));
5969
5970 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5971
5972 char *ptr = (char *) salt.salt_buf;
5973
5974 uint len = salt.salt_len;
5975
5976 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5977 {
5978 uint tt;
5979
5980 switch (hash_type)
5981 {
5982 case HASH_TYPE_NETNTLM:
5983
5984 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
5985 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
5986
5987 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
5988
5989 break;
5990 }
5991 }
5992
5993 if (opts_type & OPTS_TYPE_ST_UNICODE)
5994 {
5995 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5996 {
5997 ptr[i] = ptr[j];
5998 }
5999
6000 len = len / 2;
6001 }
6002
6003 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6004 {
6005 uint max = salt.salt_len / 4;
6006
6007 if (len % 4) max++;
6008
6009 for (uint i = 0; i < max; i++)
6010 {
6011 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6012 }
6013 }
6014
6015 if (opts_type & OPTS_TYPE_ST_HEX)
6016 {
6017 char tmp[64];
6018
6019 memset (tmp, 0, sizeof (tmp));
6020
6021 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6022 {
6023 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6024 }
6025
6026 len = len * 2;
6027
6028 memcpy (ptr, tmp, len);
6029 }
6030
6031 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6032
6033 memset (ptr + len, 0, memset_size);
6034
6035 salt.salt_len = len;
6036 }
6037
6038 //
6039 // some modes require special encoding
6040 //
6041
6042 uint out_buf_plain[256];
6043 uint out_buf_salt[256];
6044
6045 char tmp_buf[1024];
6046
6047 memset (out_buf_plain, 0, sizeof (out_buf_plain));
6048 memset (out_buf_salt, 0, sizeof (out_buf_salt));
6049
6050 memset (tmp_buf, 0, sizeof (tmp_buf));
6051
6052 char *ptr_plain = (char *) out_buf_plain;
6053 char *ptr_salt = (char *) out_buf_salt;
6054
6055 if (hash_mode == 22)
6056 {
6057 char username[30];
6058
6059 memset (username, 0, sizeof (username));
6060
6061 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6062
6063 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6064
6065 u16 *ptr = (u16 *) digest_buf;
6066
6067 tmp_buf[ 0] = sig[0];
6068 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6069 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6070 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6071 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6072 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6073 tmp_buf[ 6] = sig[1];
6074 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6075 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6076 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6077 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6078 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6079 tmp_buf[12] = sig[2];
6080 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6081 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6082 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6083 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6084 tmp_buf[17] = sig[3];
6085 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6086 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6087 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6088 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6089 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6090 tmp_buf[23] = sig[4];
6091 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6092 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6093 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6094 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6095 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6096 tmp_buf[29] = sig[5];
6097
6098 snprintf (out_buf, len-1, "%s:%s",
6099 tmp_buf,
6100 username);
6101 }
6102 else if (hash_mode == 23)
6103 {
6104 // do not show the \nskyper\n part in output
6105
6106 char *salt_buf_ptr = (char *) salt.salt_buf;
6107
6108 salt_buf_ptr[salt.salt_len - 8] = 0;
6109
6110 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6111 digest_buf[0],
6112 digest_buf[1],
6113 digest_buf[2],
6114 digest_buf[3],
6115 salt_buf_ptr);
6116 }
6117 else if (hash_mode == 101)
6118 {
6119 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6120
6121 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6122 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6123 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6124 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6125 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6126
6127 memcpy (tmp_buf, digest_buf, 20);
6128
6129 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6130
6131 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6132 }
6133 else if (hash_mode == 111)
6134 {
6135 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6136
6137 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6138 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6139 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6140 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6141 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6142
6143 memcpy (tmp_buf, digest_buf, 20);
6144 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6145
6146 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6147
6148 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6149 }
6150 else if (hash_mode == 122)
6151 {
6152 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6153 (char *) salt.salt_buf,
6154 digest_buf[0],
6155 digest_buf[1],
6156 digest_buf[2],
6157 digest_buf[3],
6158 digest_buf[4]);
6159 }
6160 else if (hash_mode == 124)
6161 {
6162 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6163 (char *) salt.salt_buf,
6164 digest_buf[0],
6165 digest_buf[1],
6166 digest_buf[2],
6167 digest_buf[3],
6168 digest_buf[4]);
6169 }
6170 else if (hash_mode == 131)
6171 {
6172 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6173 (char *) salt.salt_buf,
6174 0, 0, 0, 0, 0,
6175 digest_buf[0],
6176 digest_buf[1],
6177 digest_buf[2],
6178 digest_buf[3],
6179 digest_buf[4]);
6180 }
6181 else if (hash_mode == 132)
6182 {
6183 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6184 (char *) salt.salt_buf,
6185 digest_buf[0],
6186 digest_buf[1],
6187 digest_buf[2],
6188 digest_buf[3],
6189 digest_buf[4]);
6190 }
6191 else if (hash_mode == 133)
6192 {
6193 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6194
6195 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6196 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6197 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6198 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6199 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6200
6201 memcpy (tmp_buf, digest_buf, 20);
6202
6203 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6204
6205 snprintf (out_buf, len-1, "%s", ptr_plain);
6206 }
6207 else if (hash_mode == 141)
6208 {
6209 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6210
6211 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6212
6213 memset (tmp_buf, 0, sizeof (tmp_buf));
6214
6215 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6216
6217 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6218 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6219 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6220 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6221 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6222
6223 memcpy (tmp_buf, digest_buf, 20);
6224
6225 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6226
6227 ptr_plain[27] = 0;
6228
6229 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6230 }
6231 else if (hash_mode == 400)
6232 {
6233 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6234
6235 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6236 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6237 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6238 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6239
6240 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6241
6242 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6243 }
6244 else if (hash_mode == 500)
6245 {
6246 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6247
6248 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6249 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6250 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6251 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6252
6253 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6254
6255 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6256 {
6257 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6258 }
6259 else
6260 {
6261 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6262 }
6263 }
6264 else if (hash_mode == 501)
6265 {
6266 uint digest_idx = salt.digests_offset + digest_pos;
6267
6268 hashinfo_t **hashinfo_ptr = data.hash_info;
6269 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6270
6271 snprintf (out_buf, len-1, "%s", hash_buf);
6272 }
6273 else if (hash_mode == 1421)
6274 {
6275 u8 *salt_ptr = (u8 *) salt.salt_buf;
6276
6277 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6278 salt_ptr[0],
6279 salt_ptr[1],
6280 salt_ptr[2],
6281 salt_ptr[3],
6282 salt_ptr[4],
6283 salt_ptr[5],
6284 digest_buf[0],
6285 digest_buf[1],
6286 digest_buf[2],
6287 digest_buf[3],
6288 digest_buf[4],
6289 digest_buf[5],
6290 digest_buf[6],
6291 digest_buf[7]);
6292 }
6293 else if (hash_mode == 1441)
6294 {
6295 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6296
6297 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6298
6299 memset (tmp_buf, 0, sizeof (tmp_buf));
6300
6301 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6302
6303 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6304 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6305 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6306 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6307 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6308 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6309 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6310 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6311
6312 memcpy (tmp_buf, digest_buf, 32);
6313
6314 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6315
6316 ptr_plain[43] = 0;
6317
6318 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6319 }
6320 else if (hash_mode == 1500)
6321 {
6322 out_buf[0] = salt.salt_sign[0] & 0xff;
6323 out_buf[1] = salt.salt_sign[1] & 0xff;
6324 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6325 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6326 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6327
6328 memset (tmp_buf, 0, sizeof (tmp_buf));
6329
6330 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6331
6332 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6333 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6334
6335 memcpy (tmp_buf, digest_buf, 8);
6336
6337 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6338
6339 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6340
6341 out_buf[13] = 0;
6342 }
6343 else if (hash_mode == 1600)
6344 {
6345 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6346
6347 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6348 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6349 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6350 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6351
6352 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6353
6354 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6355 {
6356 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6357 }
6358 else
6359 {
6360 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6361 }
6362 }
6363 else if (hash_mode == 1711)
6364 {
6365 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6366
6367 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6368 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6369 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6370 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6371 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6372 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6373 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6374 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6375
6376 memcpy (tmp_buf, digest_buf, 64);
6377 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6378
6379 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6380
6381 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6382 }
6383 else if (hash_mode == 1722)
6384 {
6385 uint *ptr = digest_buf;
6386
6387 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6388 (unsigned char *) salt.salt_buf,
6389 ptr[ 1], ptr[ 0],
6390 ptr[ 3], ptr[ 2],
6391 ptr[ 5], ptr[ 4],
6392 ptr[ 7], ptr[ 6],
6393 ptr[ 9], ptr[ 8],
6394 ptr[11], ptr[10],
6395 ptr[13], ptr[12],
6396 ptr[15], ptr[14]);
6397 }
6398 else if (hash_mode == 1731)
6399 {
6400 uint *ptr = digest_buf;
6401
6402 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6403 (unsigned char *) salt.salt_buf,
6404 ptr[ 1], ptr[ 0],
6405 ptr[ 3], ptr[ 2],
6406 ptr[ 5], ptr[ 4],
6407 ptr[ 7], ptr[ 6],
6408 ptr[ 9], ptr[ 8],
6409 ptr[11], ptr[10],
6410 ptr[13], ptr[12],
6411 ptr[15], ptr[14]);
6412 }
6413 else if (hash_mode == 1800)
6414 {
6415 // temp workaround
6416
6417 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6418 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6419 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6420 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6421 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6422 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6423 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6424 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6425
6426 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6427
6428 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6429 {
6430 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6431 }
6432 else
6433 {
6434 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6435 }
6436 }
6437 else if (hash_mode == 2100)
6438 {
6439 uint pos = 0;
6440
6441 snprintf (out_buf + pos, len-1, "%s%i#",
6442 SIGNATURE_DCC2,
6443 salt.salt_iter + 1);
6444
6445 uint signature_len = strlen (out_buf);
6446
6447 pos += signature_len;
6448 len -= signature_len;
6449
6450 char *salt_ptr = (char *) salt.salt_buf;
6451
6452 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6453
6454 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6455 byte_swap_32 (digest_buf[0]),
6456 byte_swap_32 (digest_buf[1]),
6457 byte_swap_32 (digest_buf[2]),
6458 byte_swap_32 (digest_buf[3]));
6459 }
6460 else if ((hash_mode == 2400) || (hash_mode == 2410))
6461 {
6462 memcpy (tmp_buf, digest_buf, 16);
6463
6464 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6465
6466 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6467 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6468 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6469 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6470
6471 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6472 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6473 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6474 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6475
6476 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6477 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6478 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6479 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6480
6481 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6482 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6483 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6484 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6485
6486 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6487 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6488 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6489 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6490
6491 out_buf[16] = 0;
6492 }
6493 else if (hash_mode == 2500)
6494 {
6495 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6496
6497 wpa_t *wpa = &wpas[salt_pos];
6498
6499 uint pke[25];
6500
6501 char *pke_ptr = (char *) pke;
6502
6503 for (uint i = 0; i < 25; i++)
6504 {
6505 pke[i] = byte_swap_32 (wpa->pke[i]);
6506 }
6507
6508 unsigned char mac1[6];
6509 unsigned char mac2[6];
6510
6511 memcpy (mac1, pke_ptr + 23, 6);
6512 memcpy (mac2, pke_ptr + 29, 6);
6513
6514 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6515 (char *) salt.salt_buf,
6516 mac1[0],
6517 mac1[1],
6518 mac1[2],
6519 mac1[3],
6520 mac1[4],
6521 mac1[5],
6522 mac2[0],
6523 mac2[1],
6524 mac2[2],
6525 mac2[3],
6526 mac2[4],
6527 mac2[5]);
6528 }
6529 else if (hash_mode == 4400)
6530 {
6531 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6532 byte_swap_32 (digest_buf[0]),
6533 byte_swap_32 (digest_buf[1]),
6534 byte_swap_32 (digest_buf[2]),
6535 byte_swap_32 (digest_buf[3]));
6536 }
6537 else if (hash_mode == 4700)
6538 {
6539 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6540 byte_swap_32 (digest_buf[0]),
6541 byte_swap_32 (digest_buf[1]),
6542 byte_swap_32 (digest_buf[2]),
6543 byte_swap_32 (digest_buf[3]),
6544 byte_swap_32 (digest_buf[4]));
6545 }
6546 else if (hash_mode == 4800)
6547 {
6548 u8 chap_id_byte = (u8) salt.salt_buf[4];
6549
6550 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6551 digest_buf[0],
6552 digest_buf[1],
6553 digest_buf[2],
6554 digest_buf[3],
6555 byte_swap_32 (salt.salt_buf[0]),
6556 byte_swap_32 (salt.salt_buf[1]),
6557 byte_swap_32 (salt.salt_buf[2]),
6558 byte_swap_32 (salt.salt_buf[3]),
6559 chap_id_byte);
6560 }
6561 else if (hash_mode == 4900)
6562 {
6563 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6564 byte_swap_32 (digest_buf[0]),
6565 byte_swap_32 (digest_buf[1]),
6566 byte_swap_32 (digest_buf[2]),
6567 byte_swap_32 (digest_buf[3]),
6568 byte_swap_32 (digest_buf[4]));
6569 }
6570 else if (hash_mode == 5100)
6571 {
6572 snprintf (out_buf, len-1, "%08x%08x",
6573 digest_buf[0],
6574 digest_buf[1]);
6575 }
6576 else if (hash_mode == 5200)
6577 {
6578 snprintf (out_buf, len-1, "%s", hashfile);
6579 }
6580 else if (hash_mode == 5300)
6581 {
6582 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6583
6584 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6585
6586 int buf_len = len -1;
6587
6588 // msg_buf
6589
6590 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6591
6592 for (uint i = 0; i < ikepsk_msg_len; i++)
6593 {
6594 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6595 {
6596 snprintf (out_buf, buf_len, ":");
6597
6598 buf_len--;
6599 out_buf++;
6600 }
6601
6602 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6603
6604 buf_len -= 8;
6605 out_buf += 8;
6606 }
6607
6608 // nr_buf
6609
6610 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6611
6612 for (uint i = 0; i < ikepsk_nr_len; i++)
6613 {
6614 if ((i == 0) || (i == 5))
6615 {
6616 snprintf (out_buf, buf_len, ":");
6617
6618 buf_len--;
6619 out_buf++;
6620 }
6621
6622 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6623
6624 buf_len -= 8;
6625 out_buf += 8;
6626 }
6627
6628 // digest_buf
6629
6630 for (uint i = 0; i < 4; i++)
6631 {
6632 if (i == 0)
6633 {
6634 snprintf (out_buf, buf_len, ":");
6635
6636 buf_len--;
6637 out_buf++;
6638 }
6639
6640 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6641
6642 buf_len -= 8;
6643 out_buf += 8;
6644 }
6645 }
6646 else if (hash_mode == 5400)
6647 {
6648 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6649
6650 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6651
6652 int buf_len = len -1;
6653
6654 // msg_buf
6655
6656 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6657
6658 for (uint i = 0; i < ikepsk_msg_len; i++)
6659 {
6660 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6661 {
6662 snprintf (out_buf, buf_len, ":");
6663
6664 buf_len--;
6665 out_buf++;
6666 }
6667
6668 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6669
6670 buf_len -= 8;
6671 out_buf += 8;
6672 }
6673
6674 // nr_buf
6675
6676 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6677
6678 for (uint i = 0; i < ikepsk_nr_len; i++)
6679 {
6680 if ((i == 0) || (i == 5))
6681 {
6682 snprintf (out_buf, buf_len, ":");
6683
6684 buf_len--;
6685 out_buf++;
6686 }
6687
6688 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6689
6690 buf_len -= 8;
6691 out_buf += 8;
6692 }
6693
6694 // digest_buf
6695
6696 for (uint i = 0; i < 5; i++)
6697 {
6698 if (i == 0)
6699 {
6700 snprintf (out_buf, buf_len, ":");
6701
6702 buf_len--;
6703 out_buf++;
6704 }
6705
6706 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6707
6708 buf_len -= 8;
6709 out_buf += 8;
6710 }
6711 }
6712 else if (hash_mode == 5500)
6713 {
6714 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6715
6716 netntlm_t *netntlm = &netntlms[salt_pos];
6717
6718 char user_buf[64];
6719 char domain_buf[64];
6720 char srvchall_buf[1024];
6721 char clichall_buf[1024];
6722
6723 memset (user_buf, 0, sizeof (user_buf));
6724 memset (domain_buf, 0, sizeof (domain_buf));
6725 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6726 memset (clichall_buf, 0, sizeof (clichall_buf));
6727
6728 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6729 {
6730 char *ptr = (char *) netntlm->userdomain_buf;
6731
6732 user_buf[i] = ptr[j];
6733 }
6734
6735 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6736 {
6737 char *ptr = (char *) netntlm->userdomain_buf;
6738
6739 domain_buf[i] = ptr[netntlm->user_len + j];
6740 }
6741
6742 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6743 {
6744 u8 *ptr = (u8 *) netntlm->chall_buf;
6745
6746 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6747 }
6748
6749 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6750 {
6751 u8 *ptr = (u8 *) netntlm->chall_buf;
6752
6753 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6754 }
6755
6756 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6757 user_buf,
6758 domain_buf,
6759 srvchall_buf,
6760 digest_buf[0],
6761 digest_buf[1],
6762 digest_buf[2],
6763 digest_buf[3],
6764 byte_swap_32 (salt.salt_buf_pc[0]),
6765 byte_swap_32 (salt.salt_buf_pc[1]),
6766 clichall_buf);
6767 }
6768 else if (hash_mode == 5600)
6769 {
6770 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6771
6772 netntlm_t *netntlm = &netntlms[salt_pos];
6773
6774 char user_buf[64];
6775 char domain_buf[64];
6776 char srvchall_buf[1024];
6777 char clichall_buf[1024];
6778
6779 memset (user_buf, 0, sizeof (user_buf));
6780 memset (domain_buf, 0, sizeof (domain_buf));
6781 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6782 memset (clichall_buf, 0, sizeof (clichall_buf));
6783
6784 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6785 {
6786 char *ptr = (char *) netntlm->userdomain_buf;
6787
6788 user_buf[i] = ptr[j];
6789 }
6790
6791 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6792 {
6793 char *ptr = (char *) netntlm->userdomain_buf;
6794
6795 domain_buf[i] = ptr[netntlm->user_len + j];
6796 }
6797
6798 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6799 {
6800 u8 *ptr = (u8 *) netntlm->chall_buf;
6801
6802 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6803 }
6804
6805 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6806 {
6807 u8 *ptr = (u8 *) netntlm->chall_buf;
6808
6809 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6810 }
6811
6812 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6813 user_buf,
6814 domain_buf,
6815 srvchall_buf,
6816 digest_buf[0],
6817 digest_buf[1],
6818 digest_buf[2],
6819 digest_buf[3],
6820 clichall_buf);
6821 }
6822 else if (hash_mode == 5700)
6823 {
6824 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6825
6826 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6827 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6828 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6829 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6830 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6831 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6832 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6833 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6834
6835 memcpy (tmp_buf, digest_buf, 32);
6836
6837 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6838
6839 ptr_plain[43] = 0;
6840
6841 snprintf (out_buf, len-1, "%s", ptr_plain);
6842 }
6843 else if (hash_mode == 5800)
6844 {
6845 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6846 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6847 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6848 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6849 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6850
6851 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6852 digest_buf[0],
6853 digest_buf[1],
6854 digest_buf[2],
6855 digest_buf[3],
6856 digest_buf[4]);
6857 }
6858 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6859 {
6860 snprintf (out_buf, len-1, "%s", hashfile);
6861 }
6862 else if (hash_mode == 6300)
6863 {
6864 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6865
6866 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6867 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6868 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6869 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6870
6871 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6872
6873 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6874 }
6875 else if (hash_mode == 6400)
6876 {
6877 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6878
6879 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6880 }
6881 else if (hash_mode == 6500)
6882 {
6883 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6884
6885 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6886 }
6887 else if (hash_mode == 6600)
6888 {
6889 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6890
6891 agilekey_t *agilekey = &agilekeys[salt_pos];
6892
6893 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6894 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6895
6896 uint buf_len = len - 1;
6897
6898 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6899 buf_len -= 22;
6900
6901 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6902 {
6903 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6904
6905 buf_len -= 2;
6906 }
6907 }
6908 else if (hash_mode == 6700)
6909 {
6910 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6911
6912 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6913 }
6914 else if (hash_mode == 6800)
6915 {
6916 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6917 }
6918 else if (hash_mode == 7100)
6919 {
6920 uint *ptr = digest_buf;
6921
6922 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6923
6924 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6925
6926 uint esalt[16];
6927
6928 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6929 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6930 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6931 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6932 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6933 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6934 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6935 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6936
6937 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",
6938 SIGNATURE_SHA512OSX,
6939 salt.salt_iter + 1,
6940 esalt[ 0], esalt[ 1],
6941 esalt[ 2], esalt[ 3],
6942 esalt[ 4], esalt[ 5],
6943 esalt[ 6], esalt[ 7],
6944 ptr [ 1], ptr [ 0],
6945 ptr [ 3], ptr [ 2],
6946 ptr [ 5], ptr [ 4],
6947 ptr [ 7], ptr [ 6],
6948 ptr [ 9], ptr [ 8],
6949 ptr [11], ptr [10],
6950 ptr [13], ptr [12],
6951 ptr [15], ptr [14]);
6952 }
6953 else if (hash_mode == 7200)
6954 {
6955 uint *ptr = digest_buf;
6956
6957 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6958
6959 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6960
6961 uint len_used = 0;
6962
6963 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6964
6965 len_used = strlen (out_buf);
6966
6967 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6968
6969 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6970 {
6971 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6972 }
6973
6974 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",
6975 ptr [ 1], ptr [ 0],
6976 ptr [ 3], ptr [ 2],
6977 ptr [ 5], ptr [ 4],
6978 ptr [ 7], ptr [ 6],
6979 ptr [ 9], ptr [ 8],
6980 ptr [11], ptr [10],
6981 ptr [13], ptr [12],
6982 ptr [15], ptr [14]);
6983 }
6984 else if (hash_mode == 7300)
6985 {
6986 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6987
6988 rakp_t *rakp = &rakps[salt_pos];
6989
6990 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6991 {
6992 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6993 }
6994
6995 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6996 digest_buf[0],
6997 digest_buf[1],
6998 digest_buf[2],
6999 digest_buf[3],
7000 digest_buf[4]);
7001 }
7002 else if (hash_mode == 7400)
7003 {
7004 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7005
7006 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7007 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7008 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7009 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7010 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7011 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7012 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7013 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7014
7015 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7016
7017 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7018 {
7019 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7020 }
7021 else
7022 {
7023 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7024 }
7025 }
7026 else if (hash_mode == 7500)
7027 {
7028 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7029
7030 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7031
7032 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7033 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7034
7035 char data[128];
7036
7037 char *ptr_data = data;
7038
7039 for (uint i = 0; i < 36; i++, ptr_data += 2)
7040 {
7041 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7042 }
7043
7044 for (uint i = 0; i < 16; i++, ptr_data += 2)
7045 {
7046 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7047 }
7048
7049 *ptr_data = 0;
7050
7051 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7052 SIGNATURE_KRB5PA,
7053 (char *) krb5pa->user,
7054 (char *) krb5pa->realm,
7055 (char *) krb5pa->salt,
7056 data);
7057 }
7058 else if (hash_mode == 7700)
7059 {
7060 snprintf (out_buf, len-1, "%s$%08X%08X",
7061 (char *) salt.salt_buf,
7062 digest_buf[0],
7063 digest_buf[1]);
7064 }
7065 else if (hash_mode == 7800)
7066 {
7067 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7068 (char *) salt.salt_buf,
7069 digest_buf[0],
7070 digest_buf[1],
7071 digest_buf[2],
7072 digest_buf[3],
7073 digest_buf[4]);
7074 }
7075 else if (hash_mode == 7900)
7076 {
7077 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7078
7079 // ugly hack start
7080
7081 char *tmp = (char *) salt.salt_buf_pc;
7082
7083 ptr_plain[42] = tmp[0];
7084
7085 // ugly hack end
7086
7087 ptr_plain[43] = 0;
7088
7089 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7090 }
7091 else if (hash_mode == 8000)
7092 {
7093 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7094 (unsigned char *) salt.salt_buf,
7095 digest_buf[0],
7096 digest_buf[1],
7097 digest_buf[2],
7098 digest_buf[3],
7099 digest_buf[4],
7100 digest_buf[5],
7101 digest_buf[6],
7102 digest_buf[7]);
7103 }
7104 else if (hash_mode == 8100)
7105 {
7106 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7107 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7108
7109 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7110 (unsigned char *) salt.salt_buf,
7111 digest_buf[0],
7112 digest_buf[1],
7113 digest_buf[2],
7114 digest_buf[3],
7115 digest_buf[4]);
7116 }
7117 else if (hash_mode == 8200)
7118 {
7119 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7120
7121 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7122
7123 char data_buf[4096];
7124
7125 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7126 {
7127 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7128 }
7129
7130 data_buf[cloudkey->data_len * 2] = 0;
7131
7132 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7133 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7134 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7135 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7136 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7137 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7138 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7139 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7140
7141 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7142 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7143 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7144 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7145
7146 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7147 digest_buf[0],
7148 digest_buf[1],
7149 digest_buf[2],
7150 digest_buf[3],
7151 digest_buf[4],
7152 digest_buf[5],
7153 digest_buf[6],
7154 digest_buf[7],
7155 salt.salt_buf[0],
7156 salt.salt_buf[1],
7157 salt.salt_buf[2],
7158 salt.salt_buf[3],
7159 salt.salt_iter + 1,
7160 data_buf);
7161 }
7162 else if (hash_mode == 8300)
7163 {
7164 char digest_buf_c[34] = { 0 };
7165
7166 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7167
7168 digest_buf_c[32] = 0;
7169
7170 // domain
7171
7172 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7173
7174 char domain_buf_c[33] = { 0 };
7175
7176 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7177
7178 for (uint i = 0; i < salt_pc_len; i++)
7179 {
7180 const char next = domain_buf_c[i];
7181
7182 domain_buf_c[i] = '.';
7183
7184 i += next;
7185 }
7186
7187 domain_buf_c[salt_pc_len] = 0;
7188
7189 // final
7190
7191 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7192 }
7193 else if (hash_mode == 8500)
7194 {
7195 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7196 }
7197 else if (hash_mode == 2612)
7198 {
7199 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7200 SIGNATURE_PHPS,
7201 (char *) salt.salt_buf,
7202 digest_buf[0],
7203 digest_buf[1],
7204 digest_buf[2],
7205 digest_buf[3]);
7206 }
7207 else if (hash_mode == 3711)
7208 {
7209 char *salt_ptr = (char *) salt.salt_buf;
7210
7211 salt_ptr[salt.salt_len - 1] = 0;
7212
7213 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7214 SIGNATURE_MEDIAWIKI_B,
7215 salt_ptr,
7216 digest_buf[0],
7217 digest_buf[1],
7218 digest_buf[2],
7219 digest_buf[3]);
7220 }
7221 else if (hash_mode == 8800)
7222 {
7223 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7224
7225 androidfde_t *androidfde = &androidfdes[salt_pos];
7226
7227 char tmp[3073];
7228
7229 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7230 {
7231 sprintf (tmp + j, "%08x", androidfde->data[i]);
7232 }
7233
7234 tmp[3072] = 0;
7235
7236 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7237 SIGNATURE_ANDROIDFDE,
7238 byte_swap_32 (salt.salt_buf[0]),
7239 byte_swap_32 (salt.salt_buf[1]),
7240 byte_swap_32 (salt.salt_buf[2]),
7241 byte_swap_32 (salt.salt_buf[3]),
7242 byte_swap_32 (digest_buf[0]),
7243 byte_swap_32 (digest_buf[1]),
7244 byte_swap_32 (digest_buf[2]),
7245 byte_swap_32 (digest_buf[3]),
7246 tmp);
7247 }
7248 else if (hash_mode == 8900)
7249 {
7250 uint N = salt.scrypt_N;
7251 uint r = salt.scrypt_r;
7252 uint p = salt.scrypt_p;
7253
7254 char base64_salt[32];
7255
7256 memset (base64_salt, 0, 32);
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];
7309 memset (tmp_buf, 0, sizeof (tmp_buf));
7310
7311 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7312 tmp_buf[43] = 0; // cut it here
7313
7314 // output
7315
7316 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7317 }
7318 else if (hash_mode == 9300)
7319 {
7320 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7321 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7322 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7323 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7324 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7325 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7326 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7327 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7328 digest_buf[8] = 0; // needed for base64_encode ()
7329
7330 char tmp_buf[64];
7331 memset (tmp_buf, 0, sizeof (tmp_buf));
7332
7333 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7334 tmp_buf[43] = 0; // cut it here
7335
7336 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7337
7338 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7339 }
7340 else if (hash_mode == 9400)
7341 {
7342 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7343
7344 office2007_t *office2007 = &office2007s[salt_pos];
7345
7346 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7347 SIGNATURE_OFFICE2007,
7348 2007,
7349 20,
7350 office2007->keySize,
7351 16,
7352 salt.salt_buf[0],
7353 salt.salt_buf[1],
7354 salt.salt_buf[2],
7355 salt.salt_buf[3],
7356 office2007->encryptedVerifier[0],
7357 office2007->encryptedVerifier[1],
7358 office2007->encryptedVerifier[2],
7359 office2007->encryptedVerifier[3],
7360 office2007->encryptedVerifierHash[0],
7361 office2007->encryptedVerifierHash[1],
7362 office2007->encryptedVerifierHash[2],
7363 office2007->encryptedVerifierHash[3],
7364 office2007->encryptedVerifierHash[4]);
7365 }
7366 else if (hash_mode == 9500)
7367 {
7368 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7369
7370 office2010_t *office2010 = &office2010s[salt_pos];
7371
7372 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,
7373
7374 salt.salt_buf[0],
7375 salt.salt_buf[1],
7376 salt.salt_buf[2],
7377 salt.salt_buf[3],
7378 office2010->encryptedVerifier[0],
7379 office2010->encryptedVerifier[1],
7380 office2010->encryptedVerifier[2],
7381 office2010->encryptedVerifier[3],
7382 office2010->encryptedVerifierHash[0],
7383 office2010->encryptedVerifierHash[1],
7384 office2010->encryptedVerifierHash[2],
7385 office2010->encryptedVerifierHash[3],
7386 office2010->encryptedVerifierHash[4],
7387 office2010->encryptedVerifierHash[5],
7388 office2010->encryptedVerifierHash[6],
7389 office2010->encryptedVerifierHash[7]);
7390 }
7391 else if (hash_mode == 9600)
7392 {
7393 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7394
7395 office2013_t *office2013 = &office2013s[salt_pos];
7396
7397 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,
7398
7399 salt.salt_buf[0],
7400 salt.salt_buf[1],
7401 salt.salt_buf[2],
7402 salt.salt_buf[3],
7403 office2013->encryptedVerifier[0],
7404 office2013->encryptedVerifier[1],
7405 office2013->encryptedVerifier[2],
7406 office2013->encryptedVerifier[3],
7407 office2013->encryptedVerifierHash[0],
7408 office2013->encryptedVerifierHash[1],
7409 office2013->encryptedVerifierHash[2],
7410 office2013->encryptedVerifierHash[3],
7411 office2013->encryptedVerifierHash[4],
7412 office2013->encryptedVerifierHash[5],
7413 office2013->encryptedVerifierHash[6],
7414 office2013->encryptedVerifierHash[7]);
7415 }
7416 else if (hash_mode == 9700)
7417 {
7418 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7419
7420 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7421
7422 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7423 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7424 byte_swap_32 (salt.salt_buf[0]),
7425 byte_swap_32 (salt.salt_buf[1]),
7426 byte_swap_32 (salt.salt_buf[2]),
7427 byte_swap_32 (salt.salt_buf[3]),
7428 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7429 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7430 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7431 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7432 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7433 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7434 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7435 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7436 }
7437 else if (hash_mode == 9710)
7438 {
7439 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7440
7441 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7442
7443 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7444 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7445 byte_swap_32 (salt.salt_buf[0]),
7446 byte_swap_32 (salt.salt_buf[1]),
7447 byte_swap_32 (salt.salt_buf[2]),
7448 byte_swap_32 (salt.salt_buf[3]),
7449 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7450 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7451 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7452 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7453 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7454 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7455 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7456 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7457 }
7458 else if (hash_mode == 9720)
7459 {
7460 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7461
7462 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7463
7464 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7465
7466 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7467 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7468 byte_swap_32 (salt.salt_buf[0]),
7469 byte_swap_32 (salt.salt_buf[1]),
7470 byte_swap_32 (salt.salt_buf[2]),
7471 byte_swap_32 (salt.salt_buf[3]),
7472 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7473 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7474 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7475 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7476 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7477 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7478 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7479 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7480 rc4key[0],
7481 rc4key[1],
7482 rc4key[2],
7483 rc4key[3],
7484 rc4key[4]);
7485 }
7486 else if (hash_mode == 9800)
7487 {
7488 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7489
7490 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7491
7492 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7493 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7494 salt.salt_buf[0],
7495 salt.salt_buf[1],
7496 salt.salt_buf[2],
7497 salt.salt_buf[3],
7498 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7499 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7500 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7501 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7502 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7503 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7504 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7505 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7506 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7507 }
7508 else if (hash_mode == 9810)
7509 {
7510 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7511
7512 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7513
7514 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7515 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7516 salt.salt_buf[0],
7517 salt.salt_buf[1],
7518 salt.salt_buf[2],
7519 salt.salt_buf[3],
7520 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7521 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7522 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7523 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7524 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7525 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7526 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7527 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7528 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7529 }
7530 else if (hash_mode == 9820)
7531 {
7532 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7533
7534 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7535
7536 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7537
7538 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7539 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7540 salt.salt_buf[0],
7541 salt.salt_buf[1],
7542 salt.salt_buf[2],
7543 salt.salt_buf[3],
7544 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7545 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7546 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7547 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7548 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7549 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7550 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7551 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7552 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7553 rc4key[0],
7554 rc4key[1],
7555 rc4key[2],
7556 rc4key[3],
7557 rc4key[4]);
7558 }
7559 else if (hash_mode == 10000)
7560 {
7561 // salt
7562
7563 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7564
7565 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7566
7567 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7568
7569 // hash
7570
7571 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7572 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7573 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7574 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7575 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7576 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7577 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7578 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7579 digest_buf[8] = 0; // needed for base64_encode ()
7580
7581 char tmp_buf[64];
7582 memset (tmp_buf, 0, sizeof (tmp_buf));
7583
7584 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7585
7586 // output
7587
7588 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7589 }
7590 else if (hash_mode == 10100)
7591 {
7592 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7593 digest_buf[0],
7594 digest_buf[1],
7595 2,
7596 4,
7597 byte_swap_32 (salt.salt_buf[0]),
7598 byte_swap_32 (salt.salt_buf[1]),
7599 byte_swap_32 (salt.salt_buf[2]),
7600 byte_swap_32 (salt.salt_buf[3]));
7601 }
7602 else if (hash_mode == 10200)
7603 {
7604 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7605
7606 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7607
7608 // challenge
7609
7610 char challenge[100];
7611
7612 memset (challenge, 0, sizeof (challenge));
7613
7614 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7615
7616 // response
7617
7618 char tmp_buf[100];
7619
7620 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7621 (char *) cram_md5->user,
7622 digest_buf[0],
7623 digest_buf[1],
7624 digest_buf[2],
7625 digest_buf[3]);
7626
7627 char response[100];
7628
7629 memset (response, 0, sizeof (response));
7630
7631 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7632
7633 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7634 }
7635 else if (hash_mode == 10300)
7636 {
7637 char tmp_buf[100];
7638
7639 memset (tmp_buf, 0, sizeof (tmp_buf));
7640
7641 memcpy (tmp_buf + 0, digest_buf, 20);
7642 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7643
7644 uint tmp_len = 20 + salt.salt_len;
7645
7646 // base64 encode it
7647
7648 char base64_encoded[100];
7649
7650 memset (base64_encoded, 0, sizeof (base64_encoded));
7651
7652 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7653
7654 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7655 }
7656 else if (hash_mode == 10400)
7657 {
7658 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7659
7660 pdf_t *pdf = &pdfs[salt_pos];
7661
7662 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",
7663
7664 pdf->V,
7665 pdf->R,
7666 40,
7667 pdf->P,
7668 pdf->enc_md,
7669 pdf->id_len,
7670 byte_swap_32 (pdf->id_buf[0]),
7671 byte_swap_32 (pdf->id_buf[1]),
7672 byte_swap_32 (pdf->id_buf[2]),
7673 byte_swap_32 (pdf->id_buf[3]),
7674 pdf->u_len,
7675 byte_swap_32 (pdf->u_buf[0]),
7676 byte_swap_32 (pdf->u_buf[1]),
7677 byte_swap_32 (pdf->u_buf[2]),
7678 byte_swap_32 (pdf->u_buf[3]),
7679 byte_swap_32 (pdf->u_buf[4]),
7680 byte_swap_32 (pdf->u_buf[5]),
7681 byte_swap_32 (pdf->u_buf[6]),
7682 byte_swap_32 (pdf->u_buf[7]),
7683 pdf->o_len,
7684 byte_swap_32 (pdf->o_buf[0]),
7685 byte_swap_32 (pdf->o_buf[1]),
7686 byte_swap_32 (pdf->o_buf[2]),
7687 byte_swap_32 (pdf->o_buf[3]),
7688 byte_swap_32 (pdf->o_buf[4]),
7689 byte_swap_32 (pdf->o_buf[5]),
7690 byte_swap_32 (pdf->o_buf[6]),
7691 byte_swap_32 (pdf->o_buf[7])
7692 );
7693 }
7694 else if (hash_mode == 10410)
7695 {
7696 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7697
7698 pdf_t *pdf = &pdfs[salt_pos];
7699
7700 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",
7701
7702 pdf->V,
7703 pdf->R,
7704 40,
7705 pdf->P,
7706 pdf->enc_md,
7707 pdf->id_len,
7708 byte_swap_32 (pdf->id_buf[0]),
7709 byte_swap_32 (pdf->id_buf[1]),
7710 byte_swap_32 (pdf->id_buf[2]),
7711 byte_swap_32 (pdf->id_buf[3]),
7712 pdf->u_len,
7713 byte_swap_32 (pdf->u_buf[0]),
7714 byte_swap_32 (pdf->u_buf[1]),
7715 byte_swap_32 (pdf->u_buf[2]),
7716 byte_swap_32 (pdf->u_buf[3]),
7717 byte_swap_32 (pdf->u_buf[4]),
7718 byte_swap_32 (pdf->u_buf[5]),
7719 byte_swap_32 (pdf->u_buf[6]),
7720 byte_swap_32 (pdf->u_buf[7]),
7721 pdf->o_len,
7722 byte_swap_32 (pdf->o_buf[0]),
7723 byte_swap_32 (pdf->o_buf[1]),
7724 byte_swap_32 (pdf->o_buf[2]),
7725 byte_swap_32 (pdf->o_buf[3]),
7726 byte_swap_32 (pdf->o_buf[4]),
7727 byte_swap_32 (pdf->o_buf[5]),
7728 byte_swap_32 (pdf->o_buf[6]),
7729 byte_swap_32 (pdf->o_buf[7])
7730 );
7731 }
7732 else if (hash_mode == 10420)
7733 {
7734 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7735
7736 pdf_t *pdf = &pdfs[salt_pos];
7737
7738 u8 *rc4key = (u8 *) pdf->rc4key;
7739
7740 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",
7741
7742 pdf->V,
7743 pdf->R,
7744 40,
7745 pdf->P,
7746 pdf->enc_md,
7747 pdf->id_len,
7748 byte_swap_32 (pdf->id_buf[0]),
7749 byte_swap_32 (pdf->id_buf[1]),
7750 byte_swap_32 (pdf->id_buf[2]),
7751 byte_swap_32 (pdf->id_buf[3]),
7752 pdf->u_len,
7753 byte_swap_32 (pdf->u_buf[0]),
7754 byte_swap_32 (pdf->u_buf[1]),
7755 byte_swap_32 (pdf->u_buf[2]),
7756 byte_swap_32 (pdf->u_buf[3]),
7757 byte_swap_32 (pdf->u_buf[4]),
7758 byte_swap_32 (pdf->u_buf[5]),
7759 byte_swap_32 (pdf->u_buf[6]),
7760 byte_swap_32 (pdf->u_buf[7]),
7761 pdf->o_len,
7762 byte_swap_32 (pdf->o_buf[0]),
7763 byte_swap_32 (pdf->o_buf[1]),
7764 byte_swap_32 (pdf->o_buf[2]),
7765 byte_swap_32 (pdf->o_buf[3]),
7766 byte_swap_32 (pdf->o_buf[4]),
7767 byte_swap_32 (pdf->o_buf[5]),
7768 byte_swap_32 (pdf->o_buf[6]),
7769 byte_swap_32 (pdf->o_buf[7]),
7770 rc4key[0],
7771 rc4key[1],
7772 rc4key[2],
7773 rc4key[3],
7774 rc4key[4]
7775 );
7776 }
7777 else if (hash_mode == 10500)
7778 {
7779 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7780
7781 pdf_t *pdf = &pdfs[salt_pos];
7782
7783 if (pdf->id_len == 32)
7784 {
7785 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",
7786
7787 pdf->V,
7788 pdf->R,
7789 128,
7790 pdf->P,
7791 pdf->enc_md,
7792 pdf->id_len,
7793 byte_swap_32 (pdf->id_buf[0]),
7794 byte_swap_32 (pdf->id_buf[1]),
7795 byte_swap_32 (pdf->id_buf[2]),
7796 byte_swap_32 (pdf->id_buf[3]),
7797 byte_swap_32 (pdf->id_buf[4]),
7798 byte_swap_32 (pdf->id_buf[5]),
7799 byte_swap_32 (pdf->id_buf[6]),
7800 byte_swap_32 (pdf->id_buf[7]),
7801 pdf->u_len,
7802 byte_swap_32 (pdf->u_buf[0]),
7803 byte_swap_32 (pdf->u_buf[1]),
7804 byte_swap_32 (pdf->u_buf[2]),
7805 byte_swap_32 (pdf->u_buf[3]),
7806 byte_swap_32 (pdf->u_buf[4]),
7807 byte_swap_32 (pdf->u_buf[5]),
7808 byte_swap_32 (pdf->u_buf[6]),
7809 byte_swap_32 (pdf->u_buf[7]),
7810 pdf->o_len,
7811 byte_swap_32 (pdf->o_buf[0]),
7812 byte_swap_32 (pdf->o_buf[1]),
7813 byte_swap_32 (pdf->o_buf[2]),
7814 byte_swap_32 (pdf->o_buf[3]),
7815 byte_swap_32 (pdf->o_buf[4]),
7816 byte_swap_32 (pdf->o_buf[5]),
7817 byte_swap_32 (pdf->o_buf[6]),
7818 byte_swap_32 (pdf->o_buf[7])
7819 );
7820 }
7821 else
7822 {
7823 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",
7824
7825 pdf->V,
7826 pdf->R,
7827 128,
7828 pdf->P,
7829 pdf->enc_md,
7830 pdf->id_len,
7831 byte_swap_32 (pdf->id_buf[0]),
7832 byte_swap_32 (pdf->id_buf[1]),
7833 byte_swap_32 (pdf->id_buf[2]),
7834 byte_swap_32 (pdf->id_buf[3]),
7835 pdf->u_len,
7836 byte_swap_32 (pdf->u_buf[0]),
7837 byte_swap_32 (pdf->u_buf[1]),
7838 byte_swap_32 (pdf->u_buf[2]),
7839 byte_swap_32 (pdf->u_buf[3]),
7840 byte_swap_32 (pdf->u_buf[4]),
7841 byte_swap_32 (pdf->u_buf[5]),
7842 byte_swap_32 (pdf->u_buf[6]),
7843 byte_swap_32 (pdf->u_buf[7]),
7844 pdf->o_len,
7845 byte_swap_32 (pdf->o_buf[0]),
7846 byte_swap_32 (pdf->o_buf[1]),
7847 byte_swap_32 (pdf->o_buf[2]),
7848 byte_swap_32 (pdf->o_buf[3]),
7849 byte_swap_32 (pdf->o_buf[4]),
7850 byte_swap_32 (pdf->o_buf[5]),
7851 byte_swap_32 (pdf->o_buf[6]),
7852 byte_swap_32 (pdf->o_buf[7])
7853 );
7854 }
7855 }
7856 else if (hash_mode == 10600)
7857 {
7858 uint digest_idx = salt.digests_offset + digest_pos;
7859
7860 hashinfo_t **hashinfo_ptr = data.hash_info;
7861 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7862
7863 snprintf (out_buf, len-1, "%s", hash_buf);
7864 }
7865 else if (hash_mode == 10700)
7866 {
7867 uint digest_idx = salt.digests_offset + digest_pos;
7868
7869 hashinfo_t **hashinfo_ptr = data.hash_info;
7870 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7871
7872 snprintf (out_buf, len-1, "%s", hash_buf);
7873 }
7874 else if (hash_mode == 10900)
7875 {
7876 uint digest_idx = salt.digests_offset + digest_pos;
7877
7878 hashinfo_t **hashinfo_ptr = data.hash_info;
7879 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7880
7881 snprintf (out_buf, len-1, "%s", hash_buf);
7882 }
7883 else if (hash_mode == 11100)
7884 {
7885 u32 salt_challenge = salt.salt_buf[0];
7886
7887 salt_challenge = byte_swap_32 (salt_challenge);
7888
7889 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7890
7891 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7892 SIGNATURE_POSTGRESQL_AUTH,
7893 user_name,
7894 salt_challenge,
7895 digest_buf[0],
7896 digest_buf[1],
7897 digest_buf[2],
7898 digest_buf[3]);
7899 }
7900 else if (hash_mode == 11200)
7901 {
7902 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7903 SIGNATURE_MYSQL_AUTH,
7904 (unsigned char *) salt.salt_buf,
7905 digest_buf[0],
7906 digest_buf[1],
7907 digest_buf[2],
7908 digest_buf[3],
7909 digest_buf[4]);
7910 }
7911 else if (hash_mode == 11300)
7912 {
7913 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7914
7915 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7916
7917 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7918 const uint ckey_len = bitcoin_wallet->ckey_len;
7919 const uint public_key_len = bitcoin_wallet->public_key_len;
7920
7921 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7922 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7923 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7924
7925 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7926 {
7927 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7928
7929 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7930 }
7931
7932 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7933 {
7934 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7935
7936 sprintf (ckey_buf + j, "%02x", ptr[i]);
7937 }
7938
7939 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7940 {
7941 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
7942
7943 sprintf (public_key_buf + j, "%02x", ptr[i]);
7944 }
7945
7946 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7947 SIGNATURE_BITCOIN_WALLET,
7948 cry_master_len * 2,
7949 cry_master_buf,
7950 salt.salt_len,
7951 (unsigned char *) salt.salt_buf,
7952 salt.salt_iter + 1,
7953 ckey_len * 2,
7954 ckey_buf,
7955 public_key_len * 2,
7956 public_key_buf
7957 );
7958
7959 free (cry_master_buf);
7960 free (ckey_buf);
7961 free (public_key_buf);
7962 }
7963 else if (hash_mode == 11400)
7964 {
7965 uint digest_idx = salt.digests_offset + digest_pos;
7966
7967 hashinfo_t **hashinfo_ptr = data.hash_info;
7968 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7969
7970 snprintf (out_buf, len-1, "%s", hash_buf);
7971 }
7972 else if (hash_mode == 11600)
7973 {
7974 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7975
7976 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7977
7978 const uint data_len = seven_zip->data_len;
7979
7980 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7981
7982 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7983 {
7984 const u8 *ptr = (const u8 *) seven_zip->data_buf;
7985
7986 sprintf (data_buf + j, "%02x", ptr[i]);
7987 }
7988
7989 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7990 SIGNATURE_SEVEN_ZIP,
7991 0,
7992 salt.salt_sign[0],
7993 0,
7994 (char *) seven_zip->salt_buf,
7995 seven_zip->iv_len,
7996 seven_zip->iv_buf[0],
7997 seven_zip->iv_buf[1],
7998 seven_zip->iv_buf[2],
7999 seven_zip->iv_buf[3],
8000 seven_zip->crc,
8001 seven_zip->data_len,
8002 seven_zip->unpack_size,
8003 data_buf);
8004
8005 free (data_buf);
8006 }
8007 else if (hash_mode == 11700)
8008 {
8009 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8010 digest_buf[0],
8011 digest_buf[1],
8012 digest_buf[2],
8013 digest_buf[3],
8014 digest_buf[4],
8015 digest_buf[5],
8016 digest_buf[6],
8017 digest_buf[7]);
8018 }
8019 else if (hash_mode == 11800)
8020 {
8021 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8022 digest_buf[ 0],
8023 digest_buf[ 1],
8024 digest_buf[ 2],
8025 digest_buf[ 3],
8026 digest_buf[ 4],
8027 digest_buf[ 5],
8028 digest_buf[ 6],
8029 digest_buf[ 7],
8030 digest_buf[ 8],
8031 digest_buf[ 9],
8032 digest_buf[10],
8033 digest_buf[11],
8034 digest_buf[12],
8035 digest_buf[13],
8036 digest_buf[14],
8037 digest_buf[15]);
8038 }
8039 else if (hash_mode == 11900)
8040 {
8041 uint digest_idx = salt.digests_offset + digest_pos;
8042
8043 hashinfo_t **hashinfo_ptr = data.hash_info;
8044 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8045
8046 snprintf (out_buf, len-1, "%s", hash_buf);
8047 }
8048 else if (hash_mode == 12000)
8049 {
8050 uint digest_idx = salt.digests_offset + digest_pos;
8051
8052 hashinfo_t **hashinfo_ptr = data.hash_info;
8053 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8054
8055 snprintf (out_buf, len-1, "%s", hash_buf);
8056 }
8057 else if (hash_mode == 12100)
8058 {
8059 uint digest_idx = salt.digests_offset + digest_pos;
8060
8061 hashinfo_t **hashinfo_ptr = data.hash_info;
8062 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8063
8064 snprintf (out_buf, len-1, "%s", hash_buf);
8065 }
8066 else if (hash_mode == 12200)
8067 {
8068 uint *ptr_digest = digest_buf;
8069 uint *ptr_salt = salt.salt_buf;
8070
8071 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8072 SIGNATURE_ECRYPTFS,
8073 ptr_salt[0],
8074 ptr_salt[1],
8075 ptr_digest[0],
8076 ptr_digest[1]);
8077 }
8078 else if (hash_mode == 12300)
8079 {
8080 uint *ptr_digest = digest_buf;
8081 uint *ptr_salt = salt.salt_buf;
8082
8083 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",
8084 ptr_digest[ 0], ptr_digest[ 1],
8085 ptr_digest[ 2], ptr_digest[ 3],
8086 ptr_digest[ 4], ptr_digest[ 5],
8087 ptr_digest[ 6], ptr_digest[ 7],
8088 ptr_digest[ 8], ptr_digest[ 9],
8089 ptr_digest[10], ptr_digest[11],
8090 ptr_digest[12], ptr_digest[13],
8091 ptr_digest[14], ptr_digest[15],
8092 ptr_salt[0],
8093 ptr_salt[1],
8094 ptr_salt[2],
8095 ptr_salt[3]);
8096 }
8097 else if (hash_mode == 12400)
8098 {
8099 // encode iteration count
8100
8101 char salt_iter[5];
8102
8103 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8104 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8105 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8106 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8107 salt_iter[4] = 0;
8108
8109 // encode salt
8110
8111 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8112 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8113 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8114 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8115 ptr_salt[4] = 0;
8116
8117 // encode digest
8118
8119 memset (tmp_buf, 0, sizeof (tmp_buf));
8120
8121 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8122 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8123
8124 memcpy (tmp_buf, digest_buf, 8);
8125
8126 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8127
8128 ptr_plain[11] = 0;
8129
8130 // fill the resulting buffer
8131
8132 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8133 }
8134 else if (hash_mode == 12500)
8135 {
8136 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8137 SIGNATURE_RAR3,
8138 byte_swap_32 (salt.salt_buf[0]),
8139 byte_swap_32 (salt.salt_buf[1]),
8140 salt.salt_buf[2],
8141 salt.salt_buf[3],
8142 salt.salt_buf[4],
8143 salt.salt_buf[5]);
8144 }
8145 else if (hash_mode == 12600)
8146 {
8147 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8148 digest_buf[0] + salt.salt_buf_pc[0],
8149 digest_buf[1] + salt.salt_buf_pc[1],
8150 digest_buf[2] + salt.salt_buf_pc[2],
8151 digest_buf[3] + salt.salt_buf_pc[3],
8152 digest_buf[4] + salt.salt_buf_pc[4],
8153 digest_buf[5] + salt.salt_buf_pc[5],
8154 digest_buf[6] + salt.salt_buf_pc[6],
8155 digest_buf[7] + salt.salt_buf_pc[7]);
8156 }
8157 else if (hash_mode == 12700)
8158 {
8159 uint digest_idx = salt.digests_offset + digest_pos;
8160
8161 hashinfo_t **hashinfo_ptr = data.hash_info;
8162 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8163
8164 snprintf (out_buf, len-1, "%s", hash_buf);
8165 }
8166 else if (hash_mode == 12800)
8167 {
8168 const u8 *ptr = (const u8 *) salt.salt_buf;
8169
8170 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",
8171 SIGNATURE_MS_DRSR,
8172 ptr[0],
8173 ptr[1],
8174 ptr[2],
8175 ptr[3],
8176 ptr[4],
8177 ptr[5],
8178 ptr[6],
8179 ptr[7],
8180 ptr[8],
8181 ptr[9],
8182 salt.salt_iter + 1,
8183 byte_swap_32 (digest_buf[0]),
8184 byte_swap_32 (digest_buf[1]),
8185 byte_swap_32 (digest_buf[2]),
8186 byte_swap_32 (digest_buf[3]),
8187 byte_swap_32 (digest_buf[4]),
8188 byte_swap_32 (digest_buf[5]),
8189 byte_swap_32 (digest_buf[6]),
8190 byte_swap_32 (digest_buf[7])
8191 );
8192 }
8193 else if (hash_mode == 12900)
8194 {
8195 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",
8196 salt.salt_buf[ 4],
8197 salt.salt_buf[ 5],
8198 salt.salt_buf[ 6],
8199 salt.salt_buf[ 7],
8200 salt.salt_buf[ 8],
8201 salt.salt_buf[ 9],
8202 salt.salt_buf[10],
8203 salt.salt_buf[11],
8204 byte_swap_32 (digest_buf[0]),
8205 byte_swap_32 (digest_buf[1]),
8206 byte_swap_32 (digest_buf[2]),
8207 byte_swap_32 (digest_buf[3]),
8208 byte_swap_32 (digest_buf[4]),
8209 byte_swap_32 (digest_buf[5]),
8210 byte_swap_32 (digest_buf[6]),
8211 byte_swap_32 (digest_buf[7]),
8212 salt.salt_buf[ 0],
8213 salt.salt_buf[ 1],
8214 salt.salt_buf[ 2],
8215 salt.salt_buf[ 3]
8216 );
8217 }
8218 else if (hash_mode == 13000)
8219 {
8220 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8221
8222 rar5_t *rar5 = &rar5s[salt_pos];
8223
8224 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8225 salt.salt_buf[0],
8226 salt.salt_buf[1],
8227 salt.salt_buf[2],
8228 salt.salt_buf[3],
8229 salt.salt_sign[0],
8230 rar5->iv[0],
8231 rar5->iv[1],
8232 rar5->iv[2],
8233 rar5->iv[3],
8234 byte_swap_32 (digest_buf[0]),
8235 byte_swap_32 (digest_buf[1])
8236 );
8237 }
8238 else
8239 {
8240 if (hash_type == HASH_TYPE_MD4)
8241 {
8242 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8243 digest_buf[0],
8244 digest_buf[1],
8245 digest_buf[2],
8246 digest_buf[3]);
8247 }
8248 else if (hash_type == HASH_TYPE_MD5)
8249 {
8250 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8251 digest_buf[0],
8252 digest_buf[1],
8253 digest_buf[2],
8254 digest_buf[3]);
8255 }
8256 else if (hash_type == HASH_TYPE_SHA1)
8257 {
8258 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8259 digest_buf[0],
8260 digest_buf[1],
8261 digest_buf[2],
8262 digest_buf[3],
8263 digest_buf[4]);
8264 }
8265 else if (hash_type == HASH_TYPE_SHA256)
8266 {
8267 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8268 digest_buf[0],
8269 digest_buf[1],
8270 digest_buf[2],
8271 digest_buf[3],
8272 digest_buf[4],
8273 digest_buf[5],
8274 digest_buf[6],
8275 digest_buf[7]);
8276 }
8277 else if (hash_type == HASH_TYPE_SHA384)
8278 {
8279 uint *ptr = digest_buf;
8280
8281 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8282 ptr[ 1], ptr[ 0],
8283 ptr[ 3], ptr[ 2],
8284 ptr[ 5], ptr[ 4],
8285 ptr[ 7], ptr[ 6],
8286 ptr[ 9], ptr[ 8],
8287 ptr[11], ptr[10]);
8288 }
8289 else if (hash_type == HASH_TYPE_SHA512)
8290 {
8291 uint *ptr = digest_buf;
8292
8293 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8294 ptr[ 1], ptr[ 0],
8295 ptr[ 3], ptr[ 2],
8296 ptr[ 5], ptr[ 4],
8297 ptr[ 7], ptr[ 6],
8298 ptr[ 9], ptr[ 8],
8299 ptr[11], ptr[10],
8300 ptr[13], ptr[12],
8301 ptr[15], ptr[14]);
8302 }
8303 else if (hash_type == HASH_TYPE_LM)
8304 {
8305 snprintf (out_buf, len-1, "%08x%08x",
8306 digest_buf[0],
8307 digest_buf[1]);
8308 }
8309 else if (hash_type == HASH_TYPE_ORACLEH)
8310 {
8311 snprintf (out_buf, len-1, "%08X%08X",
8312 digest_buf[0],
8313 digest_buf[1]);
8314 }
8315 else if (hash_type == HASH_TYPE_BCRYPT)
8316 {
8317 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8318 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8319
8320 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8321
8322 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8323 }
8324 else if (hash_type == HASH_TYPE_KECCAK)
8325 {
8326 uint *ptr = digest_buf;
8327
8328 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",
8329 ptr[ 1], ptr[ 0],
8330 ptr[ 3], ptr[ 2],
8331 ptr[ 5], ptr[ 4],
8332 ptr[ 7], ptr[ 6],
8333 ptr[ 9], ptr[ 8],
8334 ptr[11], ptr[10],
8335 ptr[13], ptr[12],
8336 ptr[15], ptr[14],
8337 ptr[17], ptr[16],
8338 ptr[19], ptr[18],
8339 ptr[21], ptr[20],
8340 ptr[23], ptr[22],
8341 ptr[25], ptr[24],
8342 ptr[27], ptr[26],
8343 ptr[29], ptr[28],
8344 ptr[31], ptr[30],
8345 ptr[33], ptr[32],
8346 ptr[35], ptr[34],
8347 ptr[37], ptr[36],
8348 ptr[39], ptr[38],
8349 ptr[41], ptr[30],
8350 ptr[43], ptr[42],
8351 ptr[45], ptr[44],
8352 ptr[47], ptr[46],
8353 ptr[49], ptr[48]
8354 );
8355
8356 out_buf[salt.keccak_mdlen * 2] = 0;
8357 }
8358 else if (hash_type == HASH_TYPE_RIPEMD160)
8359 {
8360 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8361 digest_buf[0],
8362 digest_buf[1],
8363 digest_buf[2],
8364 digest_buf[3],
8365 digest_buf[4]);
8366 }
8367 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8368 {
8369 digest_buf[ 0] = digest_buf[ 0];
8370 digest_buf[ 1] = digest_buf[ 1];
8371 digest_buf[ 2] = digest_buf[ 2];
8372 digest_buf[ 3] = digest_buf[ 3];
8373 digest_buf[ 4] = digest_buf[ 4];
8374 digest_buf[ 5] = digest_buf[ 5];
8375 digest_buf[ 6] = digest_buf[ 6];
8376 digest_buf[ 7] = digest_buf[ 7];
8377 digest_buf[ 8] = digest_buf[ 8];
8378 digest_buf[ 9] = digest_buf[ 9];
8379 digest_buf[10] = digest_buf[10];
8380 digest_buf[11] = digest_buf[11];
8381 digest_buf[12] = digest_buf[12];
8382 digest_buf[13] = digest_buf[13];
8383 digest_buf[14] = digest_buf[14];
8384 digest_buf[15] = digest_buf[15];
8385
8386 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8387 digest_buf[ 0],
8388 digest_buf[ 1],
8389 digest_buf[ 2],
8390 digest_buf[ 3],
8391 digest_buf[ 4],
8392 digest_buf[ 5],
8393 digest_buf[ 6],
8394 digest_buf[ 7],
8395 digest_buf[ 8],
8396 digest_buf[ 9],
8397 digest_buf[10],
8398 digest_buf[11],
8399 digest_buf[12],
8400 digest_buf[13],
8401 digest_buf[14],
8402 digest_buf[15]);
8403 }
8404 else if (hash_type == HASH_TYPE_GOST)
8405 {
8406 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8407 digest_buf[0],
8408 digest_buf[1],
8409 digest_buf[2],
8410 digest_buf[3],
8411 digest_buf[4],
8412 digest_buf[5],
8413 digest_buf[6],
8414 digest_buf[7]);
8415 }
8416 else if (hash_type == HASH_TYPE_MYSQL)
8417 {
8418 snprintf (out_buf, len-1, "%08x%08x",
8419 digest_buf[0],
8420 digest_buf[1]);
8421 }
8422 else if (hash_type == HASH_TYPE_LOTUS5)
8423 {
8424 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8425 digest_buf[0],
8426 digest_buf[1],
8427 digest_buf[2],
8428 digest_buf[3]);
8429 }
8430 else if (hash_type == HASH_TYPE_LOTUS6)
8431 {
8432 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8433 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8434 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8435 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8436
8437 char buf[16];
8438
8439 memcpy (buf + 0, salt.salt_buf, 5);
8440 memcpy (buf + 5, digest_buf, 9);
8441
8442 buf[3] -= -4;
8443
8444 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8445
8446 tmp_buf[18] = salt.salt_buf_pc[7];
8447 tmp_buf[19] = 0;
8448
8449 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8450 }
8451 else if (hash_type == HASH_TYPE_LOTUS8)
8452 {
8453 char buf[52];
8454
8455 memset (buf, 0, sizeof (buf));
8456
8457 // salt
8458
8459 memcpy (buf + 0, salt.salt_buf, 16);
8460
8461 buf[3] -= -4;
8462
8463 // iteration
8464
8465 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8466
8467 // chars
8468
8469 buf[26] = salt.salt_buf_pc[0];
8470 buf[27] = salt.salt_buf_pc[1];
8471
8472 // digest
8473
8474 memcpy (buf + 28, digest_buf, 8);
8475
8476 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8477
8478 tmp_buf[49] = 0;
8479
8480 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8481 }
8482 else if (hash_type == HASH_TYPE_CRC32)
8483 {
8484 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8485 }
8486 }
8487
8488 if (salt_type == SALT_TYPE_INTERN)
8489 {
8490 size_t pos = strlen (out_buf);
8491
8492 out_buf[pos] = data.separator;
8493
8494 char *ptr = (char *) salt.salt_buf;
8495
8496 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8497
8498 out_buf[pos + 1 + salt.salt_len] = 0;
8499 }
8500 }
8501
8502 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8503 {
8504 memset (hccap, 0, sizeof (hccap_t));
8505
8506 salt_t *salt = &data.salts_buf[salt_pos];
8507
8508 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8509
8510 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8511 wpa_t *wpa = &wpas[salt_pos];
8512
8513 hccap->keyver = wpa->keyver;
8514
8515 hccap->eapol_size = wpa->eapol_size;
8516
8517 if (wpa->keyver != 1)
8518 {
8519 uint eapol_tmp[64];
8520
8521 for (uint i = 0; i < 64; i++)
8522 {
8523 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8524 }
8525
8526 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8527 }
8528 else
8529 {
8530 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8531 }
8532
8533 uint pke_tmp[25];
8534
8535 for (int i = 5; i < 25; i++)
8536 {
8537 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8538 }
8539
8540 char *pke_ptr = (char *) pke_tmp;
8541
8542 memcpy (hccap->mac1, pke_ptr + 23, 6);
8543 memcpy (hccap->mac2, pke_ptr + 29, 6);
8544 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8545 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8546
8547 char *digests_buf_ptr = (char *) data.digests_buf;
8548
8549 uint dgst_size = data.dgst_size;
8550
8551 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8552
8553 if (wpa->keyver != 1)
8554 {
8555 uint digest_tmp[4];
8556
8557 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8558 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8559 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8560 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8561
8562 memcpy (hccap->keymic, digest_tmp, 16);
8563 }
8564 else
8565 {
8566 memcpy (hccap->keymic, digest_ptr, 16);
8567 }
8568 }
8569
8570 void SuspendThreads ()
8571 {
8572 if (data.devices_status == STATUS_RUNNING)
8573 {
8574 hc_timer_set (&data.timer_paused);
8575
8576 data.devices_status = STATUS_PAUSED;
8577
8578 log_info ("Paused");
8579 }
8580 }
8581
8582 void ResumeThreads ()
8583 {
8584 if (data.devices_status == STATUS_PAUSED)
8585 {
8586 float ms_paused;
8587
8588 hc_timer_get (data.timer_paused, ms_paused);
8589
8590 data.ms_paused += ms_paused;
8591
8592 data.devices_status = STATUS_RUNNING;
8593
8594 log_info ("Resumed");
8595 }
8596 }
8597
8598 void bypass ()
8599 {
8600 if (data.devices_status != STATUS_RUNNING) return;
8601
8602 data.devices_status = STATUS_BYPASS;
8603
8604 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8605 }
8606
8607 void stop_at_checkpoint ()
8608 {
8609 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8610 {
8611 if (data.devices_status != STATUS_RUNNING) return;
8612 }
8613
8614 // this feature only makes sense if --restore-disable was not specified
8615
8616 if (data.restore_disable == 1)
8617 {
8618 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8619
8620 return;
8621 }
8622
8623 // check if monitoring of Restore Point updates should be enabled or disabled
8624
8625 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8626 {
8627 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8628
8629 // save the current restore point value
8630
8631 data.checkpoint_cur_words = get_lowest_words_done ();
8632
8633 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8634 }
8635 else
8636 {
8637 data.devices_status = STATUS_RUNNING;
8638
8639 // reset the global value for checkpoint checks
8640
8641 data.checkpoint_cur_words = 0;
8642
8643 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8644 }
8645 }
8646
8647 void myabort ()
8648 {
8649 if (data.devices_status == STATUS_INIT) return;
8650 if (data.devices_status == STATUS_STARTING) return;
8651
8652 data.devices_status = STATUS_ABORTED;
8653 }
8654
8655 void myquit ()
8656 {
8657 if (data.devices_status == STATUS_INIT) return;
8658 if (data.devices_status == STATUS_STARTING) return;
8659
8660 data.devices_status = STATUS_QUIT;
8661 }
8662
8663 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8664 {
8665 FILE *fp;
8666
8667 if ((fp = fopen (kernel_file, "rb")) != NULL)
8668 {
8669 struct stat st;
8670
8671 memset (&st, 0, sizeof (st));
8672
8673 stat (kernel_file, &st);
8674
8675 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8676
8677 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8678
8679 if (num_read != (size_t) st.st_size)
8680 {
8681 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8682
8683 exit (-1);
8684 }
8685
8686 fclose (fp);
8687
8688 buf[st.st_size] = 0;
8689
8690 for (int i = 0; i < num_devices; i++)
8691 {
8692 kernel_lengths[i] = (size_t) st.st_size;
8693
8694 kernel_sources[i] = buf;
8695 }
8696 }
8697 else
8698 {
8699 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8700
8701 exit (-1);
8702 }
8703
8704 return;
8705 }
8706
8707 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8708 {
8709 FILE *fp = fopen (dst, "wb");
8710
8711 fwrite (binary, sizeof (u8), binary_size, fp);
8712
8713 fflush (fp);
8714 fclose (fp);
8715 }
8716
8717 /**
8718 * restore
8719 */
8720
8721 restore_data_t *init_restore (int argc, char **argv)
8722 {
8723 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8724
8725 if (data.restore_disable == 0)
8726 {
8727 FILE *fp = fopen (data.eff_restore_file, "rb");
8728
8729 if (fp)
8730 {
8731 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8732
8733 if (nread != 1)
8734 {
8735 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8736
8737 exit (-1);
8738 }
8739
8740 fclose (fp);
8741
8742 if (rd->pid)
8743 {
8744 char pidbin[BUFSIZ];
8745
8746 int pidbin_len;
8747
8748 #ifdef _POSIX
8749 memset (pidbin, 0, sizeof (pidbin));
8750
8751 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8752
8753 FILE *fd = fopen (pidbin, "rb");
8754
8755 if (fd)
8756 {
8757 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8758
8759 pidbin[pidbin_len] = 0;
8760
8761 fclose (fd);
8762
8763 char *argv0_r = strrchr (argv[0], '/');
8764
8765 char *pidbin_r = strrchr (pidbin, '/');
8766
8767 if (argv0_r == NULL) argv0_r = argv[0];
8768
8769 if (pidbin_r == NULL) pidbin_r = pidbin;
8770
8771 if (strcmp (argv0_r, pidbin_r) == 0)
8772 {
8773 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8774
8775 exit (-1);
8776 }
8777 }
8778
8779 #elif _WIN
8780 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8781
8782 char pidbin2[BUFSIZ];
8783
8784 int pidbin2_len;
8785
8786 memset (pidbin2, 0, sizeof (pidbin2));
8787
8788 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8789 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8790
8791 pidbin[pidbin_len] = 0;
8792 pidbin2[pidbin2_len] = 0;
8793
8794 if (pidbin2_len)
8795 {
8796 if (strcmp (pidbin, pidbin2) == 0)
8797 {
8798 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8799
8800 exit (-1);
8801 }
8802 }
8803 #endif
8804 }
8805
8806 if (rd->version_bin < RESTORE_MIN)
8807 {
8808 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8809
8810 exit (-1);
8811 }
8812 }
8813 }
8814
8815 memset (rd, 0, sizeof (restore_data_t));
8816
8817 rd->version_bin = VERSION_BIN;
8818
8819 #ifdef _POSIX
8820 rd->pid = getpid ();
8821 #elif _WIN
8822 rd->pid = GetCurrentProcessId ();
8823 #endif
8824
8825 if (getcwd (rd->cwd, 255) == NULL)
8826 {
8827 myfree (rd);
8828
8829 return (NULL);
8830 }
8831
8832 rd->argc = argc;
8833 rd->argv = argv;
8834
8835 return (rd);
8836 }
8837
8838 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8839 {
8840 FILE *fp = fopen (eff_restore_file, "rb");
8841
8842 if (fp == NULL)
8843 {
8844 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8845
8846 exit (-1);
8847 }
8848
8849 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8850 {
8851 log_error ("ERROR: cannot read %s", eff_restore_file);
8852
8853 exit (-1);
8854 }
8855
8856 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8857
8858 for (uint i = 0; i < rd->argc; i++)
8859 {
8860 char buf[BUFSIZ];
8861
8862 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8863 {
8864 log_error ("ERROR: cannot read %s", eff_restore_file);
8865
8866 exit (-1);
8867 }
8868
8869 size_t len = strlen (buf);
8870
8871 if (len) buf[len - 1] = 0;
8872
8873 rd->argv[i] = mystrdup (buf);
8874 }
8875
8876 fclose (fp);
8877
8878 char new_cwd[256];
8879
8880 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8881
8882 if (nwd == NULL)
8883 {
8884 log_error ("Restore file is corrupted");
8885 }
8886
8887 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8888 {
8889 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8890 {
8891 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8892
8893 exit (-1);
8894 }
8895
8896 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8897 }
8898
8899
8900 if (chdir (rd->cwd))
8901 {
8902 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8903
8904 exit (-1);
8905 }
8906 }
8907
8908 u64 get_lowest_words_done ()
8909 {
8910 u64 words_cur = -1;
8911
8912 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8913 {
8914 hc_device_param_t *device_param = &data.devices_param[device_id];
8915
8916 if (device_param->skipped) continue;
8917
8918 const u64 words_done = device_param->words_done;
8919
8920 if (words_done < words_cur) words_cur = words_done;
8921 }
8922
8923 // It's possible that a device's workload isn't finished right after a restore-case.
8924 // In that case, this function would return 0 and overwrite the real restore point
8925 // There's also data.words_cur which is set to rd->words_cur but it changes while
8926 // the attack is running therefore we should stick to rd->words_cur.
8927 // Note that -s influences rd->words_cur we should keep a close look on that.
8928
8929 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8930
8931 return words_cur;
8932 }
8933
8934 void write_restore (const char *new_restore_file, restore_data_t *rd)
8935 {
8936 u64 words_cur = get_lowest_words_done ();
8937
8938 rd->words_cur = words_cur;
8939
8940 FILE *fp = fopen (new_restore_file, "wb");
8941
8942 if (fp == NULL)
8943 {
8944 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8945
8946 exit (-1);
8947 }
8948
8949 if (setvbuf (fp, NULL, _IONBF, 0))
8950 {
8951 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8952
8953 exit (-1);
8954 }
8955
8956 fwrite (rd, sizeof (restore_data_t), 1, fp);
8957
8958 for (uint i = 0; i < rd->argc; i++)
8959 {
8960 fprintf (fp, "%s", rd->argv[i]);
8961 fputc ('\n', fp);
8962 }
8963
8964 fflush (fp);
8965
8966 fsync (fileno (fp));
8967
8968 fclose (fp);
8969 }
8970
8971 void cycle_restore ()
8972 {
8973 const char *eff_restore_file = data.eff_restore_file;
8974 const char *new_restore_file = data.new_restore_file;
8975
8976 restore_data_t *rd = data.rd;
8977
8978 write_restore (new_restore_file, rd);
8979
8980 struct stat st;
8981
8982 memset (&st, 0, sizeof(st));
8983
8984 if (stat (eff_restore_file, &st) == 0)
8985 {
8986 if (unlink (eff_restore_file))
8987 {
8988 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8989 }
8990 }
8991
8992 if (rename (new_restore_file, eff_restore_file))
8993 {
8994 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8995 }
8996 }
8997
8998 void check_checkpoint ()
8999 {
9000 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9001
9002 u64 words_cur = get_lowest_words_done ();
9003
9004 if (words_cur != data.checkpoint_cur_words)
9005 {
9006 myabort ();
9007 }
9008 }
9009
9010 /**
9011 * adjustments
9012 */
9013
9014 uint set_kernel_accel (uint hash_mode)
9015 {
9016 switch (hash_mode)
9017 {
9018 case 0: return GET_ACCEL (0);
9019 case 10: return GET_ACCEL (10);
9020 case 11: return GET_ACCEL (11);
9021 case 12: return GET_ACCEL (12);
9022 case 20: return GET_ACCEL (20);
9023 case 21: return GET_ACCEL (21);
9024 case 22: return GET_ACCEL (22);
9025 case 23: return GET_ACCEL (23);
9026 case 30: return GET_ACCEL (30);
9027 case 40: return GET_ACCEL (40);
9028 case 50: return GET_ACCEL (50);
9029 case 60: return GET_ACCEL (60);
9030 case 100: return GET_ACCEL (100);
9031 case 101: return GET_ACCEL (101);
9032 case 110: return GET_ACCEL (110);
9033 case 111: return GET_ACCEL (111);
9034 case 112: return GET_ACCEL (112);
9035 case 120: return GET_ACCEL (120);
9036 case 121: return GET_ACCEL (121);
9037 case 122: return GET_ACCEL (122);
9038 case 124: return GET_ACCEL (124);
9039 case 130: return GET_ACCEL (130);
9040 case 131: return GET_ACCEL (131);
9041 case 132: return GET_ACCEL (132);
9042 case 133: return GET_ACCEL (133);
9043 case 140: return GET_ACCEL (140);
9044 case 141: return GET_ACCEL (141);
9045 case 150: return GET_ACCEL (150);
9046 case 160: return GET_ACCEL (160);
9047 case 190: return GET_ACCEL (190);
9048 case 200: return GET_ACCEL (200);
9049 case 300: return GET_ACCEL (300);
9050 case 400: return GET_ACCEL (400);
9051 case 500: return GET_ACCEL (500);
9052 case 501: return GET_ACCEL (501);
9053 case 900: return GET_ACCEL (900);
9054 case 910: return GET_ACCEL (910);
9055 case 1000: return GET_ACCEL (1000);
9056 case 1100: return GET_ACCEL (1100);
9057 case 1400: return GET_ACCEL (1400);
9058 case 1410: return GET_ACCEL (1410);
9059 case 1420: return GET_ACCEL (1420);
9060 case 1421: return GET_ACCEL (1421);
9061 case 1430: return GET_ACCEL (1430);
9062 case 1440: return GET_ACCEL (1440);
9063 case 1441: return GET_ACCEL (1441);
9064 case 1450: return GET_ACCEL (1450);
9065 case 1460: return GET_ACCEL (1460);
9066 case 1500: return GET_ACCEL (1500);
9067 case 1600: return GET_ACCEL (1600);
9068 case 1700: return GET_ACCEL (1700);
9069 case 1710: return GET_ACCEL (1710);
9070 case 1711: return GET_ACCEL (1711);
9071 case 1720: return GET_ACCEL (1720);
9072 case 1722: return GET_ACCEL (1722);
9073 case 1730: return GET_ACCEL (1730);
9074 case 1731: return GET_ACCEL (1731);
9075 case 1740: return GET_ACCEL (1740);
9076 case 1750: return GET_ACCEL (1750);
9077 case 1760: return GET_ACCEL (1760);
9078 case 1800: return GET_ACCEL (1800);
9079 case 2100: return GET_ACCEL (2100);
9080 case 2400: return GET_ACCEL (2400);
9081 case 2410: return GET_ACCEL (2410);
9082 case 2500: return GET_ACCEL (2500);
9083 case 2600: return GET_ACCEL (2600);
9084 case 2611: return GET_ACCEL (2611);
9085 case 2612: return GET_ACCEL (2612);
9086 case 2711: return GET_ACCEL (2711);
9087 case 2811: return GET_ACCEL (2811);
9088 case 3000: return GET_ACCEL (3000);
9089 case 3100: return GET_ACCEL (3100);
9090 case 3200: return GET_ACCEL (3200);
9091 case 3710: return GET_ACCEL (3710);
9092 case 3711: return GET_ACCEL (3711);
9093 case 3800: return GET_ACCEL (3800);
9094 case 4300: return GET_ACCEL (4300);
9095 case 4400: return GET_ACCEL (4400);
9096 case 4500: return GET_ACCEL (4500);
9097 case 4700: return GET_ACCEL (4700);
9098 case 4800: return GET_ACCEL (4800);
9099 case 4900: return GET_ACCEL (4900);
9100 case 5000: return GET_ACCEL (5000);
9101 case 5100: return GET_ACCEL (5100);
9102 case 5200: return GET_ACCEL (5200);
9103 case 5300: return GET_ACCEL (5300);
9104 case 5400: return GET_ACCEL (5400);
9105 case 5500: return GET_ACCEL (5500);
9106 case 5600: return GET_ACCEL (5600);
9107 case 5700: return GET_ACCEL (5700);
9108 case 5800: return GET_ACCEL (5800);
9109 case 6000: return GET_ACCEL (6000);
9110 case 6100: return GET_ACCEL (6100);
9111 case 6211: return GET_ACCEL (6211);
9112 case 6212: return GET_ACCEL (6212);
9113 case 6213: return GET_ACCEL (6213);
9114 case 6221: return GET_ACCEL (6221);
9115 case 6222: return GET_ACCEL (6222);
9116 case 6223: return GET_ACCEL (6223);
9117 case 6231: return GET_ACCEL (6231);
9118 case 6232: return GET_ACCEL (6232);
9119 case 6233: return GET_ACCEL (6233);
9120 case 6241: return GET_ACCEL (6241);
9121 case 6242: return GET_ACCEL (6242);
9122 case 6243: return GET_ACCEL (6243);
9123 case 6300: return GET_ACCEL (6300);
9124 case 6400: return GET_ACCEL (6400);
9125 case 6500: return GET_ACCEL (6500);
9126 case 6600: return GET_ACCEL (6600);
9127 case 6700: return GET_ACCEL (6700);
9128 case 6800: return GET_ACCEL (6800);
9129 case 6900: return GET_ACCEL (6900);
9130 case 7100: return GET_ACCEL (7100);
9131 case 7200: return GET_ACCEL (7200);
9132 case 7300: return GET_ACCEL (7300);
9133 case 7400: return GET_ACCEL (7400);
9134 case 7500: return GET_ACCEL (7500);
9135 case 7600: return GET_ACCEL (7600);
9136 case 7700: return GET_ACCEL (7700);
9137 case 7800: return GET_ACCEL (7800);
9138 case 7900: return GET_ACCEL (7900);
9139 case 8000: return GET_ACCEL (8000);
9140 case 8100: return GET_ACCEL (8100);
9141 case 8200: return GET_ACCEL (8200);
9142 case 8300: return GET_ACCEL (8300);
9143 case 8400: return GET_ACCEL (8400);
9144 case 8500: return GET_ACCEL (8500);
9145 case 8600: return GET_ACCEL (8600);
9146 case 8700: return GET_ACCEL (8700);
9147 case 8800: return GET_ACCEL (8800);
9148 case 8900: return GET_ACCEL (8900);
9149 case 9000: return GET_ACCEL (9000);
9150 case 9100: return GET_ACCEL (9100);
9151 case 9200: return GET_ACCEL (9200);
9152 case 9300: return GET_ACCEL (9300);
9153 case 9400: return GET_ACCEL (9400);
9154 case 9500: return GET_ACCEL (9500);
9155 case 9600: return GET_ACCEL (9600);
9156 case 9700: return GET_ACCEL (9700);
9157 case 9710: return GET_ACCEL (9710);
9158 case 9720: return GET_ACCEL (9720);
9159 case 9800: return GET_ACCEL (9800);
9160 case 9810: return GET_ACCEL (9810);
9161 case 9820: return GET_ACCEL (9820);
9162 case 9900: return GET_ACCEL (9900);
9163 case 10000: return GET_ACCEL (10000);
9164 case 10100: return GET_ACCEL (10100);
9165 case 10200: return GET_ACCEL (10200);
9166 case 10300: return GET_ACCEL (10300);
9167 case 10400: return GET_ACCEL (10400);
9168 case 10410: return GET_ACCEL (10410);
9169 case 10420: return GET_ACCEL (10420);
9170 case 10500: return GET_ACCEL (10500);
9171 case 10600: return GET_ACCEL (10600);
9172 case 10700: return GET_ACCEL (10700);
9173 case 10800: return GET_ACCEL (10800);
9174 case 10900: return GET_ACCEL (10900);
9175 case 11000: return GET_ACCEL (11000);
9176 case 11100: return GET_ACCEL (11100);
9177 case 11200: return GET_ACCEL (11200);
9178 case 11300: return GET_ACCEL (11300);
9179 case 11400: return GET_ACCEL (11400);
9180 case 11500: return GET_ACCEL (11500);
9181 case 11600: return GET_ACCEL (11600);
9182 case 11700: return GET_ACCEL (11700);
9183 case 11800: return GET_ACCEL (11800);
9184 case 11900: return GET_ACCEL (11900);
9185 case 12000: return GET_ACCEL (12000);
9186 case 12100: return GET_ACCEL (12100);
9187 case 12200: return GET_ACCEL (12200);
9188 case 12300: return GET_ACCEL (12300);
9189 case 12400: return GET_ACCEL (12400);
9190 case 12500: return GET_ACCEL (12500);
9191 case 12600: return GET_ACCEL (12600);
9192 case 12700: return GET_ACCEL (12700);
9193 case 12800: return GET_ACCEL (12800);
9194 case 12900: return GET_ACCEL (12900);
9195 case 13000: return GET_ACCEL (13000);
9196 }
9197
9198 return 0;
9199 }
9200
9201 uint set_kernel_loops (uint hash_mode)
9202 {
9203 switch (hash_mode)
9204 {
9205 case 0: return GET_LOOPS (0);
9206 case 10: return GET_LOOPS (10);
9207 case 11: return GET_LOOPS (11);
9208 case 12: return GET_LOOPS (12);
9209 case 20: return GET_LOOPS (20);
9210 case 21: return GET_LOOPS (21);
9211 case 22: return GET_LOOPS (22);
9212 case 23: return GET_LOOPS (23);
9213 case 30: return GET_LOOPS (30);
9214 case 40: return GET_LOOPS (40);
9215 case 50: return GET_LOOPS (50);
9216 case 60: return GET_LOOPS (60);
9217 case 100: return GET_LOOPS (100);
9218 case 101: return GET_LOOPS (101);
9219 case 110: return GET_LOOPS (110);
9220 case 111: return GET_LOOPS (111);
9221 case 112: return GET_LOOPS (112);
9222 case 120: return GET_LOOPS (120);
9223 case 121: return GET_LOOPS (121);
9224 case 122: return GET_LOOPS (122);
9225 case 124: return GET_LOOPS (124);
9226 case 130: return GET_LOOPS (130);
9227 case 131: return GET_LOOPS (131);
9228 case 132: return GET_LOOPS (132);
9229 case 133: return GET_LOOPS (133);
9230 case 140: return GET_LOOPS (140);
9231 case 141: return GET_LOOPS (141);
9232 case 150: return GET_LOOPS (150);
9233 case 160: return GET_LOOPS (160);
9234 case 190: return GET_LOOPS (190);
9235 case 200: return GET_LOOPS (200);
9236 case 300: return GET_LOOPS (300);
9237 case 400: return GET_LOOPS (400);
9238 case 500: return GET_LOOPS (500);
9239 case 501: return GET_LOOPS (501);
9240 case 900: return GET_LOOPS (900);
9241 case 910: return GET_LOOPS (910);
9242 case 1000: return GET_LOOPS (1000);
9243 case 1100: return GET_LOOPS (1100);
9244 case 1400: return GET_LOOPS (1400);
9245 case 1410: return GET_LOOPS (1410);
9246 case 1420: return GET_LOOPS (1420);
9247 case 1421: return GET_LOOPS (1421);
9248 case 1430: return GET_LOOPS (1430);
9249 case 1440: return GET_LOOPS (1440);
9250 case 1441: return GET_LOOPS (1441);
9251 case 1450: return GET_LOOPS (1450);
9252 case 1460: return GET_LOOPS (1460);
9253 case 1500: return GET_LOOPS (1500);
9254 case 1600: return GET_LOOPS (1600);
9255 case 1700: return GET_LOOPS (1700);
9256 case 1710: return GET_LOOPS (1710);
9257 case 1711: return GET_LOOPS (1711);
9258 case 1720: return GET_LOOPS (1720);
9259 case 1722: return GET_LOOPS (1722);
9260 case 1730: return GET_LOOPS (1730);
9261 case 1731: return GET_LOOPS (1731);
9262 case 1740: return GET_LOOPS (1740);
9263 case 1750: return GET_LOOPS (1750);
9264 case 1760: return GET_LOOPS (1760);
9265 case 1800: return GET_LOOPS (1800);
9266 case 2100: return GET_LOOPS (2100);
9267 case 2400: return GET_LOOPS (2400);
9268 case 2410: return GET_LOOPS (2410);
9269 case 2500: return GET_LOOPS (2500);
9270 case 2600: return GET_LOOPS (2600);
9271 case 2611: return GET_LOOPS (2611);
9272 case 2612: return GET_LOOPS (2612);
9273 case 2711: return GET_LOOPS (2711);
9274 case 2811: return GET_LOOPS (2811);
9275 case 3000: return GET_LOOPS (3000);
9276 case 3100: return GET_LOOPS (3100);
9277 case 3200: return GET_LOOPS (3200);
9278 case 3710: return GET_LOOPS (3710);
9279 case 3711: return GET_LOOPS (3711);
9280 case 3800: return GET_LOOPS (3800);
9281 case 4300: return GET_LOOPS (4300);
9282 case 4400: return GET_LOOPS (4400);
9283 case 4500: return GET_LOOPS (4500);
9284 case 4700: return GET_LOOPS (4700);
9285 case 4800: return GET_LOOPS (4800);
9286 case 4900: return GET_LOOPS (4900);
9287 case 5000: return GET_LOOPS (5000);
9288 case 5100: return GET_LOOPS (5100);
9289 case 5200: return GET_LOOPS (5200);
9290 case 5300: return GET_LOOPS (5300);
9291 case 5400: return GET_LOOPS (5400);
9292 case 5500: return GET_LOOPS (5500);
9293 case 5600: return GET_LOOPS (5600);
9294 case 5700: return GET_LOOPS (5700);
9295 case 5800: return GET_LOOPS (5800);
9296 case 6000: return GET_LOOPS (6000);
9297 case 6100: return GET_LOOPS (6100);
9298 case 6211: return GET_LOOPS (6211);
9299 case 6212: return GET_LOOPS (6212);
9300 case 6213: return GET_LOOPS (6213);
9301 case 6221: return GET_LOOPS (6221);
9302 case 6222: return GET_LOOPS (6222);
9303 case 6223: return GET_LOOPS (6223);
9304 case 6231: return GET_LOOPS (6231);
9305 case 6232: return GET_LOOPS (6232);
9306 case 6233: return GET_LOOPS (6233);
9307 case 6241: return GET_LOOPS (6241);
9308 case 6242: return GET_LOOPS (6242);
9309 case 6243: return GET_LOOPS (6243);
9310 case 6300: return GET_LOOPS (6300);
9311 case 6400: return GET_LOOPS (6400);
9312 case 6500: return GET_LOOPS (6500);
9313 case 6600: return GET_LOOPS (6600);
9314 case 6700: return GET_LOOPS (6700);
9315 case 6800: return GET_LOOPS (6800);
9316 case 6900: return GET_LOOPS (6900);
9317 case 7100: return GET_LOOPS (7100);
9318 case 7200: return GET_LOOPS (7200);
9319 case 7300: return GET_LOOPS (7300);
9320 case 7400: return GET_LOOPS (7400);
9321 case 7500: return GET_LOOPS (7500);
9322 case 7600: return GET_LOOPS (7600);
9323 case 7700: return GET_LOOPS (7700);
9324 case 7800: return GET_LOOPS (7800);
9325 case 7900: return GET_LOOPS (7900);
9326 case 8000: return GET_LOOPS (8000);
9327 case 8100: return GET_LOOPS (8100);
9328 case 8200: return GET_LOOPS (8200);
9329 case 8300: return GET_LOOPS (8300);
9330 case 8400: return GET_LOOPS (8400);
9331 case 8500: return GET_LOOPS (8500);
9332 case 8600: return GET_LOOPS (8600);
9333 case 8700: return GET_LOOPS (8700);
9334 case 8800: return GET_LOOPS (8800);
9335 case 8900: return GET_LOOPS (8900);
9336 case 9000: return GET_LOOPS (9000);
9337 case 9100: return GET_LOOPS (9100);
9338 case 9200: return GET_LOOPS (9200);
9339 case 9300: return GET_LOOPS (9300);
9340 case 9400: return GET_LOOPS (9400);
9341 case 9500: return GET_LOOPS (9500);
9342 case 9600: return GET_LOOPS (9600);
9343 case 9700: return GET_LOOPS (9700);
9344 case 9710: return GET_LOOPS (9710);
9345 case 9720: return GET_LOOPS (9720);
9346 case 9800: return GET_LOOPS (9800);
9347 case 9810: return GET_LOOPS (9810);
9348 case 9820: return GET_LOOPS (9820);
9349 case 9900: return GET_LOOPS (9900);
9350 case 10000: return GET_LOOPS (10000);
9351 case 10100: return GET_LOOPS (10100);
9352 case 10200: return GET_LOOPS (10200);
9353 case 10300: return GET_LOOPS (10300);
9354 case 10400: return GET_LOOPS (10400);
9355 case 10410: return GET_LOOPS (10410);
9356 case 10420: return GET_LOOPS (10420);
9357 case 10500: return GET_LOOPS (10500);
9358 case 10600: return GET_LOOPS (10600);
9359 case 10700: return GET_LOOPS (10700);
9360 case 10800: return GET_LOOPS (10800);
9361 case 10900: return GET_LOOPS (10900);
9362 case 11000: return GET_LOOPS (11000);
9363 case 11100: return GET_LOOPS (11100);
9364 case 11200: return GET_LOOPS (11200);
9365 case 11300: return GET_LOOPS (11300);
9366 case 11400: return GET_LOOPS (11400);
9367 case 11500: return GET_LOOPS (11500);
9368 case 11600: return GET_LOOPS (11600);
9369 case 11700: return GET_LOOPS (11700);
9370 case 11800: return GET_LOOPS (11800);
9371 case 11900: return GET_LOOPS (11900);
9372 case 12000: return GET_LOOPS (12000);
9373 case 12100: return GET_LOOPS (12100);
9374 case 12200: return GET_LOOPS (12200);
9375 case 12300: return GET_LOOPS (12300);
9376 case 12400: return GET_LOOPS (12400);
9377 case 12500: return GET_LOOPS (12500);
9378 case 12600: return GET_LOOPS (12600);
9379 case 12700: return GET_LOOPS (12700);
9380 case 12800: return GET_LOOPS (12800);
9381 case 12900: return GET_LOOPS (12900);
9382 case 13000: return GET_LOOPS (13000);
9383 }
9384
9385 return 0;
9386 }
9387
9388 /**
9389 * parser
9390 */
9391
9392 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9393 {
9394 u8 tmp[256];
9395
9396 if (salt_len > sizeof (tmp))
9397 {
9398 return UINT_MAX;
9399 }
9400
9401 memset (tmp, 0, sizeof (tmp));
9402 memcpy (tmp, in, salt_len);
9403
9404 if (data.opts_type & OPTS_TYPE_ST_HEX)
9405 {
9406 if ((salt_len % 2) == 0)
9407 {
9408 u32 new_salt_len = salt_len / 2;
9409
9410 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9411 {
9412 u8 p0 = tmp[j + 0];
9413 u8 p1 = tmp[j + 1];
9414
9415 tmp[i] = hex_convert (p1) << 0;
9416 tmp[i] |= hex_convert (p0) << 4;
9417 }
9418
9419 salt_len = new_salt_len;
9420 }
9421 else
9422 {
9423 return UINT_MAX;
9424 }
9425 }
9426 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9427 {
9428 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9429 }
9430
9431 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9432
9433 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9434 {
9435 if (salt_len < 20)
9436 {
9437 u32 *tmp_uint = (u32 *) tmp;
9438
9439 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9440 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9441 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9442 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9443 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9444 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9445 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9446 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9447 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9448 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9449
9450 salt_len = salt_len * 2;
9451 }
9452 else
9453 {
9454 return UINT_MAX;
9455 }
9456 }
9457
9458 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9459 {
9460 lowercase (tmp, salt_len);
9461 }
9462
9463 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9464 {
9465 uppercase (tmp, salt_len);
9466 }
9467
9468 u32 len = salt_len;
9469
9470 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9471 {
9472 tmp[len++] = 0x80;
9473 }
9474
9475 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9476 {
9477 tmp[len++] = 0x01;
9478 }
9479
9480 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9481 {
9482 u32 *tmp_uint = (uint *) tmp;
9483
9484 u32 max = len / 4;
9485
9486 if (len % 4) max++;
9487
9488 for (u32 i = 0; i < max; i++)
9489 {
9490 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9491 }
9492
9493 // Important: we may need to increase the length of memcpy since
9494 // we don't want to "loose" some swapped bytes (could happen if
9495 // they do not perfectly fit in the 4-byte blocks)
9496 // Memcpy does always copy the bytes in the BE order, but since
9497 // we swapped them, some important bytes could be in positions
9498 // we normally skip with the original len
9499
9500 if (len % 4) len += 4 - (len % 4);
9501 }
9502
9503 memcpy (out, tmp, len);
9504
9505 return (salt_len);
9506 }
9507
9508 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9509 {
9510 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9511
9512 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9513
9514 u32 *digest = (u32 *) hash_buf->digest;
9515
9516 salt_t *salt = hash_buf->salt;
9517
9518 memcpy ((char *) salt->salt_sign, input_buf, 6);
9519
9520 char *iter_pos = input_buf + 4;
9521
9522 salt->salt_iter = 1 << atoi (iter_pos);
9523
9524 char *salt_pos = strchr (iter_pos, '$');
9525
9526 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9527
9528 salt_pos++;
9529
9530 uint salt_len = 16;
9531
9532 salt->salt_len = salt_len;
9533
9534 u8 tmp_buf[100];
9535
9536 memset (tmp_buf, 0, sizeof (tmp_buf));
9537
9538 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9539
9540 char *salt_buf_ptr = (char *) salt->salt_buf;
9541
9542 memcpy (salt_buf_ptr, tmp_buf, 16);
9543
9544 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9545 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9546 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9547 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9548
9549 char *hash_pos = salt_pos + 22;
9550
9551 memset (tmp_buf, 0, sizeof (tmp_buf));
9552
9553 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9554
9555 memcpy (digest, tmp_buf, 24);
9556
9557 digest[0] = byte_swap_32 (digest[0]);
9558 digest[1] = byte_swap_32 (digest[1]);
9559 digest[2] = byte_swap_32 (digest[2]);
9560 digest[3] = byte_swap_32 (digest[3]);
9561 digest[4] = byte_swap_32 (digest[4]);
9562 digest[5] = byte_swap_32 (digest[5]);
9563
9564 digest[5] &= ~0xff; // its just 23 not 24 !
9565
9566 return (PARSER_OK);
9567 }
9568
9569 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9570 {
9571 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9572
9573 u32 *digest = (u32 *) hash_buf->digest;
9574
9575 u8 tmp_buf[100];
9576
9577 memset (tmp_buf, 0, sizeof (tmp_buf));
9578
9579 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9580
9581 memcpy (digest, tmp_buf, 32);
9582
9583 digest[0] = byte_swap_32 (digest[0]);
9584 digest[1] = byte_swap_32 (digest[1]);
9585 digest[2] = byte_swap_32 (digest[2]);
9586 digest[3] = byte_swap_32 (digest[3]);
9587 digest[4] = byte_swap_32 (digest[4]);
9588 digest[5] = byte_swap_32 (digest[5]);
9589 digest[6] = byte_swap_32 (digest[6]);
9590 digest[7] = byte_swap_32 (digest[7]);
9591
9592 digest[0] -= SHA256M_A;
9593 digest[1] -= SHA256M_B;
9594 digest[2] -= SHA256M_C;
9595 digest[3] -= SHA256M_D;
9596 digest[4] -= SHA256M_E;
9597 digest[5] -= SHA256M_F;
9598 digest[6] -= SHA256M_G;
9599 digest[7] -= SHA256M_H;
9600
9601 return (PARSER_OK);
9602 }
9603
9604 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9605 {
9606 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9607
9608 u32 *digest = (u32 *) hash_buf->digest;
9609
9610 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9611 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9612
9613 digest[0] = byte_swap_32 (digest[0]);
9614 digest[1] = byte_swap_32 (digest[1]);
9615
9616 uint tt;
9617
9618 IP (digest[0], digest[1], tt);
9619
9620 digest[0] = digest[0];
9621 digest[1] = digest[1];
9622 digest[2] = 0;
9623 digest[3] = 0;
9624
9625 return (PARSER_OK);
9626 }
9627
9628 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9629 {
9630 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9631
9632 u32 *digest = (u32 *) hash_buf->digest;
9633
9634 salt_t *salt = hash_buf->salt;
9635
9636 char *hash_pos = input_buf + 8;
9637
9638 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9639 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9640 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9641 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9642 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9643
9644 digest[0] -= SHA1M_A;
9645 digest[1] -= SHA1M_B;
9646 digest[2] -= SHA1M_C;
9647 digest[3] -= SHA1M_D;
9648 digest[4] -= SHA1M_E;
9649
9650 uint salt_len = 8;
9651
9652 char *salt_buf_ptr = (char *) salt->salt_buf;
9653
9654 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9655
9656 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9657
9658 salt->salt_len = salt_len;
9659
9660 return (PARSER_OK);
9661 }
9662
9663 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9664 {
9665 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9666
9667 u64 *digest = (u64 *) hash_buf->digest;
9668
9669 salt_t *salt = hash_buf->salt;
9670
9671 char *hash_pos = input_buf + 8;
9672
9673 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9674 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9675 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9676 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9677 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9678 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9679 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9680 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9681
9682 digest[0] -= SHA512M_A;
9683 digest[1] -= SHA512M_B;
9684 digest[2] -= SHA512M_C;
9685 digest[3] -= SHA512M_D;
9686 digest[4] -= SHA512M_E;
9687 digest[5] -= SHA512M_F;
9688 digest[6] -= SHA512M_G;
9689 digest[7] -= SHA512M_H;
9690
9691 uint salt_len = 8;
9692
9693 char *salt_buf_ptr = (char *) salt->salt_buf;
9694
9695 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9696
9697 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9698
9699 salt->salt_len = salt_len;
9700
9701 return (PARSER_OK);
9702 }
9703
9704 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9705 {
9706 if (data.opts_type & OPTS_TYPE_ST_HEX)
9707 {
9708 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9709 }
9710 else
9711 {
9712 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9713 }
9714
9715 u32 *digest = (u32 *) hash_buf->digest;
9716
9717 salt_t *salt = hash_buf->salt;
9718
9719 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9720 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9721 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9722 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9723
9724 digest[0] = byte_swap_32 (digest[0]);
9725 digest[1] = byte_swap_32 (digest[1]);
9726 digest[2] = byte_swap_32 (digest[2]);
9727 digest[3] = byte_swap_32 (digest[3]);
9728
9729 digest[0] -= MD5M_A;
9730 digest[1] -= MD5M_B;
9731 digest[2] -= MD5M_C;
9732 digest[3] -= MD5M_D;
9733
9734 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9735
9736 uint salt_len = input_len - 32 - 1;
9737
9738 char *salt_buf = input_buf + 32 + 1;
9739
9740 char *salt_buf_ptr = (char *) salt->salt_buf;
9741
9742 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9743
9744 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9745
9746 salt->salt_len = salt_len;
9747
9748 return (PARSER_OK);
9749 }
9750
9751 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9752 {
9753 if (data.opts_type & OPTS_TYPE_ST_HEX)
9754 {
9755 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9756 }
9757 else
9758 {
9759 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9760 }
9761
9762 // unscramble
9763
9764 char clean_input_buf[32];
9765
9766 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9767 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9768
9769 for (int i = 0, j = 0, k = 0; i < 30; i++)
9770 {
9771 if (i == pos[j])
9772 {
9773 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9774
9775 j++;
9776 }
9777 else
9778 {
9779 clean_input_buf[k] = input_buf[i];
9780
9781 k++;
9782 }
9783 }
9784
9785 // base64 decode
9786
9787 u32 *digest = (u32 *) hash_buf->digest;
9788
9789 salt_t *salt = hash_buf->salt;
9790
9791 u32 a, b, c, d, e, f;
9792
9793 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9794 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9795 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9796 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9797 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9798 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9799
9800 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9801 | (((d << 12) | (e << 6) | (f)) << 0);
9802
9803 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9804 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9805 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9806 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9807 e = base64_to_int (clean_input_buf[10] & 0x7f);
9808 f = base64_to_int (clean_input_buf[11] & 0x7f);
9809
9810 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9811 | (((d << 12) | (e << 6) | (f)) << 0);
9812
9813 a = base64_to_int (clean_input_buf[12] & 0x7f);
9814 b = base64_to_int (clean_input_buf[13] & 0x7f);
9815 c = base64_to_int (clean_input_buf[14] & 0x7f);
9816 d = base64_to_int (clean_input_buf[15] & 0x7f);
9817 e = base64_to_int (clean_input_buf[16] & 0x7f);
9818 f = base64_to_int (clean_input_buf[17] & 0x7f);
9819
9820 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9821 | (((d << 12) | (e << 6) | (f)) << 0);
9822
9823 a = base64_to_int (clean_input_buf[18] & 0x7f);
9824 b = base64_to_int (clean_input_buf[19] & 0x7f);
9825 c = base64_to_int (clean_input_buf[20] & 0x7f);
9826 d = base64_to_int (clean_input_buf[21] & 0x7f);
9827 e = base64_to_int (clean_input_buf[22] & 0x7f);
9828 f = base64_to_int (clean_input_buf[23] & 0x7f);
9829
9830 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9831 | (((d << 12) | (e << 6) | (f)) << 0);
9832
9833 digest[0] = byte_swap_32 (digest[0]);
9834 digest[1] = byte_swap_32 (digest[1]);
9835 digest[2] = byte_swap_32 (digest[2]);
9836 digest[3] = byte_swap_32 (digest[3]);
9837
9838 digest[0] -= MD5M_A;
9839 digest[1] -= MD5M_B;
9840 digest[2] -= MD5M_C;
9841 digest[3] -= MD5M_D;
9842
9843 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9844
9845 uint salt_len = input_len - 30 - 1;
9846
9847 char *salt_buf = input_buf + 30 + 1;
9848
9849 char *salt_buf_ptr = (char *) salt->salt_buf;
9850
9851 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9852
9853 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9854 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9855
9856 salt->salt_len = salt_len;
9857
9858 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9859
9860 salt->salt_len += 22;
9861
9862 return (PARSER_OK);
9863 }
9864
9865 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9866 {
9867 if (data.opts_type & OPTS_TYPE_ST_HEX)
9868 {
9869 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9870 }
9871 else
9872 {
9873 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9874 }
9875
9876 u32 *digest = (u32 *) hash_buf->digest;
9877
9878 salt_t *salt = hash_buf->salt;
9879
9880 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9881 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9882 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9883 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9884 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
9885
9886 digest[0] -= SHA1M_A;
9887 digest[1] -= SHA1M_B;
9888 digest[2] -= SHA1M_C;
9889 digest[3] -= SHA1M_D;
9890 digest[4] -= SHA1M_E;
9891
9892 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9893
9894 uint salt_len = input_len - 40 - 1;
9895
9896 char *salt_buf = input_buf + 40 + 1;
9897
9898 char *salt_buf_ptr = (char *) salt->salt_buf;
9899
9900 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9901
9902 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9903
9904 salt->salt_len = salt_len;
9905
9906 return (PARSER_OK);
9907 }
9908
9909 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9910 {
9911 if (data.opts_type & OPTS_TYPE_ST_HEX)
9912 {
9913 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9914 }
9915 else
9916 {
9917 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9918 }
9919
9920 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9921
9922 char *iter_pos = input_buf + 6;
9923
9924 salt_t *salt = hash_buf->salt;
9925
9926 uint iter = atoi (iter_pos);
9927
9928 if (iter < 1)
9929 {
9930 iter = ROUNDS_DCC2;
9931 }
9932
9933 salt->salt_iter = iter - 1;
9934
9935 char *salt_pos = strchr (iter_pos, '#');
9936
9937 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9938
9939 salt_pos++;
9940
9941 char *digest_pos = strchr (salt_pos, '#');
9942
9943 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9944
9945 digest_pos++;
9946
9947 uint salt_len = digest_pos - salt_pos - 1;
9948
9949 u32 *digest = (u32 *) hash_buf->digest;
9950
9951 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
9952 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
9953 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
9954 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
9955
9956 char *salt_buf_ptr = (char *) salt->salt_buf;
9957
9958 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9959
9960 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9961
9962 salt->salt_len = salt_len;
9963
9964 return (PARSER_OK);
9965 }
9966
9967 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9968 {
9969 u32 *digest = (u32 *) hash_buf->digest;
9970
9971 salt_t *salt = hash_buf->salt;
9972
9973 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9974
9975 hccap_t in;
9976
9977 memcpy (&in, input_buf, input_len);
9978
9979 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9980
9981 memcpy (digest, in.keymic, 16);
9982
9983 /*
9984 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9985 The phrase "Pairwise key expansion"
9986 Access Point Address (referred to as Authenticator Address AA)
9987 Supplicant Address (referred to as Supplicant Address SA)
9988 Access Point Nonce (referred to as Authenticator Anonce)
9989 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9990 */
9991
9992 uint salt_len = strlen (in.essid);
9993
9994 memcpy (salt->salt_buf, in.essid, salt_len);
9995
9996 salt->salt_len = salt_len;
9997
9998 salt->salt_iter = ROUNDS_WPA2 - 1;
9999
10000 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10001
10002 memcpy (pke_ptr, "Pairwise key expansion", 23);
10003
10004 if (memcmp (in.mac1, in.mac2, 6) < 0)
10005 {
10006 memcpy (pke_ptr + 23, in.mac1, 6);
10007 memcpy (pke_ptr + 29, in.mac2, 6);
10008 }
10009 else
10010 {
10011 memcpy (pke_ptr + 23, in.mac2, 6);
10012 memcpy (pke_ptr + 29, in.mac1, 6);
10013 }
10014
10015 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10016 {
10017 memcpy (pke_ptr + 35, in.nonce1, 32);
10018 memcpy (pke_ptr + 67, in.nonce2, 32);
10019 }
10020 else
10021 {
10022 memcpy (pke_ptr + 35, in.nonce2, 32);
10023 memcpy (pke_ptr + 67, in.nonce1, 32);
10024 }
10025
10026 for (int i = 0; i < 25; i++)
10027 {
10028 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10029 }
10030
10031 wpa->keyver = in.keyver;
10032
10033 if (wpa->keyver > 255)
10034 {
10035 log_info ("ATTENTION!");
10036 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10037 log_info (" This could be due to a recent aircrack-ng bug.");
10038 log_info (" The key version was automatically reset to a reasonable value.");
10039 log_info ("");
10040
10041 wpa->keyver &= 0xff;
10042 }
10043
10044 wpa->eapol_size = in.eapol_size;
10045
10046 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10047
10048 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10049
10050 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10051
10052 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10053
10054 if (wpa->keyver == 1)
10055 {
10056 // nothing to do
10057 }
10058 else
10059 {
10060 digest[0] = byte_swap_32 (digest[0]);
10061 digest[1] = byte_swap_32 (digest[1]);
10062 digest[2] = byte_swap_32 (digest[2]);
10063 digest[3] = byte_swap_32 (digest[3]);
10064
10065 for (int i = 0; i < 64; i++)
10066 {
10067 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10068 }
10069 }
10070
10071 salt->salt_buf[10] = digest[1];
10072 salt->salt_buf[11] = digest[2];
10073
10074 return (PARSER_OK);
10075 }
10076
10077 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10078 {
10079 u32 *digest = (u32 *) hash_buf->digest;
10080
10081 salt_t *salt = hash_buf->salt;
10082
10083 if (input_len == 0)
10084 {
10085 log_error ("Password Safe v2 container not specified");
10086
10087 exit (-1);
10088 }
10089
10090 FILE *fp = fopen (input_buf, "rb");
10091
10092 if (fp == NULL)
10093 {
10094 log_error ("%s: %s", input_buf, strerror (errno));
10095
10096 exit (-1);
10097 }
10098
10099 psafe2_hdr buf;
10100
10101 memset (&buf, 0, sizeof (psafe2_hdr));
10102
10103 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10104
10105 fclose (fp);
10106
10107 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10108
10109 salt->salt_buf[0] = buf.random[0];
10110 salt->salt_buf[1] = buf.random[1];
10111
10112 salt->salt_len = 8;
10113 salt->salt_iter = 1000;
10114
10115 digest[0] = byte_swap_32 (buf.hash[0]);
10116 digest[1] = byte_swap_32 (buf.hash[1]);
10117 digest[2] = byte_swap_32 (buf.hash[2]);
10118 digest[3] = byte_swap_32 (buf.hash[3]);
10119 digest[4] = byte_swap_32 (buf.hash[4]);
10120
10121 return (PARSER_OK);
10122 }
10123
10124 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10125 {
10126 u32 *digest = (u32 *) hash_buf->digest;
10127
10128 salt_t *salt = hash_buf->salt;
10129
10130 if (input_len == 0)
10131 {
10132 log_error (".psafe3 not specified");
10133
10134 exit (-1);
10135 }
10136
10137 FILE *fp = fopen (input_buf, "rb");
10138
10139 if (fp == NULL)
10140 {
10141 log_error ("%s: %s", input_buf, strerror (errno));
10142
10143 exit (-1);
10144 }
10145
10146 psafe3_t in;
10147
10148 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10149
10150 fclose (fp);
10151
10152 data.hashfile = input_buf; // we will need this in case it gets cracked
10153
10154 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10155
10156 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10157
10158 salt->salt_iter = in.iterations + 1;
10159
10160 salt->salt_buf[0] = in.salt_buf[0];
10161 salt->salt_buf[1] = in.salt_buf[1];
10162 salt->salt_buf[2] = in.salt_buf[2];
10163 salt->salt_buf[3] = in.salt_buf[3];
10164 salt->salt_buf[4] = in.salt_buf[4];
10165 salt->salt_buf[5] = in.salt_buf[5];
10166 salt->salt_buf[6] = in.salt_buf[6];
10167 salt->salt_buf[7] = in.salt_buf[7];
10168
10169 salt->salt_len = 32;
10170
10171 digest[0] = in.hash_buf[0];
10172 digest[1] = in.hash_buf[1];
10173 digest[2] = in.hash_buf[2];
10174 digest[3] = in.hash_buf[3];
10175 digest[4] = in.hash_buf[4];
10176 digest[5] = in.hash_buf[5];
10177 digest[6] = in.hash_buf[6];
10178 digest[7] = in.hash_buf[7];
10179
10180 digest[0] = byte_swap_32 (digest[0]);
10181 digest[1] = byte_swap_32 (digest[1]);
10182 digest[2] = byte_swap_32 (digest[2]);
10183 digest[3] = byte_swap_32 (digest[3]);
10184 digest[4] = byte_swap_32 (digest[4]);
10185 digest[5] = byte_swap_32 (digest[5]);
10186 digest[6] = byte_swap_32 (digest[6]);
10187 digest[7] = byte_swap_32 (digest[7]);
10188
10189 return (PARSER_OK);
10190 }
10191
10192 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10193 {
10194 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10195
10196 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10197
10198 u32 *digest = (u32 *) hash_buf->digest;
10199
10200 salt_t *salt = hash_buf->salt;
10201
10202 char *iter_pos = input_buf + 3;
10203
10204 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10205
10206 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10207
10208 memcpy ((char *) salt->salt_sign, input_buf, 4);
10209
10210 salt->salt_iter = salt_iter;
10211
10212 char *salt_pos = iter_pos + 1;
10213
10214 uint salt_len = 8;
10215
10216 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10217
10218 salt->salt_len = salt_len;
10219
10220 char *hash_pos = salt_pos + salt_len;
10221
10222 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10223
10224 return (PARSER_OK);
10225 }
10226
10227 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10228 {
10229 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10230
10231 u32 *digest = (u32 *) hash_buf->digest;
10232
10233 salt_t *salt = hash_buf->salt;
10234
10235 char *salt_pos = input_buf + 3;
10236
10237 uint iterations_len = 0;
10238
10239 if (memcmp (salt_pos, "rounds=", 7) == 0)
10240 {
10241 salt_pos += 7;
10242
10243 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10244
10245 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10246 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10247
10248 salt_pos[0] = 0x0;
10249
10250 salt->salt_iter = atoi (salt_pos - iterations_len);
10251
10252 salt_pos += 1;
10253
10254 iterations_len += 8;
10255 }
10256 else
10257 {
10258 salt->salt_iter = ROUNDS_MD5CRYPT;
10259 }
10260
10261 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10262
10263 char *hash_pos = strchr (salt_pos, '$');
10264
10265 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10266
10267 uint salt_len = hash_pos - salt_pos;
10268
10269 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10270
10271 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10272
10273 salt->salt_len = salt_len;
10274
10275 hash_pos++;
10276
10277 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10278
10279 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10280
10281 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10282
10283 return (PARSER_OK);
10284 }
10285
10286 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10287 {
10288 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10289
10290 u32 *digest = (u32 *) hash_buf->digest;
10291
10292 salt_t *salt = hash_buf->salt;
10293
10294 char *salt_pos = input_buf + 6;
10295
10296 uint iterations_len = 0;
10297
10298 if (memcmp (salt_pos, "rounds=", 7) == 0)
10299 {
10300 salt_pos += 7;
10301
10302 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10303
10304 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10305 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10306
10307 salt_pos[0] = 0x0;
10308
10309 salt->salt_iter = atoi (salt_pos - iterations_len);
10310
10311 salt_pos += 1;
10312
10313 iterations_len += 8;
10314 }
10315 else
10316 {
10317 salt->salt_iter = ROUNDS_MD5CRYPT;
10318 }
10319
10320 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10321
10322 char *hash_pos = strchr (salt_pos, '$');
10323
10324 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10325
10326 uint salt_len = hash_pos - salt_pos;
10327
10328 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10329
10330 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10331
10332 salt->salt_len = salt_len;
10333
10334 hash_pos++;
10335
10336 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10337
10338 return (PARSER_OK);
10339 }
10340
10341 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10342 {
10343 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10344
10345 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10346
10347 u32 *digest = (u32 *) hash_buf->digest;
10348
10349 salt_t *salt = hash_buf->salt;
10350
10351 char *salt_pos = input_buf + 14;
10352
10353 char *hash_pos = strchr (salt_pos, '*');
10354
10355 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10356
10357 hash_pos++;
10358
10359 uint salt_len = hash_pos - salt_pos - 1;
10360
10361 char *salt_buf_ptr = (char *) salt->salt_buf;
10362
10363 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10364
10365 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10366
10367 salt->salt_len = salt_len;
10368
10369 u8 tmp_buf[100];
10370
10371 memset (tmp_buf, 0, sizeof (tmp_buf));
10372
10373 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10374
10375 memcpy (digest, tmp_buf, 20);
10376
10377 digest[0] = byte_swap_32 (digest[0]);
10378 digest[1] = byte_swap_32 (digest[1]);
10379 digest[2] = byte_swap_32 (digest[2]);
10380 digest[3] = byte_swap_32 (digest[3]);
10381 digest[4] = byte_swap_32 (digest[4]);
10382
10383 digest[0] -= SHA1M_A;
10384 digest[1] -= SHA1M_B;
10385 digest[2] -= SHA1M_C;
10386 digest[3] -= SHA1M_D;
10387 digest[4] -= SHA1M_E;
10388
10389 return (PARSER_OK);
10390 }
10391
10392 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10393 {
10394 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10395
10396 unsigned char c12 = itoa64_to_int (input_buf[12]);
10397
10398 if (c12 & 3) return (PARSER_HASH_VALUE);
10399
10400 u32 *digest = (u32 *) hash_buf->digest;
10401
10402 salt_t *salt = hash_buf->salt;
10403
10404 // for ascii_digest
10405 salt->salt_sign[0] = input_buf[0];
10406 salt->salt_sign[1] = input_buf[1];
10407
10408 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10409 | itoa64_to_int (input_buf[1]) << 6;
10410
10411 salt->salt_len = 2;
10412
10413 u8 tmp_buf[100];
10414
10415 memset (tmp_buf, 0, sizeof (tmp_buf));
10416
10417 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10418
10419 memcpy (digest, tmp_buf, 8);
10420
10421 uint tt;
10422
10423 IP (digest[0], digest[1], tt);
10424
10425 digest[2] = 0;
10426 digest[3] = 0;
10427
10428 return (PARSER_OK);
10429 }
10430
10431 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10432 {
10433 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10434
10435 u32 *digest = (u32 *) hash_buf->digest;
10436
10437 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10438 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10439 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10440 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10441
10442 digest[0] = byte_swap_32 (digest[0]);
10443 digest[1] = byte_swap_32 (digest[1]);
10444 digest[2] = byte_swap_32 (digest[2]);
10445 digest[3] = byte_swap_32 (digest[3]);
10446
10447 digest[0] -= MD4M_A;
10448 digest[1] -= MD4M_B;
10449 digest[2] -= MD4M_C;
10450 digest[3] -= MD4M_D;
10451
10452 return (PARSER_OK);
10453 }
10454
10455 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10456 {
10457 if (data.opts_type & OPTS_TYPE_ST_HEX)
10458 {
10459 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10460 }
10461 else
10462 {
10463 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10464 }
10465
10466 u32 *digest = (u32 *) hash_buf->digest;
10467
10468 salt_t *salt = hash_buf->salt;
10469
10470 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10471 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10472 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10473 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10474
10475 digest[0] = byte_swap_32 (digest[0]);
10476 digest[1] = byte_swap_32 (digest[1]);
10477 digest[2] = byte_swap_32 (digest[2]);
10478 digest[3] = byte_swap_32 (digest[3]);
10479
10480 digest[0] -= MD4M_A;
10481 digest[1] -= MD4M_B;
10482 digest[2] -= MD4M_C;
10483 digest[3] -= MD4M_D;
10484
10485 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10486
10487 uint salt_len = input_len - 32 - 1;
10488
10489 char *salt_buf = input_buf + 32 + 1;
10490
10491 char *salt_buf_ptr = (char *) salt->salt_buf;
10492
10493 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10494
10495 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10496
10497 salt->salt_len = salt_len;
10498
10499 return (PARSER_OK);
10500 }
10501
10502 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10503 {
10504 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10505
10506 u32 *digest = (u32 *) hash_buf->digest;
10507
10508 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10509 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10510 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10511 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10512
10513 digest[0] = byte_swap_32 (digest[0]);
10514 digest[1] = byte_swap_32 (digest[1]);
10515 digest[2] = byte_swap_32 (digest[2]);
10516 digest[3] = byte_swap_32 (digest[3]);
10517
10518 digest[0] -= MD5M_A;
10519 digest[1] -= MD5M_B;
10520 digest[2] -= MD5M_C;
10521 digest[3] -= MD5M_D;
10522
10523 return (PARSER_OK);
10524 }
10525
10526 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10527 {
10528 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10529
10530 u32 *digest = (u32 *) hash_buf->digest;
10531
10532 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10533 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10534 digest[2] = 0;
10535 digest[3] = 0;
10536
10537 digest[0] = byte_swap_32 (digest[0]);
10538 digest[1] = byte_swap_32 (digest[1]);
10539
10540 return (PARSER_OK);
10541 }
10542
10543 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10544 {
10545 if (data.opts_type & OPTS_TYPE_ST_HEX)
10546 {
10547 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10548 }
10549 else
10550 {
10551 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10552 }
10553
10554 u32 *digest = (u32 *) hash_buf->digest;
10555
10556 salt_t *salt = hash_buf->salt;
10557
10558 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10559 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10560 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10561 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10562
10563 digest[0] = byte_swap_32 (digest[0]);
10564 digest[1] = byte_swap_32 (digest[1]);
10565 digest[2] = byte_swap_32 (digest[2]);
10566 digest[3] = byte_swap_32 (digest[3]);
10567
10568 digest[0] -= MD5M_A;
10569 digest[1] -= MD5M_B;
10570 digest[2] -= MD5M_C;
10571 digest[3] -= MD5M_D;
10572
10573 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10574
10575 uint salt_len = input_len - 32 - 1;
10576
10577 char *salt_buf = input_buf + 32 + 1;
10578
10579 char *salt_buf_ptr = (char *) salt->salt_buf;
10580
10581 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10582
10583 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10584
10585 salt->salt_len = salt_len;
10586
10587 return (PARSER_OK);
10588 }
10589
10590 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10591 {
10592 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10593
10594 u32 *digest = (u32 *) hash_buf->digest;
10595
10596 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10597 | itoa64_to_int (input_buf[ 1]) << 6
10598 | itoa64_to_int (input_buf[ 2]) << 12
10599 | itoa64_to_int (input_buf[ 3]) << 18;
10600 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10601 | itoa64_to_int (input_buf[ 5]) << 6
10602 | itoa64_to_int (input_buf[ 6]) << 12
10603 | itoa64_to_int (input_buf[ 7]) << 18;
10604 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10605 | itoa64_to_int (input_buf[ 9]) << 6
10606 | itoa64_to_int (input_buf[10]) << 12
10607 | itoa64_to_int (input_buf[11]) << 18;
10608 digest[3] = itoa64_to_int (input_buf[12]) << 0
10609 | itoa64_to_int (input_buf[13]) << 6
10610 | itoa64_to_int (input_buf[14]) << 12
10611 | itoa64_to_int (input_buf[15]) << 18;
10612
10613 digest[0] -= MD5M_A;
10614 digest[1] -= MD5M_B;
10615 digest[2] -= MD5M_C;
10616 digest[3] -= MD5M_D;
10617
10618 digest[0] &= 0x00ffffff;
10619 digest[1] &= 0x00ffffff;
10620 digest[2] &= 0x00ffffff;
10621 digest[3] &= 0x00ffffff;
10622
10623 return (PARSER_OK);
10624 }
10625
10626 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10627 {
10628 if (data.opts_type & OPTS_TYPE_ST_HEX)
10629 {
10630 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10631 }
10632 else
10633 {
10634 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10635 }
10636
10637 u32 *digest = (u32 *) hash_buf->digest;
10638
10639 salt_t *salt = hash_buf->salt;
10640
10641 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10642 | itoa64_to_int (input_buf[ 1]) << 6
10643 | itoa64_to_int (input_buf[ 2]) << 12
10644 | itoa64_to_int (input_buf[ 3]) << 18;
10645 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10646 | itoa64_to_int (input_buf[ 5]) << 6
10647 | itoa64_to_int (input_buf[ 6]) << 12
10648 | itoa64_to_int (input_buf[ 7]) << 18;
10649 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10650 | itoa64_to_int (input_buf[ 9]) << 6
10651 | itoa64_to_int (input_buf[10]) << 12
10652 | itoa64_to_int (input_buf[11]) << 18;
10653 digest[3] = itoa64_to_int (input_buf[12]) << 0
10654 | itoa64_to_int (input_buf[13]) << 6
10655 | itoa64_to_int (input_buf[14]) << 12
10656 | itoa64_to_int (input_buf[15]) << 18;
10657
10658 digest[0] -= MD5M_A;
10659 digest[1] -= MD5M_B;
10660 digest[2] -= MD5M_C;
10661 digest[3] -= MD5M_D;
10662
10663 digest[0] &= 0x00ffffff;
10664 digest[1] &= 0x00ffffff;
10665 digest[2] &= 0x00ffffff;
10666 digest[3] &= 0x00ffffff;
10667
10668 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10669
10670 uint salt_len = input_len - 16 - 1;
10671
10672 char *salt_buf = input_buf + 16 + 1;
10673
10674 char *salt_buf_ptr = (char *) salt->salt_buf;
10675
10676 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10677
10678 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10679
10680 salt->salt_len = salt_len;
10681
10682 return (PARSER_OK);
10683 }
10684
10685 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10686 {
10687 key[0] = (nthash[0] >> 0);
10688 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10689 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10690 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10691 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10692 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10693 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10694 key[7] = (nthash[6] << 1);
10695
10696 key[0] |= 0x01;
10697 key[1] |= 0x01;
10698 key[2] |= 0x01;
10699 key[3] |= 0x01;
10700 key[4] |= 0x01;
10701 key[5] |= 0x01;
10702 key[6] |= 0x01;
10703 key[7] |= 0x01;
10704 }
10705
10706 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10707 {
10708 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10709
10710 u32 *digest = (u32 *) hash_buf->digest;
10711
10712 salt_t *salt = hash_buf->salt;
10713
10714 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10715
10716 /**
10717 * parse line
10718 */
10719
10720 char *user_pos = input_buf;
10721
10722 char *unused_pos = strchr (user_pos, ':');
10723
10724 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10725
10726 uint user_len = unused_pos - user_pos;
10727
10728 if (user_len > 60) return (PARSER_SALT_LENGTH);
10729
10730 unused_pos++;
10731
10732 char *domain_pos = strchr (unused_pos, ':');
10733
10734 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10735
10736 uint unused_len = domain_pos - unused_pos;
10737
10738 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10739
10740 domain_pos++;
10741
10742 char *srvchall_pos = strchr (domain_pos, ':');
10743
10744 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10745
10746 uint domain_len = srvchall_pos - domain_pos;
10747
10748 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10749
10750 srvchall_pos++;
10751
10752 char *hash_pos = strchr (srvchall_pos, ':');
10753
10754 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10755
10756 uint srvchall_len = hash_pos - srvchall_pos;
10757
10758 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10759
10760 hash_pos++;
10761
10762 char *clichall_pos = strchr (hash_pos, ':');
10763
10764 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10765
10766 uint hash_len = clichall_pos - hash_pos;
10767
10768 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10769
10770 clichall_pos++;
10771
10772 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10773
10774 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10775
10776 /**
10777 * store some data for later use
10778 */
10779
10780 netntlm->user_len = user_len * 2;
10781 netntlm->domain_len = domain_len * 2;
10782 netntlm->srvchall_len = srvchall_len / 2;
10783 netntlm->clichall_len = clichall_len / 2;
10784
10785 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10786 char *chall_ptr = (char *) netntlm->chall_buf;
10787
10788 /**
10789 * handle username and domainname
10790 */
10791
10792 for (uint i = 0; i < user_len; i++)
10793 {
10794 *userdomain_ptr++ = user_pos[i];
10795 *userdomain_ptr++ = 0;
10796 }
10797
10798 for (uint i = 0; i < domain_len; i++)
10799 {
10800 *userdomain_ptr++ = domain_pos[i];
10801 *userdomain_ptr++ = 0;
10802 }
10803
10804 /**
10805 * handle server challenge encoding
10806 */
10807
10808 for (uint i = 0; i < srvchall_len; i += 2)
10809 {
10810 const char p0 = srvchall_pos[i + 0];
10811 const char p1 = srvchall_pos[i + 1];
10812
10813 *chall_ptr++ = hex_convert (p1) << 0
10814 | hex_convert (p0) << 4;
10815 }
10816
10817 /**
10818 * handle client challenge encoding
10819 */
10820
10821 for (uint i = 0; i < clichall_len; i += 2)
10822 {
10823 const char p0 = clichall_pos[i + 0];
10824 const char p1 = clichall_pos[i + 1];
10825
10826 *chall_ptr++ = hex_convert (p1) << 0
10827 | hex_convert (p0) << 4;
10828 }
10829
10830 /**
10831 * store data
10832 */
10833
10834 char *salt_buf_ptr = (char *) salt->salt_buf;
10835
10836 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10837
10838 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10839
10840 salt->salt_len = salt_len;
10841
10842 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10843 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10844 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10845 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10846
10847 digest[0] = byte_swap_32 (digest[0]);
10848 digest[1] = byte_swap_32 (digest[1]);
10849 digest[2] = byte_swap_32 (digest[2]);
10850 digest[3] = byte_swap_32 (digest[3]);
10851
10852 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10853
10854 uint digest_tmp[2];
10855
10856 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10857 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
10858
10859 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10860 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10861
10862 /* special case 2: ESS */
10863
10864 if (srvchall_len == 48)
10865 {
10866 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10867 {
10868 uint w[16];
10869
10870 w[ 0] = netntlm->chall_buf[6];
10871 w[ 1] = netntlm->chall_buf[7];
10872 w[ 2] = netntlm->chall_buf[0];
10873 w[ 3] = netntlm->chall_buf[1];
10874 w[ 4] = 0x80;
10875 w[ 5] = 0;
10876 w[ 6] = 0;
10877 w[ 7] = 0;
10878 w[ 8] = 0;
10879 w[ 9] = 0;
10880 w[10] = 0;
10881 w[11] = 0;
10882 w[12] = 0;
10883 w[13] = 0;
10884 w[14] = 16 * 8;
10885 w[15] = 0;
10886
10887 uint dgst[4];
10888
10889 dgst[0] = MAGIC_A;
10890 dgst[1] = MAGIC_B;
10891 dgst[2] = MAGIC_C;
10892 dgst[3] = MAGIC_D;
10893
10894 md5_64 (w, dgst);
10895
10896 salt->salt_buf[0] = dgst[0];
10897 salt->salt_buf[1] = dgst[1];
10898 }
10899 }
10900
10901 /* precompute netntlmv1 exploit start */
10902
10903 for (uint i = 0; i < 0x10000; i++)
10904 {
10905 uint key_md4[2] = { i, 0 };
10906 uint key_des[2] = { 0, 0 };
10907
10908 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
10909
10910 uint Kc[16];
10911 uint Kd[16];
10912
10913 _des_keysetup (key_des, Kc, Kd, c_skb);
10914
10915 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10916
10917 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10918
10919 if (data3[0] != digest_tmp[0]) continue;
10920 if (data3[1] != digest_tmp[1]) continue;
10921
10922 salt->salt_buf[2] = i;
10923
10924 salt->salt_len = 24;
10925
10926 break;
10927 }
10928
10929 salt->salt_buf_pc[0] = digest_tmp[0];
10930 salt->salt_buf_pc[1] = digest_tmp[1];
10931
10932 /* precompute netntlmv1 exploit stop */
10933
10934 u32 tt;
10935
10936 IP (digest[0], digest[1], tt);
10937 IP (digest[2], digest[3], tt);
10938
10939 digest[0] = rotr32 (digest[0], 29);
10940 digest[1] = rotr32 (digest[1], 29);
10941 digest[2] = rotr32 (digest[2], 29);
10942 digest[3] = rotr32 (digest[3], 29);
10943
10944 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10945
10946 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
10947 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
10948
10949 return (PARSER_OK);
10950 }
10951
10952 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10953 {
10954 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10955
10956 u32 *digest = (u32 *) hash_buf->digest;
10957
10958 salt_t *salt = hash_buf->salt;
10959
10960 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10961
10962 /**
10963 * parse line
10964 */
10965
10966 char *user_pos = input_buf;
10967
10968 char *unused_pos = strchr (user_pos, ':');
10969
10970 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10971
10972 uint user_len = unused_pos - user_pos;
10973
10974 if (user_len > 60) return (PARSER_SALT_LENGTH);
10975
10976 unused_pos++;
10977
10978 char *domain_pos = strchr (unused_pos, ':');
10979
10980 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10981
10982 uint unused_len = domain_pos - unused_pos;
10983
10984 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10985
10986 domain_pos++;
10987
10988 char *srvchall_pos = strchr (domain_pos, ':');
10989
10990 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10991
10992 uint domain_len = srvchall_pos - domain_pos;
10993
10994 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10995
10996 srvchall_pos++;
10997
10998 char *hash_pos = strchr (srvchall_pos, ':');
10999
11000 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11001
11002 uint srvchall_len = hash_pos - srvchall_pos;
11003
11004 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11005
11006 hash_pos++;
11007
11008 char *clichall_pos = strchr (hash_pos, ':');
11009
11010 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11011
11012 uint hash_len = clichall_pos - hash_pos;
11013
11014 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11015
11016 clichall_pos++;
11017
11018 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11019
11020 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11021
11022 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11023
11024 /**
11025 * store some data for later use
11026 */
11027
11028 netntlm->user_len = user_len * 2;
11029 netntlm->domain_len = domain_len * 2;
11030 netntlm->srvchall_len = srvchall_len / 2;
11031 netntlm->clichall_len = clichall_len / 2;
11032
11033 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11034 char *chall_ptr = (char *) netntlm->chall_buf;
11035
11036 /**
11037 * handle username and domainname
11038 */
11039
11040 for (uint i = 0; i < user_len; i++)
11041 {
11042 *userdomain_ptr++ = toupper (user_pos[i]);
11043 *userdomain_ptr++ = 0;
11044 }
11045
11046 for (uint i = 0; i < domain_len; i++)
11047 {
11048 *userdomain_ptr++ = domain_pos[i];
11049 *userdomain_ptr++ = 0;
11050 }
11051
11052 *userdomain_ptr++ = 0x80;
11053
11054 /**
11055 * handle server challenge encoding
11056 */
11057
11058 for (uint i = 0; i < srvchall_len; i += 2)
11059 {
11060 const char p0 = srvchall_pos[i + 0];
11061 const char p1 = srvchall_pos[i + 1];
11062
11063 *chall_ptr++ = hex_convert (p1) << 0
11064 | hex_convert (p0) << 4;
11065 }
11066
11067 /**
11068 * handle client challenge encoding
11069 */
11070
11071 for (uint i = 0; i < clichall_len; i += 2)
11072 {
11073 const char p0 = clichall_pos[i + 0];
11074 const char p1 = clichall_pos[i + 1];
11075
11076 *chall_ptr++ = hex_convert (p1) << 0
11077 | hex_convert (p0) << 4;
11078 }
11079
11080 *chall_ptr++ = 0x80;
11081
11082 /**
11083 * handle hash itself
11084 */
11085
11086 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11087 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11088 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11089 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11090
11091 digest[0] = byte_swap_32 (digest[0]);
11092 digest[1] = byte_swap_32 (digest[1]);
11093 digest[2] = byte_swap_32 (digest[2]);
11094 digest[3] = byte_swap_32 (digest[3]);
11095
11096 /**
11097 * reuse challange data as salt_buf, its the buffer that is most likely unique
11098 */
11099
11100 salt->salt_buf[0] = 0;
11101 salt->salt_buf[1] = 0;
11102 salt->salt_buf[2] = 0;
11103 salt->salt_buf[3] = 0;
11104 salt->salt_buf[4] = 0;
11105 salt->salt_buf[5] = 0;
11106 salt->salt_buf[6] = 0;
11107 salt->salt_buf[7] = 0;
11108
11109 uint *uptr;
11110
11111 uptr = (uint *) netntlm->userdomain_buf;
11112
11113 for (uint i = 0; i < 16; i += 16)
11114 {
11115 md5_64 (uptr, salt->salt_buf);
11116 }
11117
11118 uptr = (uint *) netntlm->chall_buf;
11119
11120 for (uint i = 0; i < 256; i += 16)
11121 {
11122 md5_64 (uptr, salt->salt_buf);
11123 }
11124
11125 salt->salt_len = 16;
11126
11127 return (PARSER_OK);
11128 }
11129
11130 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11131 {
11132 if (data.opts_type & OPTS_TYPE_ST_HEX)
11133 {
11134 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11135 }
11136 else
11137 {
11138 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11139 }
11140
11141 u32 *digest = (u32 *) hash_buf->digest;
11142
11143 salt_t *salt = hash_buf->salt;
11144
11145 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11146 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11147 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11148 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11149
11150 digest[0] = byte_swap_32 (digest[0]);
11151 digest[1] = byte_swap_32 (digest[1]);
11152 digest[2] = byte_swap_32 (digest[2]);
11153 digest[3] = byte_swap_32 (digest[3]);
11154
11155 digest[0] -= MD5M_A;
11156 digest[1] -= MD5M_B;
11157 digest[2] -= MD5M_C;
11158 digest[3] -= MD5M_D;
11159
11160 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11161
11162 uint salt_len = input_len - 32 - 1;
11163
11164 char *salt_buf = input_buf + 32 + 1;
11165
11166 char *salt_buf_ptr = (char *) salt->salt_buf;
11167
11168 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11169
11170 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11171
11172 salt->salt_len = salt_len;
11173
11174 return (PARSER_OK);
11175 }
11176
11177 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11178 {
11179 if (data.opts_type & OPTS_TYPE_ST_HEX)
11180 {
11181 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11182 }
11183 else
11184 {
11185 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11186 }
11187
11188 u32 *digest = (u32 *) hash_buf->digest;
11189
11190 salt_t *salt = hash_buf->salt;
11191
11192 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11193 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11194 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11195 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11196
11197 digest[0] = byte_swap_32 (digest[0]);
11198 digest[1] = byte_swap_32 (digest[1]);
11199 digest[2] = byte_swap_32 (digest[2]);
11200 digest[3] = byte_swap_32 (digest[3]);
11201
11202 digest[0] -= MD5M_A;
11203 digest[1] -= MD5M_B;
11204 digest[2] -= MD5M_C;
11205 digest[3] -= MD5M_D;
11206
11207 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11208
11209 uint salt_len = input_len - 32 - 1;
11210
11211 char *salt_buf = input_buf + 32 + 1;
11212
11213 char *salt_buf_ptr = (char *) salt->salt_buf;
11214
11215 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11216
11217 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11218
11219 salt->salt_len = salt_len;
11220
11221 return (PARSER_OK);
11222 }
11223
11224 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11225 {
11226 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11227
11228 u32 *digest = (u32 *) hash_buf->digest;
11229
11230 salt_t *salt = hash_buf->salt;
11231
11232 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11233 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11234 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11235 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11236
11237 digest[0] = byte_swap_32 (digest[0]);
11238 digest[1] = byte_swap_32 (digest[1]);
11239 digest[2] = byte_swap_32 (digest[2]);
11240 digest[3] = byte_swap_32 (digest[3]);
11241
11242 digest[0] -= MD5M_A;
11243 digest[1] -= MD5M_B;
11244 digest[2] -= MD5M_C;
11245 digest[3] -= MD5M_D;
11246
11247 /**
11248 * This is a virtual salt. While the algorithm is basically not salted
11249 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11250 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11251 */
11252
11253 char *salt_buf_ptr = (char *) salt->salt_buf;
11254
11255 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11256
11257 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11258
11259 salt->salt_len = salt_len;
11260
11261 return (PARSER_OK);
11262 }
11263
11264 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11265 {
11266 if (data.opts_type & OPTS_TYPE_ST_HEX)
11267 {
11268 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11269 }
11270 else
11271 {
11272 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11273 }
11274
11275 u32 *digest = (u32 *) hash_buf->digest;
11276
11277 salt_t *salt = hash_buf->salt;
11278
11279 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11280 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11281 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11282 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11283
11284 digest[0] = byte_swap_32 (digest[0]);
11285 digest[1] = byte_swap_32 (digest[1]);
11286 digest[2] = byte_swap_32 (digest[2]);
11287 digest[3] = byte_swap_32 (digest[3]);
11288
11289 digest[0] -= MD5M_A;
11290 digest[1] -= MD5M_B;
11291 digest[2] -= MD5M_C;
11292 digest[3] -= MD5M_D;
11293
11294 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11295
11296 uint salt_len = input_len - 32 - 1;
11297
11298 char *salt_buf = input_buf + 32 + 1;
11299
11300 char *salt_buf_ptr = (char *) salt->salt_buf;
11301
11302 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11303
11304 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11305
11306 salt->salt_len = salt_len;
11307
11308 return (PARSER_OK);
11309 }
11310
11311 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11312 {
11313 if (data.opts_type & OPTS_TYPE_ST_HEX)
11314 {
11315 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11316 }
11317 else
11318 {
11319 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11320 }
11321
11322 u32 *digest = (u32 *) hash_buf->digest;
11323
11324 salt_t *salt = hash_buf->salt;
11325
11326 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11327 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11328 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11329 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11330
11331 digest[0] = byte_swap_32 (digest[0]);
11332 digest[1] = byte_swap_32 (digest[1]);
11333 digest[2] = byte_swap_32 (digest[2]);
11334 digest[3] = byte_swap_32 (digest[3]);
11335
11336 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11337
11338 uint salt_len = input_len - 32 - 1;
11339
11340 char *salt_buf = input_buf + 32 + 1;
11341
11342 char *salt_buf_ptr = (char *) salt->salt_buf;
11343
11344 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11345
11346 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11347
11348 salt->salt_len = salt_len;
11349
11350 return (PARSER_OK);
11351 }
11352
11353 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11354 {
11355 if (data.opts_type & OPTS_TYPE_ST_HEX)
11356 {
11357 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11358 }
11359 else
11360 {
11361 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11362 }
11363
11364 u32 *digest = (u32 *) hash_buf->digest;
11365
11366 salt_t *salt = hash_buf->salt;
11367
11368 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11369 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11370 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11371 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11372
11373 digest[0] = byte_swap_32 (digest[0]);
11374 digest[1] = byte_swap_32 (digest[1]);
11375 digest[2] = byte_swap_32 (digest[2]);
11376 digest[3] = byte_swap_32 (digest[3]);
11377
11378 digest[0] -= MD4M_A;
11379 digest[1] -= MD4M_B;
11380 digest[2] -= MD4M_C;
11381 digest[3] -= MD4M_D;
11382
11383 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11384
11385 uint salt_len = input_len - 32 - 1;
11386
11387 char *salt_buf = input_buf + 32 + 1;
11388
11389 char *salt_buf_ptr = (char *) salt->salt_buf;
11390
11391 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11392
11393 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11394
11395 salt->salt_len = salt_len;
11396
11397 return (PARSER_OK);
11398 }
11399
11400 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11401 {
11402 if (data.opts_type & OPTS_TYPE_ST_HEX)
11403 {
11404 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11405 }
11406 else
11407 {
11408 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11409 }
11410
11411 u32 *digest = (u32 *) hash_buf->digest;
11412
11413 salt_t *salt = hash_buf->salt;
11414
11415 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11416 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11417 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11418 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11419
11420 digest[0] = byte_swap_32 (digest[0]);
11421 digest[1] = byte_swap_32 (digest[1]);
11422 digest[2] = byte_swap_32 (digest[2]);
11423 digest[3] = byte_swap_32 (digest[3]);
11424
11425 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11426
11427 uint salt_len = input_len - 32 - 1;
11428
11429 char *salt_buf = input_buf + 32 + 1;
11430
11431 uint salt_pc_block[16];
11432
11433 memset (salt_pc_block, 0, sizeof (salt_pc_block));
11434
11435 char *salt_pc_block_ptr = (char *) salt_pc_block;
11436
11437 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11438
11439 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11440
11441 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11442
11443 salt_pc_block[14] = salt_len * 8;
11444
11445 uint salt_pc_digest[4];
11446
11447 salt_pc_digest[0] = MAGIC_A;
11448 salt_pc_digest[1] = MAGIC_B;
11449 salt_pc_digest[2] = MAGIC_C;
11450 salt_pc_digest[3] = MAGIC_D;
11451
11452 md5_64 (salt_pc_block, salt_pc_digest);
11453
11454 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11455 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11456 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11457 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11458
11459 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11460
11461 memcpy (salt_buf_ptr, salt_buf, salt_len);
11462
11463 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11464
11465 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11466 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11467 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11468 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11469
11470 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11471
11472 return (PARSER_OK);
11473 }
11474
11475 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11476 {
11477 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11478
11479 u32 *digest = (u32 *) hash_buf->digest;
11480
11481 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11482 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11483 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11484 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11485 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11486
11487 digest[0] -= SHA1M_A;
11488 digest[1] -= SHA1M_B;
11489 digest[2] -= SHA1M_C;
11490 digest[3] -= SHA1M_D;
11491 digest[4] -= SHA1M_E;
11492
11493 return (PARSER_OK);
11494 }
11495
11496 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11497 {
11498 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11499
11500 u32 *digest = (u32 *) hash_buf->digest;
11501
11502 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11503 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11504 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11505 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11506 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11507
11508 return (PARSER_OK);
11509 }
11510
11511 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11512 {
11513 if (data.opts_type & OPTS_TYPE_ST_HEX)
11514 {
11515 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11516 }
11517 else
11518 {
11519 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11520 }
11521
11522 u32 *digest = (u32 *) hash_buf->digest;
11523
11524 salt_t *salt = hash_buf->salt;
11525
11526 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11527 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11528 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11529 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11530 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11531
11532 digest[0] -= SHA1M_A;
11533 digest[1] -= SHA1M_B;
11534 digest[2] -= SHA1M_C;
11535 digest[3] -= SHA1M_D;
11536 digest[4] -= SHA1M_E;
11537
11538 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11539
11540 uint salt_len = input_len - 40 - 1;
11541
11542 char *salt_buf = input_buf + 40 + 1;
11543
11544 char *salt_buf_ptr = (char *) salt->salt_buf;
11545
11546 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11547
11548 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11549
11550 salt->salt_len = salt_len;
11551
11552 return (PARSER_OK);
11553 }
11554
11555 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11556 {
11557 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11558
11559 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11560
11561 u32 *digest = (u32 *) hash_buf->digest;
11562
11563 u8 tmp_buf[100];
11564
11565 memset (tmp_buf, 0, sizeof (tmp_buf));
11566
11567 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11568
11569 memcpy (digest, tmp_buf, 20);
11570
11571 digest[0] = byte_swap_32 (digest[0]);
11572 digest[1] = byte_swap_32 (digest[1]);
11573 digest[2] = byte_swap_32 (digest[2]);
11574 digest[3] = byte_swap_32 (digest[3]);
11575 digest[4] = byte_swap_32 (digest[4]);
11576
11577 digest[0] -= SHA1M_A;
11578 digest[1] -= SHA1M_B;
11579 digest[2] -= SHA1M_C;
11580 digest[3] -= SHA1M_D;
11581 digest[4] -= SHA1M_E;
11582
11583 return (PARSER_OK);
11584 }
11585
11586 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11587 {
11588 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11589
11590 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11591
11592 u32 *digest = (u32 *) hash_buf->digest;
11593
11594 salt_t *salt = hash_buf->salt;
11595
11596 u8 tmp_buf[100];
11597
11598 memset (tmp_buf, 0, sizeof (tmp_buf));
11599
11600 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11601
11602 memcpy (digest, tmp_buf, 20);
11603
11604 salt->salt_len = tmp_len - 20;
11605
11606 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11607
11608 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11609 {
11610 char *ptr = (char *) salt->salt_buf;
11611
11612 ptr[salt->salt_len] = 0x80;
11613 }
11614
11615 digest[0] = byte_swap_32 (digest[0]);
11616 digest[1] = byte_swap_32 (digest[1]);
11617 digest[2] = byte_swap_32 (digest[2]);
11618 digest[3] = byte_swap_32 (digest[3]);
11619 digest[4] = byte_swap_32 (digest[4]);
11620
11621 digest[0] -= SHA1M_A;
11622 digest[1] -= SHA1M_B;
11623 digest[2] -= SHA1M_C;
11624 digest[3] -= SHA1M_D;
11625 digest[4] -= SHA1M_E;
11626
11627 return (PARSER_OK);
11628 }
11629
11630 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11631 {
11632 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11633
11634 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11635
11636 u32 *digest = (u32 *) hash_buf->digest;
11637
11638 salt_t *salt = hash_buf->salt;
11639
11640 char *salt_buf = input_buf + 6;
11641
11642 uint salt_len = 8;
11643
11644 char *salt_buf_ptr = (char *) salt->salt_buf;
11645
11646 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11647
11648 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11649
11650 salt->salt_len = salt_len;
11651
11652 char *hash_pos = input_buf + 6 + 8 + 40;
11653
11654 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11655 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11656 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11657 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11658 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11659
11660 digest[0] -= SHA1M_A;
11661 digest[1] -= SHA1M_B;
11662 digest[2] -= SHA1M_C;
11663 digest[3] -= SHA1M_D;
11664 digest[4] -= SHA1M_E;
11665
11666 return (PARSER_OK);
11667 }
11668
11669 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11670 {
11671 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11672
11673 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11674
11675 u32 *digest = (u32 *) hash_buf->digest;
11676
11677 salt_t *salt = hash_buf->salt;
11678
11679 char *salt_buf = input_buf + 6;
11680
11681 uint salt_len = 8;
11682
11683 char *salt_buf_ptr = (char *) salt->salt_buf;
11684
11685 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11686
11687 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11688
11689 salt->salt_len = salt_len;
11690
11691 char *hash_pos = input_buf + 6 + 8;
11692
11693 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11694 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11695 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11696 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11697 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11698
11699 digest[0] -= SHA1M_A;
11700 digest[1] -= SHA1M_B;
11701 digest[2] -= SHA1M_C;
11702 digest[3] -= SHA1M_D;
11703 digest[4] -= SHA1M_E;
11704
11705 return (PARSER_OK);
11706 }
11707
11708 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11709 {
11710 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11711
11712 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11713
11714 u64 *digest = (u64 *) hash_buf->digest;
11715
11716 salt_t *salt = hash_buf->salt;
11717
11718 char *salt_buf = input_buf + 6;
11719
11720 uint salt_len = 8;
11721
11722 char *salt_buf_ptr = (char *) salt->salt_buf;
11723
11724 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11725
11726 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11727
11728 salt->salt_len = salt_len;
11729
11730 char *hash_pos = input_buf + 6 + 8;
11731
11732 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11733 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11734 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11735 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11736 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11737 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11738 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11739 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11740
11741 digest[0] -= SHA512M_A;
11742 digest[1] -= SHA512M_B;
11743 digest[2] -= SHA512M_C;
11744 digest[3] -= SHA512M_D;
11745 digest[4] -= SHA512M_E;
11746 digest[5] -= SHA512M_F;
11747 digest[6] -= SHA512M_G;
11748 digest[7] -= SHA512M_H;
11749
11750 return (PARSER_OK);
11751 }
11752
11753 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11754 {
11755 if (data.opts_type & OPTS_TYPE_ST_HEX)
11756 {
11757 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11758 }
11759 else
11760 {
11761 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11762 }
11763
11764 u32 *digest = (u32 *) hash_buf->digest;
11765
11766 salt_t *salt = hash_buf->salt;
11767
11768 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11769 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11770 digest[2] = 0;
11771 digest[3] = 0;
11772
11773 digest[0] = byte_swap_32 (digest[0]);
11774 digest[1] = byte_swap_32 (digest[1]);
11775
11776 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11777
11778 uint salt_len = input_len - 16 - 1;
11779
11780 char *salt_buf = input_buf + 16 + 1;
11781
11782 char *salt_buf_ptr = (char *) salt->salt_buf;
11783
11784 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11785
11786 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11787
11788 salt->salt_len = salt_len;
11789
11790 return (PARSER_OK);
11791 }
11792
11793 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11794 {
11795 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11796
11797 u32 *digest = (u32 *) hash_buf->digest;
11798
11799 salt_t *salt = hash_buf->salt;
11800
11801 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11802 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11803 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11804 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11805 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11806
11807 digest[0] -= SHA1M_A;
11808 digest[1] -= SHA1M_B;
11809 digest[2] -= SHA1M_C;
11810 digest[3] -= SHA1M_D;
11811 digest[4] -= SHA1M_E;
11812
11813 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11814
11815 uint salt_len = input_len - 40 - 1;
11816
11817 char *salt_buf = input_buf + 40 + 1;
11818
11819 char *salt_buf_ptr = (char *) salt->salt_buf;
11820
11821 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11822
11823 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11824
11825 salt->salt_len = salt_len;
11826
11827 return (PARSER_OK);
11828 }
11829
11830 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11831 {
11832 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11833
11834 u32 *digest = (u32 *) hash_buf->digest;
11835
11836 salt_t *salt = hash_buf->salt;
11837
11838 char *hash_pos = input_buf;
11839
11840 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11841 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11842 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11843 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11844 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
11845 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
11846 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
11847 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
11848 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
11849 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
11850 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
11851 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
11852 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
11853 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
11854 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
11855 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
11856
11857 char *salt_pos = input_buf + 128;
11858
11859 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
11860 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
11861 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
11862 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
11863
11864 salt->salt_iter = ROUNDS_ORACLET - 1;
11865 salt->salt_len = 16;
11866
11867 return (PARSER_OK);
11868 }
11869
11870 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11871 {
11872 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11873
11874 u32 *digest = (u32 *) hash_buf->digest;
11875
11876 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11877 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11878 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11879 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11880 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11881 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11882 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11883 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11884
11885 digest[0] -= SHA256M_A;
11886 digest[1] -= SHA256M_B;
11887 digest[2] -= SHA256M_C;
11888 digest[3] -= SHA256M_D;
11889 digest[4] -= SHA256M_E;
11890 digest[5] -= SHA256M_F;
11891 digest[6] -= SHA256M_G;
11892 digest[7] -= SHA256M_H;
11893
11894 return (PARSER_OK);
11895 }
11896
11897 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11898 {
11899 if (data.opts_type & OPTS_TYPE_ST_HEX)
11900 {
11901 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11902 }
11903 else
11904 {
11905 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11906 }
11907
11908 u32 *digest = (u32 *) hash_buf->digest;
11909
11910 salt_t *salt = hash_buf->salt;
11911
11912 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11913 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11914 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11915 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11916 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11917 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11918 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11919 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11920
11921 digest[0] -= SHA256M_A;
11922 digest[1] -= SHA256M_B;
11923 digest[2] -= SHA256M_C;
11924 digest[3] -= SHA256M_D;
11925 digest[4] -= SHA256M_E;
11926 digest[5] -= SHA256M_F;
11927 digest[6] -= SHA256M_G;
11928 digest[7] -= SHA256M_H;
11929
11930 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11931
11932 uint salt_len = input_len - 64 - 1;
11933
11934 char *salt_buf = input_buf + 64 + 1;
11935
11936 char *salt_buf_ptr = (char *) salt->salt_buf;
11937
11938 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11939
11940 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11941
11942 salt->salt_len = salt_len;
11943
11944 return (PARSER_OK);
11945 }
11946
11947 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11948 {
11949 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11950
11951 u64 *digest = (u64 *) hash_buf->digest;
11952
11953 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11954 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11955 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11956 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11957 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11958 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11959 digest[6] = 0;
11960 digest[7] = 0;
11961
11962 digest[0] -= SHA384M_A;
11963 digest[1] -= SHA384M_B;
11964 digest[2] -= SHA384M_C;
11965 digest[3] -= SHA384M_D;
11966 digest[4] -= SHA384M_E;
11967 digest[5] -= SHA384M_F;
11968 digest[6] -= 0;
11969 digest[7] -= 0;
11970
11971 return (PARSER_OK);
11972 }
11973
11974 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11975 {
11976 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11977
11978 u64 *digest = (u64 *) hash_buf->digest;
11979
11980 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11981 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11982 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11983 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11984 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11985 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11986 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11987 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11988
11989 digest[0] -= SHA512M_A;
11990 digest[1] -= SHA512M_B;
11991 digest[2] -= SHA512M_C;
11992 digest[3] -= SHA512M_D;
11993 digest[4] -= SHA512M_E;
11994 digest[5] -= SHA512M_F;
11995 digest[6] -= SHA512M_G;
11996 digest[7] -= SHA512M_H;
11997
11998 return (PARSER_OK);
11999 }
12000
12001 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12002 {
12003 if (data.opts_type & OPTS_TYPE_ST_HEX)
12004 {
12005 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12006 }
12007 else
12008 {
12009 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12010 }
12011
12012 u64 *digest = (u64 *) hash_buf->digest;
12013
12014 salt_t *salt = hash_buf->salt;
12015
12016 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12017 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12018 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12019 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12020 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12021 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12022 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12023 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12024
12025 digest[0] -= SHA512M_A;
12026 digest[1] -= SHA512M_B;
12027 digest[2] -= SHA512M_C;
12028 digest[3] -= SHA512M_D;
12029 digest[4] -= SHA512M_E;
12030 digest[5] -= SHA512M_F;
12031 digest[6] -= SHA512M_G;
12032 digest[7] -= SHA512M_H;
12033
12034 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12035
12036 uint salt_len = input_len - 128 - 1;
12037
12038 char *salt_buf = input_buf + 128 + 1;
12039
12040 char *salt_buf_ptr = (char *) salt->salt_buf;
12041
12042 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12043
12044 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12045
12046 salt->salt_len = salt_len;
12047
12048 return (PARSER_OK);
12049 }
12050
12051 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12052 {
12053 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12054
12055 u64 *digest = (u64 *) hash_buf->digest;
12056
12057 salt_t *salt = hash_buf->salt;
12058
12059 char *salt_pos = input_buf + 3;
12060
12061 uint iterations_len = 0;
12062
12063 if (memcmp (salt_pos, "rounds=", 7) == 0)
12064 {
12065 salt_pos += 7;
12066
12067 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12068
12069 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12070 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12071
12072 salt_pos[0] = 0x0;
12073
12074 salt->salt_iter = atoi (salt_pos - iterations_len);
12075
12076 salt_pos += 1;
12077
12078 iterations_len += 8;
12079 }
12080 else
12081 {
12082 salt->salt_iter = ROUNDS_SHA512CRYPT;
12083 }
12084
12085 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12086
12087 char *hash_pos = strchr (salt_pos, '$');
12088
12089 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12090
12091 uint salt_len = hash_pos - salt_pos;
12092
12093 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12094
12095 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12096
12097 salt->salt_len = salt_len;
12098
12099 hash_pos++;
12100
12101 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12102
12103 return (PARSER_OK);
12104 }
12105
12106 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12107 {
12108 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12109
12110 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12111
12112 u64 *digest = (u64 *) hash_buf->digest;
12113
12114 salt_t *salt = hash_buf->salt;
12115
12116 uint keccak_mdlen = input_len / 2;
12117
12118 for (uint i = 0; i < keccak_mdlen / 8; i++)
12119 {
12120 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12121
12122 digest[i] = byte_swap_64 (digest[i]);
12123 }
12124
12125 salt->keccak_mdlen = keccak_mdlen;
12126
12127 return (PARSER_OK);
12128 }
12129
12130 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12131 {
12132 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12133
12134 u32 *digest = (u32 *) hash_buf->digest;
12135
12136 salt_t *salt = hash_buf->salt;
12137
12138 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12139
12140 /**
12141 * Parse that strange long line
12142 */
12143
12144 char *in_off[9];
12145
12146 size_t in_len[9];
12147
12148 in_off[0] = strtok (input_buf, ":");
12149
12150 in_len[0] = strlen (in_off[0]);
12151
12152 size_t i;
12153
12154 for (i = 1; i < 9; i++)
12155 {
12156 in_off[i] = strtok (NULL, ":");
12157
12158 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12159
12160 in_len[i] = strlen (in_off[i]);
12161 }
12162
12163 char *ptr;
12164
12165 ptr = (char *) ikepsk->msg_buf;
12166
12167 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12168 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12169 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12170 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12171 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12172 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12173
12174 *ptr = 0x80;
12175
12176 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12177
12178 ptr = (char *) ikepsk->nr_buf;
12179
12180 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12181 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12182
12183 *ptr = 0x80;
12184
12185 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12186
12187 /**
12188 * Store to database
12189 */
12190
12191 ptr = in_off[8];
12192
12193 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12194 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12195 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12196 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12197
12198 digest[0] = byte_swap_32 (digest[0]);
12199 digest[1] = byte_swap_32 (digest[1]);
12200 digest[2] = byte_swap_32 (digest[2]);
12201 digest[3] = byte_swap_32 (digest[3]);
12202
12203 salt->salt_len = 32;
12204
12205 salt->salt_buf[0] = ikepsk->nr_buf[0];
12206 salt->salt_buf[1] = ikepsk->nr_buf[1];
12207 salt->salt_buf[2] = ikepsk->nr_buf[2];
12208 salt->salt_buf[3] = ikepsk->nr_buf[3];
12209 salt->salt_buf[4] = ikepsk->nr_buf[4];
12210 salt->salt_buf[5] = ikepsk->nr_buf[5];
12211 salt->salt_buf[6] = ikepsk->nr_buf[6];
12212 salt->salt_buf[7] = ikepsk->nr_buf[7];
12213
12214 return (PARSER_OK);
12215 }
12216
12217 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12218 {
12219 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12220
12221 u32 *digest = (u32 *) hash_buf->digest;
12222
12223 salt_t *salt = hash_buf->salt;
12224
12225 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12226
12227 /**
12228 * Parse that strange long line
12229 */
12230
12231 char *in_off[9];
12232
12233 size_t in_len[9];
12234
12235 in_off[0] = strtok (input_buf, ":");
12236
12237 in_len[0] = strlen (in_off[0]);
12238
12239 size_t i;
12240
12241 for (i = 1; i < 9; i++)
12242 {
12243 in_off[i] = strtok (NULL, ":");
12244
12245 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12246
12247 in_len[i] = strlen (in_off[i]);
12248 }
12249
12250 char *ptr;
12251
12252 ptr = (char *) ikepsk->msg_buf;
12253
12254 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12255 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12256 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12257 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12258 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12259 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12260
12261 *ptr = 0x80;
12262
12263 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12264
12265 ptr = (char *) ikepsk->nr_buf;
12266
12267 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12268 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12269
12270 *ptr = 0x80;
12271
12272 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12273
12274 /**
12275 * Store to database
12276 */
12277
12278 ptr = in_off[8];
12279
12280 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12281 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12282 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12283 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12284 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12285
12286 salt->salt_len = 32;
12287
12288 salt->salt_buf[0] = ikepsk->nr_buf[0];
12289 salt->salt_buf[1] = ikepsk->nr_buf[1];
12290 salt->salt_buf[2] = ikepsk->nr_buf[2];
12291 salt->salt_buf[3] = ikepsk->nr_buf[3];
12292 salt->salt_buf[4] = ikepsk->nr_buf[4];
12293 salt->salt_buf[5] = ikepsk->nr_buf[5];
12294 salt->salt_buf[6] = ikepsk->nr_buf[6];
12295 salt->salt_buf[7] = ikepsk->nr_buf[7];
12296
12297 return (PARSER_OK);
12298 }
12299
12300 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12301 {
12302 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12303
12304 u32 *digest = (u32 *) hash_buf->digest;
12305
12306 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12307 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12308 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12309 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12310 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12311
12312 digest[0] = byte_swap_32 (digest[0]);
12313 digest[1] = byte_swap_32 (digest[1]);
12314 digest[2] = byte_swap_32 (digest[2]);
12315 digest[3] = byte_swap_32 (digest[3]);
12316 digest[4] = byte_swap_32 (digest[4]);
12317
12318 return (PARSER_OK);
12319 }
12320
12321 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12322 {
12323 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12324
12325 u32 *digest = (u32 *) hash_buf->digest;
12326
12327 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12328 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12329 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12330 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12331 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12332 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12333 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12334 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12335 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12336 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12337 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12338 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12339 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12340 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12341 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12342 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12343
12344 return (PARSER_OK);
12345 }
12346
12347 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12348 {
12349 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12350
12351 u32 *digest = (u32 *) hash_buf->digest;
12352
12353 salt_t *salt = hash_buf->salt;
12354
12355 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12356 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12357 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12358 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12359 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12360
12361 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12362
12363 uint salt_len = input_len - 40 - 1;
12364
12365 char *salt_buf = input_buf + 40 + 1;
12366
12367 char *salt_buf_ptr = (char *) salt->salt_buf;
12368
12369 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12370
12371 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12372
12373 salt->salt_len = salt_len;
12374
12375 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12376
12377 return (PARSER_OK);
12378 }
12379
12380 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12381 {
12382 u32 *digest = (u32 *) hash_buf->digest;
12383
12384 salt_t *salt = hash_buf->salt;
12385
12386 tc_t *tc = (tc_t *) hash_buf->esalt;
12387
12388 if (input_len == 0)
12389 {
12390 log_error ("TrueCrypt container not specified");
12391
12392 exit (-1);
12393 }
12394
12395 FILE *fp = fopen (input_buf, "rb");
12396
12397 if (fp == NULL)
12398 {
12399 log_error ("%s: %s", input_buf, strerror (errno));
12400
12401 exit (-1);
12402 }
12403
12404 char buf[512];
12405
12406 int n = fread (buf, 1, sizeof (buf), fp);
12407
12408 fclose (fp);
12409
12410 if (n != 512) return (PARSER_TC_FILE_SIZE);
12411
12412 memcpy (tc->salt_buf, buf, 64);
12413
12414 memcpy (tc->data_buf, buf + 64, 512 - 64);
12415
12416 salt->salt_buf[0] = tc->salt_buf[0];
12417
12418 salt->salt_len = 4;
12419
12420 salt->salt_iter = 1000 - 1;
12421
12422 digest[0] = tc->data_buf[0];
12423
12424 return (PARSER_OK);
12425 }
12426
12427 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12428 {
12429 u32 *digest = (u32 *) hash_buf->digest;
12430
12431 salt_t *salt = hash_buf->salt;
12432
12433 tc_t *tc = (tc_t *) hash_buf->esalt;
12434
12435 if (input_len == 0)
12436 {
12437 log_error ("TrueCrypt container not specified");
12438
12439 exit (-1);
12440 }
12441
12442 FILE *fp = fopen (input_buf, "rb");
12443
12444 if (fp == NULL)
12445 {
12446 log_error ("%s: %s", input_buf, strerror (errno));
12447
12448 exit (-1);
12449 }
12450
12451 char buf[512];
12452
12453 int n = fread (buf, 1, sizeof (buf), fp);
12454
12455 fclose (fp);
12456
12457 if (n != 512) return (PARSER_TC_FILE_SIZE);
12458
12459 memcpy (tc->salt_buf, buf, 64);
12460
12461 memcpy (tc->data_buf, buf + 64, 512 - 64);
12462
12463 salt->salt_buf[0] = tc->salt_buf[0];
12464
12465 salt->salt_len = 4;
12466
12467 salt->salt_iter = 2000 - 1;
12468
12469 digest[0] = tc->data_buf[0];
12470
12471 return (PARSER_OK);
12472 }
12473
12474 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12475 {
12476 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12477
12478 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12479
12480 u32 *digest = (u32 *) hash_buf->digest;
12481
12482 salt_t *salt = hash_buf->salt;
12483
12484 char *salt_pos = input_buf + 6;
12485
12486 char *hash_pos = strchr (salt_pos, '$');
12487
12488 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12489
12490 uint salt_len = hash_pos - salt_pos;
12491
12492 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12493
12494 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12495
12496 salt->salt_len = salt_len;
12497
12498 salt->salt_iter = 1000;
12499
12500 hash_pos++;
12501
12502 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12503
12504 return (PARSER_OK);
12505 }
12506
12507 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12508 {
12509 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12510
12511 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12512
12513 u32 *digest = (u32 *) hash_buf->digest;
12514
12515 salt_t *salt = hash_buf->salt;
12516
12517 char *iter_pos = input_buf + 7;
12518
12519 char *salt_pos = strchr (iter_pos, '$');
12520
12521 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12522
12523 salt_pos++;
12524
12525 char *hash_pos = strchr (salt_pos, '$');
12526
12527 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12528
12529 uint salt_len = hash_pos - salt_pos;
12530
12531 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12532
12533 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12534
12535 salt->salt_len = salt_len;
12536
12537 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12538
12539 salt->salt_sign[0] = atoi (salt_iter);
12540
12541 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12542
12543 hash_pos++;
12544
12545 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12546
12547 digest[0] = byte_swap_32 (digest[0]);
12548 digest[1] = byte_swap_32 (digest[1]);
12549 digest[2] = byte_swap_32 (digest[2]);
12550 digest[3] = byte_swap_32 (digest[3]);
12551 digest[4] = byte_swap_32 (digest[4]);
12552
12553 return (PARSER_OK);
12554 }
12555
12556 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12557 {
12558 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12559
12560 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12561
12562 u32 *digest = (u32 *) hash_buf->digest;
12563
12564 salt_t *salt = hash_buf->salt;
12565
12566 char *iter_pos = input_buf + 9;
12567
12568 char *salt_pos = strchr (iter_pos, '$');
12569
12570 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12571
12572 salt_pos++;
12573
12574 char *hash_pos = strchr (salt_pos, '$');
12575
12576 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12577
12578 uint salt_len = hash_pos - salt_pos;
12579
12580 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12581
12582 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12583
12584 salt->salt_len = salt_len;
12585
12586 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12587
12588 salt->salt_sign[0] = atoi (salt_iter);
12589
12590 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12591
12592 hash_pos++;
12593
12594 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12595
12596 digest[0] = byte_swap_32 (digest[0]);
12597 digest[1] = byte_swap_32 (digest[1]);
12598 digest[2] = byte_swap_32 (digest[2]);
12599 digest[3] = byte_swap_32 (digest[3]);
12600 digest[4] = byte_swap_32 (digest[4]);
12601 digest[5] = byte_swap_32 (digest[5]);
12602 digest[6] = byte_swap_32 (digest[6]);
12603 digest[7] = byte_swap_32 (digest[7]);
12604
12605 return (PARSER_OK);
12606 }
12607
12608 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12609 {
12610 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12611
12612 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12613
12614 u64 *digest = (u64 *) hash_buf->digest;
12615
12616 salt_t *salt = hash_buf->salt;
12617
12618 char *iter_pos = input_buf + 9;
12619
12620 char *salt_pos = strchr (iter_pos, '$');
12621
12622 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12623
12624 salt_pos++;
12625
12626 char *hash_pos = strchr (salt_pos, '$');
12627
12628 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12629
12630 uint salt_len = hash_pos - salt_pos;
12631
12632 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12633
12634 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12635
12636 salt->salt_len = salt_len;
12637
12638 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12639
12640 salt->salt_sign[0] = atoi (salt_iter);
12641
12642 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12643
12644 hash_pos++;
12645
12646 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12647
12648 digest[0] = byte_swap_64 (digest[0]);
12649 digest[1] = byte_swap_64 (digest[1]);
12650 digest[2] = byte_swap_64 (digest[2]);
12651 digest[3] = byte_swap_64 (digest[3]);
12652 digest[4] = byte_swap_64 (digest[4]);
12653 digest[5] = byte_swap_64 (digest[5]);
12654 digest[6] = byte_swap_64 (digest[6]);
12655 digest[7] = byte_swap_64 (digest[7]);
12656
12657 return (PARSER_OK);
12658 }
12659
12660 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12661 {
12662 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12663
12664 u32 *digest = (u32 *) hash_buf->digest;
12665
12666 salt_t *salt = hash_buf->salt;
12667
12668 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12669
12670 /**
12671 * parse line
12672 */
12673
12674 char *iterations_pos = input_buf;
12675
12676 char *saltbuf_pos = strchr (iterations_pos, ':');
12677
12678 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12679
12680 uint iterations_len = saltbuf_pos - iterations_pos;
12681
12682 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12683
12684 saltbuf_pos++;
12685
12686 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12687
12688 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12689
12690 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12691
12692 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12693
12694 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12695
12696 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12697
12698 cipherbuf_pos++;
12699
12700 /**
12701 * pbkdf2 iterations
12702 */
12703
12704 salt->salt_iter = atoi (iterations_pos) - 1;
12705
12706 /**
12707 * handle salt encoding
12708 */
12709
12710 char *saltbuf_ptr = (char *) salt->salt_buf;
12711
12712 for (uint i = 0; i < saltbuf_len; i += 2)
12713 {
12714 const char p0 = saltbuf_pos[i + 0];
12715 const char p1 = saltbuf_pos[i + 1];
12716
12717 *saltbuf_ptr++ = hex_convert (p1) << 0
12718 | hex_convert (p0) << 4;
12719 }
12720
12721 salt->salt_len = saltbuf_len / 2;
12722
12723 /**
12724 * handle cipher encoding
12725 */
12726
12727 uint *tmp = (uint *) mymalloc (32);
12728
12729 char *cipherbuf_ptr = (char *) tmp;
12730
12731 for (uint i = 2016; i < cipherbuf_len; i += 2)
12732 {
12733 const char p0 = cipherbuf_pos[i + 0];
12734 const char p1 = cipherbuf_pos[i + 1];
12735
12736 *cipherbuf_ptr++ = hex_convert (p1) << 0
12737 | hex_convert (p0) << 4;
12738 }
12739
12740 // iv is stored at salt_buf 4 (length 16)
12741 // data is stored at salt_buf 8 (length 16)
12742
12743 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12744 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12745 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12746 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12747
12748 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12749 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12750 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12751 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12752
12753 free (tmp);
12754
12755 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12756 {
12757 const char p0 = cipherbuf_pos[j + 0];
12758 const char p1 = cipherbuf_pos[j + 1];
12759
12760 agilekey->cipher[i] = hex_convert (p1) << 0
12761 | hex_convert (p0) << 4;
12762 }
12763
12764 /**
12765 * digest buf
12766 */
12767
12768 digest[0] = 0x10101010;
12769 digest[1] = 0x10101010;
12770 digest[2] = 0x10101010;
12771 digest[3] = 0x10101010;
12772
12773 return (PARSER_OK);
12774 }
12775
12776 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12777 {
12778 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12779
12780 u32 *digest = (u32 *) hash_buf->digest;
12781
12782 salt_t *salt = hash_buf->salt;
12783
12784 char *hashbuf_pos = input_buf;
12785
12786 char *iterations_pos = strchr (hashbuf_pos, ':');
12787
12788 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12789
12790 uint hash_len = iterations_pos - hashbuf_pos;
12791
12792 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12793
12794 iterations_pos++;
12795
12796 char *saltbuf_pos = strchr (iterations_pos, ':');
12797
12798 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12799
12800 uint iterations_len = saltbuf_pos - iterations_pos;
12801
12802 saltbuf_pos++;
12803
12804 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12805
12806 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12807
12808 char *salt_buf_ptr = (char *) salt->salt_buf;
12809
12810 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12811
12812 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12813
12814 salt->salt_len = salt_len;
12815
12816 salt->salt_iter = atoi (iterations_pos) - 1;
12817
12818 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12819 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12820 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12821 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12822
12823 return (PARSER_OK);
12824 }
12825
12826 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12827 {
12828 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12829
12830 u32 *digest = (u32 *) hash_buf->digest;
12831
12832 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12833 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12834 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12835 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12836 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12837 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12838 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12839 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12840
12841 digest[0] = byte_swap_32 (digest[0]);
12842 digest[1] = byte_swap_32 (digest[1]);
12843 digest[2] = byte_swap_32 (digest[2]);
12844 digest[3] = byte_swap_32 (digest[3]);
12845 digest[4] = byte_swap_32 (digest[4]);
12846 digest[5] = byte_swap_32 (digest[5]);
12847 digest[6] = byte_swap_32 (digest[6]);
12848 digest[7] = byte_swap_32 (digest[7]);
12849
12850 return (PARSER_OK);
12851 }
12852
12853 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12854 {
12855 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12856
12857 u32 *digest = (u32 *) hash_buf->digest;
12858
12859 salt_t *salt = hash_buf->salt;
12860
12861 char *salt_pos = input_buf + 3;
12862
12863 uint iterations_len = 0;
12864
12865 if (memcmp (salt_pos, "rounds=", 7) == 0)
12866 {
12867 salt_pos += 7;
12868
12869 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12870
12871 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12872 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12873
12874 salt_pos[0] = 0x0;
12875
12876 salt->salt_iter = atoi (salt_pos - iterations_len);
12877
12878 salt_pos += 1;
12879
12880 iterations_len += 8;
12881 }
12882 else
12883 {
12884 salt->salt_iter = ROUNDS_SHA256CRYPT;
12885 }
12886
12887 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12888
12889 char *hash_pos = strchr (salt_pos, '$');
12890
12891 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12892
12893 uint salt_len = hash_pos - salt_pos;
12894
12895 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12896
12897 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12898
12899 salt->salt_len = salt_len;
12900
12901 hash_pos++;
12902
12903 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12904
12905 return (PARSER_OK);
12906 }
12907
12908 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12909 {
12910 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12911
12912 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12913
12914 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12915
12916 u64 *digest = (u64 *) hash_buf->digest;
12917
12918 salt_t *salt = hash_buf->salt;
12919
12920 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12921
12922 char *iter_pos = input_buf + 4;
12923
12924 char *salt_pos = strchr (iter_pos, '$');
12925
12926 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12927
12928 salt_pos++;
12929
12930 char *hash_pos = strchr (salt_pos, '$');
12931
12932 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12933
12934 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12935
12936 hash_pos++;
12937
12938 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12939 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12940 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12941 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12942 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12943 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12944 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12945 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12946
12947 uint salt_len = hash_pos - salt_pos - 1;
12948
12949 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12950
12951 salt->salt_len = salt_len / 2;
12952
12953 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12954 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12955 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12956 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12957 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
12958 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
12959 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
12960 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
12961
12962 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12963 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12964 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12965 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12966 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12967 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12968 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12969 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12970 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12971 pbkdf2_sha512->salt_buf[9] = 0x80;
12972
12973 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12974
12975 salt->salt_iter = atoi (iter_pos) - 1;
12976
12977 return (PARSER_OK);
12978 }
12979
12980 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12981 {
12982 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12983
12984 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12985
12986 u32 *digest = (u32 *) hash_buf->digest;
12987
12988 salt_t *salt = hash_buf->salt;
12989
12990 char *salt_pos = input_buf + 14;
12991
12992 char *hash_pos = strchr (salt_pos, '*');
12993
12994 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12995
12996 hash_pos++;
12997
12998 uint salt_len = hash_pos - salt_pos - 1;
12999
13000 char *salt_buf_ptr = (char *) salt->salt_buf;
13001
13002 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13003
13004 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13005
13006 salt->salt_len = salt_len;
13007
13008 u8 tmp_buf[100];
13009
13010 memset (tmp_buf, 0, sizeof (tmp_buf));
13011
13012 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13013
13014 memcpy (digest, tmp_buf, 32);
13015
13016 digest[0] = byte_swap_32 (digest[0]);
13017 digest[1] = byte_swap_32 (digest[1]);
13018 digest[2] = byte_swap_32 (digest[2]);
13019 digest[3] = byte_swap_32 (digest[3]);
13020 digest[4] = byte_swap_32 (digest[4]);
13021 digest[5] = byte_swap_32 (digest[5]);
13022 digest[6] = byte_swap_32 (digest[6]);
13023 digest[7] = byte_swap_32 (digest[7]);
13024
13025 digest[0] -= SHA256M_A;
13026 digest[1] -= SHA256M_B;
13027 digest[2] -= SHA256M_C;
13028 digest[3] -= SHA256M_D;
13029 digest[4] -= SHA256M_E;
13030 digest[5] -= SHA256M_F;
13031 digest[6] -= SHA256M_G;
13032 digest[7] -= SHA256M_H;
13033
13034 return (PARSER_OK);
13035 }
13036
13037 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13038 {
13039 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13040
13041 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13042
13043 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13044
13045 u64 *digest = (u64 *) hash_buf->digest;
13046
13047 salt_t *salt = hash_buf->salt;
13048
13049 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13050
13051 char *iter_pos = input_buf + 19;
13052
13053 char *salt_pos = strchr (iter_pos, '.');
13054
13055 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13056
13057 salt_pos++;
13058
13059 char *hash_pos = strchr (salt_pos, '.');
13060
13061 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13062
13063 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13064
13065 hash_pos++;
13066
13067 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13068 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13069 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13070 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13071 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13072 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13073 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13074 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13075
13076 uint salt_len = hash_pos - salt_pos - 1;
13077
13078 salt_len /= 2;
13079
13080 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13081
13082 uint i;
13083
13084 for (i = 0; i < salt_len; i++)
13085 {
13086 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13087 }
13088
13089 salt_buf_ptr[salt_len + 3] = 0x01;
13090 salt_buf_ptr[salt_len + 4] = 0x80;
13091
13092 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13093
13094 salt->salt_len = salt_len;
13095
13096 salt->salt_iter = atoi (iter_pos) - 1;
13097
13098 return (PARSER_OK);
13099 }
13100
13101 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13102 {
13103 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13104
13105 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13106
13107 u64 *digest = (u64 *) hash_buf->digest;
13108
13109 salt_t *salt = hash_buf->salt;
13110
13111 u8 tmp_buf[120];
13112
13113 memset (tmp_buf, 0, sizeof (tmp_buf));
13114
13115 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13116
13117 memcpy (digest, tmp_buf, 64);
13118
13119 digest[0] = byte_swap_64 (digest[0]);
13120 digest[1] = byte_swap_64 (digest[1]);
13121 digest[2] = byte_swap_64 (digest[2]);
13122 digest[3] = byte_swap_64 (digest[3]);
13123 digest[4] = byte_swap_64 (digest[4]);
13124 digest[5] = byte_swap_64 (digest[5]);
13125 digest[6] = byte_swap_64 (digest[6]);
13126 digest[7] = byte_swap_64 (digest[7]);
13127
13128 digest[0] -= SHA512M_A;
13129 digest[1] -= SHA512M_B;
13130 digest[2] -= SHA512M_C;
13131 digest[3] -= SHA512M_D;
13132 digest[4] -= SHA512M_E;
13133 digest[5] -= SHA512M_F;
13134 digest[6] -= SHA512M_G;
13135 digest[7] -= SHA512M_H;
13136
13137 salt->salt_len = tmp_len - 64;
13138
13139 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13140
13141 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13142 {
13143 char *ptr = (char *) salt->salt_buf;
13144
13145 ptr[salt->salt_len] = 0x80;
13146 }
13147
13148 return (PARSER_OK);
13149 }
13150
13151 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13152 {
13153 if (data.opts_type & OPTS_TYPE_ST_HEX)
13154 {
13155 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13156 }
13157 else
13158 {
13159 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13160 }
13161
13162 u32 *digest = (u32 *) hash_buf->digest;
13163
13164 salt_t *salt = hash_buf->salt;
13165
13166 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13167 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13168 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13169 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13170
13171 digest[0] = byte_swap_32 (digest[0]);
13172 digest[1] = byte_swap_32 (digest[1]);
13173 digest[2] = byte_swap_32 (digest[2]);
13174 digest[3] = byte_swap_32 (digest[3]);
13175
13176 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13177
13178 uint salt_len = input_len - 32 - 1;
13179
13180 char *salt_buf = input_buf + 32 + 1;
13181
13182 char *salt_buf_ptr = (char *) salt->salt_buf;
13183
13184 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13185
13186 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13187
13188 salt->salt_len = salt_len;
13189
13190 return (PARSER_OK);
13191 }
13192
13193 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13194 {
13195 if (data.opts_type & OPTS_TYPE_ST_HEX)
13196 {
13197 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13198 }
13199 else
13200 {
13201 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13202 }
13203
13204 u32 *digest = (u32 *) hash_buf->digest;
13205
13206 salt_t *salt = hash_buf->salt;
13207
13208 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13209 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13210 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13211 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13212 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13213
13214 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13215
13216 uint salt_len = input_len - 40 - 1;
13217
13218 char *salt_buf = input_buf + 40 + 1;
13219
13220 char *salt_buf_ptr = (char *) salt->salt_buf;
13221
13222 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13223
13224 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13225
13226 salt->salt_len = salt_len;
13227
13228 return (PARSER_OK);
13229 }
13230
13231 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13232 {
13233 if (data.opts_type & OPTS_TYPE_ST_HEX)
13234 {
13235 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13236 }
13237 else
13238 {
13239 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13240 }
13241
13242 u32 *digest = (u32 *) hash_buf->digest;
13243
13244 salt_t *salt = hash_buf->salt;
13245
13246 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13247 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13248 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13249 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13250 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13251 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13252 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13253 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13254
13255 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13256
13257 uint salt_len = input_len - 64 - 1;
13258
13259 char *salt_buf = input_buf + 64 + 1;
13260
13261 char *salt_buf_ptr = (char *) salt->salt_buf;
13262
13263 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13264
13265 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13266
13267 salt->salt_len = salt_len;
13268
13269 return (PARSER_OK);
13270 }
13271
13272 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13273 {
13274 if (data.opts_type & OPTS_TYPE_ST_HEX)
13275 {
13276 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13277 }
13278 else
13279 {
13280 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13281 }
13282
13283 u64 *digest = (u64 *) hash_buf->digest;
13284
13285 salt_t *salt = hash_buf->salt;
13286
13287 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13288 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13289 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13290 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13291 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13292 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13293 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13294 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13295
13296 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13297
13298 uint salt_len = input_len - 128 - 1;
13299
13300 char *salt_buf = input_buf + 128 + 1;
13301
13302 char *salt_buf_ptr = (char *) salt->salt_buf;
13303
13304 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13305
13306 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13307
13308 salt->salt_len = salt_len;
13309
13310 return (PARSER_OK);
13311 }
13312
13313 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13314 {
13315 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13316
13317 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13318
13319 u32 *digest = (u32 *) hash_buf->digest;
13320
13321 salt_t *salt = hash_buf->salt;
13322
13323 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13324
13325 /**
13326 * parse line
13327 */
13328
13329 char *user_pos = input_buf + 10 + 1;
13330
13331 char *realm_pos = strchr (user_pos, '$');
13332
13333 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13334
13335 uint user_len = realm_pos - user_pos;
13336
13337 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13338
13339 realm_pos++;
13340
13341 char *salt_pos = strchr (realm_pos, '$');
13342
13343 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13344
13345 uint realm_len = salt_pos - realm_pos;
13346
13347 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13348
13349 salt_pos++;
13350
13351 char *data_pos = strchr (salt_pos, '$');
13352
13353 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13354
13355 uint salt_len = data_pos - salt_pos;
13356
13357 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13358
13359 data_pos++;
13360
13361 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13362
13363 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13364
13365 /**
13366 * copy data
13367 */
13368
13369 memcpy (krb5pa->user, user_pos, user_len);
13370 memcpy (krb5pa->realm, realm_pos, realm_len);
13371 memcpy (krb5pa->salt, salt_pos, salt_len);
13372
13373 char *timestamp_ptr = (char *) krb5pa->timestamp;
13374
13375 for (uint i = 0; i < (36 * 2); i += 2)
13376 {
13377 const char p0 = data_pos[i + 0];
13378 const char p1 = data_pos[i + 1];
13379
13380 *timestamp_ptr++ = hex_convert (p1) << 0
13381 | hex_convert (p0) << 4;
13382 }
13383
13384 char *checksum_ptr = (char *) krb5pa->checksum;
13385
13386 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13387 {
13388 const char p0 = data_pos[i + 0];
13389 const char p1 = data_pos[i + 1];
13390
13391 *checksum_ptr++ = hex_convert (p1) << 0
13392 | hex_convert (p0) << 4;
13393 }
13394
13395 /**
13396 * copy some data to generic buffers to make sorting happy
13397 */
13398
13399 salt->salt_buf[0] = krb5pa->timestamp[0];
13400 salt->salt_buf[1] = krb5pa->timestamp[1];
13401 salt->salt_buf[2] = krb5pa->timestamp[2];
13402 salt->salt_buf[3] = krb5pa->timestamp[3];
13403 salt->salt_buf[4] = krb5pa->timestamp[4];
13404 salt->salt_buf[5] = krb5pa->timestamp[5];
13405 salt->salt_buf[6] = krb5pa->timestamp[6];
13406 salt->salt_buf[7] = krb5pa->timestamp[7];
13407 salt->salt_buf[8] = krb5pa->timestamp[8];
13408
13409 salt->salt_len = 36;
13410
13411 digest[0] = krb5pa->checksum[0];
13412 digest[1] = krb5pa->checksum[1];
13413 digest[2] = krb5pa->checksum[2];
13414 digest[3] = krb5pa->checksum[3];
13415
13416 return (PARSER_OK);
13417 }
13418
13419 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13420 {
13421 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13422
13423 u32 *digest = (u32 *) hash_buf->digest;
13424
13425 salt_t *salt = hash_buf->salt;
13426
13427 /**
13428 * parse line
13429 */
13430
13431 char *salt_pos = input_buf;
13432
13433 char *hash_pos = strchr (salt_pos, '$');
13434
13435 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13436
13437 uint salt_len = hash_pos - salt_pos;
13438
13439 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13440
13441 hash_pos++;
13442
13443 uint hash_len = input_len - 1 - salt_len;
13444
13445 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13446
13447 /**
13448 * valid some data
13449 */
13450
13451 uint user_len = 0;
13452
13453 for (uint i = 0; i < salt_len; i++)
13454 {
13455 if (salt_pos[i] == ' ') continue;
13456
13457 user_len++;
13458 }
13459
13460 // SAP user names cannot be longer than 12 characters
13461 if (user_len > 12) return (PARSER_SALT_LENGTH);
13462
13463 // SAP user name cannot start with ! or ?
13464 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13465
13466 /**
13467 * copy data
13468 */
13469
13470 char *salt_buf_ptr = (char *) salt->salt_buf;
13471
13472 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13473
13474 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13475
13476 salt->salt_len = salt_len;
13477
13478 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13479 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13480 digest[2] = 0;
13481 digest[3] = 0;
13482
13483 digest[0] = byte_swap_32 (digest[0]);
13484 digest[1] = byte_swap_32 (digest[1]);
13485
13486 return (PARSER_OK);
13487 }
13488
13489 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13490 {
13491 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13492
13493 u32 *digest = (u32 *) hash_buf->digest;
13494
13495 salt_t *salt = hash_buf->salt;
13496
13497 /**
13498 * parse line
13499 */
13500
13501 char *salt_pos = input_buf;
13502
13503 char *hash_pos = strchr (salt_pos, '$');
13504
13505 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13506
13507 uint salt_len = hash_pos - salt_pos;
13508
13509 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13510
13511 hash_pos++;
13512
13513 uint hash_len = input_len - 1 - salt_len;
13514
13515 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13516
13517 /**
13518 * valid some data
13519 */
13520
13521 uint user_len = 0;
13522
13523 for (uint i = 0; i < salt_len; i++)
13524 {
13525 if (salt_pos[i] == ' ') continue;
13526
13527 user_len++;
13528 }
13529
13530 // SAP user names cannot be longer than 12 characters
13531 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13532 // so far nobody complained so we stay with this because it helps in optimization
13533 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13534
13535 if (user_len > 12) return (PARSER_SALT_LENGTH);
13536
13537 // SAP user name cannot start with ! or ?
13538 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13539
13540 /**
13541 * copy data
13542 */
13543
13544 char *salt_buf_ptr = (char *) salt->salt_buf;
13545
13546 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13547
13548 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13549
13550 salt->salt_len = salt_len;
13551
13552 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13553 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13554 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13555 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13556 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13557
13558 return (PARSER_OK);
13559 }
13560
13561 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13562 {
13563 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13564
13565 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13566
13567 u64 *digest = (u64 *) hash_buf->digest;
13568
13569 salt_t *salt = hash_buf->salt;
13570
13571 char *iter_pos = input_buf + 3;
13572
13573 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13574
13575 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13576
13577 memcpy ((char *) salt->salt_sign, input_buf, 4);
13578
13579 salt->salt_iter = salt_iter;
13580
13581 char *salt_pos = iter_pos + 1;
13582
13583 uint salt_len = 8;
13584
13585 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13586
13587 salt->salt_len = salt_len;
13588
13589 char *hash_pos = salt_pos + salt_len;
13590
13591 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13592
13593 // ugly hack start
13594
13595 char *tmp = (char *) salt->salt_buf_pc;
13596
13597 tmp[0] = hash_pos[42];
13598
13599 // ugly hack end
13600
13601 digest[ 0] = byte_swap_64 (digest[ 0]);
13602 digest[ 1] = byte_swap_64 (digest[ 1]);
13603 digest[ 2] = byte_swap_64 (digest[ 2]);
13604 digest[ 3] = byte_swap_64 (digest[ 3]);
13605 digest[ 4] = 0;
13606 digest[ 5] = 0;
13607 digest[ 6] = 0;
13608 digest[ 7] = 0;
13609
13610 return (PARSER_OK);
13611 }
13612
13613 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13614 {
13615 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13616
13617 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13618
13619 u32 *digest = (u32 *) hash_buf->digest;
13620
13621 salt_t *salt = hash_buf->salt;
13622
13623 char *salt_buf = input_buf + 6;
13624
13625 uint salt_len = 16;
13626
13627 char *salt_buf_ptr = (char *) salt->salt_buf;
13628
13629 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13630
13631 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13632
13633 salt->salt_len = salt_len;
13634
13635 char *hash_pos = input_buf + 6 + 16;
13636
13637 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13638 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13639 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13640 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13641 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13642 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13643 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13644 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13645
13646 return (PARSER_OK);
13647 }
13648
13649 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13650 {
13651 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13652
13653 u32 *digest = (u32 *) hash_buf->digest;
13654
13655 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13656 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13657 digest[2] = 0;
13658 digest[3] = 0;
13659
13660 return (PARSER_OK);
13661 }
13662
13663 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13664 {
13665 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13666
13667 u32 *digest = (u32 *) hash_buf->digest;
13668
13669 salt_t *salt = hash_buf->salt;
13670
13671 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13672
13673 char *saltbuf_pos = input_buf;
13674
13675 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13676
13677 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13678
13679 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13680
13681 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13682 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13683
13684 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13685
13686 hashbuf_pos++;
13687
13688 uint hashbuf_len = input_len - saltbuf_len - 1;
13689
13690 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13691
13692 char *salt_ptr = (char *) saltbuf_pos;
13693 char *rakp_ptr = (char *) rakp->salt_buf;
13694
13695 uint i;
13696 uint j;
13697
13698 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13699 {
13700 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13701 }
13702
13703 rakp_ptr[j] = 0x80;
13704
13705 rakp->salt_len = j;
13706
13707 for (i = 0; i < 64; i++)
13708 {
13709 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13710 }
13711
13712 salt->salt_buf[0] = rakp->salt_buf[0];
13713 salt->salt_buf[1] = rakp->salt_buf[1];
13714 salt->salt_buf[2] = rakp->salt_buf[2];
13715 salt->salt_buf[3] = rakp->salt_buf[3];
13716 salt->salt_buf[4] = rakp->salt_buf[4];
13717 salt->salt_buf[5] = rakp->salt_buf[5];
13718 salt->salt_buf[6] = rakp->salt_buf[6];
13719 salt->salt_buf[7] = rakp->salt_buf[7];
13720
13721 salt->salt_len = 32; // muss min. 32 haben
13722
13723 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13724 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13725 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13726 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13727 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13728
13729 return (PARSER_OK);
13730 }
13731
13732 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13733 {
13734 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13735
13736 u32 *digest = (u32 *) hash_buf->digest;
13737
13738 salt_t *salt = hash_buf->salt;
13739
13740 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13741
13742 char *salt_pos = input_buf + 1;
13743
13744 memcpy (salt->salt_buf, salt_pos, 8);
13745
13746 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13747 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13748
13749 salt->salt_len = 8;
13750
13751 char *hash_pos = salt_pos + 8;
13752
13753 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13754 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13755 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13756 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13757 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13758
13759 digest[0] -= SHA1M_A;
13760 digest[1] -= SHA1M_B;
13761 digest[2] -= SHA1M_C;
13762 digest[3] -= SHA1M_D;
13763 digest[4] -= SHA1M_E;
13764
13765 return (PARSER_OK);
13766 }
13767
13768 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13769 {
13770 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13771
13772 u32 *digest = (u32 *) hash_buf->digest;
13773
13774 salt_t *salt = hash_buf->salt;
13775
13776 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13777 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13778 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13779 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13780
13781 digest[0] = byte_swap_32 (digest[0]);
13782 digest[1] = byte_swap_32 (digest[1]);
13783 digest[2] = byte_swap_32 (digest[2]);
13784 digest[3] = byte_swap_32 (digest[3]);
13785
13786 digest[0] -= MD5M_A;
13787 digest[1] -= MD5M_B;
13788 digest[2] -= MD5M_C;
13789 digest[3] -= MD5M_D;
13790
13791 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13792
13793 char *salt_buf_ptr = input_buf + 32 + 1;
13794
13795 u32 *salt_buf = salt->salt_buf;
13796
13797 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13798 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13799 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13800 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13801
13802 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13803 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13804 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13805 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13806
13807 salt->salt_len = 16 + 1;
13808
13809 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13810
13811 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13812
13813 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13814
13815 return (PARSER_OK);
13816 }
13817
13818 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13819 {
13820 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13821
13822 u32 *digest = (u32 *) hash_buf->digest;
13823
13824 salt_t *salt = hash_buf->salt;
13825
13826 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13827
13828 /**
13829 * parse line
13830 */
13831
13832 char *hashbuf_pos = input_buf;
13833
13834 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13835
13836 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13837
13838 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13839
13840 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13841
13842 saltbuf_pos++;
13843
13844 char *iteration_pos = strchr (saltbuf_pos, ':');
13845
13846 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13847
13848 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13849
13850 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13851
13852 iteration_pos++;
13853
13854 char *databuf_pos = strchr (iteration_pos, ':');
13855
13856 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13857
13858 const uint iteration_len = databuf_pos - iteration_pos;
13859
13860 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13861 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13862
13863 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13864
13865 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13866 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13867
13868 databuf_pos++;
13869
13870 // digest
13871
13872 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13873 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13874 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13875 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13876 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13877 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
13878 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
13879 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
13880
13881 // salt
13882
13883 char *saltbuf_ptr = (char *) salt->salt_buf;
13884
13885 for (uint i = 0; i < saltbuf_len; i += 2)
13886 {
13887 const char p0 = saltbuf_pos[i + 0];
13888 const char p1 = saltbuf_pos[i + 1];
13889
13890 *saltbuf_ptr++ = hex_convert (p1) << 0
13891 | hex_convert (p0) << 4;
13892 }
13893
13894 salt->salt_buf[4] = 0x01000000;
13895 salt->salt_buf[5] = 0x80;
13896
13897 salt->salt_len = saltbuf_len / 2;
13898
13899 // iteration
13900
13901 salt->salt_iter = atoi (iteration_pos) - 1;
13902
13903 // data
13904
13905 char *databuf_ptr = (char *) cloudkey->data_buf;
13906
13907 for (uint i = 0; i < databuf_len; i += 2)
13908 {
13909 const char p0 = databuf_pos[i + 0];
13910 const char p1 = databuf_pos[i + 1];
13911
13912 *databuf_ptr++ = hex_convert (p1) << 0
13913 | hex_convert (p0) << 4;
13914 }
13915
13916 *databuf_ptr++ = 0x80;
13917
13918 for (uint i = 0; i < 512; i++)
13919 {
13920 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13921 }
13922
13923 cloudkey->data_len = databuf_len / 2;
13924
13925 return (PARSER_OK);
13926 }
13927
13928 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13929 {
13930 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13931
13932 u32 *digest = (u32 *) hash_buf->digest;
13933
13934 salt_t *salt = hash_buf->salt;
13935
13936 /**
13937 * parse line
13938 */
13939
13940 char *hashbuf_pos = input_buf;
13941
13942 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13943
13944 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13945
13946 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13947
13948 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13949
13950 domainbuf_pos++;
13951
13952 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13953
13954 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13955
13956 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13957
13958 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13959
13960 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13961
13962 saltbuf_pos++;
13963
13964 char *iteration_pos = strchr (saltbuf_pos, ':');
13965
13966 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13967
13968 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13969
13970 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13971
13972 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13973
13974 iteration_pos++;
13975
13976 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13977
13978 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13979 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13980
13981 // ok, the plan for this algorithm is the following:
13982 // we have 2 salts here, the domain-name and a random salt
13983 // while both are used in the initial transformation,
13984 // only the random salt is used in the following iterations
13985 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13986 // and one that includes only the real salt (stored into salt_buf[]).
13987 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13988
13989 u8 tmp_buf[100];
13990
13991 memset (tmp_buf, 0, sizeof (tmp_buf));
13992
13993 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
13994
13995 memcpy (digest, tmp_buf, 20);
13996
13997 digest[0] = byte_swap_32 (digest[0]);
13998 digest[1] = byte_swap_32 (digest[1]);
13999 digest[2] = byte_swap_32 (digest[2]);
14000 digest[3] = byte_swap_32 (digest[3]);
14001 digest[4] = byte_swap_32 (digest[4]);
14002
14003 // domain
14004
14005 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14006
14007 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14008
14009 char *len_ptr = NULL;
14010
14011 for (uint i = 0; i < domainbuf_len; i++)
14012 {
14013 if (salt_buf_pc_ptr[i] == '.')
14014 {
14015 len_ptr = &salt_buf_pc_ptr[i];
14016
14017 *len_ptr = 0;
14018 }
14019 else
14020 {
14021 *len_ptr += 1;
14022 }
14023 }
14024
14025 salt->salt_buf_pc[7] = domainbuf_len;
14026
14027 // "real" salt
14028
14029 char *salt_buf_ptr = (char *) salt->salt_buf;
14030
14031 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14032
14033 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14034
14035 salt->salt_len = salt_len;
14036
14037 // iteration
14038
14039 salt->salt_iter = atoi (iteration_pos);
14040
14041 return (PARSER_OK);
14042 }
14043
14044 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14045 {
14046 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14047
14048 u32 *digest = (u32 *) hash_buf->digest;
14049
14050 salt_t *salt = hash_buf->salt;
14051
14052 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14053 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14054 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14055 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14056 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14057
14058 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14059
14060 uint salt_len = input_len - 40 - 1;
14061
14062 char *salt_buf = input_buf + 40 + 1;
14063
14064 char *salt_buf_ptr = (char *) salt->salt_buf;
14065
14066 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14067
14068 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14069
14070 salt->salt_len = salt_len;
14071
14072 return (PARSER_OK);
14073 }
14074
14075 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14076 {
14077 const u8 ascii_to_ebcdic[] =
14078 {
14079 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14080 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14081 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14082 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14083 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14084 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14085 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14086 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14087 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14088 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14089 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14090 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14091 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14092 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14093 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14094 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14095 };
14096
14097 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14098
14099 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14100
14101 u32 *digest = (u32 *) hash_buf->digest;
14102
14103 salt_t *salt = hash_buf->salt;
14104
14105 char *salt_pos = input_buf + 6 + 1;
14106
14107 char *digest_pos = strchr (salt_pos, '*');
14108
14109 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14110
14111 uint salt_len = digest_pos - salt_pos;
14112
14113 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14114
14115 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14116
14117 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14118
14119 digest_pos++;
14120
14121 char *salt_buf_ptr = (char *) salt->salt_buf;
14122 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14123
14124 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14125
14126 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14127
14128 salt->salt_len = salt_len;
14129
14130 for (uint i = 0; i < salt_len; i++)
14131 {
14132 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14133 }
14134 for (uint i = salt_len; i < 8; i++)
14135 {
14136 salt_buf_pc_ptr[i] = 0x40;
14137 }
14138
14139 uint tt;
14140
14141 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14142
14143 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14144 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14145
14146 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14147 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14148
14149 digest[0] = byte_swap_32 (digest[0]);
14150 digest[1] = byte_swap_32 (digest[1]);
14151
14152 IP (digest[0], digest[1], tt);
14153
14154 digest[0] = rotr32 (digest[0], 29);
14155 digest[1] = rotr32 (digest[1], 29);
14156 digest[2] = 0;
14157 digest[3] = 0;
14158
14159 return (PARSER_OK);
14160 }
14161
14162 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14163 {
14164 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14165
14166 u32 *digest = (u32 *) hash_buf->digest;
14167
14168 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14169 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14170 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14171 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14172
14173 digest[0] = byte_swap_32 (digest[0]);
14174 digest[1] = byte_swap_32 (digest[1]);
14175 digest[2] = byte_swap_32 (digest[2]);
14176 digest[3] = byte_swap_32 (digest[3]);
14177
14178 return (PARSER_OK);
14179 }
14180
14181 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14182 {
14183 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14184
14185 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14186
14187 u32 *digest = (u32 *) hash_buf->digest;
14188
14189 salt_t *salt = hash_buf->salt;
14190
14191 u8 tmp_buf[120];
14192
14193 memset (tmp_buf, 0, sizeof (tmp_buf));
14194
14195 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14196
14197 tmp_buf[3] += -4; // dont ask!
14198
14199 memcpy (salt->salt_buf, tmp_buf, 5);
14200
14201 salt->salt_len = 5;
14202
14203 memcpy (digest, tmp_buf + 5, 9);
14204
14205 // yes, only 9 byte are needed to crack, but 10 to display
14206
14207 salt->salt_buf_pc[7] = input_buf[20];
14208
14209 return (PARSER_OK);
14210 }
14211
14212 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14213 {
14214 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14215
14216 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14217
14218 u32 *digest = (u32 *) hash_buf->digest;
14219
14220 salt_t *salt = hash_buf->salt;
14221
14222 u8 tmp_buf[120];
14223
14224 memset (tmp_buf, 0, sizeof (tmp_buf));
14225
14226 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14227
14228 tmp_buf[3] += -4; // dont ask!
14229
14230 // salt
14231
14232 memcpy (salt->salt_buf, tmp_buf, 16);
14233
14234 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)
14235
14236 // iteration
14237
14238 char tmp_iter_buf[11];
14239
14240 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14241
14242 tmp_iter_buf[10] = 0;
14243
14244 salt->salt_iter = atoi (tmp_iter_buf);
14245
14246 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14247 {
14248 return (PARSER_SALT_ITERATION);
14249 }
14250
14251 salt->salt_iter--; // first round in init
14252
14253 // 2 additional bytes for display only
14254
14255 salt->salt_buf_pc[0] = tmp_buf[26];
14256 salt->salt_buf_pc[1] = tmp_buf[27];
14257
14258 // digest
14259
14260 memcpy (digest, tmp_buf + 28, 8);
14261
14262 digest[0] = byte_swap_32 (digest[0]);
14263 digest[1] = byte_swap_32 (digest[1]);
14264 digest[2] = 0;
14265 digest[3] = 0;
14266
14267 return (PARSER_OK);
14268 }
14269
14270 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14271 {
14272 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14273
14274 u32 *digest = (u32 *) hash_buf->digest;
14275
14276 salt_t *salt = hash_buf->salt;
14277
14278 char *salt_buf_pos = input_buf;
14279
14280 char *hash_buf_pos = salt_buf_pos + 6;
14281
14282 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14283 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14284 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14285 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14286 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14287 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14288 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14289 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14290
14291 digest[0] -= SHA256M_A;
14292 digest[1] -= SHA256M_B;
14293 digest[2] -= SHA256M_C;
14294 digest[3] -= SHA256M_D;
14295 digest[4] -= SHA256M_E;
14296 digest[5] -= SHA256M_F;
14297 digest[6] -= SHA256M_G;
14298 digest[7] -= SHA256M_H;
14299
14300 char *salt_buf_ptr = (char *) salt->salt_buf;
14301
14302 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14303
14304 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14305
14306 salt->salt_len = salt_len;
14307
14308 return (PARSER_OK);
14309 }
14310
14311 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14312 {
14313 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14314
14315 u32 *digest = (u32 *) hash_buf->digest;
14316
14317 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14318
14319 salt_t *salt = hash_buf->salt;
14320
14321 char *salt_buf = input_buf + 6;
14322
14323 char *digest_buf = strchr (salt_buf, '$');
14324
14325 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14326
14327 uint salt_len = digest_buf - salt_buf;
14328
14329 digest_buf++; // skip the '$' symbol
14330
14331 char *salt_buf_ptr = (char *) salt->salt_buf;
14332
14333 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14334
14335 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14336
14337 salt->salt_len = salt_len;
14338
14339 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14340 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14341 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14342 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14343
14344 digest[0] = byte_swap_32 (digest[0]);
14345 digest[1] = byte_swap_32 (digest[1]);
14346 digest[2] = byte_swap_32 (digest[2]);
14347 digest[3] = byte_swap_32 (digest[3]);
14348
14349 digest[0] -= MD5M_A;
14350 digest[1] -= MD5M_B;
14351 digest[2] -= MD5M_C;
14352 digest[3] -= MD5M_D;
14353
14354 return (PARSER_OK);
14355 }
14356
14357 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14358 {
14359 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14360
14361 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14362
14363 u32 *digest = (u32 *) hash_buf->digest;
14364
14365 salt_t *salt = hash_buf->salt;
14366
14367 char *salt_buf = input_buf + 3;
14368
14369 char *digest_buf = strchr (salt_buf, '$');
14370
14371 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14372
14373 uint salt_len = digest_buf - salt_buf;
14374
14375 digest_buf++; // skip the '$' symbol
14376
14377 char *salt_buf_ptr = (char *) salt->salt_buf;
14378
14379 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14380
14381 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14382
14383 salt_buf_ptr[salt_len] = 0x2d;
14384
14385 salt->salt_len = salt_len + 1;
14386
14387 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14388 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14389 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14390 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14391
14392 digest[0] = byte_swap_32 (digest[0]);
14393 digest[1] = byte_swap_32 (digest[1]);
14394 digest[2] = byte_swap_32 (digest[2]);
14395 digest[3] = byte_swap_32 (digest[3]);
14396
14397 digest[0] -= MD5M_A;
14398 digest[1] -= MD5M_B;
14399 digest[2] -= MD5M_C;
14400 digest[3] -= MD5M_D;
14401
14402 return (PARSER_OK);
14403 }
14404
14405 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14406 {
14407 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14408
14409 u32 *digest = (u32 *) hash_buf->digest;
14410
14411 u8 tmp_buf[100];
14412
14413 memset (tmp_buf, 0, sizeof (tmp_buf));
14414
14415 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14416
14417 memcpy (digest, tmp_buf, 20);
14418
14419 digest[0] = byte_swap_32 (digest[0]);
14420 digest[1] = byte_swap_32 (digest[1]);
14421 digest[2] = byte_swap_32 (digest[2]);
14422 digest[3] = byte_swap_32 (digest[3]);
14423 digest[4] = byte_swap_32 (digest[4]);
14424
14425 digest[0] -= SHA1M_A;
14426 digest[1] -= SHA1M_B;
14427 digest[2] -= SHA1M_C;
14428 digest[3] -= SHA1M_D;
14429 digest[4] -= SHA1M_E;
14430
14431 return (PARSER_OK);
14432 }
14433
14434 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14435 {
14436 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14437
14438 u32 *digest = (u32 *) hash_buf->digest;
14439
14440 salt_t *salt = hash_buf->salt;
14441
14442 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14443 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14444 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14445 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14446
14447 digest[0] = byte_swap_32 (digest[0]);
14448 digest[1] = byte_swap_32 (digest[1]);
14449 digest[2] = byte_swap_32 (digest[2]);
14450 digest[3] = byte_swap_32 (digest[3]);
14451
14452 digest[0] -= MD5M_A;
14453 digest[1] -= MD5M_B;
14454 digest[2] -= MD5M_C;
14455 digest[3] -= MD5M_D;
14456
14457 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14458
14459 uint salt_len = input_len - 32 - 1;
14460
14461 char *salt_buf = input_buf + 32 + 1;
14462
14463 char *salt_buf_ptr = (char *) salt->salt_buf;
14464
14465 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14466
14467 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14468
14469 /*
14470 * add static "salt" part
14471 */
14472
14473 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14474
14475 salt_len += 8;
14476
14477 salt->salt_len = salt_len;
14478
14479 return (PARSER_OK);
14480 }
14481
14482 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14483 {
14484 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14485
14486 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14487
14488 u32 *digest = (u32 *) hash_buf->digest;
14489
14490 salt_t *salt = hash_buf->salt;
14491
14492 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14493
14494 /**
14495 * parse line
14496 */
14497
14498 char *saltlen_pos = input_buf + 1 + 3 + 1;
14499
14500 char *saltbuf_pos = strchr (saltlen_pos, '$');
14501
14502 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14503
14504 uint saltlen_len = saltbuf_pos - saltlen_pos;
14505
14506 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14507
14508 saltbuf_pos++;
14509
14510 char *keylen_pos = strchr (saltbuf_pos, '$');
14511
14512 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14513
14514 uint saltbuf_len = keylen_pos - saltbuf_pos;
14515
14516 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14517
14518 keylen_pos++;
14519
14520 char *keybuf_pos = strchr (keylen_pos, '$');
14521
14522 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14523
14524 uint keylen_len = keybuf_pos - keylen_pos;
14525
14526 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14527
14528 keybuf_pos++;
14529
14530 char *databuf_pos = strchr (keybuf_pos, '$');
14531
14532 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14533
14534 uint keybuf_len = databuf_pos - keybuf_pos;
14535
14536 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14537
14538 databuf_pos++;
14539
14540 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14541
14542 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14543
14544 /**
14545 * copy data
14546 */
14547
14548 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14549 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14550 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14551 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14552
14553 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14554 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14555 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14556 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14557
14558 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14559 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14560 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14561 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14562
14563 salt->salt_len = 16;
14564 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14565
14566 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14567 {
14568 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14569 }
14570
14571 return (PARSER_OK);
14572 }
14573
14574 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14575 {
14576 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14577
14578 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14579
14580 u32 *digest = (u32 *) hash_buf->digest;
14581
14582 salt_t *salt = hash_buf->salt;
14583
14584 /**
14585 * parse line
14586 */
14587
14588 // first is the N salt parameter
14589
14590 char *N_pos = input_buf + 6;
14591
14592 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14593
14594 N_pos++;
14595
14596 salt->scrypt_N = atoi (N_pos);
14597
14598 // r
14599
14600 char *r_pos = strchr (N_pos, ':');
14601
14602 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14603
14604 r_pos++;
14605
14606 salt->scrypt_r = atoi (r_pos);
14607
14608 // p
14609
14610 char *p_pos = strchr (r_pos, ':');
14611
14612 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14613
14614 p_pos++;
14615
14616 salt->scrypt_p = atoi (p_pos);
14617
14618 // salt
14619
14620 char *saltbuf_pos = strchr (p_pos, ':');
14621
14622 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14623
14624 saltbuf_pos++;
14625
14626 char *hash_pos = strchr (saltbuf_pos, ':');
14627
14628 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14629
14630 hash_pos++;
14631
14632 // base64 decode
14633
14634 u8 tmp_buf[33];
14635
14636 memset (tmp_buf, 0, sizeof (tmp_buf));
14637
14638 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14639
14640 char *salt_buf_ptr = (char *) salt->salt_buf;
14641
14642 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14643
14644 salt->salt_len = tmp_len;
14645 salt->salt_iter = 1;
14646
14647 // digest - base64 decode
14648
14649 memset (tmp_buf, 0, sizeof (tmp_buf));
14650
14651 tmp_len = input_len - (hash_pos - input_buf);
14652
14653 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14654
14655 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14656
14657 memcpy (digest, tmp_buf, 32);
14658
14659 return (PARSER_OK);
14660 }
14661
14662 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14663 {
14664 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14665
14666 u32 *digest = (u32 *) hash_buf->digest;
14667
14668 salt_t *salt = hash_buf->salt;
14669
14670 /**
14671 * parse line
14672 */
14673
14674 char decrypted[76]; // iv + hash
14675
14676 juniper_decrypt_hash (input_buf, decrypted);
14677
14678 char *md5crypt_hash = decrypted + 12;
14679
14680 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14681
14682 salt->salt_iter = ROUNDS_MD5CRYPT;
14683
14684 char *salt_pos = md5crypt_hash + 3;
14685
14686 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14687
14688 salt->salt_len = hash_pos - salt_pos; // should be 8
14689
14690 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14691
14692 hash_pos++;
14693
14694 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14695
14696 return (PARSER_OK);
14697 }
14698
14699 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14700 {
14701 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14702
14703 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14704
14705 u32 *digest = (u32 *) hash_buf->digest;
14706
14707 salt_t *salt = hash_buf->salt;
14708
14709 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14710
14711 /**
14712 * parse line
14713 */
14714
14715 // first is *raw* salt
14716
14717 char *salt_pos = input_buf + 3;
14718
14719 char *hash_pos = strchr (salt_pos, '$');
14720
14721 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14722
14723 uint salt_len = hash_pos - salt_pos;
14724
14725 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14726
14727 hash_pos++;
14728
14729 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14730
14731 memcpy (salt_buf_ptr, salt_pos, 14);
14732
14733 salt_buf_ptr[17] = 0x01;
14734 salt_buf_ptr[18] = 0x80;
14735
14736 // add some stuff to normal salt to make sorted happy
14737
14738 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14739 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14740 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14741 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14742
14743 salt->salt_len = salt_len;
14744 salt->salt_iter = ROUNDS_CISCO8 - 1;
14745
14746 // base64 decode hash
14747
14748 u8 tmp_buf[100];
14749
14750 memset (tmp_buf, 0, sizeof (tmp_buf));
14751
14752 uint hash_len = input_len - 3 - salt_len - 1;
14753
14754 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14755
14756 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14757
14758 memcpy (digest, tmp_buf, 32);
14759
14760 digest[0] = byte_swap_32 (digest[0]);
14761 digest[1] = byte_swap_32 (digest[1]);
14762 digest[2] = byte_swap_32 (digest[2]);
14763 digest[3] = byte_swap_32 (digest[3]);
14764 digest[4] = byte_swap_32 (digest[4]);
14765 digest[5] = byte_swap_32 (digest[5]);
14766 digest[6] = byte_swap_32 (digest[6]);
14767 digest[7] = byte_swap_32 (digest[7]);
14768
14769 return (PARSER_OK);
14770 }
14771
14772 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14773 {
14774 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14775
14776 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14777
14778 u32 *digest = (u32 *) hash_buf->digest;
14779
14780 salt_t *salt = hash_buf->salt;
14781
14782 /**
14783 * parse line
14784 */
14785
14786 // first is *raw* salt
14787
14788 char *salt_pos = input_buf + 3;
14789
14790 char *hash_pos = strchr (salt_pos, '$');
14791
14792 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14793
14794 uint salt_len = hash_pos - salt_pos;
14795
14796 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14797
14798 salt->salt_len = salt_len;
14799 hash_pos++;
14800
14801 char *salt_buf_ptr = (char *) salt->salt_buf;
14802
14803 memcpy (salt_buf_ptr, salt_pos, salt_len);
14804 salt_buf_ptr[salt_len] = 0;
14805
14806 // base64 decode hash
14807
14808 u8 tmp_buf[100];
14809
14810 memset (tmp_buf, 0, sizeof (tmp_buf));
14811
14812 uint hash_len = input_len - 3 - salt_len - 1;
14813
14814 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14815
14816 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14817
14818 memcpy (digest, tmp_buf, 32);
14819
14820 // fixed:
14821 salt->scrypt_N = 16384;
14822 salt->scrypt_r = 1;
14823 salt->scrypt_p = 1;
14824 salt->salt_iter = 1;
14825
14826 return (PARSER_OK);
14827 }
14828
14829 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14830 {
14831 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14832
14833 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14834
14835 u32 *digest = (u32 *) hash_buf->digest;
14836
14837 salt_t *salt = hash_buf->salt;
14838
14839 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14840
14841 /**
14842 * parse line
14843 */
14844
14845 char *version_pos = input_buf + 8 + 1;
14846
14847 char *verifierHashSize_pos = strchr (version_pos, '*');
14848
14849 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14850
14851 u32 version_len = verifierHashSize_pos - version_pos;
14852
14853 if (version_len != 4) return (PARSER_SALT_LENGTH);
14854
14855 verifierHashSize_pos++;
14856
14857 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14858
14859 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14860
14861 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14862
14863 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14864
14865 keySize_pos++;
14866
14867 char *saltSize_pos = strchr (keySize_pos, '*');
14868
14869 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14870
14871 u32 keySize_len = saltSize_pos - keySize_pos;
14872
14873 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14874
14875 saltSize_pos++;
14876
14877 char *osalt_pos = strchr (saltSize_pos, '*');
14878
14879 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14880
14881 u32 saltSize_len = osalt_pos - saltSize_pos;
14882
14883 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14884
14885 osalt_pos++;
14886
14887 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14888
14889 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14890
14891 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14892
14893 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14894
14895 encryptedVerifier_pos++;
14896
14897 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14898
14899 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14900
14901 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14902
14903 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14904
14905 encryptedVerifierHash_pos++;
14906
14907 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;
14908
14909 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14910
14911 const uint version = atoi (version_pos);
14912
14913 if (version != 2007) return (PARSER_SALT_VALUE);
14914
14915 const uint verifierHashSize = atoi (verifierHashSize_pos);
14916
14917 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14918
14919 const uint keySize = atoi (keySize_pos);
14920
14921 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14922
14923 office2007->keySize = keySize;
14924
14925 const uint saltSize = atoi (saltSize_pos);
14926
14927 if (saltSize != 16) return (PARSER_SALT_VALUE);
14928
14929 /**
14930 * salt
14931 */
14932
14933 salt->salt_len = 16;
14934 salt->salt_iter = ROUNDS_OFFICE2007;
14935
14936 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14937 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14938 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14939 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14940
14941 /**
14942 * esalt
14943 */
14944
14945 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14946 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14947 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14948 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14949
14950 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14951 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14952 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14953 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14954 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14955
14956 /**
14957 * digest
14958 */
14959
14960 digest[0] = office2007->encryptedVerifierHash[0];
14961 digest[1] = office2007->encryptedVerifierHash[1];
14962 digest[2] = office2007->encryptedVerifierHash[2];
14963 digest[3] = office2007->encryptedVerifierHash[3];
14964
14965 return (PARSER_OK);
14966 }
14967
14968 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14969 {
14970 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14971
14972 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14973
14974 u32 *digest = (u32 *) hash_buf->digest;
14975
14976 salt_t *salt = hash_buf->salt;
14977
14978 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14979
14980 /**
14981 * parse line
14982 */
14983
14984 char *version_pos = input_buf + 8 + 1;
14985
14986 char *spinCount_pos = strchr (version_pos, '*');
14987
14988 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14989
14990 u32 version_len = spinCount_pos - version_pos;
14991
14992 if (version_len != 4) return (PARSER_SALT_LENGTH);
14993
14994 spinCount_pos++;
14995
14996 char *keySize_pos = strchr (spinCount_pos, '*');
14997
14998 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14999
15000 u32 spinCount_len = keySize_pos - spinCount_pos;
15001
15002 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15003
15004 keySize_pos++;
15005
15006 char *saltSize_pos = strchr (keySize_pos, '*');
15007
15008 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15009
15010 u32 keySize_len = saltSize_pos - keySize_pos;
15011
15012 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15013
15014 saltSize_pos++;
15015
15016 char *osalt_pos = strchr (saltSize_pos, '*');
15017
15018 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15019
15020 u32 saltSize_len = osalt_pos - saltSize_pos;
15021
15022 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15023
15024 osalt_pos++;
15025
15026 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15027
15028 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15029
15030 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15031
15032 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15033
15034 encryptedVerifier_pos++;
15035
15036 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15037
15038 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15039
15040 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15041
15042 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15043
15044 encryptedVerifierHash_pos++;
15045
15046 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;
15047
15048 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15049
15050 const uint version = atoi (version_pos);
15051
15052 if (version != 2010) return (PARSER_SALT_VALUE);
15053
15054 const uint spinCount = atoi (spinCount_pos);
15055
15056 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15057
15058 const uint keySize = atoi (keySize_pos);
15059
15060 if (keySize != 128) return (PARSER_SALT_VALUE);
15061
15062 const uint saltSize = atoi (saltSize_pos);
15063
15064 if (saltSize != 16) return (PARSER_SALT_VALUE);
15065
15066 /**
15067 * salt
15068 */
15069
15070 salt->salt_len = 16;
15071 salt->salt_iter = spinCount;
15072
15073 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15074 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15075 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15076 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15077
15078 /**
15079 * esalt
15080 */
15081
15082 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15083 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15084 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15085 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15086
15087 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15088 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15089 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15090 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15091 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15092 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15093 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15094 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15095
15096 /**
15097 * digest
15098 */
15099
15100 digest[0] = office2010->encryptedVerifierHash[0];
15101 digest[1] = office2010->encryptedVerifierHash[1];
15102 digest[2] = office2010->encryptedVerifierHash[2];
15103 digest[3] = office2010->encryptedVerifierHash[3];
15104
15105 return (PARSER_OK);
15106 }
15107
15108 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15109 {
15110 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15111
15112 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15113
15114 u32 *digest = (u32 *) hash_buf->digest;
15115
15116 salt_t *salt = hash_buf->salt;
15117
15118 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15119
15120 /**
15121 * parse line
15122 */
15123
15124 char *version_pos = input_buf + 8 + 1;
15125
15126 char *spinCount_pos = strchr (version_pos, '*');
15127
15128 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15129
15130 u32 version_len = spinCount_pos - version_pos;
15131
15132 if (version_len != 4) return (PARSER_SALT_LENGTH);
15133
15134 spinCount_pos++;
15135
15136 char *keySize_pos = strchr (spinCount_pos, '*');
15137
15138 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15139
15140 u32 spinCount_len = keySize_pos - spinCount_pos;
15141
15142 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15143
15144 keySize_pos++;
15145
15146 char *saltSize_pos = strchr (keySize_pos, '*');
15147
15148 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15149
15150 u32 keySize_len = saltSize_pos - keySize_pos;
15151
15152 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15153
15154 saltSize_pos++;
15155
15156 char *osalt_pos = strchr (saltSize_pos, '*');
15157
15158 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15159
15160 u32 saltSize_len = osalt_pos - saltSize_pos;
15161
15162 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15163
15164 osalt_pos++;
15165
15166 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15167
15168 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15169
15170 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15171
15172 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15173
15174 encryptedVerifier_pos++;
15175
15176 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15177
15178 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15179
15180 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15181
15182 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15183
15184 encryptedVerifierHash_pos++;
15185
15186 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;
15187
15188 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15189
15190 const uint version = atoi (version_pos);
15191
15192 if (version != 2013) return (PARSER_SALT_VALUE);
15193
15194 const uint spinCount = atoi (spinCount_pos);
15195
15196 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15197
15198 const uint keySize = atoi (keySize_pos);
15199
15200 if (keySize != 256) return (PARSER_SALT_VALUE);
15201
15202 const uint saltSize = atoi (saltSize_pos);
15203
15204 if (saltSize != 16) return (PARSER_SALT_VALUE);
15205
15206 /**
15207 * salt
15208 */
15209
15210 salt->salt_len = 16;
15211 salt->salt_iter = spinCount;
15212
15213 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15214 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15215 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15216 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15217
15218 /**
15219 * esalt
15220 */
15221
15222 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15223 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15224 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15225 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15226
15227 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15228 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15229 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15230 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15231 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15232 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15233 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15234 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15235
15236 /**
15237 * digest
15238 */
15239
15240 digest[0] = office2013->encryptedVerifierHash[0];
15241 digest[1] = office2013->encryptedVerifierHash[1];
15242 digest[2] = office2013->encryptedVerifierHash[2];
15243 digest[3] = office2013->encryptedVerifierHash[3];
15244
15245 return (PARSER_OK);
15246 }
15247
15248 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15249 {
15250 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15251
15252 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15253
15254 u32 *digest = (u32 *) hash_buf->digest;
15255
15256 salt_t *salt = hash_buf->salt;
15257
15258 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15259
15260 /**
15261 * parse line
15262 */
15263
15264 char *version_pos = input_buf + 11;
15265
15266 char *osalt_pos = strchr (version_pos, '*');
15267
15268 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15269
15270 u32 version_len = osalt_pos - version_pos;
15271
15272 if (version_len != 1) return (PARSER_SALT_LENGTH);
15273
15274 osalt_pos++;
15275
15276 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15277
15278 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15279
15280 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15281
15282 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15283
15284 encryptedVerifier_pos++;
15285
15286 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15287
15288 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15289
15290 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15291
15292 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15293
15294 encryptedVerifierHash_pos++;
15295
15296 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15297
15298 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15299
15300 const uint version = *version_pos - 0x30;
15301
15302 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15303
15304 /**
15305 * esalt
15306 */
15307
15308 oldoffice01->version = version;
15309
15310 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15311 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15312 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15313 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15314
15315 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15316 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15317 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15318 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15319
15320 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15321 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15322 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15323 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15324
15325 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15326 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15327 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15328 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15329
15330 /**
15331 * salt
15332 */
15333
15334 salt->salt_len = 16;
15335
15336 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15337 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15338 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15339 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15340
15341 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15342 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15343 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15344 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15345
15346 // this is a workaround as office produces multiple documents with the same salt
15347
15348 salt->salt_len += 32;
15349
15350 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15351 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15352 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15353 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15354 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15355 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15356 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15357 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15358
15359 /**
15360 * digest
15361 */
15362
15363 digest[0] = oldoffice01->encryptedVerifierHash[0];
15364 digest[1] = oldoffice01->encryptedVerifierHash[1];
15365 digest[2] = oldoffice01->encryptedVerifierHash[2];
15366 digest[3] = oldoffice01->encryptedVerifierHash[3];
15367
15368 return (PARSER_OK);
15369 }
15370
15371 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15372 {
15373 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15374 }
15375
15376 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15377 {
15378 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15379
15380 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15381
15382 u32 *digest = (u32 *) hash_buf->digest;
15383
15384 salt_t *salt = hash_buf->salt;
15385
15386 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15387
15388 /**
15389 * parse line
15390 */
15391
15392 char *version_pos = input_buf + 11;
15393
15394 char *osalt_pos = strchr (version_pos, '*');
15395
15396 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15397
15398 u32 version_len = osalt_pos - version_pos;
15399
15400 if (version_len != 1) return (PARSER_SALT_LENGTH);
15401
15402 osalt_pos++;
15403
15404 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15405
15406 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15407
15408 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15409
15410 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15411
15412 encryptedVerifier_pos++;
15413
15414 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15415
15416 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15417
15418 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15419
15420 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15421
15422 encryptedVerifierHash_pos++;
15423
15424 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15425
15426 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15427
15428 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15429
15430 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15431
15432 rc4key_pos++;
15433
15434 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15435
15436 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15437
15438 const uint version = *version_pos - 0x30;
15439
15440 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15441
15442 /**
15443 * esalt
15444 */
15445
15446 oldoffice01->version = version;
15447
15448 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15449 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15450 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15451 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15452
15453 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15454 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15455 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15456 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15457
15458 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15459 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15460 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15461 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15462
15463 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15464 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15465 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15466 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15467
15468 oldoffice01->rc4key[1] = 0;
15469 oldoffice01->rc4key[0] = 0;
15470
15471 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15472 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15473 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15474 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15475 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15476 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15477 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15478 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15479 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15480 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15481
15482 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15483 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15484
15485 /**
15486 * salt
15487 */
15488
15489 salt->salt_len = 16;
15490
15491 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15492 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15493 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15494 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15495
15496 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15497 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15498 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15499 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15500
15501 // this is a workaround as office produces multiple documents with the same salt
15502
15503 salt->salt_len += 32;
15504
15505 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15506 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15507 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15508 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15509 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15510 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15511 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15512 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15513
15514 /**
15515 * digest
15516 */
15517
15518 digest[0] = oldoffice01->rc4key[0];
15519 digest[1] = oldoffice01->rc4key[1];
15520 digest[2] = 0;
15521 digest[3] = 0;
15522
15523 return (PARSER_OK);
15524 }
15525
15526 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15527 {
15528 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15529
15530 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15531
15532 u32 *digest = (u32 *) hash_buf->digest;
15533
15534 salt_t *salt = hash_buf->salt;
15535
15536 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15537
15538 /**
15539 * parse line
15540 */
15541
15542 char *version_pos = input_buf + 11;
15543
15544 char *osalt_pos = strchr (version_pos, '*');
15545
15546 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15547
15548 u32 version_len = osalt_pos - version_pos;
15549
15550 if (version_len != 1) return (PARSER_SALT_LENGTH);
15551
15552 osalt_pos++;
15553
15554 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15555
15556 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15557
15558 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15559
15560 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15561
15562 encryptedVerifier_pos++;
15563
15564 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15565
15566 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15567
15568 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15569
15570 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15571
15572 encryptedVerifierHash_pos++;
15573
15574 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15575
15576 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15577
15578 const uint version = *version_pos - 0x30;
15579
15580 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15581
15582 /**
15583 * esalt
15584 */
15585
15586 oldoffice34->version = version;
15587
15588 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15589 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15590 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15591 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15592
15593 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15594 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15595 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15596 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15597
15598 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15599 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15600 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15601 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15602 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15603
15604 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15605 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15606 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15607 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15608 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15609
15610 /**
15611 * salt
15612 */
15613
15614 salt->salt_len = 16;
15615
15616 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15617 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15618 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15619 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15620
15621 // this is a workaround as office produces multiple documents with the same salt
15622
15623 salt->salt_len += 32;
15624
15625 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15626 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15627 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15628 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15629 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15630 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15631 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15632 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15633
15634 /**
15635 * digest
15636 */
15637
15638 digest[0] = oldoffice34->encryptedVerifierHash[0];
15639 digest[1] = oldoffice34->encryptedVerifierHash[1];
15640 digest[2] = oldoffice34->encryptedVerifierHash[2];
15641 digest[3] = oldoffice34->encryptedVerifierHash[3];
15642
15643 return (PARSER_OK);
15644 }
15645
15646 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15647 {
15648 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15649
15650 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15651 }
15652
15653 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15654 {
15655 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15656
15657 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15658
15659 u32 *digest = (u32 *) hash_buf->digest;
15660
15661 salt_t *salt = hash_buf->salt;
15662
15663 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15664
15665 /**
15666 * parse line
15667 */
15668
15669 char *version_pos = input_buf + 11;
15670
15671 char *osalt_pos = strchr (version_pos, '*');
15672
15673 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15674
15675 u32 version_len = osalt_pos - version_pos;
15676
15677 if (version_len != 1) return (PARSER_SALT_LENGTH);
15678
15679 osalt_pos++;
15680
15681 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15682
15683 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15684
15685 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15686
15687 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15688
15689 encryptedVerifier_pos++;
15690
15691 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15692
15693 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15694
15695 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15696
15697 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15698
15699 encryptedVerifierHash_pos++;
15700
15701 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15702
15703 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15704
15705 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15706
15707 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15708
15709 rc4key_pos++;
15710
15711 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15712
15713 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15714
15715 const uint version = *version_pos - 0x30;
15716
15717 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15718
15719 /**
15720 * esalt
15721 */
15722
15723 oldoffice34->version = version;
15724
15725 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15726 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15727 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15728 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15729
15730 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15731 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15732 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15733 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15734
15735 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15736 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15737 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15738 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15739 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15740
15741 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15742 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15743 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15744 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15745 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15746
15747 oldoffice34->rc4key[1] = 0;
15748 oldoffice34->rc4key[0] = 0;
15749
15750 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15751 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15752 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15753 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15754 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15755 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15756 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15757 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15758 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15759 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15760
15761 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15762 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15763
15764 /**
15765 * salt
15766 */
15767
15768 salt->salt_len = 16;
15769
15770 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15771 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15772 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15773 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15774
15775 // this is a workaround as office produces multiple documents with the same salt
15776
15777 salt->salt_len += 32;
15778
15779 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15780 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15781 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15782 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15783 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15784 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15785 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15786 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15787
15788 /**
15789 * digest
15790 */
15791
15792 digest[0] = oldoffice34->rc4key[0];
15793 digest[1] = oldoffice34->rc4key[1];
15794 digest[2] = 0;
15795 digest[3] = 0;
15796
15797 return (PARSER_OK);
15798 }
15799
15800 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15801 {
15802 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15803
15804 u32 *digest = (u32 *) hash_buf->digest;
15805
15806 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15807 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15808 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15809 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15810
15811 digest[0] = byte_swap_32 (digest[0]);
15812 digest[1] = byte_swap_32 (digest[1]);
15813 digest[2] = byte_swap_32 (digest[2]);
15814 digest[3] = byte_swap_32 (digest[3]);
15815
15816 return (PARSER_OK);
15817 }
15818
15819 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15820 {
15821 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15822
15823 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15824
15825 u32 *digest = (u32 *) hash_buf->digest;
15826
15827 salt_t *salt = hash_buf->salt;
15828
15829 char *signature_pos = input_buf;
15830
15831 char *salt_pos = strchr (signature_pos, '$');
15832
15833 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15834
15835 u32 signature_len = salt_pos - signature_pos;
15836
15837 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15838
15839 salt_pos++;
15840
15841 char *hash_pos = strchr (salt_pos, '$');
15842
15843 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15844
15845 u32 salt_len = hash_pos - salt_pos;
15846
15847 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15848
15849 hash_pos++;
15850
15851 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15852
15853 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15854
15855 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15856 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15857 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15858 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15859 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15860
15861 digest[0] -= SHA1M_A;
15862 digest[1] -= SHA1M_B;
15863 digest[2] -= SHA1M_C;
15864 digest[3] -= SHA1M_D;
15865 digest[4] -= SHA1M_E;
15866
15867 char *salt_buf_ptr = (char *) salt->salt_buf;
15868
15869 memcpy (salt_buf_ptr, salt_pos, salt_len);
15870
15871 salt->salt_len = salt_len;
15872
15873 return (PARSER_OK);
15874 }
15875
15876 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15877 {
15878 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15879
15880 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15881
15882 u32 *digest = (u32 *) hash_buf->digest;
15883
15884 salt_t *salt = hash_buf->salt;
15885
15886 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15887
15888 /**
15889 * parse line
15890 */
15891
15892 char *iter_pos = input_buf + 14;
15893
15894 const int iter = atoi (iter_pos);
15895
15896 if (iter < 1) return (PARSER_SALT_ITERATION);
15897
15898 salt->salt_iter = iter - 1;
15899
15900 char *salt_pos = strchr (iter_pos, '$');
15901
15902 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15903
15904 salt_pos++;
15905
15906 char *hash_pos = strchr (salt_pos, '$');
15907
15908 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15909
15910 const uint salt_len = hash_pos - salt_pos;
15911
15912 hash_pos++;
15913
15914 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15915
15916 memcpy (salt_buf_ptr, salt_pos, salt_len);
15917
15918 salt->salt_len = salt_len;
15919
15920 salt_buf_ptr[salt_len + 3] = 0x01;
15921 salt_buf_ptr[salt_len + 4] = 0x80;
15922
15923 // add some stuff to normal salt to make sorted happy
15924
15925 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15926 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15927 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15928 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15929 salt->salt_buf[4] = salt->salt_iter;
15930
15931 // base64 decode hash
15932
15933 u8 tmp_buf[100];
15934
15935 memset (tmp_buf, 0, sizeof (tmp_buf));
15936
15937 uint hash_len = input_len - (hash_pos - input_buf);
15938
15939 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15940
15941 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15942
15943 memcpy (digest, tmp_buf, 32);
15944
15945 digest[0] = byte_swap_32 (digest[0]);
15946 digest[1] = byte_swap_32 (digest[1]);
15947 digest[2] = byte_swap_32 (digest[2]);
15948 digest[3] = byte_swap_32 (digest[3]);
15949 digest[4] = byte_swap_32 (digest[4]);
15950 digest[5] = byte_swap_32 (digest[5]);
15951 digest[6] = byte_swap_32 (digest[6]);
15952 digest[7] = byte_swap_32 (digest[7]);
15953
15954 return (PARSER_OK);
15955 }
15956
15957 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15958 {
15959 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15960
15961 u32 *digest = (u32 *) hash_buf->digest;
15962
15963 salt_t *salt = hash_buf->salt;
15964
15965 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15966 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15967 digest[2] = 0;
15968 digest[3] = 0;
15969
15970 digest[0] = byte_swap_32 (digest[0]);
15971 digest[1] = byte_swap_32 (digest[1]);
15972
15973 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15974 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15975 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15976
15977 char iter_c = input_buf[17];
15978 char iter_d = input_buf[19];
15979
15980 // atm only defaults, let's see if there's more request
15981 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15982 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15983
15984 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15985
15986 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
15987 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
15988 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
15989 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
15990
15991 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15992 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15993 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15994 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15995
15996 salt->salt_len = 16;
15997
15998 return (PARSER_OK);
15999 }
16000
16001 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16002 {
16003 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16004
16005 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16006
16007 u32 *digest = (u32 *) hash_buf->digest;
16008
16009 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16010
16011 salt_t *salt = hash_buf->salt;
16012
16013 char *salt_pos = input_buf + 10;
16014
16015 char *hash_pos = strchr (salt_pos, '$');
16016
16017 uint salt_len = hash_pos - salt_pos;
16018
16019 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16020
16021 hash_pos++;
16022
16023 uint hash_len = input_len - 10 - salt_len - 1;
16024
16025 // base64 decode salt
16026
16027 u8 tmp_buf[100];
16028
16029 memset (tmp_buf, 0, sizeof (tmp_buf));
16030
16031 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16032
16033 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16034
16035 tmp_buf[salt_len] = 0x80;
16036
16037 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16038
16039 salt->salt_len = salt_len;
16040
16041 // base64 decode salt
16042
16043 memset (tmp_buf, 0, sizeof (tmp_buf));
16044
16045 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16046
16047 uint user_len = hash_len - 32;
16048
16049 const u8 *tmp_hash = tmp_buf + user_len;
16050
16051 user_len--; // skip the trailing space
16052
16053 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16054 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16055 digest[2] = hex_to_u32 (&tmp_hash[16]);
16056 digest[3] = hex_to_u32 (&tmp_hash[24]);
16057
16058 digest[0] = byte_swap_32 (digest[0]);
16059 digest[1] = byte_swap_32 (digest[1]);
16060 digest[2] = byte_swap_32 (digest[2]);
16061 digest[3] = byte_swap_32 (digest[3]);
16062
16063 // store username for host only (output hash if cracked)
16064
16065 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16066 memcpy (cram_md5->user, tmp_buf, user_len);
16067
16068 return (PARSER_OK);
16069 }
16070
16071 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16072 {
16073 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16074
16075 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16076
16077 u32 *digest = (u32 *) hash_buf->digest;
16078
16079 salt_t *salt = hash_buf->salt;
16080
16081 char *iter_pos = input_buf + 10;
16082
16083 u32 iter = atoi (iter_pos);
16084
16085 if (iter < 1)
16086 {
16087 return (PARSER_SALT_ITERATION);
16088 }
16089
16090 iter--; // first iteration is special
16091
16092 salt->salt_iter = iter;
16093
16094 char *base64_pos = strchr (iter_pos, '}');
16095
16096 if (base64_pos == NULL)
16097 {
16098 return (PARSER_SIGNATURE_UNMATCHED);
16099 }
16100
16101 base64_pos++;
16102
16103 // base64 decode salt
16104
16105 u32 base64_len = input_len - (base64_pos - input_buf);
16106
16107 u8 tmp_buf[100];
16108
16109 memset (tmp_buf, 0, sizeof (tmp_buf));
16110
16111 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16112
16113 if (decoded_len < 24)
16114 {
16115 return (PARSER_SALT_LENGTH);
16116 }
16117
16118 // copy the salt
16119
16120 uint salt_len = decoded_len - 20;
16121
16122 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16123 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16124
16125 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16126
16127 salt->salt_len = salt_len;
16128
16129 // set digest
16130
16131 u32 *digest_ptr = (u32*) tmp_buf;
16132
16133 digest[0] = byte_swap_32 (digest_ptr[0]);
16134 digest[1] = byte_swap_32 (digest_ptr[1]);
16135 digest[2] = byte_swap_32 (digest_ptr[2]);
16136 digest[3] = byte_swap_32 (digest_ptr[3]);
16137 digest[4] = byte_swap_32 (digest_ptr[4]);
16138
16139 return (PARSER_OK);
16140 }
16141
16142 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16143 {
16144 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16145
16146 u32 *digest = (u32 *) hash_buf->digest;
16147
16148 salt_t *salt = hash_buf->salt;
16149
16150 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16151 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16152 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16153 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16154 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16155
16156 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16157
16158 uint salt_len = input_len - 40 - 1;
16159
16160 char *salt_buf = input_buf + 40 + 1;
16161
16162 char *salt_buf_ptr = (char *) salt->salt_buf;
16163
16164 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16165
16166 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16167
16168 salt->salt_len = salt_len;
16169
16170 return (PARSER_OK);
16171 }
16172
16173 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16174 {
16175 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16176
16177 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16178
16179 u32 *digest = (u32 *) hash_buf->digest;
16180
16181 salt_t *salt = hash_buf->salt;
16182
16183 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16184
16185 /**
16186 * parse line
16187 */
16188
16189 char *V_pos = input_buf + 5;
16190
16191 char *R_pos = strchr (V_pos, '*');
16192
16193 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16194
16195 u32 V_len = R_pos - V_pos;
16196
16197 R_pos++;
16198
16199 char *bits_pos = strchr (R_pos, '*');
16200
16201 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16202
16203 u32 R_len = bits_pos - R_pos;
16204
16205 bits_pos++;
16206
16207 char *P_pos = strchr (bits_pos, '*');
16208
16209 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16210
16211 u32 bits_len = P_pos - bits_pos;
16212
16213 P_pos++;
16214
16215 char *enc_md_pos = strchr (P_pos, '*');
16216
16217 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16218
16219 u32 P_len = enc_md_pos - P_pos;
16220
16221 enc_md_pos++;
16222
16223 char *id_len_pos = strchr (enc_md_pos, '*');
16224
16225 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16226
16227 u32 enc_md_len = id_len_pos - enc_md_pos;
16228
16229 id_len_pos++;
16230
16231 char *id_buf_pos = strchr (id_len_pos, '*');
16232
16233 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16234
16235 u32 id_len_len = id_buf_pos - id_len_pos;
16236
16237 id_buf_pos++;
16238
16239 char *u_len_pos = strchr (id_buf_pos, '*');
16240
16241 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16242
16243 u32 id_buf_len = u_len_pos - id_buf_pos;
16244
16245 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16246
16247 u_len_pos++;
16248
16249 char *u_buf_pos = strchr (u_len_pos, '*');
16250
16251 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16252
16253 u32 u_len_len = u_buf_pos - u_len_pos;
16254
16255 u_buf_pos++;
16256
16257 char *o_len_pos = strchr (u_buf_pos, '*');
16258
16259 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16260
16261 u32 u_buf_len = o_len_pos - u_buf_pos;
16262
16263 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16264
16265 o_len_pos++;
16266
16267 char *o_buf_pos = strchr (o_len_pos, '*');
16268
16269 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16270
16271 u32 o_len_len = o_buf_pos - o_len_pos;
16272
16273 o_buf_pos++;
16274
16275 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;
16276
16277 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16278
16279 // validate data
16280
16281 const int V = atoi (V_pos);
16282 const int R = atoi (R_pos);
16283 const int P = atoi (P_pos);
16284
16285 if (V != 1) return (PARSER_SALT_VALUE);
16286 if (R != 2) return (PARSER_SALT_VALUE);
16287
16288 const int enc_md = atoi (enc_md_pos);
16289
16290 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16291
16292 const int id_len = atoi (id_len_pos);
16293 const int u_len = atoi (u_len_pos);
16294 const int o_len = atoi (o_len_pos);
16295
16296 if (id_len != 16) return (PARSER_SALT_VALUE);
16297 if (u_len != 32) return (PARSER_SALT_VALUE);
16298 if (o_len != 32) return (PARSER_SALT_VALUE);
16299
16300 const int bits = atoi (bits_pos);
16301
16302 if (bits != 40) return (PARSER_SALT_VALUE);
16303
16304 // copy data to esalt
16305
16306 pdf->V = V;
16307 pdf->R = R;
16308 pdf->P = P;
16309
16310 pdf->enc_md = enc_md;
16311
16312 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16313 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16314 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16315 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16316 pdf->id_len = id_len;
16317
16318 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16319 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16320 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16321 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16322 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16323 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16324 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16325 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16326 pdf->u_len = u_len;
16327
16328 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16329 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16330 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16331 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16332 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16333 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16334 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16335 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16336 pdf->o_len = o_len;
16337
16338 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16339 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16340 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16341 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16342
16343 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16344 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16345 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16346 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16347 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16348 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16349 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16350 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16351
16352 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16353 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16354 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16355 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16356 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16357 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16358 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16359 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16360
16361 // we use ID for salt, maybe needs to change, we will see...
16362
16363 salt->salt_buf[0] = pdf->id_buf[0];
16364 salt->salt_buf[1] = pdf->id_buf[1];
16365 salt->salt_buf[2] = pdf->id_buf[2];
16366 salt->salt_buf[3] = pdf->id_buf[3];
16367 salt->salt_len = pdf->id_len;
16368
16369 digest[0] = pdf->u_buf[0];
16370 digest[1] = pdf->u_buf[1];
16371 digest[2] = pdf->u_buf[2];
16372 digest[3] = pdf->u_buf[3];
16373
16374 return (PARSER_OK);
16375 }
16376
16377 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16378 {
16379 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16380 }
16381
16382 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16383 {
16384 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16385
16386 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16387
16388 u32 *digest = (u32 *) hash_buf->digest;
16389
16390 salt_t *salt = hash_buf->salt;
16391
16392 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16393
16394 /**
16395 * parse line
16396 */
16397
16398 char *V_pos = input_buf + 5;
16399
16400 char *R_pos = strchr (V_pos, '*');
16401
16402 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16403
16404 u32 V_len = R_pos - V_pos;
16405
16406 R_pos++;
16407
16408 char *bits_pos = strchr (R_pos, '*');
16409
16410 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16411
16412 u32 R_len = bits_pos - R_pos;
16413
16414 bits_pos++;
16415
16416 char *P_pos = strchr (bits_pos, '*');
16417
16418 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16419
16420 u32 bits_len = P_pos - bits_pos;
16421
16422 P_pos++;
16423
16424 char *enc_md_pos = strchr (P_pos, '*');
16425
16426 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16427
16428 u32 P_len = enc_md_pos - P_pos;
16429
16430 enc_md_pos++;
16431
16432 char *id_len_pos = strchr (enc_md_pos, '*');
16433
16434 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16435
16436 u32 enc_md_len = id_len_pos - enc_md_pos;
16437
16438 id_len_pos++;
16439
16440 char *id_buf_pos = strchr (id_len_pos, '*');
16441
16442 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16443
16444 u32 id_len_len = id_buf_pos - id_len_pos;
16445
16446 id_buf_pos++;
16447
16448 char *u_len_pos = strchr (id_buf_pos, '*');
16449
16450 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16451
16452 u32 id_buf_len = u_len_pos - id_buf_pos;
16453
16454 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16455
16456 u_len_pos++;
16457
16458 char *u_buf_pos = strchr (u_len_pos, '*');
16459
16460 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16461
16462 u32 u_len_len = u_buf_pos - u_len_pos;
16463
16464 u_buf_pos++;
16465
16466 char *o_len_pos = strchr (u_buf_pos, '*');
16467
16468 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16469
16470 u32 u_buf_len = o_len_pos - u_buf_pos;
16471
16472 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16473
16474 o_len_pos++;
16475
16476 char *o_buf_pos = strchr (o_len_pos, '*');
16477
16478 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16479
16480 u32 o_len_len = o_buf_pos - o_len_pos;
16481
16482 o_buf_pos++;
16483
16484 char *rc4key_pos = strchr (o_buf_pos, ':');
16485
16486 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16487
16488 u32 o_buf_len = rc4key_pos - o_buf_pos;
16489
16490 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16491
16492 rc4key_pos++;
16493
16494 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;
16495
16496 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16497
16498 // validate data
16499
16500 const int V = atoi (V_pos);
16501 const int R = atoi (R_pos);
16502 const int P = atoi (P_pos);
16503
16504 if (V != 1) return (PARSER_SALT_VALUE);
16505 if (R != 2) return (PARSER_SALT_VALUE);
16506
16507 const int enc_md = atoi (enc_md_pos);
16508
16509 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16510
16511 const int id_len = atoi (id_len_pos);
16512 const int u_len = atoi (u_len_pos);
16513 const int o_len = atoi (o_len_pos);
16514
16515 if (id_len != 16) return (PARSER_SALT_VALUE);
16516 if (u_len != 32) return (PARSER_SALT_VALUE);
16517 if (o_len != 32) return (PARSER_SALT_VALUE);
16518
16519 const int bits = atoi (bits_pos);
16520
16521 if (bits != 40) return (PARSER_SALT_VALUE);
16522
16523 // copy data to esalt
16524
16525 pdf->V = V;
16526 pdf->R = R;
16527 pdf->P = P;
16528
16529 pdf->enc_md = enc_md;
16530
16531 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16532 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16533 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16534 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16535 pdf->id_len = id_len;
16536
16537 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16538 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16539 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16540 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16541 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16542 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16543 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16544 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16545 pdf->u_len = u_len;
16546
16547 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16548 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16549 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16550 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16551 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16552 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16553 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16554 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16555 pdf->o_len = o_len;
16556
16557 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16558 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16559 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16560 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16561
16562 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16563 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16564 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16565 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16566 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16567 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16568 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16569 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16570
16571 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16572 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16573 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16574 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16575 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16576 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16577 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16578 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16579
16580 pdf->rc4key[1] = 0;
16581 pdf->rc4key[0] = 0;
16582
16583 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16584 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16585 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16586 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16587 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16588 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16589 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16590 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16591 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16592 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16593
16594 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16595 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16596
16597 // we use ID for salt, maybe needs to change, we will see...
16598
16599 salt->salt_buf[0] = pdf->id_buf[0];
16600 salt->salt_buf[1] = pdf->id_buf[1];
16601 salt->salt_buf[2] = pdf->id_buf[2];
16602 salt->salt_buf[3] = pdf->id_buf[3];
16603 salt->salt_buf[4] = pdf->u_buf[0];
16604 salt->salt_buf[5] = pdf->u_buf[1];
16605 salt->salt_buf[6] = pdf->o_buf[0];
16606 salt->salt_buf[7] = pdf->o_buf[1];
16607 salt->salt_len = pdf->id_len + 16;
16608
16609 digest[0] = pdf->rc4key[0];
16610 digest[1] = pdf->rc4key[1];
16611 digest[2] = 0;
16612 digest[3] = 0;
16613
16614 return (PARSER_OK);
16615 }
16616
16617 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16618 {
16619 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16620
16621 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16622
16623 u32 *digest = (u32 *) hash_buf->digest;
16624
16625 salt_t *salt = hash_buf->salt;
16626
16627 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16628
16629 /**
16630 * parse line
16631 */
16632
16633 char *V_pos = input_buf + 5;
16634
16635 char *R_pos = strchr (V_pos, '*');
16636
16637 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16638
16639 u32 V_len = R_pos - V_pos;
16640
16641 R_pos++;
16642
16643 char *bits_pos = strchr (R_pos, '*');
16644
16645 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16646
16647 u32 R_len = bits_pos - R_pos;
16648
16649 bits_pos++;
16650
16651 char *P_pos = strchr (bits_pos, '*');
16652
16653 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16654
16655 u32 bits_len = P_pos - bits_pos;
16656
16657 P_pos++;
16658
16659 char *enc_md_pos = strchr (P_pos, '*');
16660
16661 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16662
16663 u32 P_len = enc_md_pos - P_pos;
16664
16665 enc_md_pos++;
16666
16667 char *id_len_pos = strchr (enc_md_pos, '*');
16668
16669 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16670
16671 u32 enc_md_len = id_len_pos - enc_md_pos;
16672
16673 id_len_pos++;
16674
16675 char *id_buf_pos = strchr (id_len_pos, '*');
16676
16677 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16678
16679 u32 id_len_len = id_buf_pos - id_len_pos;
16680
16681 id_buf_pos++;
16682
16683 char *u_len_pos = strchr (id_buf_pos, '*');
16684
16685 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16686
16687 u32 id_buf_len = u_len_pos - id_buf_pos;
16688
16689 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16690
16691 u_len_pos++;
16692
16693 char *u_buf_pos = strchr (u_len_pos, '*');
16694
16695 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16696
16697 u32 u_len_len = u_buf_pos - u_len_pos;
16698
16699 u_buf_pos++;
16700
16701 char *o_len_pos = strchr (u_buf_pos, '*');
16702
16703 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16704
16705 u32 u_buf_len = o_len_pos - u_buf_pos;
16706
16707 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16708
16709 o_len_pos++;
16710
16711 char *o_buf_pos = strchr (o_len_pos, '*');
16712
16713 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16714
16715 u32 o_len_len = o_buf_pos - o_len_pos;
16716
16717 o_buf_pos++;
16718
16719 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;
16720
16721 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16722
16723 // validate data
16724
16725 const int V = atoi (V_pos);
16726 const int R = atoi (R_pos);
16727 const int P = atoi (P_pos);
16728
16729 int vr_ok = 0;
16730
16731 if ((V == 2) && (R == 3)) vr_ok = 1;
16732 if ((V == 4) && (R == 4)) vr_ok = 1;
16733
16734 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16735
16736 const int id_len = atoi (id_len_pos);
16737 const int u_len = atoi (u_len_pos);
16738 const int o_len = atoi (o_len_pos);
16739
16740 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16741
16742 if (u_len != 32) return (PARSER_SALT_VALUE);
16743 if (o_len != 32) return (PARSER_SALT_VALUE);
16744
16745 const int bits = atoi (bits_pos);
16746
16747 if (bits != 128) return (PARSER_SALT_VALUE);
16748
16749 int enc_md = 1;
16750
16751 if (R >= 4)
16752 {
16753 enc_md = atoi (enc_md_pos);
16754 }
16755
16756 // copy data to esalt
16757
16758 pdf->V = V;
16759 pdf->R = R;
16760 pdf->P = P;
16761
16762 pdf->enc_md = enc_md;
16763
16764 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16765 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16766 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16767 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16768
16769 if (id_len == 32)
16770 {
16771 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16772 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16773 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16774 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16775 }
16776
16777 pdf->id_len = id_len;
16778
16779 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16780 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16781 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16782 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16783 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16784 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16785 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16786 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16787 pdf->u_len = u_len;
16788
16789 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16790 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16791 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16792 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16793 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16794 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16795 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16796 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16797 pdf->o_len = o_len;
16798
16799 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16800 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16801 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16802 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16803
16804 if (id_len == 32)
16805 {
16806 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16807 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16808 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16809 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16810 }
16811
16812 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16813 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16814 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16815 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16816 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16817 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16818 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16819 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16820
16821 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16822 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16823 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16824 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16825 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16826 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16827 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16828 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16829
16830 // precompute rc4 data for later use
16831
16832 uint padding[8] =
16833 {
16834 0x5e4ebf28,
16835 0x418a754e,
16836 0x564e0064,
16837 0x0801faff,
16838 0xb6002e2e,
16839 0x803e68d0,
16840 0xfea90c2f,
16841 0x7a695364
16842 };
16843
16844 // md5
16845
16846 uint salt_pc_block[32];
16847
16848 char *salt_pc_ptr = (char *) salt_pc_block;
16849
16850 memcpy (salt_pc_ptr, padding, 32);
16851 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16852
16853 uint salt_pc_digest[4];
16854
16855 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16856
16857 pdf->rc4data[0] = salt_pc_digest[0];
16858 pdf->rc4data[1] = salt_pc_digest[1];
16859
16860 // we use ID for salt, maybe needs to change, we will see...
16861
16862 salt->salt_buf[0] = pdf->id_buf[0];
16863 salt->salt_buf[1] = pdf->id_buf[1];
16864 salt->salt_buf[2] = pdf->id_buf[2];
16865 salt->salt_buf[3] = pdf->id_buf[3];
16866 salt->salt_buf[4] = pdf->u_buf[0];
16867 salt->salt_buf[5] = pdf->u_buf[1];
16868 salt->salt_buf[6] = pdf->o_buf[0];
16869 salt->salt_buf[7] = pdf->o_buf[1];
16870 salt->salt_len = pdf->id_len + 16;
16871
16872 salt->salt_iter = ROUNDS_PDF14;
16873
16874 digest[0] = pdf->u_buf[0];
16875 digest[1] = pdf->u_buf[1];
16876 digest[2] = 0;
16877 digest[3] = 0;
16878
16879 return (PARSER_OK);
16880 }
16881
16882 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16883 {
16884 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16885
16886 if (ret != PARSER_OK)
16887 {
16888 return ret;
16889 }
16890
16891 u32 *digest = (u32 *) hash_buf->digest;
16892
16893 salt_t *salt = hash_buf->salt;
16894
16895 digest[0] -= SHA256M_A;
16896 digest[1] -= SHA256M_B;
16897 digest[2] -= SHA256M_C;
16898 digest[3] -= SHA256M_D;
16899 digest[4] -= SHA256M_E;
16900 digest[5] -= SHA256M_F;
16901 digest[6] -= SHA256M_G;
16902 digest[7] -= SHA256M_H;
16903
16904 salt->salt_buf[2] = 0x80;
16905
16906 return (PARSER_OK);
16907 }
16908
16909 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16910 {
16911 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16912
16913 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16914
16915 u32 *digest = (u32 *) hash_buf->digest;
16916
16917 salt_t *salt = hash_buf->salt;
16918
16919 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16920
16921 /**
16922 * parse line
16923 */
16924
16925 char *V_pos = input_buf + 5;
16926
16927 char *R_pos = strchr (V_pos, '*');
16928
16929 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16930
16931 u32 V_len = R_pos - V_pos;
16932
16933 R_pos++;
16934
16935 char *bits_pos = strchr (R_pos, '*');
16936
16937 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16938
16939 u32 R_len = bits_pos - R_pos;
16940
16941 bits_pos++;
16942
16943 char *P_pos = strchr (bits_pos, '*');
16944
16945 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16946
16947 u32 bits_len = P_pos - bits_pos;
16948
16949 P_pos++;
16950
16951 char *enc_md_pos = strchr (P_pos, '*');
16952
16953 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16954
16955 u32 P_len = enc_md_pos - P_pos;
16956
16957 enc_md_pos++;
16958
16959 char *id_len_pos = strchr (enc_md_pos, '*');
16960
16961 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16962
16963 u32 enc_md_len = id_len_pos - enc_md_pos;
16964
16965 id_len_pos++;
16966
16967 char *id_buf_pos = strchr (id_len_pos, '*');
16968
16969 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16970
16971 u32 id_len_len = id_buf_pos - id_len_pos;
16972
16973 id_buf_pos++;
16974
16975 char *u_len_pos = strchr (id_buf_pos, '*');
16976
16977 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16978
16979 u32 id_buf_len = u_len_pos - id_buf_pos;
16980
16981 u_len_pos++;
16982
16983 char *u_buf_pos = strchr (u_len_pos, '*');
16984
16985 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16986
16987 u32 u_len_len = u_buf_pos - u_len_pos;
16988
16989 u_buf_pos++;
16990
16991 char *o_len_pos = strchr (u_buf_pos, '*');
16992
16993 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16994
16995 u32 u_buf_len = o_len_pos - u_buf_pos;
16996
16997 o_len_pos++;
16998
16999 char *o_buf_pos = strchr (o_len_pos, '*');
17000
17001 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17002
17003 u32 o_len_len = o_buf_pos - o_len_pos;
17004
17005 o_buf_pos++;
17006
17007 char *last = strchr (o_buf_pos, '*');
17008
17009 if (last == NULL) last = input_buf + input_len;
17010
17011 u32 o_buf_len = last - o_buf_pos;
17012
17013 // validate data
17014
17015 const int V = atoi (V_pos);
17016 const int R = atoi (R_pos);
17017
17018 int vr_ok = 0;
17019
17020 if ((V == 5) && (R == 5)) vr_ok = 1;
17021 if ((V == 5) && (R == 6)) vr_ok = 1;
17022
17023 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17024
17025 const int bits = atoi (bits_pos);
17026
17027 if (bits != 256) return (PARSER_SALT_VALUE);
17028
17029 int enc_md = atoi (enc_md_pos);
17030
17031 if (enc_md != 1) return (PARSER_SALT_VALUE);
17032
17033 const uint id_len = atoi (id_len_pos);
17034 const uint u_len = atoi (u_len_pos);
17035 const uint o_len = atoi (o_len_pos);
17036
17037 if (V_len > 6) return (PARSER_SALT_LENGTH);
17038 if (R_len > 6) return (PARSER_SALT_LENGTH);
17039 if (P_len > 6) return (PARSER_SALT_LENGTH);
17040 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17041 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17042 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17043 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17044 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17045
17046 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17047 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17048 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17049
17050 // copy data to esalt
17051
17052 if (u_len < 40) return (PARSER_SALT_VALUE);
17053
17054 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17055 {
17056 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17057 }
17058
17059 salt->salt_buf[0] = pdf->u_buf[8];
17060 salt->salt_buf[1] = pdf->u_buf[9];
17061
17062 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17063 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17064
17065 salt->salt_len = 8;
17066 salt->salt_iter = ROUNDS_PDF17L8;
17067
17068 digest[0] = pdf->u_buf[0];
17069 digest[1] = pdf->u_buf[1];
17070 digest[2] = pdf->u_buf[2];
17071 digest[3] = pdf->u_buf[3];
17072 digest[4] = pdf->u_buf[4];
17073 digest[5] = pdf->u_buf[5];
17074 digest[6] = pdf->u_buf[6];
17075 digest[7] = pdf->u_buf[7];
17076
17077 return (PARSER_OK);
17078 }
17079
17080 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17081 {
17082 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17083
17084 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17085
17086 u32 *digest = (u32 *) hash_buf->digest;
17087
17088 salt_t *salt = hash_buf->salt;
17089
17090 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17091
17092 /**
17093 * parse line
17094 */
17095
17096 // iterations
17097
17098 char *iter_pos = input_buf + 7;
17099
17100 u32 iter = atoi (iter_pos);
17101
17102 if (iter < 1) return (PARSER_SALT_ITERATION);
17103 if (iter > 999999) return (PARSER_SALT_ITERATION);
17104
17105 // first is *raw* salt
17106
17107 char *salt_pos = strchr (iter_pos, ':');
17108
17109 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17110
17111 salt_pos++;
17112
17113 char *hash_pos = strchr (salt_pos, ':');
17114
17115 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17116
17117 u32 salt_len = hash_pos - salt_pos;
17118
17119 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17120
17121 hash_pos++;
17122
17123 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17124
17125 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17126
17127 // decode salt
17128
17129 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17130
17131 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17132
17133 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17134
17135 salt_buf_ptr[salt_len + 3] = 0x01;
17136 salt_buf_ptr[salt_len + 4] = 0x80;
17137
17138 salt->salt_len = salt_len;
17139 salt->salt_iter = iter - 1;
17140
17141 // decode hash
17142
17143 u8 tmp_buf[100];
17144
17145 memset (tmp_buf, 0, sizeof (tmp_buf));
17146
17147 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17148
17149 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17150
17151 memcpy (digest, tmp_buf, 16);
17152
17153 digest[0] = byte_swap_32 (digest[0]);
17154 digest[1] = byte_swap_32 (digest[1]);
17155 digest[2] = byte_swap_32 (digest[2]);
17156 digest[3] = byte_swap_32 (digest[3]);
17157
17158 // add some stuff to normal salt to make sorted happy
17159
17160 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17161 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17162 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17163 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17164 salt->salt_buf[4] = salt->salt_iter;
17165
17166 return (PARSER_OK);
17167 }
17168
17169 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17170 {
17171 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17172
17173 u32 *digest = (u32 *) hash_buf->digest;
17174
17175 salt_t *salt = hash_buf->salt;
17176
17177 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17178 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17179 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17180 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17181
17182 digest[0] = byte_swap_32 (digest[0]);
17183 digest[1] = byte_swap_32 (digest[1]);
17184 digest[2] = byte_swap_32 (digest[2]);
17185 digest[3] = byte_swap_32 (digest[3]);
17186
17187 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17188
17189 uint salt_len = input_len - 32 - 1;
17190
17191 char *salt_buf = input_buf + 32 + 1;
17192
17193 char *salt_buf_ptr = (char *) salt->salt_buf;
17194
17195 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17196
17197 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17198
17199 salt->salt_len = salt_len;
17200
17201 return (PARSER_OK);
17202 }
17203
17204 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17205 {
17206 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17207
17208 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17209
17210 u32 *digest = (u32 *) hash_buf->digest;
17211
17212 salt_t *salt = hash_buf->salt;
17213
17214 char *user_pos = input_buf + 10;
17215
17216 char *salt_pos = strchr (user_pos, '*');
17217
17218 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17219
17220 salt_pos++;
17221
17222 char *hash_pos = strchr (salt_pos, '*');
17223
17224 hash_pos++;
17225
17226 uint hash_len = input_len - (hash_pos - input_buf);
17227
17228 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17229
17230 uint user_len = salt_pos - user_pos - 1;
17231
17232 uint salt_len = hash_pos - salt_pos - 1;
17233
17234 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17235
17236 /*
17237 * store digest
17238 */
17239
17240 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17241 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17242 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17243 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17244
17245 digest[0] = byte_swap_32 (digest[0]);
17246 digest[1] = byte_swap_32 (digest[1]);
17247 digest[2] = byte_swap_32 (digest[2]);
17248 digest[3] = byte_swap_32 (digest[3]);
17249
17250 digest[0] -= MD5M_A;
17251 digest[1] -= MD5M_B;
17252 digest[2] -= MD5M_C;
17253 digest[3] -= MD5M_D;
17254
17255 /*
17256 * store salt
17257 */
17258
17259 char *salt_buf_ptr = (char *) salt->salt_buf;
17260
17261 // first 4 bytes are the "challenge"
17262
17263 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17264 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17265 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17266 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17267
17268 // append the user name
17269
17270 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17271
17272 salt->salt_len = 4 + user_len;
17273
17274 return (PARSER_OK);
17275 }
17276
17277 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17278 {
17279 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17280
17281 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17282
17283 u32 *digest = (u32 *) hash_buf->digest;
17284
17285 salt_t *salt = hash_buf->salt;
17286
17287 char *salt_pos = input_buf + 9;
17288
17289 char *hash_pos = strchr (salt_pos, '*');
17290
17291 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17292
17293 hash_pos++;
17294
17295 uint hash_len = input_len - (hash_pos - input_buf);
17296
17297 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17298
17299 uint salt_len = hash_pos - salt_pos - 1;
17300
17301 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17302
17303 /*
17304 * store digest
17305 */
17306
17307 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17308 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17309 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17310 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17311 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17312
17313 /*
17314 * store salt
17315 */
17316
17317 char *salt_buf_ptr = (char *) salt->salt_buf;
17318
17319 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17320
17321 salt->salt_len = salt_len;
17322
17323 return (PARSER_OK);
17324 }
17325
17326 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17327 {
17328 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17329
17330 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17331
17332 u32 *digest = (u32 *) hash_buf->digest;
17333
17334 salt_t *salt = hash_buf->salt;
17335
17336 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17337
17338 /**
17339 * parse line
17340 */
17341
17342 char *cry_master_len_pos = input_buf + 9;
17343
17344 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17345
17346 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17347
17348 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17349
17350 cry_master_buf_pos++;
17351
17352 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17353
17354 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17355
17356 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17357
17358 cry_salt_len_pos++;
17359
17360 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17361
17362 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17363
17364 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17365
17366 cry_salt_buf_pos++;
17367
17368 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17369
17370 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17371
17372 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17373
17374 cry_rounds_pos++;
17375
17376 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17377
17378 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17379
17380 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17381
17382 ckey_len_pos++;
17383
17384 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17385
17386 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17387
17388 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17389
17390 ckey_buf_pos++;
17391
17392 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17393
17394 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17395
17396 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17397
17398 public_key_len_pos++;
17399
17400 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17401
17402 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17403
17404 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17405
17406 public_key_buf_pos++;
17407
17408 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;
17409
17410 const uint cry_master_len = atoi (cry_master_len_pos);
17411 const uint cry_salt_len = atoi (cry_salt_len_pos);
17412 const uint ckey_len = atoi (ckey_len_pos);
17413 const uint public_key_len = atoi (public_key_len_pos);
17414
17415 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17416 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17417 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17418 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17419
17420 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17421 {
17422 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17423
17424 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17425 }
17426
17427 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17428 {
17429 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17430
17431 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17432 }
17433
17434 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17435 {
17436 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17437
17438 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17439 }
17440
17441 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17442 bitcoin_wallet->ckey_len = ckey_len / 2;
17443 bitcoin_wallet->public_key_len = public_key_len / 2;
17444
17445 /*
17446 * store digest (should be unique enought, hopefully)
17447 */
17448
17449 digest[0] = bitcoin_wallet->cry_master_buf[0];
17450 digest[1] = bitcoin_wallet->cry_master_buf[1];
17451 digest[2] = bitcoin_wallet->cry_master_buf[2];
17452 digest[3] = bitcoin_wallet->cry_master_buf[3];
17453
17454 /*
17455 * store salt
17456 */
17457
17458 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17459
17460 const uint cry_rounds = atoi (cry_rounds_pos);
17461
17462 salt->salt_iter = cry_rounds - 1;
17463
17464 char *salt_buf_ptr = (char *) salt->salt_buf;
17465
17466 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17467
17468 salt->salt_len = salt_len;
17469
17470 return (PARSER_OK);
17471 }
17472
17473 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17474 {
17475 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17476
17477 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17478
17479 u32 *digest = (u32 *) hash_buf->digest;
17480
17481 salt_t *salt = hash_buf->salt;
17482
17483 sip_t *sip = (sip_t *) hash_buf->esalt;
17484
17485 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17486
17487 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17488
17489 memcpy (temp_input_buf, input_buf, input_len);
17490
17491 // URI_server:
17492
17493 char *URI_server_pos = temp_input_buf + 6;
17494
17495 char *URI_client_pos = strchr (URI_server_pos, '*');
17496
17497 if (URI_client_pos == NULL)
17498 {
17499 myfree (temp_input_buf);
17500
17501 return (PARSER_SEPARATOR_UNMATCHED);
17502 }
17503
17504 URI_client_pos[0] = 0;
17505 URI_client_pos++;
17506
17507 uint URI_server_len = strlen (URI_server_pos);
17508
17509 if (URI_server_len > 512)
17510 {
17511 myfree (temp_input_buf);
17512
17513 return (PARSER_SALT_LENGTH);
17514 }
17515
17516 // URI_client:
17517
17518 char *user_pos = strchr (URI_client_pos, '*');
17519
17520 if (user_pos == NULL)
17521 {
17522 myfree (temp_input_buf);
17523
17524 return (PARSER_SEPARATOR_UNMATCHED);
17525 }
17526
17527 user_pos[0] = 0;
17528 user_pos++;
17529
17530 uint URI_client_len = strlen (URI_client_pos);
17531
17532 if (URI_client_len > 512)
17533 {
17534 myfree (temp_input_buf);
17535
17536 return (PARSER_SALT_LENGTH);
17537 }
17538
17539 // user:
17540
17541 char *realm_pos = strchr (user_pos, '*');
17542
17543 if (realm_pos == NULL)
17544 {
17545 myfree (temp_input_buf);
17546
17547 return (PARSER_SEPARATOR_UNMATCHED);
17548 }
17549
17550 realm_pos[0] = 0;
17551 realm_pos++;
17552
17553 uint user_len = strlen (user_pos);
17554
17555 if (user_len > 116)
17556 {
17557 myfree (temp_input_buf);
17558
17559 return (PARSER_SALT_LENGTH);
17560 }
17561
17562 // realm:
17563
17564 char *method_pos = strchr (realm_pos, '*');
17565
17566 if (method_pos == NULL)
17567 {
17568 myfree (temp_input_buf);
17569
17570 return (PARSER_SEPARATOR_UNMATCHED);
17571 }
17572
17573 method_pos[0] = 0;
17574 method_pos++;
17575
17576 uint realm_len = strlen (realm_pos);
17577
17578 if (realm_len > 116)
17579 {
17580 myfree (temp_input_buf);
17581
17582 return (PARSER_SALT_LENGTH);
17583 }
17584
17585 // method:
17586
17587 char *URI_prefix_pos = strchr (method_pos, '*');
17588
17589 if (URI_prefix_pos == NULL)
17590 {
17591 myfree (temp_input_buf);
17592
17593 return (PARSER_SEPARATOR_UNMATCHED);
17594 }
17595
17596 URI_prefix_pos[0] = 0;
17597 URI_prefix_pos++;
17598
17599 uint method_len = strlen (method_pos);
17600
17601 if (method_len > 246)
17602 {
17603 myfree (temp_input_buf);
17604
17605 return (PARSER_SALT_LENGTH);
17606 }
17607
17608 // URI_prefix:
17609
17610 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17611
17612 if (URI_resource_pos == NULL)
17613 {
17614 myfree (temp_input_buf);
17615
17616 return (PARSER_SEPARATOR_UNMATCHED);
17617 }
17618
17619 URI_resource_pos[0] = 0;
17620 URI_resource_pos++;
17621
17622 uint URI_prefix_len = strlen (URI_prefix_pos);
17623
17624 if (URI_prefix_len > 245)
17625 {
17626 myfree (temp_input_buf);
17627
17628 return (PARSER_SALT_LENGTH);
17629 }
17630
17631 // URI_resource:
17632
17633 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17634
17635 if (URI_suffix_pos == NULL)
17636 {
17637 myfree (temp_input_buf);
17638
17639 return (PARSER_SEPARATOR_UNMATCHED);
17640 }
17641
17642 URI_suffix_pos[0] = 0;
17643 URI_suffix_pos++;
17644
17645 uint URI_resource_len = strlen (URI_resource_pos);
17646
17647 if (URI_resource_len < 1 || URI_resource_len > 246)
17648 {
17649 myfree (temp_input_buf);
17650
17651 return (PARSER_SALT_LENGTH);
17652 }
17653
17654 // URI_suffix:
17655
17656 char *nonce_pos = strchr (URI_suffix_pos, '*');
17657
17658 if (nonce_pos == NULL)
17659 {
17660 myfree (temp_input_buf);
17661
17662 return (PARSER_SEPARATOR_UNMATCHED);
17663 }
17664
17665 nonce_pos[0] = 0;
17666 nonce_pos++;
17667
17668 uint URI_suffix_len = strlen (URI_suffix_pos);
17669
17670 if (URI_suffix_len > 245)
17671 {
17672 myfree (temp_input_buf);
17673
17674 return (PARSER_SALT_LENGTH);
17675 }
17676
17677 // nonce:
17678
17679 char *nonce_client_pos = strchr (nonce_pos, '*');
17680
17681 if (nonce_client_pos == NULL)
17682 {
17683 myfree (temp_input_buf);
17684
17685 return (PARSER_SEPARATOR_UNMATCHED);
17686 }
17687
17688 nonce_client_pos[0] = 0;
17689 nonce_client_pos++;
17690
17691 uint nonce_len = strlen (nonce_pos);
17692
17693 if (nonce_len < 1 || nonce_len > 50)
17694 {
17695 myfree (temp_input_buf);
17696
17697 return (PARSER_SALT_LENGTH);
17698 }
17699
17700 // nonce_client:
17701
17702 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17703
17704 if (nonce_count_pos == NULL)
17705 {
17706 myfree (temp_input_buf);
17707
17708 return (PARSER_SEPARATOR_UNMATCHED);
17709 }
17710
17711 nonce_count_pos[0] = 0;
17712 nonce_count_pos++;
17713
17714 uint nonce_client_len = strlen (nonce_client_pos);
17715
17716 if (nonce_client_len > 50)
17717 {
17718 myfree (temp_input_buf);
17719
17720 return (PARSER_SALT_LENGTH);
17721 }
17722
17723 // nonce_count:
17724
17725 char *qop_pos = strchr (nonce_count_pos, '*');
17726
17727 if (qop_pos == NULL)
17728 {
17729 myfree (temp_input_buf);
17730
17731 return (PARSER_SEPARATOR_UNMATCHED);
17732 }
17733
17734 qop_pos[0] = 0;
17735 qop_pos++;
17736
17737 uint nonce_count_len = strlen (nonce_count_pos);
17738
17739 if (nonce_count_len > 50)
17740 {
17741 myfree (temp_input_buf);
17742
17743 return (PARSER_SALT_LENGTH);
17744 }
17745
17746 // qop:
17747
17748 char *directive_pos = strchr (qop_pos, '*');
17749
17750 if (directive_pos == NULL)
17751 {
17752 myfree (temp_input_buf);
17753
17754 return (PARSER_SEPARATOR_UNMATCHED);
17755 }
17756
17757 directive_pos[0] = 0;
17758 directive_pos++;
17759
17760 uint qop_len = strlen (qop_pos);
17761
17762 if (qop_len > 50)
17763 {
17764 myfree (temp_input_buf);
17765
17766 return (PARSER_SALT_LENGTH);
17767 }
17768
17769 // directive
17770
17771 char *digest_pos = strchr (directive_pos, '*');
17772
17773 if (digest_pos == NULL)
17774 {
17775 myfree (temp_input_buf);
17776
17777 return (PARSER_SEPARATOR_UNMATCHED);
17778 }
17779
17780 digest_pos[0] = 0;
17781 digest_pos++;
17782
17783 uint directive_len = strlen (directive_pos);
17784
17785 if (directive_len != 3)
17786 {
17787 myfree (temp_input_buf);
17788
17789 return (PARSER_SALT_LENGTH);
17790 }
17791
17792 if (memcmp (directive_pos, "MD5", 3))
17793 {
17794 log_info ("ERROR: only the MD5 directive is currently supported\n");
17795
17796 myfree (temp_input_buf);
17797
17798 return (PARSER_SIP_AUTH_DIRECTIVE);
17799 }
17800
17801 /*
17802 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17803 */
17804
17805 uint md5_len = 0;
17806
17807 uint md5_max_len = 4 * 64;
17808
17809 uint md5_remaining_len = md5_max_len;
17810
17811 uint tmp_md5_buf[64] = { 0 };
17812
17813 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17814
17815 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17816
17817 md5_len += method_len + 1;
17818 tmp_md5_ptr += method_len + 1;
17819
17820 if (URI_prefix_len > 0)
17821 {
17822 md5_remaining_len = md5_max_len - md5_len;
17823
17824 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17825
17826 md5_len += URI_prefix_len + 1;
17827 tmp_md5_ptr += URI_prefix_len + 1;
17828 }
17829
17830 md5_remaining_len = md5_max_len - md5_len;
17831
17832 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17833
17834 md5_len += URI_resource_len;
17835 tmp_md5_ptr += URI_resource_len;
17836
17837 if (URI_suffix_len > 0)
17838 {
17839 md5_remaining_len = md5_max_len - md5_len;
17840
17841 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17842
17843 md5_len += 1 + URI_suffix_len;
17844 }
17845
17846 uint tmp_digest[4] = { 0 };
17847
17848 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17849
17850 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17851 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17852 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17853 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17854
17855 /*
17856 * esalt
17857 */
17858
17859 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17860
17861 uint esalt_len = 0;
17862
17863 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17864
17865 // there are 2 possibilities for the esalt:
17866
17867 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17868 {
17869 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17870
17871 if (esalt_len > max_esalt_len)
17872 {
17873 myfree (temp_input_buf);
17874
17875 return (PARSER_SALT_LENGTH);
17876 }
17877
17878 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17879 nonce_pos,
17880 nonce_count_pos,
17881 nonce_client_pos,
17882 qop_pos,
17883 tmp_digest[0],
17884 tmp_digest[1],
17885 tmp_digest[2],
17886 tmp_digest[3]);
17887 }
17888 else
17889 {
17890 esalt_len = 1 + nonce_len + 1 + 32;
17891
17892 if (esalt_len > max_esalt_len)
17893 {
17894 myfree (temp_input_buf);
17895
17896 return (PARSER_SALT_LENGTH);
17897 }
17898
17899 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17900 nonce_pos,
17901 tmp_digest[0],
17902 tmp_digest[1],
17903 tmp_digest[2],
17904 tmp_digest[3]);
17905 }
17906
17907 // add 0x80 to esalt
17908
17909 esalt_buf_ptr[esalt_len] = 0x80;
17910
17911 sip->esalt_len = esalt_len;
17912
17913 /*
17914 * actual salt
17915 */
17916
17917 char *sip_salt_ptr = (char *) sip->salt_buf;
17918
17919 uint salt_len = user_len + 1 + realm_len + 1;
17920
17921 uint max_salt_len = 119;
17922
17923 if (salt_len > max_salt_len)
17924 {
17925 myfree (temp_input_buf);
17926
17927 return (PARSER_SALT_LENGTH);
17928 }
17929
17930 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17931
17932 sip->salt_len = salt_len;
17933
17934 /*
17935 * fake salt (for sorting)
17936 */
17937
17938 char *salt_buf_ptr = (char *) salt->salt_buf;
17939
17940 max_salt_len = 55;
17941
17942 uint fake_salt_len = salt_len;
17943
17944 if (fake_salt_len > max_salt_len)
17945 {
17946 fake_salt_len = max_salt_len;
17947 }
17948
17949 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17950
17951 salt->salt_len = fake_salt_len;
17952
17953 /*
17954 * digest
17955 */
17956
17957 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
17958 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
17959 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
17960 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
17961
17962 digest[0] = byte_swap_32 (digest[0]);
17963 digest[1] = byte_swap_32 (digest[1]);
17964 digest[2] = byte_swap_32 (digest[2]);
17965 digest[3] = byte_swap_32 (digest[3]);
17966
17967 myfree (temp_input_buf);
17968
17969 return (PARSER_OK);
17970 }
17971
17972 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17973 {
17974 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17975
17976 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17977
17978 u32 *digest = (u32 *) hash_buf->digest;
17979
17980 salt_t *salt = hash_buf->salt;
17981
17982 // digest
17983
17984 char *digest_pos = input_buf;
17985
17986 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
17987 digest[1] = 0;
17988 digest[2] = 0;
17989 digest[3] = 0;
17990
17991 // salt
17992
17993 char *salt_buf = input_buf + 8 + 1;
17994
17995 uint salt_len = 8;
17996
17997 char *salt_buf_ptr = (char *) salt->salt_buf;
17998
17999 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18000
18001 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18002
18003 salt->salt_len = salt_len;
18004
18005 return (PARSER_OK);
18006 }
18007
18008 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18009 {
18010 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18011
18012 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18013
18014 u32 *digest = (u32 *) hash_buf->digest;
18015
18016 salt_t *salt = hash_buf->salt;
18017
18018 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18019
18020 /**
18021 * parse line
18022 */
18023
18024 char *p_buf_pos = input_buf + 4;
18025
18026 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18027
18028 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18029
18030 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18031
18032 NumCyclesPower_pos++;
18033
18034 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18035
18036 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18037
18038 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18039
18040 salt_len_pos++;
18041
18042 char *salt_buf_pos = strchr (salt_len_pos, '$');
18043
18044 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18045
18046 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18047
18048 salt_buf_pos++;
18049
18050 char *iv_len_pos = strchr (salt_buf_pos, '$');
18051
18052 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18053
18054 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18055
18056 iv_len_pos++;
18057
18058 char *iv_buf_pos = strchr (iv_len_pos, '$');
18059
18060 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18061
18062 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18063
18064 iv_buf_pos++;
18065
18066 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18067
18068 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18069
18070 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18071
18072 crc_buf_pos++;
18073
18074 char *data_len_pos = strchr (crc_buf_pos, '$');
18075
18076 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18077
18078 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18079
18080 data_len_pos++;
18081
18082 char *unpack_size_pos = strchr (data_len_pos, '$');
18083
18084 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18085
18086 u32 data_len_len = unpack_size_pos - data_len_pos;
18087
18088 unpack_size_pos++;
18089
18090 char *data_buf_pos = strchr (unpack_size_pos, '$');
18091
18092 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18093
18094 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18095
18096 data_buf_pos++;
18097
18098 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;
18099
18100 const uint iter = atoi (NumCyclesPower_pos);
18101 const uint crc = atoi (crc_buf_pos);
18102 const uint p_buf = atoi (p_buf_pos);
18103 const uint salt_len = atoi (salt_len_pos);
18104 const uint iv_len = atoi (iv_len_pos);
18105 const uint unpack_size = atoi (unpack_size_pos);
18106 const uint data_len = atoi (data_len_pos);
18107
18108 /**
18109 * verify some data
18110 */
18111
18112 if (p_buf != 0) return (PARSER_SALT_VALUE);
18113 if (salt_len != 0) return (PARSER_SALT_VALUE);
18114
18115 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18116
18117 if (data_len > 384) return (PARSER_SALT_VALUE);
18118
18119 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18120
18121 /**
18122 * store data
18123 */
18124
18125 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18126 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18127 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18128 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18129
18130 seven_zip->iv_len = iv_len;
18131
18132 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18133
18134 seven_zip->salt_len = 0;
18135
18136 seven_zip->crc = crc;
18137
18138 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18139 {
18140 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18141
18142 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18143 }
18144
18145 seven_zip->data_len = data_len;
18146
18147 seven_zip->unpack_size = unpack_size;
18148
18149 // real salt
18150
18151 salt->salt_buf[0] = seven_zip->data_buf[0];
18152 salt->salt_buf[1] = seven_zip->data_buf[1];
18153 salt->salt_buf[2] = seven_zip->data_buf[2];
18154 salt->salt_buf[3] = seven_zip->data_buf[3];
18155
18156 salt->salt_len = 16;
18157
18158 salt->salt_sign[0] = iter;
18159
18160 salt->salt_iter = 1 << iter;
18161
18162 /**
18163 * digest
18164 */
18165
18166 digest[0] = crc;
18167 digest[1] = 0;
18168 digest[2] = 0;
18169 digest[3] = 0;
18170
18171 return (PARSER_OK);
18172 }
18173
18174 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18175 {
18176 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18177
18178 u32 *digest = (u32 *) hash_buf->digest;
18179
18180 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18181 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18182 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18183 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18184 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18185 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18186 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18187 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18188
18189 digest[0] = byte_swap_32 (digest[0]);
18190 digest[1] = byte_swap_32 (digest[1]);
18191 digest[2] = byte_swap_32 (digest[2]);
18192 digest[3] = byte_swap_32 (digest[3]);
18193 digest[4] = byte_swap_32 (digest[4]);
18194 digest[5] = byte_swap_32 (digest[5]);
18195 digest[6] = byte_swap_32 (digest[6]);
18196 digest[7] = byte_swap_32 (digest[7]);
18197
18198 return (PARSER_OK);
18199 }
18200
18201 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18202 {
18203 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18204
18205 u32 *digest = (u32 *) hash_buf->digest;
18206
18207 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18208 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18209 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18210 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18211 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18212 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18213 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18214 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18215 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18216 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18217 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18218 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18219 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18220 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18221 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18222 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18223
18224 digest[ 0] = byte_swap_32 (digest[ 0]);
18225 digest[ 1] = byte_swap_32 (digest[ 1]);
18226 digest[ 2] = byte_swap_32 (digest[ 2]);
18227 digest[ 3] = byte_swap_32 (digest[ 3]);
18228 digest[ 4] = byte_swap_32 (digest[ 4]);
18229 digest[ 5] = byte_swap_32 (digest[ 5]);
18230 digest[ 6] = byte_swap_32 (digest[ 6]);
18231 digest[ 7] = byte_swap_32 (digest[ 7]);
18232 digest[ 8] = byte_swap_32 (digest[ 8]);
18233 digest[ 9] = byte_swap_32 (digest[ 9]);
18234 digest[10] = byte_swap_32 (digest[10]);
18235 digest[11] = byte_swap_32 (digest[11]);
18236 digest[12] = byte_swap_32 (digest[12]);
18237 digest[13] = byte_swap_32 (digest[13]);
18238 digest[14] = byte_swap_32 (digest[14]);
18239 digest[15] = byte_swap_32 (digest[15]);
18240
18241 return (PARSER_OK);
18242 }
18243
18244 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18245 {
18246 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18247
18248 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18249
18250 u32 *digest = (u32 *) hash_buf->digest;
18251
18252 salt_t *salt = hash_buf->salt;
18253
18254 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18255
18256 /**
18257 * parse line
18258 */
18259
18260 // iterations
18261
18262 char *iter_pos = input_buf + 4;
18263
18264 u32 iter = atoi (iter_pos);
18265
18266 if (iter < 1) return (PARSER_SALT_ITERATION);
18267 if (iter > 999999) return (PARSER_SALT_ITERATION);
18268
18269 // first is *raw* salt
18270
18271 char *salt_pos = strchr (iter_pos, ':');
18272
18273 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18274
18275 salt_pos++;
18276
18277 char *hash_pos = strchr (salt_pos, ':');
18278
18279 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18280
18281 u32 salt_len = hash_pos - salt_pos;
18282
18283 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18284
18285 hash_pos++;
18286
18287 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18288
18289 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18290
18291 // decode salt
18292
18293 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18294
18295 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18296
18297 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18298
18299 salt_buf_ptr[salt_len + 3] = 0x01;
18300 salt_buf_ptr[salt_len + 4] = 0x80;
18301
18302 salt->salt_len = salt_len;
18303 salt->salt_iter = iter - 1;
18304
18305 // decode hash
18306
18307 u8 tmp_buf[100];
18308
18309 memset (tmp_buf, 0, sizeof (tmp_buf));
18310
18311 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18312
18313 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18314
18315 memcpy (digest, tmp_buf, 16);
18316
18317 // add some stuff to normal salt to make sorted happy
18318
18319 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18320 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18321 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18322 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18323 salt->salt_buf[4] = salt->salt_iter;
18324
18325 return (PARSER_OK);
18326 }
18327
18328 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18329 {
18330 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18331
18332 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18333
18334 u32 *digest = (u32 *) hash_buf->digest;
18335
18336 salt_t *salt = hash_buf->salt;
18337
18338 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18339
18340 /**
18341 * parse line
18342 */
18343
18344 // iterations
18345
18346 char *iter_pos = input_buf + 5;
18347
18348 u32 iter = atoi (iter_pos);
18349
18350 if (iter < 1) return (PARSER_SALT_ITERATION);
18351 if (iter > 999999) return (PARSER_SALT_ITERATION);
18352
18353 // first is *raw* salt
18354
18355 char *salt_pos = strchr (iter_pos, ':');
18356
18357 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18358
18359 salt_pos++;
18360
18361 char *hash_pos = strchr (salt_pos, ':');
18362
18363 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18364
18365 u32 salt_len = hash_pos - salt_pos;
18366
18367 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18368
18369 hash_pos++;
18370
18371 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18372
18373 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18374
18375 // decode salt
18376
18377 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18378
18379 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18380
18381 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18382
18383 salt_buf_ptr[salt_len + 3] = 0x01;
18384 salt_buf_ptr[salt_len + 4] = 0x80;
18385
18386 salt->salt_len = salt_len;
18387 salt->salt_iter = iter - 1;
18388
18389 // decode hash
18390
18391 u8 tmp_buf[100];
18392
18393 memset (tmp_buf, 0, sizeof (tmp_buf));
18394
18395 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18396
18397 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18398
18399 memcpy (digest, tmp_buf, 16);
18400
18401 digest[0] = byte_swap_32 (digest[0]);
18402 digest[1] = byte_swap_32 (digest[1]);
18403 digest[2] = byte_swap_32 (digest[2]);
18404 digest[3] = byte_swap_32 (digest[3]);
18405
18406 // add some stuff to normal salt to make sorted happy
18407
18408 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18409 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18410 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18411 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18412 salt->salt_buf[4] = salt->salt_iter;
18413
18414 return (PARSER_OK);
18415 }
18416
18417 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18418 {
18419 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18420
18421 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18422
18423 u64 *digest = (u64 *) hash_buf->digest;
18424
18425 salt_t *salt = hash_buf->salt;
18426
18427 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18428
18429 /**
18430 * parse line
18431 */
18432
18433 // iterations
18434
18435 char *iter_pos = input_buf + 7;
18436
18437 u32 iter = atoi (iter_pos);
18438
18439 if (iter < 1) return (PARSER_SALT_ITERATION);
18440 if (iter > 999999) return (PARSER_SALT_ITERATION);
18441
18442 // first is *raw* salt
18443
18444 char *salt_pos = strchr (iter_pos, ':');
18445
18446 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18447
18448 salt_pos++;
18449
18450 char *hash_pos = strchr (salt_pos, ':');
18451
18452 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18453
18454 u32 salt_len = hash_pos - salt_pos;
18455
18456 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18457
18458 hash_pos++;
18459
18460 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18461
18462 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18463
18464 // decode salt
18465
18466 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18467
18468 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18469
18470 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18471
18472 salt_buf_ptr[salt_len + 3] = 0x01;
18473 salt_buf_ptr[salt_len + 4] = 0x80;
18474
18475 salt->salt_len = salt_len;
18476 salt->salt_iter = iter - 1;
18477
18478 // decode hash
18479
18480 u8 tmp_buf[100];
18481
18482 memset (tmp_buf, 0, sizeof (tmp_buf));
18483
18484 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18485
18486 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18487
18488 memcpy (digest, tmp_buf, 64);
18489
18490 digest[0] = byte_swap_64 (digest[0]);
18491 digest[1] = byte_swap_64 (digest[1]);
18492 digest[2] = byte_swap_64 (digest[2]);
18493 digest[3] = byte_swap_64 (digest[3]);
18494 digest[4] = byte_swap_64 (digest[4]);
18495 digest[5] = byte_swap_64 (digest[5]);
18496 digest[6] = byte_swap_64 (digest[6]);
18497 digest[7] = byte_swap_64 (digest[7]);
18498
18499 // add some stuff to normal salt to make sorted happy
18500
18501 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18502 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18503 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18504 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18505 salt->salt_buf[4] = salt->salt_iter;
18506
18507 return (PARSER_OK);
18508 }
18509
18510 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18511 {
18512 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18513
18514 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18515
18516 uint *digest = (uint *) hash_buf->digest;
18517
18518 salt_t *salt = hash_buf->salt;
18519
18520 /**
18521 * parse line
18522 */
18523
18524 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18525
18526 char *hash_pos = strchr (salt_pos, '$');
18527
18528 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18529
18530 u32 salt_len = hash_pos - salt_pos;
18531
18532 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18533
18534 hash_pos++;
18535
18536 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18537
18538 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18539
18540 // decode hash
18541
18542 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18543 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18544 digest[ 2] = 0;
18545 digest[ 3] = 0;
18546 digest[ 4] = 0;
18547 digest[ 5] = 0;
18548 digest[ 6] = 0;
18549 digest[ 7] = 0;
18550 digest[ 8] = 0;
18551 digest[ 9] = 0;
18552 digest[10] = 0;
18553 digest[11] = 0;
18554 digest[12] = 0;
18555 digest[13] = 0;
18556 digest[14] = 0;
18557 digest[15] = 0;
18558
18559 // decode salt
18560
18561 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18562 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18563
18564 salt->salt_iter = ROUNDS_ECRYPTFS;
18565 salt->salt_len = 8;
18566
18567 return (PARSER_OK);
18568 }
18569
18570 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18571 {
18572 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18573
18574 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18575
18576 unsigned char c19 = itoa64_to_int (input_buf[19]);
18577
18578 if (c19 & 3) return (PARSER_HASH_VALUE);
18579
18580 salt_t *salt = hash_buf->salt;
18581
18582 u32 *digest = (u32 *) hash_buf->digest;
18583
18584 // iteration count
18585
18586 salt->salt_iter = itoa64_to_int (input_buf[1])
18587 | itoa64_to_int (input_buf[2]) << 6
18588 | itoa64_to_int (input_buf[3]) << 12
18589 | itoa64_to_int (input_buf[4]) << 18;
18590
18591 // set salt
18592
18593 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18594 | itoa64_to_int (input_buf[6]) << 6
18595 | itoa64_to_int (input_buf[7]) << 12
18596 | itoa64_to_int (input_buf[8]) << 18;
18597
18598 salt->salt_len = 4;
18599
18600 u8 tmp_buf[100];
18601
18602 memset (tmp_buf, 0, sizeof (tmp_buf));
18603
18604 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18605
18606 memcpy (digest, tmp_buf, 8);
18607
18608 uint tt;
18609
18610 IP (digest[0], digest[1], tt);
18611
18612 digest[0] = rotr32 (digest[0], 31);
18613 digest[1] = rotr32 (digest[1], 31);
18614 digest[2] = 0;
18615 digest[3] = 0;
18616
18617 return (PARSER_OK);
18618 }
18619
18620 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18621 {
18622 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18623
18624 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18625
18626 u32 *digest = (u32 *) hash_buf->digest;
18627
18628 salt_t *salt = hash_buf->salt;
18629
18630 /**
18631 * parse line
18632 */
18633
18634 char *type_pos = input_buf + 6 + 1;
18635
18636 char *salt_pos = strchr (type_pos, '*');
18637
18638 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18639
18640 u32 type_len = salt_pos - type_pos;
18641
18642 if (type_len != 1) return (PARSER_SALT_LENGTH);
18643
18644 salt_pos++;
18645
18646 char *crypted_pos = strchr (salt_pos, '*');
18647
18648 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18649
18650 u32 salt_len = crypted_pos - salt_pos;
18651
18652 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18653
18654 crypted_pos++;
18655
18656 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18657
18658 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18659
18660 /**
18661 * copy data
18662 */
18663
18664 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18665 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18666
18667 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18668 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18669
18670 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18671 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18672 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18673 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18674
18675 salt->salt_len = 24;
18676 salt->salt_iter = ROUNDS_RAR3;
18677
18678 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18679 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18680
18681 digest[0] = 0xc43d7b00;
18682 digest[1] = 0x40070000;
18683 digest[2] = 0;
18684 digest[3] = 0;
18685
18686 return (PARSER_OK);
18687 }
18688
18689 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18690 {
18691 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18692
18693 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18694
18695 u32 *digest = (u32 *) hash_buf->digest;
18696
18697 salt_t *salt = hash_buf->salt;
18698
18699 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18700
18701 /**
18702 * parse line
18703 */
18704
18705 char *param0_pos = input_buf + 1 + 4 + 1;
18706
18707 char *param1_pos = strchr (param0_pos, '$');
18708
18709 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18710
18711 u32 param0_len = param1_pos - param0_pos;
18712
18713 param1_pos++;
18714
18715 char *param2_pos = strchr (param1_pos, '$');
18716
18717 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18718
18719 u32 param1_len = param2_pos - param1_pos;
18720
18721 param2_pos++;
18722
18723 char *param3_pos = strchr (param2_pos, '$');
18724
18725 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18726
18727 u32 param2_len = param3_pos - param2_pos;
18728
18729 param3_pos++;
18730
18731 char *param4_pos = strchr (param3_pos, '$');
18732
18733 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18734
18735 u32 param3_len = param4_pos - param3_pos;
18736
18737 param4_pos++;
18738
18739 char *param5_pos = strchr (param4_pos, '$');
18740
18741 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18742
18743 u32 param4_len = param5_pos - param4_pos;
18744
18745 param5_pos++;
18746
18747 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18748
18749 char *salt_buf = param1_pos;
18750 char *iv = param3_pos;
18751 char *pswcheck = param5_pos;
18752
18753 const uint salt_len = atoi (param0_pos);
18754 const uint iterations = atoi (param2_pos);
18755 const uint pswcheck_len = atoi (param4_pos);
18756
18757 /**
18758 * verify some data
18759 */
18760
18761 if (param1_len != 32) return (PARSER_SALT_VALUE);
18762 if (param3_len != 32) return (PARSER_SALT_VALUE);
18763 if (param5_len != 16) return (PARSER_SALT_VALUE);
18764
18765 if (salt_len != 16) return (PARSER_SALT_VALUE);
18766 if (iterations == 0) return (PARSER_SALT_VALUE);
18767 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18768
18769 /**
18770 * store data
18771 */
18772
18773 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18774 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18775 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18776 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18777
18778 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18779 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18780 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18781 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18782
18783 salt->salt_len = 16;
18784
18785 salt->salt_sign[0] = iterations;
18786
18787 salt->salt_iter = ((1 << iterations) + 32) - 1;
18788
18789 /**
18790 * digest buf
18791 */
18792
18793 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18794 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18795 digest[2] = 0;
18796 digest[3] = 0;
18797
18798 return (PARSER_OK);
18799 }
18800
18801 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18802 {
18803 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18804
18805 u32 *digest = (u32 *) hash_buf->digest;
18806
18807 salt_t *salt = hash_buf->salt;
18808
18809 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18810 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18811 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18812 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18813 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18814 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18815 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18816 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18817
18818 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18819
18820 uint salt_len = input_len - 64 - 1;
18821
18822 char *salt_buf = input_buf + 64 + 1;
18823
18824 char *salt_buf_ptr = (char *) salt->salt_buf;
18825
18826 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18827
18828 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18829
18830 salt->salt_len = salt_len;
18831
18832 /**
18833 * we can precompute the first sha256 transform
18834 */
18835
18836 uint w[16];
18837
18838 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18839 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18840 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18841 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18842 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18843 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18844 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18845 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18846 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18847 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18848 w[10] = byte_swap_32 (salt->salt_buf[10]);
18849 w[11] = byte_swap_32 (salt->salt_buf[11]);
18850 w[12] = byte_swap_32 (salt->salt_buf[12]);
18851 w[13] = byte_swap_32 (salt->salt_buf[13]);
18852 w[14] = byte_swap_32 (salt->salt_buf[14]);
18853 w[15] = byte_swap_32 (salt->salt_buf[15]);
18854
18855 uint pc256[8];
18856
18857 pc256[0] = SHA256M_A;
18858 pc256[1] = SHA256M_B;
18859 pc256[2] = SHA256M_C;
18860 pc256[3] = SHA256M_D;
18861 pc256[4] = SHA256M_E;
18862 pc256[5] = SHA256M_F;
18863 pc256[6] = SHA256M_G;
18864 pc256[7] = SHA256M_H;
18865
18866 sha256_64 (w, pc256);
18867
18868 salt->salt_buf_pc[0] = pc256[0];
18869 salt->salt_buf_pc[1] = pc256[1];
18870 salt->salt_buf_pc[2] = pc256[2];
18871 salt->salt_buf_pc[3] = pc256[3];
18872 salt->salt_buf_pc[4] = pc256[4];
18873 salt->salt_buf_pc[5] = pc256[5];
18874 salt->salt_buf_pc[6] = pc256[6];
18875 salt->salt_buf_pc[7] = pc256[7];
18876
18877 digest[0] -= pc256[0];
18878 digest[1] -= pc256[1];
18879 digest[2] -= pc256[2];
18880 digest[3] -= pc256[3];
18881 digest[4] -= pc256[4];
18882 digest[5] -= pc256[5];
18883 digest[6] -= pc256[6];
18884 digest[7] -= pc256[7];
18885
18886 return (PARSER_OK);
18887 }
18888
18889 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18890 {
18891 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18892
18893 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18894
18895 u32 *digest = (u32 *) hash_buf->digest;
18896
18897 salt_t *salt = hash_buf->salt;
18898
18899 /**
18900 * parse line
18901 */
18902
18903 char *data_len_pos = input_buf + 1 + 10 + 1;
18904
18905 char *data_buf_pos = strchr (data_len_pos, '$');
18906
18907 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18908
18909 u32 data_len_len = data_buf_pos - data_len_pos;
18910
18911 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18912 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18913
18914 data_buf_pos++;
18915
18916 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18917
18918 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18919
18920 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18921
18922 u32 data_len = atoi (data_len_pos);
18923
18924 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18925
18926 /**
18927 * salt
18928 */
18929
18930 char *salt_pos = data_buf_pos;
18931
18932 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18933 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18934 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
18935 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
18936
18937 // this is actually the CT, which is also the hash later (if matched)
18938
18939 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
18940 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
18941 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
18942 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
18943
18944 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18945
18946 salt->salt_iter = 10 - 1;
18947
18948 /**
18949 * digest buf
18950 */
18951
18952 digest[0] = salt->salt_buf[4];
18953 digest[1] = salt->salt_buf[5];
18954 digest[2] = salt->salt_buf[6];
18955 digest[3] = salt->salt_buf[7];
18956
18957 return (PARSER_OK);
18958 }
18959
18960 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18961 {
18962 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18963
18964 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18965
18966 u32 *digest = (u32 *) hash_buf->digest;
18967
18968 salt_t *salt = hash_buf->salt;
18969
18970 /**
18971 * parse line
18972 */
18973
18974 char *salt_pos = input_buf + 11 + 1;
18975
18976 char *iter_pos = strchr (salt_pos, ',');
18977
18978 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18979
18980 u32 salt_len = iter_pos - salt_pos;
18981
18982 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18983
18984 iter_pos++;
18985
18986 char *hash_pos = strchr (iter_pos, ',');
18987
18988 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18989
18990 u32 iter_len = hash_pos - iter_pos;
18991
18992 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18993
18994 hash_pos++;
18995
18996 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18997
18998 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18999
19000 /**
19001 * salt
19002 */
19003
19004 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
19005 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
19006 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
19007 salt->salt_buf[3] = 0x00018000;
19008
19009 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19010 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19011 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
19012 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
19013
19014 salt->salt_len = salt_len / 2;
19015
19016 salt->salt_iter = atoi (iter_pos) - 1;
19017
19018 /**
19019 * digest buf
19020 */
19021
19022 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19023 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19024 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19025 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19026 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19027 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19028 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19029 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19030
19031 return (PARSER_OK);
19032 }
19033
19034 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19035 {
19036 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
19037
19038 u32 *digest = (u32 *) hash_buf->digest;
19039
19040 salt_t *salt = hash_buf->salt;
19041
19042 /**
19043 * parse line
19044 */
19045
19046 char *hash_pos = input_buf + 64;
19047 char *salt1_pos = input_buf + 128;
19048 char *salt2_pos = input_buf;
19049
19050 /**
19051 * salt
19052 */
19053
19054 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
19055 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
19056 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
19057 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
19058
19059 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
19060 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
19061 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
19062 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
19063
19064 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
19065 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
19066 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
19067 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
19068
19069 salt->salt_len = 48;
19070
19071 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
19072
19073 /**
19074 * digest buf
19075 */
19076
19077 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19078 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19079 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19080 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19081 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19082 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19083 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19084 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19085
19086 return (PARSER_OK);
19087 }
19088
19089 /**
19090 * parallel running threads
19091 */
19092
19093 #ifdef WIN
19094
19095 BOOL WINAPI sigHandler_default (DWORD sig)
19096 {
19097 switch (sig)
19098 {
19099 case CTRL_CLOSE_EVENT:
19100
19101 /*
19102 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
19103 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
19104 * function otherwise it is too late (e.g. after returning from this function)
19105 */
19106
19107 myabort ();
19108
19109 SetConsoleCtrlHandler (NULL, TRUE);
19110
19111 hc_sleep (10);
19112
19113 return TRUE;
19114
19115 case CTRL_C_EVENT:
19116 case CTRL_LOGOFF_EVENT:
19117 case CTRL_SHUTDOWN_EVENT:
19118
19119 myabort ();
19120
19121 SetConsoleCtrlHandler (NULL, TRUE);
19122
19123 return TRUE;
19124 }
19125
19126 return FALSE;
19127 }
19128
19129 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19130 {
19131 switch (sig)
19132 {
19133 case CTRL_CLOSE_EVENT:
19134
19135 myabort ();
19136
19137 SetConsoleCtrlHandler (NULL, TRUE);
19138
19139 hc_sleep (10);
19140
19141 return TRUE;
19142
19143 case CTRL_C_EVENT:
19144 case CTRL_LOGOFF_EVENT:
19145 case CTRL_SHUTDOWN_EVENT:
19146
19147 myquit ();
19148
19149 SetConsoleCtrlHandler (NULL, TRUE);
19150
19151 return TRUE;
19152 }
19153
19154 return FALSE;
19155 }
19156
19157 void hc_signal (BOOL WINAPI (callback) (DWORD))
19158 {
19159 if (callback == NULL)
19160 {
19161 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19162 }
19163 else
19164 {
19165 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19166 }
19167 }
19168
19169 #else
19170
19171 void sigHandler_default (int sig)
19172 {
19173 myabort ();
19174
19175 signal (sig, NULL);
19176 }
19177
19178 void sigHandler_benchmark (int sig)
19179 {
19180 myquit ();
19181
19182 signal (sig, NULL);
19183 }
19184
19185 void hc_signal (void (callback) (int))
19186 {
19187 if (callback == NULL) callback = SIG_DFL;
19188
19189 signal (SIGINT, callback);
19190 signal (SIGTERM, callback);
19191 signal (SIGABRT, callback);
19192 }
19193
19194 #endif
19195
19196 void status_display ();
19197
19198 void *thread_keypress (void *p)
19199 {
19200 int benchmark = *((int *) p);
19201
19202 uint quiet = data.quiet;
19203
19204 tty_break();
19205
19206 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19207 {
19208 int ch = tty_getchar();
19209
19210 if (ch == -1) break;
19211
19212 if (ch == 0) continue;
19213
19214 #ifdef _POSIX
19215 if (ch != '\n')
19216 #endif
19217
19218 hc_thread_mutex_lock (mux_display);
19219
19220 log_info ("");
19221
19222 switch (ch)
19223 {
19224 case 's':
19225 case '\n':
19226
19227 log_info ("");
19228
19229 status_display ();
19230
19231 log_info ("");
19232
19233 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19234 if (quiet == 0) fflush (stdout);
19235
19236 break;
19237
19238 case 'b':
19239
19240 log_info ("");
19241
19242 bypass ();
19243
19244 log_info ("");
19245
19246 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19247 if (quiet == 0) fflush (stdout);
19248
19249 break;
19250
19251 case 'p':
19252
19253 log_info ("");
19254
19255 SuspendThreads ();
19256
19257 log_info ("");
19258
19259 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19260 if (quiet == 0) fflush (stdout);
19261
19262 break;
19263
19264 case 'r':
19265
19266 log_info ("");
19267
19268 ResumeThreads ();
19269
19270 log_info ("");
19271
19272 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19273 if (quiet == 0) fflush (stdout);
19274
19275 break;
19276
19277 case 'c':
19278
19279 log_info ("");
19280
19281 if (benchmark == 1) break;
19282
19283 stop_at_checkpoint ();
19284
19285 log_info ("");
19286
19287 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19288 if (quiet == 0) fflush (stdout);
19289
19290 break;
19291
19292 case 'q':
19293
19294 log_info ("");
19295
19296 if (benchmark == 1)
19297 {
19298 myquit ();
19299 }
19300 else
19301 {
19302 myabort ();
19303 }
19304
19305 break;
19306 }
19307
19308 hc_thread_mutex_unlock (mux_display);
19309 }
19310
19311 tty_fix();
19312
19313 return (p);
19314 }
19315
19316 /**
19317 * rules common
19318 */
19319
19320 bool class_num (const u8 c)
19321 {
19322 return ((c >= '0') && (c <= '9'));
19323 }
19324
19325 bool class_lower (const u8 c)
19326 {
19327 return ((c >= 'a') && (c <= 'z'));
19328 }
19329
19330 bool class_upper (const u8 c)
19331 {
19332 return ((c >= 'A') && (c <= 'Z'));
19333 }
19334
19335 bool class_alpha (const u8 c)
19336 {
19337 return (class_lower (c) || class_upper (c));
19338 }
19339
19340 int conv_ctoi (const u8 c)
19341 {
19342 if (class_num (c))
19343 {
19344 return c - '0';
19345 }
19346 else if (class_upper (c))
19347 {
19348 return c - 'A' + 10;
19349 }
19350
19351 return -1;
19352 }
19353
19354 int conv_itoc (const u8 c)
19355 {
19356 if (c < 10)
19357 {
19358 return c + '0';
19359 }
19360 else if (c < 37)
19361 {
19362 return c + 'A' - 10;
19363 }
19364
19365 return -1;
19366 }
19367
19368 /**
19369 * device rules
19370 */
19371
19372 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19373 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19374 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19375 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19376 #define MAX_KERNEL_RULES 255
19377 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19378 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19379 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19380
19381 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19382 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19383 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19384 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19385
19386 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19387 {
19388 uint rule_pos;
19389 uint rule_cnt;
19390
19391 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19392 {
19393 switch (rule_buf[rule_pos])
19394 {
19395 case ' ':
19396 rule_cnt--;
19397 break;
19398
19399 case RULE_OP_MANGLE_NOOP:
19400 SET_NAME (rule, rule_buf[rule_pos]);
19401 break;
19402
19403 case RULE_OP_MANGLE_LREST:
19404 SET_NAME (rule, rule_buf[rule_pos]);
19405 break;
19406
19407 case RULE_OP_MANGLE_UREST:
19408 SET_NAME (rule, rule_buf[rule_pos]);
19409 break;
19410
19411 case RULE_OP_MANGLE_LREST_UFIRST:
19412 SET_NAME (rule, rule_buf[rule_pos]);
19413 break;
19414
19415 case RULE_OP_MANGLE_UREST_LFIRST:
19416 SET_NAME (rule, rule_buf[rule_pos]);
19417 break;
19418
19419 case RULE_OP_MANGLE_TREST:
19420 SET_NAME (rule, rule_buf[rule_pos]);
19421 break;
19422
19423 case RULE_OP_MANGLE_TOGGLE_AT:
19424 SET_NAME (rule, rule_buf[rule_pos]);
19425 SET_P0_CONV (rule, rule_buf[rule_pos]);
19426 break;
19427
19428 case RULE_OP_MANGLE_REVERSE:
19429 SET_NAME (rule, rule_buf[rule_pos]);
19430 break;
19431
19432 case RULE_OP_MANGLE_DUPEWORD:
19433 SET_NAME (rule, rule_buf[rule_pos]);
19434 break;
19435
19436 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19437 SET_NAME (rule, rule_buf[rule_pos]);
19438 SET_P0_CONV (rule, rule_buf[rule_pos]);
19439 break;
19440
19441 case RULE_OP_MANGLE_REFLECT:
19442 SET_NAME (rule, rule_buf[rule_pos]);
19443 break;
19444
19445 case RULE_OP_MANGLE_ROTATE_LEFT:
19446 SET_NAME (rule, rule_buf[rule_pos]);
19447 break;
19448
19449 case RULE_OP_MANGLE_ROTATE_RIGHT:
19450 SET_NAME (rule, rule_buf[rule_pos]);
19451 break;
19452
19453 case RULE_OP_MANGLE_APPEND:
19454 SET_NAME (rule, rule_buf[rule_pos]);
19455 SET_P0 (rule, rule_buf[rule_pos]);
19456 break;
19457
19458 case RULE_OP_MANGLE_PREPEND:
19459 SET_NAME (rule, rule_buf[rule_pos]);
19460 SET_P0 (rule, rule_buf[rule_pos]);
19461 break;
19462
19463 case RULE_OP_MANGLE_DELETE_FIRST:
19464 SET_NAME (rule, rule_buf[rule_pos]);
19465 break;
19466
19467 case RULE_OP_MANGLE_DELETE_LAST:
19468 SET_NAME (rule, rule_buf[rule_pos]);
19469 break;
19470
19471 case RULE_OP_MANGLE_DELETE_AT:
19472 SET_NAME (rule, rule_buf[rule_pos]);
19473 SET_P0_CONV (rule, rule_buf[rule_pos]);
19474 break;
19475
19476 case RULE_OP_MANGLE_EXTRACT:
19477 SET_NAME (rule, rule_buf[rule_pos]);
19478 SET_P0_CONV (rule, rule_buf[rule_pos]);
19479 SET_P1_CONV (rule, rule_buf[rule_pos]);
19480 break;
19481
19482 case RULE_OP_MANGLE_OMIT:
19483 SET_NAME (rule, rule_buf[rule_pos]);
19484 SET_P0_CONV (rule, rule_buf[rule_pos]);
19485 SET_P1_CONV (rule, rule_buf[rule_pos]);
19486 break;
19487
19488 case RULE_OP_MANGLE_INSERT:
19489 SET_NAME (rule, rule_buf[rule_pos]);
19490 SET_P0_CONV (rule, rule_buf[rule_pos]);
19491 SET_P1 (rule, rule_buf[rule_pos]);
19492 break;
19493
19494 case RULE_OP_MANGLE_OVERSTRIKE:
19495 SET_NAME (rule, rule_buf[rule_pos]);
19496 SET_P0_CONV (rule, rule_buf[rule_pos]);
19497 SET_P1 (rule, rule_buf[rule_pos]);
19498 break;
19499
19500 case RULE_OP_MANGLE_TRUNCATE_AT:
19501 SET_NAME (rule, rule_buf[rule_pos]);
19502 SET_P0_CONV (rule, rule_buf[rule_pos]);
19503 break;
19504
19505 case RULE_OP_MANGLE_REPLACE:
19506 SET_NAME (rule, rule_buf[rule_pos]);
19507 SET_P0 (rule, rule_buf[rule_pos]);
19508 SET_P1 (rule, rule_buf[rule_pos]);
19509 break;
19510
19511 case RULE_OP_MANGLE_PURGECHAR:
19512 return (-1);
19513 break;
19514
19515 case RULE_OP_MANGLE_TOGGLECASE_REC:
19516 return (-1);
19517 break;
19518
19519 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19520 SET_NAME (rule, rule_buf[rule_pos]);
19521 SET_P0_CONV (rule, rule_buf[rule_pos]);
19522 break;
19523
19524 case RULE_OP_MANGLE_DUPECHAR_LAST:
19525 SET_NAME (rule, rule_buf[rule_pos]);
19526 SET_P0_CONV (rule, rule_buf[rule_pos]);
19527 break;
19528
19529 case RULE_OP_MANGLE_DUPECHAR_ALL:
19530 SET_NAME (rule, rule_buf[rule_pos]);
19531 break;
19532
19533 case RULE_OP_MANGLE_SWITCH_FIRST:
19534 SET_NAME (rule, rule_buf[rule_pos]);
19535 break;
19536
19537 case RULE_OP_MANGLE_SWITCH_LAST:
19538 SET_NAME (rule, rule_buf[rule_pos]);
19539 break;
19540
19541 case RULE_OP_MANGLE_SWITCH_AT:
19542 SET_NAME (rule, rule_buf[rule_pos]);
19543 SET_P0_CONV (rule, rule_buf[rule_pos]);
19544 SET_P1_CONV (rule, rule_buf[rule_pos]);
19545 break;
19546
19547 case RULE_OP_MANGLE_CHR_SHIFTL:
19548 SET_NAME (rule, rule_buf[rule_pos]);
19549 SET_P0_CONV (rule, rule_buf[rule_pos]);
19550 break;
19551
19552 case RULE_OP_MANGLE_CHR_SHIFTR:
19553 SET_NAME (rule, rule_buf[rule_pos]);
19554 SET_P0_CONV (rule, rule_buf[rule_pos]);
19555 break;
19556
19557 case RULE_OP_MANGLE_CHR_INCR:
19558 SET_NAME (rule, rule_buf[rule_pos]);
19559 SET_P0_CONV (rule, rule_buf[rule_pos]);
19560 break;
19561
19562 case RULE_OP_MANGLE_CHR_DECR:
19563 SET_NAME (rule, rule_buf[rule_pos]);
19564 SET_P0_CONV (rule, rule_buf[rule_pos]);
19565 break;
19566
19567 case RULE_OP_MANGLE_REPLACE_NP1:
19568 SET_NAME (rule, rule_buf[rule_pos]);
19569 SET_P0_CONV (rule, rule_buf[rule_pos]);
19570 break;
19571
19572 case RULE_OP_MANGLE_REPLACE_NM1:
19573 SET_NAME (rule, rule_buf[rule_pos]);
19574 SET_P0_CONV (rule, rule_buf[rule_pos]);
19575 break;
19576
19577 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19578 SET_NAME (rule, rule_buf[rule_pos]);
19579 SET_P0_CONV (rule, rule_buf[rule_pos]);
19580 break;
19581
19582 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19583 SET_NAME (rule, rule_buf[rule_pos]);
19584 SET_P0_CONV (rule, rule_buf[rule_pos]);
19585 break;
19586
19587 case RULE_OP_MANGLE_TITLE:
19588 SET_NAME (rule, rule_buf[rule_pos]);
19589 break;
19590
19591 default:
19592 return (-1);
19593 break;
19594 }
19595 }
19596
19597 if (rule_pos < rule_len) return (-1);
19598
19599 return (0);
19600 }
19601
19602 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19603 {
19604 uint rule_cnt;
19605 uint rule_pos;
19606 uint rule_len = BUFSIZ - 1; // maximum possible len
19607
19608 char rule_cmd;
19609
19610 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19611 {
19612 GET_NAME (rule);
19613
19614 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19615
19616 switch (rule_cmd)
19617 {
19618 case RULE_OP_MANGLE_NOOP:
19619 rule_buf[rule_pos] = rule_cmd;
19620 break;
19621
19622 case RULE_OP_MANGLE_LREST:
19623 rule_buf[rule_pos] = rule_cmd;
19624 break;
19625
19626 case RULE_OP_MANGLE_UREST:
19627 rule_buf[rule_pos] = rule_cmd;
19628 break;
19629
19630 case RULE_OP_MANGLE_LREST_UFIRST:
19631 rule_buf[rule_pos] = rule_cmd;
19632 break;
19633
19634 case RULE_OP_MANGLE_UREST_LFIRST:
19635 rule_buf[rule_pos] = rule_cmd;
19636 break;
19637
19638 case RULE_OP_MANGLE_TREST:
19639 rule_buf[rule_pos] = rule_cmd;
19640 break;
19641
19642 case RULE_OP_MANGLE_TOGGLE_AT:
19643 rule_buf[rule_pos] = rule_cmd;
19644 GET_P0_CONV (rule);
19645 break;
19646
19647 case RULE_OP_MANGLE_REVERSE:
19648 rule_buf[rule_pos] = rule_cmd;
19649 break;
19650
19651 case RULE_OP_MANGLE_DUPEWORD:
19652 rule_buf[rule_pos] = rule_cmd;
19653 break;
19654
19655 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19656 rule_buf[rule_pos] = rule_cmd;
19657 GET_P0_CONV (rule);
19658 break;
19659
19660 case RULE_OP_MANGLE_REFLECT:
19661 rule_buf[rule_pos] = rule_cmd;
19662 break;
19663
19664 case RULE_OP_MANGLE_ROTATE_LEFT:
19665 rule_buf[rule_pos] = rule_cmd;
19666 break;
19667
19668 case RULE_OP_MANGLE_ROTATE_RIGHT:
19669 rule_buf[rule_pos] = rule_cmd;
19670 break;
19671
19672 case RULE_OP_MANGLE_APPEND:
19673 rule_buf[rule_pos] = rule_cmd;
19674 GET_P0 (rule);
19675 break;
19676
19677 case RULE_OP_MANGLE_PREPEND:
19678 rule_buf[rule_pos] = rule_cmd;
19679 GET_P0 (rule);
19680 break;
19681
19682 case RULE_OP_MANGLE_DELETE_FIRST:
19683 rule_buf[rule_pos] = rule_cmd;
19684 break;
19685
19686 case RULE_OP_MANGLE_DELETE_LAST:
19687 rule_buf[rule_pos] = rule_cmd;
19688 break;
19689
19690 case RULE_OP_MANGLE_DELETE_AT:
19691 rule_buf[rule_pos] = rule_cmd;
19692 GET_P0_CONV (rule);
19693 break;
19694
19695 case RULE_OP_MANGLE_EXTRACT:
19696 rule_buf[rule_pos] = rule_cmd;
19697 GET_P0_CONV (rule);
19698 GET_P1_CONV (rule);
19699 break;
19700
19701 case RULE_OP_MANGLE_OMIT:
19702 rule_buf[rule_pos] = rule_cmd;
19703 GET_P0_CONV (rule);
19704 GET_P1_CONV (rule);
19705 break;
19706
19707 case RULE_OP_MANGLE_INSERT:
19708 rule_buf[rule_pos] = rule_cmd;
19709 GET_P0_CONV (rule);
19710 GET_P1 (rule);
19711 break;
19712
19713 case RULE_OP_MANGLE_OVERSTRIKE:
19714 rule_buf[rule_pos] = rule_cmd;
19715 GET_P0_CONV (rule);
19716 GET_P1 (rule);
19717 break;
19718
19719 case RULE_OP_MANGLE_TRUNCATE_AT:
19720 rule_buf[rule_pos] = rule_cmd;
19721 GET_P0_CONV (rule);
19722 break;
19723
19724 case RULE_OP_MANGLE_REPLACE:
19725 rule_buf[rule_pos] = rule_cmd;
19726 GET_P0 (rule);
19727 GET_P1 (rule);
19728 break;
19729
19730 case RULE_OP_MANGLE_PURGECHAR:
19731 return (-1);
19732 break;
19733
19734 case RULE_OP_MANGLE_TOGGLECASE_REC:
19735 return (-1);
19736 break;
19737
19738 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19739 rule_buf[rule_pos] = rule_cmd;
19740 GET_P0_CONV (rule);
19741 break;
19742
19743 case RULE_OP_MANGLE_DUPECHAR_LAST:
19744 rule_buf[rule_pos] = rule_cmd;
19745 GET_P0_CONV (rule);
19746 break;
19747
19748 case RULE_OP_MANGLE_DUPECHAR_ALL:
19749 rule_buf[rule_pos] = rule_cmd;
19750 break;
19751
19752 case RULE_OP_MANGLE_SWITCH_FIRST:
19753 rule_buf[rule_pos] = rule_cmd;
19754 break;
19755
19756 case RULE_OP_MANGLE_SWITCH_LAST:
19757 rule_buf[rule_pos] = rule_cmd;
19758 break;
19759
19760 case RULE_OP_MANGLE_SWITCH_AT:
19761 rule_buf[rule_pos] = rule_cmd;
19762 GET_P0_CONV (rule);
19763 GET_P1_CONV (rule);
19764 break;
19765
19766 case RULE_OP_MANGLE_CHR_SHIFTL:
19767 rule_buf[rule_pos] = rule_cmd;
19768 GET_P0_CONV (rule);
19769 break;
19770
19771 case RULE_OP_MANGLE_CHR_SHIFTR:
19772 rule_buf[rule_pos] = rule_cmd;
19773 GET_P0_CONV (rule);
19774 break;
19775
19776 case RULE_OP_MANGLE_CHR_INCR:
19777 rule_buf[rule_pos] = rule_cmd;
19778 GET_P0_CONV (rule);
19779 break;
19780
19781 case RULE_OP_MANGLE_CHR_DECR:
19782 rule_buf[rule_pos] = rule_cmd;
19783 GET_P0_CONV (rule);
19784 break;
19785
19786 case RULE_OP_MANGLE_REPLACE_NP1:
19787 rule_buf[rule_pos] = rule_cmd;
19788 GET_P0_CONV (rule);
19789 break;
19790
19791 case RULE_OP_MANGLE_REPLACE_NM1:
19792 rule_buf[rule_pos] = rule_cmd;
19793 GET_P0_CONV (rule);
19794 break;
19795
19796 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19797 rule_buf[rule_pos] = rule_cmd;
19798 GET_P0_CONV (rule);
19799 break;
19800
19801 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19802 rule_buf[rule_pos] = rule_cmd;
19803 GET_P0_CONV (rule);
19804 break;
19805
19806 case RULE_OP_MANGLE_TITLE:
19807 rule_buf[rule_pos] = rule_cmd;
19808 break;
19809
19810 case 0:
19811 return rule_pos - 1;
19812 break;
19813
19814 default:
19815 return (-1);
19816 break;
19817 }
19818 }
19819
19820 if (rule_cnt > 0)
19821 {
19822 return rule_pos;
19823 }
19824
19825 return (-1);
19826 }
19827
19828 /**
19829 * CPU rules : this is from hashcat sources, cpu based rules
19830 */
19831
19832 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19833 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19834
19835 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19836 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19837 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19838
19839 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19840 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19841 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19842
19843 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19844 {
19845 int pos;
19846
19847 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19848
19849 return (arr_len);
19850 }
19851
19852 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19853 {
19854 int pos;
19855
19856 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19857
19858 return (arr_len);
19859 }
19860
19861 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19862 {
19863 int pos;
19864
19865 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19866
19867 return (arr_len);
19868 }
19869
19870 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19871 {
19872 int l;
19873 int r;
19874
19875 for (l = 0; l < arr_len; l++)
19876 {
19877 r = arr_len - 1 - l;
19878
19879 if (l >= r) break;
19880
19881 MANGLE_SWITCH (arr, l, r);
19882 }
19883
19884 return (arr_len);
19885 }
19886
19887 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19888 {
19889 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19890
19891 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19892
19893 return (arr_len * 2);
19894 }
19895
19896 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19897 {
19898 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19899
19900 int orig_len = arr_len;
19901
19902 int i;
19903
19904 for (i = 0; i < times; i++)
19905 {
19906 memcpy (&arr[arr_len], arr, orig_len);
19907
19908 arr_len += orig_len;
19909 }
19910
19911 return (arr_len);
19912 }
19913
19914 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19915 {
19916 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19917
19918 mangle_double (arr, arr_len);
19919
19920 mangle_reverse (arr + arr_len, arr_len);
19921
19922 return (arr_len * 2);
19923 }
19924
19925 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19926 {
19927 int l;
19928 int r;
19929
19930 for (l = 0, r = arr_len - 1; r > 0; r--)
19931 {
19932 MANGLE_SWITCH (arr, l, r);
19933 }
19934
19935 return (arr_len);
19936 }
19937
19938 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19939 {
19940 int l;
19941 int r;
19942
19943 for (l = 0, r = arr_len - 1; l < r; l++)
19944 {
19945 MANGLE_SWITCH (arr, l, r);
19946 }
19947
19948 return (arr_len);
19949 }
19950
19951 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19952 {
19953 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19954
19955 arr[arr_len] = c;
19956
19957 return (arr_len + 1);
19958 }
19959
19960 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19961 {
19962 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19963
19964 int arr_pos;
19965
19966 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19967 {
19968 arr[arr_pos + 1] = arr[arr_pos];
19969 }
19970
19971 arr[0] = c;
19972
19973 return (arr_len + 1);
19974 }
19975
19976 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19977 {
19978 if (upos >= arr_len) return (arr_len);
19979
19980 int arr_pos;
19981
19982 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19983 {
19984 arr[arr_pos] = arr[arr_pos + 1];
19985 }
19986
19987 return (arr_len - 1);
19988 }
19989
19990 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19991 {
19992 if (upos >= arr_len) return (arr_len);
19993
19994 if ((upos + ulen) > arr_len) return (arr_len);
19995
19996 int arr_pos;
19997
19998 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19999 {
20000 arr[arr_pos] = arr[upos + arr_pos];
20001 }
20002
20003 return (ulen);
20004 }
20005
20006 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20007 {
20008 if (upos >= arr_len) return (arr_len);
20009
20010 if ((upos + ulen) >= arr_len) return (arr_len);
20011
20012 int arr_pos;
20013
20014 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
20015 {
20016 arr[arr_pos] = arr[arr_pos + ulen];
20017 }
20018
20019 return (arr_len - ulen);
20020 }
20021
20022 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20023 {
20024 if (upos >= arr_len) return (arr_len);
20025
20026 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20027
20028 int arr_pos;
20029
20030 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
20031 {
20032 arr[arr_pos + 1] = arr[arr_pos];
20033 }
20034
20035 arr[upos] = c;
20036
20037 return (arr_len + 1);
20038 }
20039
20040 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)
20041 {
20042 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20043
20044 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
20045
20046 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
20047
20048 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
20049
20050 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
20051
20052 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
20053
20054 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
20055
20056 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
20057
20058 return (arr_len + arr2_cpy);
20059 }
20060
20061 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20062 {
20063 if (upos >= arr_len) return (arr_len);
20064
20065 arr[upos] = c;
20066
20067 return (arr_len);
20068 }
20069
20070 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
20071 {
20072 if (upos >= arr_len) return (arr_len);
20073
20074 memset (arr + upos, 0, arr_len - upos);
20075
20076 return (upos);
20077 }
20078
20079 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
20080 {
20081 int arr_pos;
20082
20083 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
20084 {
20085 if (arr[arr_pos] != oldc) continue;
20086
20087 arr[arr_pos] = newc;
20088 }
20089
20090 return (arr_len);
20091 }
20092
20093 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
20094 {
20095 int arr_pos;
20096
20097 int ret_len;
20098
20099 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
20100 {
20101 if (arr[arr_pos] == c) continue;
20102
20103 arr[ret_len] = arr[arr_pos];
20104
20105 ret_len++;
20106 }
20107
20108 return (ret_len);
20109 }
20110
20111 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
20112 {
20113 if (ulen > arr_len) return (arr_len);
20114
20115 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20116
20117 char cs[100];
20118
20119 memcpy (cs, arr, ulen);
20120
20121 int i;
20122
20123 for (i = 0; i < ulen; i++)
20124 {
20125 char c = cs[i];
20126
20127 arr_len = mangle_insert (arr, arr_len, i, c);
20128 }
20129
20130 return (arr_len);
20131 }
20132
20133 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20134 {
20135 if (ulen > arr_len) return (arr_len);
20136
20137 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20138
20139 int upos = arr_len - ulen;
20140
20141 int i;
20142
20143 for (i = 0; i < ulen; i++)
20144 {
20145 char c = arr[upos + i];
20146
20147 arr_len = mangle_append (arr, arr_len, c);
20148 }
20149
20150 return (arr_len);
20151 }
20152
20153 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20154 {
20155 if ( arr_len == 0) return (arr_len);
20156 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20157
20158 char c = arr[upos];
20159
20160 int i;
20161
20162 for (i = 0; i < ulen; i++)
20163 {
20164 arr_len = mangle_insert (arr, arr_len, upos, c);
20165 }
20166
20167 return (arr_len);
20168 }
20169
20170 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20171 {
20172 if ( arr_len == 0) return (arr_len);
20173 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20174
20175 int arr_pos;
20176
20177 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20178 {
20179 int new_pos = arr_pos * 2;
20180
20181 arr[new_pos] = arr[arr_pos];
20182
20183 arr[new_pos + 1] = arr[arr_pos];
20184 }
20185
20186 return (arr_len * 2);
20187 }
20188
20189 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20190 {
20191 if (upos >= arr_len) return (arr_len);
20192 if (upos2 >= arr_len) return (arr_len);
20193
20194 MANGLE_SWITCH (arr, upos, upos2);
20195
20196 return (arr_len);
20197 }
20198
20199 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20200 {
20201 MANGLE_SWITCH (arr, upos, upos2);
20202
20203 return (arr_len);
20204 }
20205
20206 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20207 {
20208 if (upos >= arr_len) return (arr_len);
20209
20210 arr[upos] <<= 1;
20211
20212 return (arr_len);
20213 }
20214
20215 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20216 {
20217 if (upos >= arr_len) return (arr_len);
20218
20219 arr[upos] >>= 1;
20220
20221 return (arr_len);
20222 }
20223
20224 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20225 {
20226 if (upos >= arr_len) return (arr_len);
20227
20228 arr[upos] += 1;
20229
20230 return (arr_len);
20231 }
20232
20233 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20234 {
20235 if (upos >= arr_len) return (arr_len);
20236
20237 arr[upos] -= 1;
20238
20239 return (arr_len);
20240 }
20241
20242 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20243 {
20244 int upper_next = 1;
20245
20246 int pos;
20247
20248 for (pos = 0; pos < arr_len; pos++)
20249 {
20250 if (arr[pos] == ' ')
20251 {
20252 upper_next = 1;
20253
20254 continue;
20255 }
20256
20257 if (upper_next)
20258 {
20259 upper_next = 0;
20260
20261 MANGLE_UPPER_AT (arr, pos);
20262 }
20263 else
20264 {
20265 MANGLE_LOWER_AT (arr, pos);
20266 }
20267 }
20268
20269 return (arr_len);
20270 }
20271
20272 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20273 {
20274 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20275
20276 u32 j;
20277
20278 u32 rule_pos = 0;
20279
20280 for (j = 0; j < rp_gen_num; j++)
20281 {
20282 u32 r = 0;
20283 u32 p1 = 0;
20284 u32 p2 = 0;
20285 u32 p3 = 0;
20286
20287 switch ((char) get_random_num (0, 9))
20288 {
20289 case 0:
20290 r = get_random_num (0, sizeof (grp_op_nop));
20291 rule_buf[rule_pos++] = grp_op_nop[r];
20292 break;
20293
20294 case 1:
20295 r = get_random_num (0, sizeof (grp_op_pos_p0));
20296 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20297 p1 = get_random_num (0, sizeof (grp_pos));
20298 rule_buf[rule_pos++] = grp_pos[p1];
20299 break;
20300
20301 case 2:
20302 r = get_random_num (0, sizeof (grp_op_pos_p1));
20303 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20304 p1 = get_random_num (1, 6);
20305 rule_buf[rule_pos++] = grp_pos[p1];
20306 break;
20307
20308 case 3:
20309 r = get_random_num (0, sizeof (grp_op_chr));
20310 rule_buf[rule_pos++] = grp_op_chr[r];
20311 p1 = get_random_num (0x20, 0x7e);
20312 rule_buf[rule_pos++] = (char) p1;
20313 break;
20314
20315 case 4:
20316 r = get_random_num (0, sizeof (grp_op_chr_chr));
20317 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20318 p1 = get_random_num (0x20, 0x7e);
20319 rule_buf[rule_pos++] = (char) p1;
20320 p2 = get_random_num (0x20, 0x7e);
20321 while (p1 == p2)
20322 p2 = get_random_num (0x20, 0x7e);
20323 rule_buf[rule_pos++] = (char) p2;
20324 break;
20325
20326 case 5:
20327 r = get_random_num (0, sizeof (grp_op_pos_chr));
20328 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20329 p1 = get_random_num (0, sizeof (grp_pos));
20330 rule_buf[rule_pos++] = grp_pos[p1];
20331 p2 = get_random_num (0x20, 0x7e);
20332 rule_buf[rule_pos++] = (char) p2;
20333 break;
20334
20335 case 6:
20336 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20337 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20338 p1 = get_random_num (0, sizeof (grp_pos));
20339 rule_buf[rule_pos++] = grp_pos[p1];
20340 p2 = get_random_num (0, sizeof (grp_pos));
20341 while (p1 == p2)
20342 p2 = get_random_num (0, sizeof (grp_pos));
20343 rule_buf[rule_pos++] = grp_pos[p2];
20344 break;
20345
20346 case 7:
20347 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20348 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20349 p1 = get_random_num (0, sizeof (grp_pos));
20350 rule_buf[rule_pos++] = grp_pos[p1];
20351 p2 = get_random_num (1, sizeof (grp_pos));
20352 while (p1 == p2)
20353 p2 = get_random_num (1, sizeof (grp_pos));
20354 rule_buf[rule_pos++] = grp_pos[p2];
20355 break;
20356
20357 case 8:
20358 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20359 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20360 p1 = get_random_num (0, sizeof (grp_pos));
20361 rule_buf[rule_pos++] = grp_pos[p1];
20362 p2 = get_random_num (1, sizeof (grp_pos));
20363 rule_buf[rule_pos++] = grp_pos[p1];
20364 p3 = get_random_num (0, sizeof (grp_pos));
20365 rule_buf[rule_pos++] = grp_pos[p3];
20366 break;
20367 }
20368 }
20369
20370 return (rule_pos);
20371 }
20372
20373 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20374 {
20375 char mem[BLOCK_SIZE];
20376
20377 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20378
20379 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20380
20381 if (in_len < 1) return (RULE_RC_REJECT_ERROR);
20382
20383 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20384
20385 int out_len = in_len;
20386 int mem_len = in_len;
20387
20388 memcpy (out, in, out_len);
20389
20390 int rule_pos;
20391
20392 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20393 {
20394 int upos; int upos2;
20395 int ulen;
20396
20397 switch (rule[rule_pos])
20398 {
20399 case ' ':
20400 break;
20401
20402 case RULE_OP_MANGLE_NOOP:
20403 break;
20404
20405 case RULE_OP_MANGLE_LREST:
20406 out_len = mangle_lrest (out, out_len);
20407 break;
20408
20409 case RULE_OP_MANGLE_UREST:
20410 out_len = mangle_urest (out, out_len);
20411 break;
20412
20413 case RULE_OP_MANGLE_LREST_UFIRST:
20414 out_len = mangle_lrest (out, out_len);
20415 if (out_len) MANGLE_UPPER_AT (out, 0);
20416 break;
20417
20418 case RULE_OP_MANGLE_UREST_LFIRST:
20419 out_len = mangle_urest (out, out_len);
20420 if (out_len) MANGLE_LOWER_AT (out, 0);
20421 break;
20422
20423 case RULE_OP_MANGLE_TREST:
20424 out_len = mangle_trest (out, out_len);
20425 break;
20426
20427 case RULE_OP_MANGLE_TOGGLE_AT:
20428 NEXT_RULEPOS (rule_pos);
20429 NEXT_RPTOI (rule, rule_pos, upos);
20430 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20431 break;
20432
20433 case RULE_OP_MANGLE_REVERSE:
20434 out_len = mangle_reverse (out, out_len);
20435 break;
20436
20437 case RULE_OP_MANGLE_DUPEWORD:
20438 out_len = mangle_double (out, out_len);
20439 break;
20440
20441 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20442 NEXT_RULEPOS (rule_pos);
20443 NEXT_RPTOI (rule, rule_pos, ulen);
20444 out_len = mangle_double_times (out, out_len, ulen);
20445 break;
20446
20447 case RULE_OP_MANGLE_REFLECT:
20448 out_len = mangle_reflect (out, out_len);
20449 break;
20450
20451 case RULE_OP_MANGLE_ROTATE_LEFT:
20452 mangle_rotate_left (out, out_len);
20453 break;
20454
20455 case RULE_OP_MANGLE_ROTATE_RIGHT:
20456 mangle_rotate_right (out, out_len);
20457 break;
20458
20459 case RULE_OP_MANGLE_APPEND:
20460 NEXT_RULEPOS (rule_pos);
20461 out_len = mangle_append (out, out_len, rule[rule_pos]);
20462 break;
20463
20464 case RULE_OP_MANGLE_PREPEND:
20465 NEXT_RULEPOS (rule_pos);
20466 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20467 break;
20468
20469 case RULE_OP_MANGLE_DELETE_FIRST:
20470 out_len = mangle_delete_at (out, out_len, 0);
20471 break;
20472
20473 case RULE_OP_MANGLE_DELETE_LAST:
20474 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20475 break;
20476
20477 case RULE_OP_MANGLE_DELETE_AT:
20478 NEXT_RULEPOS (rule_pos);
20479 NEXT_RPTOI (rule, rule_pos, upos);
20480 out_len = mangle_delete_at (out, out_len, upos);
20481 break;
20482
20483 case RULE_OP_MANGLE_EXTRACT:
20484 NEXT_RULEPOS (rule_pos);
20485 NEXT_RPTOI (rule, rule_pos, upos);
20486 NEXT_RULEPOS (rule_pos);
20487 NEXT_RPTOI (rule, rule_pos, ulen);
20488 out_len = mangle_extract (out, out_len, upos, ulen);
20489 break;
20490
20491 case RULE_OP_MANGLE_OMIT:
20492 NEXT_RULEPOS (rule_pos);
20493 NEXT_RPTOI (rule, rule_pos, upos);
20494 NEXT_RULEPOS (rule_pos);
20495 NEXT_RPTOI (rule, rule_pos, ulen);
20496 out_len = mangle_omit (out, out_len, upos, ulen);
20497 break;
20498
20499 case RULE_OP_MANGLE_INSERT:
20500 NEXT_RULEPOS (rule_pos);
20501 NEXT_RPTOI (rule, rule_pos, upos);
20502 NEXT_RULEPOS (rule_pos);
20503 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20504 break;
20505
20506 case RULE_OP_MANGLE_OVERSTRIKE:
20507 NEXT_RULEPOS (rule_pos);
20508 NEXT_RPTOI (rule, rule_pos, upos);
20509 NEXT_RULEPOS (rule_pos);
20510 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20511 break;
20512
20513 case RULE_OP_MANGLE_TRUNCATE_AT:
20514 NEXT_RULEPOS (rule_pos);
20515 NEXT_RPTOI (rule, rule_pos, upos);
20516 out_len = mangle_truncate_at (out, out_len, upos);
20517 break;
20518
20519 case RULE_OP_MANGLE_REPLACE:
20520 NEXT_RULEPOS (rule_pos);
20521 NEXT_RULEPOS (rule_pos);
20522 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20523 break;
20524
20525 case RULE_OP_MANGLE_PURGECHAR:
20526 NEXT_RULEPOS (rule_pos);
20527 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20528 break;
20529
20530 case RULE_OP_MANGLE_TOGGLECASE_REC:
20531 /* todo */
20532 break;
20533
20534 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20535 NEXT_RULEPOS (rule_pos);
20536 NEXT_RPTOI (rule, rule_pos, ulen);
20537 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20538 break;
20539
20540 case RULE_OP_MANGLE_DUPECHAR_LAST:
20541 NEXT_RULEPOS (rule_pos);
20542 NEXT_RPTOI (rule, rule_pos, ulen);
20543 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20544 break;
20545
20546 case RULE_OP_MANGLE_DUPECHAR_ALL:
20547 out_len = mangle_dupechar (out, out_len);
20548 break;
20549
20550 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20551 NEXT_RULEPOS (rule_pos);
20552 NEXT_RPTOI (rule, rule_pos, ulen);
20553 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20554 break;
20555
20556 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20557 NEXT_RULEPOS (rule_pos);
20558 NEXT_RPTOI (rule, rule_pos, ulen);
20559 out_len = mangle_dupeblock_append (out, out_len, ulen);
20560 break;
20561
20562 case RULE_OP_MANGLE_SWITCH_FIRST:
20563 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20564 break;
20565
20566 case RULE_OP_MANGLE_SWITCH_LAST:
20567 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20568 break;
20569
20570 case RULE_OP_MANGLE_SWITCH_AT:
20571 NEXT_RULEPOS (rule_pos);
20572 NEXT_RPTOI (rule, rule_pos, upos);
20573 NEXT_RULEPOS (rule_pos);
20574 NEXT_RPTOI (rule, rule_pos, upos2);
20575 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20576 break;
20577
20578 case RULE_OP_MANGLE_CHR_SHIFTL:
20579 NEXT_RULEPOS (rule_pos);
20580 NEXT_RPTOI (rule, rule_pos, upos);
20581 mangle_chr_shiftl (out, out_len, upos);
20582 break;
20583
20584 case RULE_OP_MANGLE_CHR_SHIFTR:
20585 NEXT_RULEPOS (rule_pos);
20586 NEXT_RPTOI (rule, rule_pos, upos);
20587 mangle_chr_shiftr (out, out_len, upos);
20588 break;
20589
20590 case RULE_OP_MANGLE_CHR_INCR:
20591 NEXT_RULEPOS (rule_pos);
20592 NEXT_RPTOI (rule, rule_pos, upos);
20593 mangle_chr_incr (out, out_len, upos);
20594 break;
20595
20596 case RULE_OP_MANGLE_CHR_DECR:
20597 NEXT_RULEPOS (rule_pos);
20598 NEXT_RPTOI (rule, rule_pos, upos);
20599 mangle_chr_decr (out, out_len, upos);
20600 break;
20601
20602 case RULE_OP_MANGLE_REPLACE_NP1:
20603 NEXT_RULEPOS (rule_pos);
20604 NEXT_RPTOI (rule, rule_pos, upos);
20605 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20606 break;
20607
20608 case RULE_OP_MANGLE_REPLACE_NM1:
20609 NEXT_RULEPOS (rule_pos);
20610 NEXT_RPTOI (rule, rule_pos, upos);
20611 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20612 break;
20613
20614 case RULE_OP_MANGLE_TITLE:
20615 out_len = mangle_title (out, out_len);
20616 break;
20617
20618 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20619 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20620 NEXT_RULEPOS (rule_pos);
20621 NEXT_RPTOI (rule, rule_pos, upos);
20622 NEXT_RULEPOS (rule_pos);
20623 NEXT_RPTOI (rule, rule_pos, ulen);
20624 NEXT_RULEPOS (rule_pos);
20625 NEXT_RPTOI (rule, rule_pos, upos2);
20626 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20627 break;
20628
20629 case RULE_OP_MANGLE_APPEND_MEMORY:
20630 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20631 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20632 memcpy (out + out_len, mem, mem_len);
20633 out_len += mem_len;
20634 break;
20635
20636 case RULE_OP_MANGLE_PREPEND_MEMORY:
20637 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20638 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20639 memcpy (mem + mem_len, out, out_len);
20640 out_len += mem_len;
20641 memcpy (out, mem, out_len);
20642 break;
20643
20644 case RULE_OP_MEMORIZE_WORD:
20645 memcpy (mem, out, out_len);
20646 mem_len = out_len;
20647 break;
20648
20649 case RULE_OP_REJECT_LESS:
20650 NEXT_RULEPOS (rule_pos);
20651 NEXT_RPTOI (rule, rule_pos, upos);
20652 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20653 break;
20654
20655 case RULE_OP_REJECT_GREATER:
20656 NEXT_RULEPOS (rule_pos);
20657 NEXT_RPTOI (rule, rule_pos, upos);
20658 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20659 break;
20660
20661 case RULE_OP_REJECT_CONTAIN:
20662 NEXT_RULEPOS (rule_pos);
20663 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20664 break;
20665
20666 case RULE_OP_REJECT_NOT_CONTAIN:
20667 NEXT_RULEPOS (rule_pos);
20668 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20669 break;
20670
20671 case RULE_OP_REJECT_EQUAL_FIRST:
20672 NEXT_RULEPOS (rule_pos);
20673 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20674 break;
20675
20676 case RULE_OP_REJECT_EQUAL_LAST:
20677 NEXT_RULEPOS (rule_pos);
20678 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20679 break;
20680
20681 case RULE_OP_REJECT_EQUAL_AT:
20682 NEXT_RULEPOS (rule_pos);
20683 NEXT_RPTOI (rule, rule_pos, upos);
20684 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20685 NEXT_RULEPOS (rule_pos);
20686 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20687 break;
20688
20689 case RULE_OP_REJECT_CONTAINS:
20690 NEXT_RULEPOS (rule_pos);
20691 NEXT_RPTOI (rule, rule_pos, upos);
20692 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20693 NEXT_RULEPOS (rule_pos);
20694 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20695 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20696 break;
20697
20698 case RULE_OP_REJECT_MEMORY:
20699 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20700 break;
20701
20702 default:
20703 return (RULE_RC_SYNTAX_ERROR);
20704 break;
20705 }
20706 }
20707
20708 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20709
20710 return (out_len);
20711 }