Merge pull request #179 from gm4tr1x/FixAppleOpenCLCompilerIssue
[hashcat.git] / src / shared.c
1 /**
2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
4 *
5 * License.....: MIT
6 */
7
8 #ifdef OSX
9 #include <stdio.h>
10 #endif
11
12 #include <shared.h>
13 #include <limits.h>
14
15 /**
16 * tuning tools
17 */
18
19 #define GET_ACCEL(x) KERNEL_ACCEL_ ## x
20 #define GET_LOOPS(x) KERNEL_LOOPS_ ## x
21
22 /**
23 * basic bit handling
24 */
25
26 u32 rotl32 (const u32 a, const u32 n)
27 {
28 return ((a << n) | (a >> (32 - n)));
29 }
30
31 u32 rotr32 (const u32 a, const u32 n)
32 {
33 return ((a >> n) | (a << (32 - n)));
34 }
35
36 u64 rotl64 (const u64 a, const u64 n)
37 {
38 return ((a << n) | (a >> (64 - n)));
39 }
40
41 u64 rotr64 (const u64 a, const u64 n)
42 {
43 return ((a >> n) | (a << (64 - n)));
44 }
45
46 u32 byte_swap_32 (const u32 n)
47 {
48 return (n & 0xff000000) >> 24
49 | (n & 0x00ff0000) >> 8
50 | (n & 0x0000ff00) << 8
51 | (n & 0x000000ff) << 24;
52 }
53
54 u64 byte_swap_64 (const u64 n)
55 {
56 return (n & 0xff00000000000000ULL) >> 56
57 | (n & 0x00ff000000000000ULL) >> 40
58 | (n & 0x0000ff0000000000ULL) >> 24
59 | (n & 0x000000ff00000000ULL) >> 8
60 | (n & 0x00000000ff000000ULL) << 8
61 | (n & 0x0000000000ff0000ULL) << 24
62 | (n & 0x000000000000ff00ULL) << 40
63 | (n & 0x00000000000000ffULL) << 56;
64 }
65
66 /**
67 * ciphers for use on cpu
68 */
69
70 #include "cpu-des.c"
71 #include "cpu-aes.c"
72
73 /**
74 * hashes for use on cpu
75 */
76
77 #include "cpu-md5.c"
78 #include "cpu-sha256.c"
79
80 /**
81 * logging
82 */
83
84 int last_len = 0;
85
86 void log_final (FILE *fp, const char *fmt, va_list ap)
87 {
88 if (last_len)
89 {
90 fputc ('\r', fp);
91
92 for (int i = 0; i < last_len; i++)
93 {
94 fputc (' ', fp);
95 }
96
97 fputc ('\r', fp);
98 }
99
100 char s[4096] = { 0 };
101
102 int max_len = (int) sizeof (s);
103
104 int len = vsnprintf (s, max_len, fmt, ap);
105
106 if (len > max_len) len = max_len;
107
108 fwrite (s, len, 1, fp);
109
110 fflush (fp);
111
112 last_len = len;
113 }
114
115 void log_out_nn (FILE *fp, const char *fmt, ...)
116 {
117 if (SUPPRESS_OUTPUT) return;
118
119 va_list ap;
120
121 va_start (ap, fmt);
122
123 log_final (fp, fmt, ap);
124
125 va_end (ap);
126 }
127
128 void log_info_nn (const char *fmt, ...)
129 {
130 if (SUPPRESS_OUTPUT) return;
131
132 va_list ap;
133
134 va_start (ap, fmt);
135
136 log_final (stdout, fmt, ap);
137
138 va_end (ap);
139 }
140
141 void log_error_nn (const char *fmt, ...)
142 {
143 if (SUPPRESS_OUTPUT) return;
144
145 va_list ap;
146
147 va_start (ap, fmt);
148
149 log_final (stderr, fmt, ap);
150
151 va_end (ap);
152 }
153
154 void log_out (FILE *fp, const char *fmt, ...)
155 {
156 if (SUPPRESS_OUTPUT) return;
157
158 va_list ap;
159
160 va_start (ap, fmt);
161
162 log_final (fp, fmt, ap);
163
164 va_end (ap);
165
166 fputc ('\n', fp);
167
168 last_len = 0;
169 }
170
171 void log_info (const char *fmt, ...)
172 {
173 if (SUPPRESS_OUTPUT) return;
174
175 va_list ap;
176
177 va_start (ap, fmt);
178
179 log_final (stdout, fmt, ap);
180
181 va_end (ap);
182
183 fputc ('\n', stdout);
184
185 last_len = 0;
186 }
187
188 void log_error (const char *fmt, ...)
189 {
190 if (SUPPRESS_OUTPUT) return;
191
192 fputc ('\n', stderr);
193 fputc ('\n', stderr);
194
195 va_list ap;
196
197 va_start (ap, fmt);
198
199 log_final (stderr, fmt, ap);
200
201 va_end (ap);
202
203 fputc ('\n', stderr);
204 fputc ('\n', stderr);
205
206 last_len = 0;
207 }
208
209 /**
210 * converter
211 */
212
213 u8 int_to_base32 (const u8 c)
214 {
215 static const u8 tbl[0x20] =
216 {
217 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
218 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
219 };
220
221 return tbl[c];
222 }
223
224 u8 base32_to_int (const u8 c)
225 {
226 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
227 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
228
229 return 0;
230 }
231
232 u8 int_to_itoa32 (const u8 c)
233 {
234 static const u8 tbl[0x20] =
235 {
236 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
237 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
238 };
239
240 return tbl[c];
241 }
242
243 u8 itoa32_to_int (const u8 c)
244 {
245 if ((c >= '0') && (c <= '9')) return c - '0';
246 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
247
248 return 0;
249 }
250
251 u8 int_to_itoa64 (const u8 c)
252 {
253 static const u8 tbl[0x40] =
254 {
255 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
256 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
257 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
258 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
259 };
260
261 return tbl[c];
262 }
263
264 u8 itoa64_to_int (const u8 c)
265 {
266 static const u8 tbl[0x100] =
267 {
268 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
269 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
270 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
271 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
272 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
273 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
274 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
275 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
276 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
277 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
278 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
279 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
280 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
281 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
282 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
283 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
284 };
285
286 return tbl[c];
287 }
288
289 u8 int_to_base64 (const u8 c)
290 {
291 static const u8 tbl[0x40] =
292 {
293 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
294 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
295 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
296 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
297 };
298
299 return tbl[c];
300 }
301
302 u8 base64_to_int (const u8 c)
303 {
304 static const u8 tbl[0x100] =
305 {
306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
309 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
311 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
313 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 };
323
324 return tbl[c];
325 }
326
327 u8 int_to_bf64 (const u8 c)
328 {
329 static const u8 tbl[0x40] =
330 {
331 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
332 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
333 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
334 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
335 };
336
337 return tbl[c];
338 }
339
340 u8 bf64_to_int (const u8 c)
341 {
342 static const u8 tbl[0x100] =
343 {
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
347 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
349 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
351 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 };
361
362 return tbl[c];
363 }
364
365 u8 int_to_lotus64 (const u8 c)
366 {
367 if (c < 10) return '0' + c;
368 else if (c < 36) return 'A' + c - 10;
369 else if (c < 62) return 'a' + c - 36;
370 else if (c == 62) return '+';
371 else if (c == 63) return '/';
372
373 return 0;
374 }
375
376 u8 lotus64_to_int (const u8 c)
377 {
378 if ((c >= '0') && (c <= '9')) return c - '0';
379 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
380 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
381 else if (c == '+') return 62;
382 else if (c == '/') return 63;
383 else
384
385 return 0;
386 }
387
388 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
389 {
390 const u8 *in_ptr = in_buf;
391
392 u8 *out_ptr = out_buf;
393
394 for (int i = 0; i < in_len; i += 8)
395 {
396 const u8 out_val0 = f (in_ptr[0] & 0x7f);
397 const u8 out_val1 = f (in_ptr[1] & 0x7f);
398 const u8 out_val2 = f (in_ptr[2] & 0x7f);
399 const u8 out_val3 = f (in_ptr[3] & 0x7f);
400 const u8 out_val4 = f (in_ptr[4] & 0x7f);
401 const u8 out_val5 = f (in_ptr[5] & 0x7f);
402 const u8 out_val6 = f (in_ptr[6] & 0x7f);
403 const u8 out_val7 = f (in_ptr[7] & 0x7f);
404
405 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
406 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
407 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
408 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
409 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
410
411 in_ptr += 8;
412 out_ptr += 5;
413 }
414
415 for (int i = 0; i < in_len; i++)
416 {
417 if (in_buf[i] != '=') continue;
418
419 in_len = i;
420 }
421
422 int out_len = (in_len * 5) / 8;
423
424 return out_len;
425 }
426
427 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
428 {
429 const u8 *in_ptr = in_buf;
430
431 u8 *out_ptr = out_buf;
432
433 for (int i = 0; i < in_len; i += 5)
434 {
435 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
436 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
437 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
438 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
439 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
440 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
441 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
442 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
443
444 out_ptr[0] = out_val0 & 0x7f;
445 out_ptr[1] = out_val1 & 0x7f;
446 out_ptr[2] = out_val2 & 0x7f;
447 out_ptr[3] = out_val3 & 0x7f;
448 out_ptr[4] = out_val4 & 0x7f;
449 out_ptr[5] = out_val5 & 0x7f;
450 out_ptr[6] = out_val6 & 0x7f;
451 out_ptr[7] = out_val7 & 0x7f;
452
453 in_ptr += 5;
454 out_ptr += 8;
455 }
456
457 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
458
459 while (out_len % 8)
460 {
461 out_buf[out_len] = '=';
462
463 out_len++;
464 }
465
466 return out_len;
467 }
468
469 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
470 {
471 const u8 *in_ptr = in_buf;
472
473 u8 *out_ptr = out_buf;
474
475 for (int i = 0; i < in_len; i += 4)
476 {
477 const u8 out_val0 = f (in_ptr[0] & 0x7f);
478 const u8 out_val1 = f (in_ptr[1] & 0x7f);
479 const u8 out_val2 = f (in_ptr[2] & 0x7f);
480 const u8 out_val3 = f (in_ptr[3] & 0x7f);
481
482 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
483 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
484 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
485
486 in_ptr += 4;
487 out_ptr += 3;
488 }
489
490 for (int i = 0; i < in_len; i++)
491 {
492 if (in_buf[i] != '=') continue;
493
494 in_len = i;
495 }
496
497 int out_len = (in_len * 6) / 8;
498
499 return out_len;
500 }
501
502 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
503 {
504 const u8 *in_ptr = in_buf;
505
506 u8 *out_ptr = out_buf;
507
508 for (int i = 0; i < in_len; i += 3)
509 {
510 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
511 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
512 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
513 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
514
515 out_ptr[0] = out_val0 & 0x7f;
516 out_ptr[1] = out_val1 & 0x7f;
517 out_ptr[2] = out_val2 & 0x7f;
518 out_ptr[3] = out_val3 & 0x7f;
519
520 in_ptr += 3;
521 out_ptr += 4;
522 }
523
524 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
525
526 while (out_len % 4)
527 {
528 out_buf[out_len] = '=';
529
530 out_len++;
531 }
532
533 return out_len;
534 }
535
536 int is_valid_hex_char (const u8 c)
537 {
538 if ((c >= '0') && (c <= '9')) return 1;
539 if ((c >= 'A') && (c <= 'F')) return 1;
540 if ((c >= 'a') && (c <= 'f')) return 1;
541
542 return 0;
543 }
544
545 u8 hex_convert (const u8 c)
546 {
547 return (c & 15) + (c >> 6) * 9;
548 }
549
550 u8 hex_to_u8 (const u8 hex[2])
551 {
552 u8 v = 0;
553
554 v |= (hex_convert (hex[1]) << 0);
555 v |= (hex_convert (hex[0]) << 4);
556
557 return (v);
558 }
559
560 u32 hex_to_u32 (const u8 hex[8])
561 {
562 u32 v = 0;
563
564 v |= ((u32) hex_convert (hex[7])) << 0;
565 v |= ((u32) hex_convert (hex[6])) << 4;
566 v |= ((u32) hex_convert (hex[5])) << 8;
567 v |= ((u32) hex_convert (hex[4])) << 12;
568 v |= ((u32) hex_convert (hex[3])) << 16;
569 v |= ((u32) hex_convert (hex[2])) << 20;
570 v |= ((u32) hex_convert (hex[1])) << 24;
571 v |= ((u32) hex_convert (hex[0])) << 28;
572
573 return (v);
574 }
575
576 u64 hex_to_u64 (const u8 hex[16])
577 {
578 u64 v = 0;
579
580 v |= ((u64) hex_convert (hex[15]) << 0);
581 v |= ((u64) hex_convert (hex[14]) << 4);
582 v |= ((u64) hex_convert (hex[13]) << 8);
583 v |= ((u64) hex_convert (hex[12]) << 12);
584 v |= ((u64) hex_convert (hex[11]) << 16);
585 v |= ((u64) hex_convert (hex[10]) << 20);
586 v |= ((u64) hex_convert (hex[ 9]) << 24);
587 v |= ((u64) hex_convert (hex[ 8]) << 28);
588 v |= ((u64) hex_convert (hex[ 7]) << 32);
589 v |= ((u64) hex_convert (hex[ 6]) << 36);
590 v |= ((u64) hex_convert (hex[ 5]) << 40);
591 v |= ((u64) hex_convert (hex[ 4]) << 44);
592 v |= ((u64) hex_convert (hex[ 3]) << 48);
593 v |= ((u64) hex_convert (hex[ 2]) << 52);
594 v |= ((u64) hex_convert (hex[ 1]) << 56);
595 v |= ((u64) hex_convert (hex[ 0]) << 60);
596
597 return (v);
598 }
599
600 void bin_to_hex_lower (const u32 v, u8 hex[8])
601 {
602 hex[0] = v >> 28 & 15;
603 hex[1] = v >> 24 & 15;
604 hex[2] = v >> 20 & 15;
605 hex[3] = v >> 16 & 15;
606 hex[4] = v >> 12 & 15;
607 hex[5] = v >> 8 & 15;
608 hex[6] = v >> 4 & 15;
609 hex[7] = v >> 0 & 15;
610
611 u32 add;
612
613 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
614 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
615 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
616 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
617 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
618 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
619 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
620 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
621 }
622
623 /**
624 * decoder
625 */
626
627 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
628 {
629 AES_KEY skey;
630
631 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
632
633 u32 _iv[4] = { 0 };
634
635 _iv[0] = iv[0];
636 _iv[1] = iv[1];
637 _iv[2] = iv[2];
638 _iv[3] = iv[3];
639
640 for (int i = 0; i < 16; i += 4)
641 {
642 u32 _in[4] = { 0 };
643 u32 _out[4] = { 0 };
644
645 _in[0] = in[i + 0];
646 _in[1] = in[i + 1];
647 _in[2] = in[i + 2];
648 _in[3] = in[i + 3];
649
650 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
651
652 _out[0] ^= _iv[0];
653 _out[1] ^= _iv[1];
654 _out[2] ^= _iv[2];
655 _out[3] ^= _iv[3];
656
657 out[i + 0] = _out[0];
658 out[i + 1] = _out[1];
659 out[i + 2] = _out[2];
660 out[i + 3] = _out[3];
661
662 _iv[0] = _in[0];
663 _iv[1] = _in[1];
664 _iv[2] = _in[2];
665 _iv[3] = _in[3];
666 }
667 }
668
669 static void juniper_decrypt_hash (char *in, char *out)
670 {
671 // base64 decode
672
673 u8 base64_buf[100] = { 0 };
674
675 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
676
677 // iv stuff
678
679 u32 juniper_iv[4] = { 0 };
680
681 memcpy (juniper_iv, base64_buf, 12);
682
683 memcpy (out, juniper_iv, 12);
684
685 // reversed key
686
687 u32 juniper_key[4] = { 0 };
688
689 juniper_key[0] = byte_swap_32 (0xa6707a7e);
690 juniper_key[1] = byte_swap_32 (0x8df91059);
691 juniper_key[2] = byte_swap_32 (0xdea70ae5);
692 juniper_key[3] = byte_swap_32 (0x2f9c2442);
693
694 // AES decrypt
695
696 u32 *in_ptr = (u32 *) (base64_buf + 12);
697 u32 *out_ptr = (u32 *) (out + 12);
698
699 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
700 }
701
702 void phpass_decode (u8 digest[16], u8 buf[22])
703 {
704 int l;
705
706 l = itoa64_to_int (buf[ 0]) << 0;
707 l |= itoa64_to_int (buf[ 1]) << 6;
708 l |= itoa64_to_int (buf[ 2]) << 12;
709 l |= itoa64_to_int (buf[ 3]) << 18;
710
711 digest[ 0] = (l >> 0) & 0xff;
712 digest[ 1] = (l >> 8) & 0xff;
713 digest[ 2] = (l >> 16) & 0xff;
714
715 l = itoa64_to_int (buf[ 4]) << 0;
716 l |= itoa64_to_int (buf[ 5]) << 6;
717 l |= itoa64_to_int (buf[ 6]) << 12;
718 l |= itoa64_to_int (buf[ 7]) << 18;
719
720 digest[ 3] = (l >> 0) & 0xff;
721 digest[ 4] = (l >> 8) & 0xff;
722 digest[ 5] = (l >> 16) & 0xff;
723
724 l = itoa64_to_int (buf[ 8]) << 0;
725 l |= itoa64_to_int (buf[ 9]) << 6;
726 l |= itoa64_to_int (buf[10]) << 12;
727 l |= itoa64_to_int (buf[11]) << 18;
728
729 digest[ 6] = (l >> 0) & 0xff;
730 digest[ 7] = (l >> 8) & 0xff;
731 digest[ 8] = (l >> 16) & 0xff;
732
733 l = itoa64_to_int (buf[12]) << 0;
734 l |= itoa64_to_int (buf[13]) << 6;
735 l |= itoa64_to_int (buf[14]) << 12;
736 l |= itoa64_to_int (buf[15]) << 18;
737
738 digest[ 9] = (l >> 0) & 0xff;
739 digest[10] = (l >> 8) & 0xff;
740 digest[11] = (l >> 16) & 0xff;
741
742 l = itoa64_to_int (buf[16]) << 0;
743 l |= itoa64_to_int (buf[17]) << 6;
744 l |= itoa64_to_int (buf[18]) << 12;
745 l |= itoa64_to_int (buf[19]) << 18;
746
747 digest[12] = (l >> 0) & 0xff;
748 digest[13] = (l >> 8) & 0xff;
749 digest[14] = (l >> 16) & 0xff;
750
751 l = itoa64_to_int (buf[20]) << 0;
752 l |= itoa64_to_int (buf[21]) << 6;
753
754 digest[15] = (l >> 0) & 0xff;
755 }
756
757 void phpass_encode (u8 digest[16], u8 buf[22])
758 {
759 int l;
760
761 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
762
763 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
764 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
765 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
766 buf[ 3] = int_to_itoa64 (l & 0x3f);
767
768 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
769
770 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
771 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
772 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
773 buf[ 7] = int_to_itoa64 (l & 0x3f);
774
775 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
776
777 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
778 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
779 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[11] = int_to_itoa64 (l & 0x3f);
781
782 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
783
784 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
785 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
786 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[15] = int_to_itoa64 (l & 0x3f);
788
789 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
790
791 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
792 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
793 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
794 buf[19] = int_to_itoa64 (l & 0x3f);
795
796 l = (digest[15] << 0);
797
798 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
799 buf[21] = int_to_itoa64 (l & 0x3f);
800 }
801
802 void md5crypt_decode (u8 digest[16], u8 buf[22])
803 {
804 int l;
805
806 l = itoa64_to_int (buf[ 0]) << 0;
807 l |= itoa64_to_int (buf[ 1]) << 6;
808 l |= itoa64_to_int (buf[ 2]) << 12;
809 l |= itoa64_to_int (buf[ 3]) << 18;
810
811 digest[ 0] = (l >> 16) & 0xff;
812 digest[ 6] = (l >> 8) & 0xff;
813 digest[12] = (l >> 0) & 0xff;
814
815 l = itoa64_to_int (buf[ 4]) << 0;
816 l |= itoa64_to_int (buf[ 5]) << 6;
817 l |= itoa64_to_int (buf[ 6]) << 12;
818 l |= itoa64_to_int (buf[ 7]) << 18;
819
820 digest[ 1] = (l >> 16) & 0xff;
821 digest[ 7] = (l >> 8) & 0xff;
822 digest[13] = (l >> 0) & 0xff;
823
824 l = itoa64_to_int (buf[ 8]) << 0;
825 l |= itoa64_to_int (buf[ 9]) << 6;
826 l |= itoa64_to_int (buf[10]) << 12;
827 l |= itoa64_to_int (buf[11]) << 18;
828
829 digest[ 2] = (l >> 16) & 0xff;
830 digest[ 8] = (l >> 8) & 0xff;
831 digest[14] = (l >> 0) & 0xff;
832
833 l = itoa64_to_int (buf[12]) << 0;
834 l |= itoa64_to_int (buf[13]) << 6;
835 l |= itoa64_to_int (buf[14]) << 12;
836 l |= itoa64_to_int (buf[15]) << 18;
837
838 digest[ 3] = (l >> 16) & 0xff;
839 digest[ 9] = (l >> 8) & 0xff;
840 digest[15] = (l >> 0) & 0xff;
841
842 l = itoa64_to_int (buf[16]) << 0;
843 l |= itoa64_to_int (buf[17]) << 6;
844 l |= itoa64_to_int (buf[18]) << 12;
845 l |= itoa64_to_int (buf[19]) << 18;
846
847 digest[ 4] = (l >> 16) & 0xff;
848 digest[10] = (l >> 8) & 0xff;
849 digest[ 5] = (l >> 0) & 0xff;
850
851 l = itoa64_to_int (buf[20]) << 0;
852 l |= itoa64_to_int (buf[21]) << 6;
853
854 digest[11] = (l >> 0) & 0xff;
855 }
856
857 void md5crypt_encode (u8 digest[16], u8 buf[22])
858 {
859 int l;
860
861 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
862
863 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
864 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
865 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
866 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
867
868 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
869
870 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
871 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
872 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
873 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
874
875 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
876
877 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
878 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
879 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
881
882 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
883
884 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
885 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
886 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
888
889 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
890
891 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
892 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
893 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
894 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
895
896 l = (digest[11] << 0);
897
898 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
899 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
900 }
901
902 void sha512crypt_decode (u8 digest[64], u8 buf[86])
903 {
904 int l;
905
906 l = itoa64_to_int (buf[ 0]) << 0;
907 l |= itoa64_to_int (buf[ 1]) << 6;
908 l |= itoa64_to_int (buf[ 2]) << 12;
909 l |= itoa64_to_int (buf[ 3]) << 18;
910
911 digest[ 0] = (l >> 16) & 0xff;
912 digest[21] = (l >> 8) & 0xff;
913 digest[42] = (l >> 0) & 0xff;
914
915 l = itoa64_to_int (buf[ 4]) << 0;
916 l |= itoa64_to_int (buf[ 5]) << 6;
917 l |= itoa64_to_int (buf[ 6]) << 12;
918 l |= itoa64_to_int (buf[ 7]) << 18;
919
920 digest[22] = (l >> 16) & 0xff;
921 digest[43] = (l >> 8) & 0xff;
922 digest[ 1] = (l >> 0) & 0xff;
923
924 l = itoa64_to_int (buf[ 8]) << 0;
925 l |= itoa64_to_int (buf[ 9]) << 6;
926 l |= itoa64_to_int (buf[10]) << 12;
927 l |= itoa64_to_int (buf[11]) << 18;
928
929 digest[44] = (l >> 16) & 0xff;
930 digest[ 2] = (l >> 8) & 0xff;
931 digest[23] = (l >> 0) & 0xff;
932
933 l = itoa64_to_int (buf[12]) << 0;
934 l |= itoa64_to_int (buf[13]) << 6;
935 l |= itoa64_to_int (buf[14]) << 12;
936 l |= itoa64_to_int (buf[15]) << 18;
937
938 digest[ 3] = (l >> 16) & 0xff;
939 digest[24] = (l >> 8) & 0xff;
940 digest[45] = (l >> 0) & 0xff;
941
942 l = itoa64_to_int (buf[16]) << 0;
943 l |= itoa64_to_int (buf[17]) << 6;
944 l |= itoa64_to_int (buf[18]) << 12;
945 l |= itoa64_to_int (buf[19]) << 18;
946
947 digest[25] = (l >> 16) & 0xff;
948 digest[46] = (l >> 8) & 0xff;
949 digest[ 4] = (l >> 0) & 0xff;
950
951 l = itoa64_to_int (buf[20]) << 0;
952 l |= itoa64_to_int (buf[21]) << 6;
953 l |= itoa64_to_int (buf[22]) << 12;
954 l |= itoa64_to_int (buf[23]) << 18;
955
956 digest[47] = (l >> 16) & 0xff;
957 digest[ 5] = (l >> 8) & 0xff;
958 digest[26] = (l >> 0) & 0xff;
959
960 l = itoa64_to_int (buf[24]) << 0;
961 l |= itoa64_to_int (buf[25]) << 6;
962 l |= itoa64_to_int (buf[26]) << 12;
963 l |= itoa64_to_int (buf[27]) << 18;
964
965 digest[ 6] = (l >> 16) & 0xff;
966 digest[27] = (l >> 8) & 0xff;
967 digest[48] = (l >> 0) & 0xff;
968
969 l = itoa64_to_int (buf[28]) << 0;
970 l |= itoa64_to_int (buf[29]) << 6;
971 l |= itoa64_to_int (buf[30]) << 12;
972 l |= itoa64_to_int (buf[31]) << 18;
973
974 digest[28] = (l >> 16) & 0xff;
975 digest[49] = (l >> 8) & 0xff;
976 digest[ 7] = (l >> 0) & 0xff;
977
978 l = itoa64_to_int (buf[32]) << 0;
979 l |= itoa64_to_int (buf[33]) << 6;
980 l |= itoa64_to_int (buf[34]) << 12;
981 l |= itoa64_to_int (buf[35]) << 18;
982
983 digest[50] = (l >> 16) & 0xff;
984 digest[ 8] = (l >> 8) & 0xff;
985 digest[29] = (l >> 0) & 0xff;
986
987 l = itoa64_to_int (buf[36]) << 0;
988 l |= itoa64_to_int (buf[37]) << 6;
989 l |= itoa64_to_int (buf[38]) << 12;
990 l |= itoa64_to_int (buf[39]) << 18;
991
992 digest[ 9] = (l >> 16) & 0xff;
993 digest[30] = (l >> 8) & 0xff;
994 digest[51] = (l >> 0) & 0xff;
995
996 l = itoa64_to_int (buf[40]) << 0;
997 l |= itoa64_to_int (buf[41]) << 6;
998 l |= itoa64_to_int (buf[42]) << 12;
999 l |= itoa64_to_int (buf[43]) << 18;
1000
1001 digest[31] = (l >> 16) & 0xff;
1002 digest[52] = (l >> 8) & 0xff;
1003 digest[10] = (l >> 0) & 0xff;
1004
1005 l = itoa64_to_int (buf[44]) << 0;
1006 l |= itoa64_to_int (buf[45]) << 6;
1007 l |= itoa64_to_int (buf[46]) << 12;
1008 l |= itoa64_to_int (buf[47]) << 18;
1009
1010 digest[53] = (l >> 16) & 0xff;
1011 digest[11] = (l >> 8) & 0xff;
1012 digest[32] = (l >> 0) & 0xff;
1013
1014 l = itoa64_to_int (buf[48]) << 0;
1015 l |= itoa64_to_int (buf[49]) << 6;
1016 l |= itoa64_to_int (buf[50]) << 12;
1017 l |= itoa64_to_int (buf[51]) << 18;
1018
1019 digest[12] = (l >> 16) & 0xff;
1020 digest[33] = (l >> 8) & 0xff;
1021 digest[54] = (l >> 0) & 0xff;
1022
1023 l = itoa64_to_int (buf[52]) << 0;
1024 l |= itoa64_to_int (buf[53]) << 6;
1025 l |= itoa64_to_int (buf[54]) << 12;
1026 l |= itoa64_to_int (buf[55]) << 18;
1027
1028 digest[34] = (l >> 16) & 0xff;
1029 digest[55] = (l >> 8) & 0xff;
1030 digest[13] = (l >> 0) & 0xff;
1031
1032 l = itoa64_to_int (buf[56]) << 0;
1033 l |= itoa64_to_int (buf[57]) << 6;
1034 l |= itoa64_to_int (buf[58]) << 12;
1035 l |= itoa64_to_int (buf[59]) << 18;
1036
1037 digest[56] = (l >> 16) & 0xff;
1038 digest[14] = (l >> 8) & 0xff;
1039 digest[35] = (l >> 0) & 0xff;
1040
1041 l = itoa64_to_int (buf[60]) << 0;
1042 l |= itoa64_to_int (buf[61]) << 6;
1043 l |= itoa64_to_int (buf[62]) << 12;
1044 l |= itoa64_to_int (buf[63]) << 18;
1045
1046 digest[15] = (l >> 16) & 0xff;
1047 digest[36] = (l >> 8) & 0xff;
1048 digest[57] = (l >> 0) & 0xff;
1049
1050 l = itoa64_to_int (buf[64]) << 0;
1051 l |= itoa64_to_int (buf[65]) << 6;
1052 l |= itoa64_to_int (buf[66]) << 12;
1053 l |= itoa64_to_int (buf[67]) << 18;
1054
1055 digest[37] = (l >> 16) & 0xff;
1056 digest[58] = (l >> 8) & 0xff;
1057 digest[16] = (l >> 0) & 0xff;
1058
1059 l = itoa64_to_int (buf[68]) << 0;
1060 l |= itoa64_to_int (buf[69]) << 6;
1061 l |= itoa64_to_int (buf[70]) << 12;
1062 l |= itoa64_to_int (buf[71]) << 18;
1063
1064 digest[59] = (l >> 16) & 0xff;
1065 digest[17] = (l >> 8) & 0xff;
1066 digest[38] = (l >> 0) & 0xff;
1067
1068 l = itoa64_to_int (buf[72]) << 0;
1069 l |= itoa64_to_int (buf[73]) << 6;
1070 l |= itoa64_to_int (buf[74]) << 12;
1071 l |= itoa64_to_int (buf[75]) << 18;
1072
1073 digest[18] = (l >> 16) & 0xff;
1074 digest[39] = (l >> 8) & 0xff;
1075 digest[60] = (l >> 0) & 0xff;
1076
1077 l = itoa64_to_int (buf[76]) << 0;
1078 l |= itoa64_to_int (buf[77]) << 6;
1079 l |= itoa64_to_int (buf[78]) << 12;
1080 l |= itoa64_to_int (buf[79]) << 18;
1081
1082 digest[40] = (l >> 16) & 0xff;
1083 digest[61] = (l >> 8) & 0xff;
1084 digest[19] = (l >> 0) & 0xff;
1085
1086 l = itoa64_to_int (buf[80]) << 0;
1087 l |= itoa64_to_int (buf[81]) << 6;
1088 l |= itoa64_to_int (buf[82]) << 12;
1089 l |= itoa64_to_int (buf[83]) << 18;
1090
1091 digest[62] = (l >> 16) & 0xff;
1092 digest[20] = (l >> 8) & 0xff;
1093 digest[41] = (l >> 0) & 0xff;
1094
1095 l = itoa64_to_int (buf[84]) << 0;
1096 l |= itoa64_to_int (buf[85]) << 6;
1097
1098 digest[63] = (l >> 0) & 0xff;
1099 }
1100
1101 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1102 {
1103 int l;
1104
1105 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1106
1107 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1108 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1109 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111
1112 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1113
1114 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1115 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1116 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118
1119 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1120
1121 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1122 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1123 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125
1126 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1127
1128 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1129 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1130 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132
1133 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1134
1135 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1136 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1137 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139
1140 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1141
1142 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1143 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1144 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146
1147 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1148
1149 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1150 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1151 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153
1154 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1155
1156 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1157 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1158 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160
1161 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1162
1163 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1164 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1165 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167
1168 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1169
1170 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1171 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1172 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174
1175 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1176
1177 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1178 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1179 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181
1182 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1183
1184 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1185 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1186 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188
1189 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1190
1191 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1192 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1193 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195
1196 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1197
1198 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1199 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1200 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202
1203 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1204
1205 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1206 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1207 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209
1210 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1211
1212 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1213 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1214 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216
1217 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1218
1219 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1220 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1221 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223
1224 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1225
1226 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1227 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1228 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230
1231 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1232
1233 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1234 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1235 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237
1238 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1239
1240 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1241 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1242 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244
1245 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1246
1247 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1248 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1249 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1250 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251
1252 l = 0 | 0 | (digest[63] << 0);
1253
1254 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1255 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1256 }
1257
1258 void sha1aix_decode (u8 digest[20], u8 buf[27])
1259 {
1260 int l;
1261
1262 l = itoa64_to_int (buf[ 0]) << 0;
1263 l |= itoa64_to_int (buf[ 1]) << 6;
1264 l |= itoa64_to_int (buf[ 2]) << 12;
1265 l |= itoa64_to_int (buf[ 3]) << 18;
1266
1267 digest[ 2] = (l >> 0) & 0xff;
1268 digest[ 1] = (l >> 8) & 0xff;
1269 digest[ 0] = (l >> 16) & 0xff;
1270
1271 l = itoa64_to_int (buf[ 4]) << 0;
1272 l |= itoa64_to_int (buf[ 5]) << 6;
1273 l |= itoa64_to_int (buf[ 6]) << 12;
1274 l |= itoa64_to_int (buf[ 7]) << 18;
1275
1276 digest[ 5] = (l >> 0) & 0xff;
1277 digest[ 4] = (l >> 8) & 0xff;
1278 digest[ 3] = (l >> 16) & 0xff;
1279
1280 l = itoa64_to_int (buf[ 8]) << 0;
1281 l |= itoa64_to_int (buf[ 9]) << 6;
1282 l |= itoa64_to_int (buf[10]) << 12;
1283 l |= itoa64_to_int (buf[11]) << 18;
1284
1285 digest[ 8] = (l >> 0) & 0xff;
1286 digest[ 7] = (l >> 8) & 0xff;
1287 digest[ 6] = (l >> 16) & 0xff;
1288
1289 l = itoa64_to_int (buf[12]) << 0;
1290 l |= itoa64_to_int (buf[13]) << 6;
1291 l |= itoa64_to_int (buf[14]) << 12;
1292 l |= itoa64_to_int (buf[15]) << 18;
1293
1294 digest[11] = (l >> 0) & 0xff;
1295 digest[10] = (l >> 8) & 0xff;
1296 digest[ 9] = (l >> 16) & 0xff;
1297
1298 l = itoa64_to_int (buf[16]) << 0;
1299 l |= itoa64_to_int (buf[17]) << 6;
1300 l |= itoa64_to_int (buf[18]) << 12;
1301 l |= itoa64_to_int (buf[19]) << 18;
1302
1303 digest[14] = (l >> 0) & 0xff;
1304 digest[13] = (l >> 8) & 0xff;
1305 digest[12] = (l >> 16) & 0xff;
1306
1307 l = itoa64_to_int (buf[20]) << 0;
1308 l |= itoa64_to_int (buf[21]) << 6;
1309 l |= itoa64_to_int (buf[22]) << 12;
1310 l |= itoa64_to_int (buf[23]) << 18;
1311
1312 digest[17] = (l >> 0) & 0xff;
1313 digest[16] = (l >> 8) & 0xff;
1314 digest[15] = (l >> 16) & 0xff;
1315
1316 l = itoa64_to_int (buf[24]) << 0;
1317 l |= itoa64_to_int (buf[25]) << 6;
1318 l |= itoa64_to_int (buf[26]) << 12;
1319
1320 digest[19] = (l >> 8) & 0xff;
1321 digest[18] = (l >> 16) & 0xff;
1322 }
1323
1324 void sha1aix_encode (u8 digest[20], u8 buf[27])
1325 {
1326 int l;
1327
1328 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1329
1330 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1331 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1332 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1333 buf[ 3] = int_to_itoa64 (l & 0x3f);
1334
1335 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1336
1337 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1338 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1339 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1340 buf[ 7] = int_to_itoa64 (l & 0x3f);
1341
1342 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1343
1344 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1345 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1346 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[11] = int_to_itoa64 (l & 0x3f);
1348
1349 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1350
1351 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1352 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1353 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[15] = int_to_itoa64 (l & 0x3f);
1355
1356 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1357
1358 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1359 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1360 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[19] = int_to_itoa64 (l & 0x3f);
1362
1363 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1364
1365 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1366 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1367 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1368 buf[23] = int_to_itoa64 (l & 0x3f);
1369
1370 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1371
1372 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1373 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1374 buf[26] = int_to_itoa64 (l & 0x3f);
1375 }
1376
1377 void sha256aix_decode (u8 digest[32], u8 buf[43])
1378 {
1379 int l;
1380
1381 l = itoa64_to_int (buf[ 0]) << 0;
1382 l |= itoa64_to_int (buf[ 1]) << 6;
1383 l |= itoa64_to_int (buf[ 2]) << 12;
1384 l |= itoa64_to_int (buf[ 3]) << 18;
1385
1386 digest[ 2] = (l >> 0) & 0xff;
1387 digest[ 1] = (l >> 8) & 0xff;
1388 digest[ 0] = (l >> 16) & 0xff;
1389
1390 l = itoa64_to_int (buf[ 4]) << 0;
1391 l |= itoa64_to_int (buf[ 5]) << 6;
1392 l |= itoa64_to_int (buf[ 6]) << 12;
1393 l |= itoa64_to_int (buf[ 7]) << 18;
1394
1395 digest[ 5] = (l >> 0) & 0xff;
1396 digest[ 4] = (l >> 8) & 0xff;
1397 digest[ 3] = (l >> 16) & 0xff;
1398
1399 l = itoa64_to_int (buf[ 8]) << 0;
1400 l |= itoa64_to_int (buf[ 9]) << 6;
1401 l |= itoa64_to_int (buf[10]) << 12;
1402 l |= itoa64_to_int (buf[11]) << 18;
1403
1404 digest[ 8] = (l >> 0) & 0xff;
1405 digest[ 7] = (l >> 8) & 0xff;
1406 digest[ 6] = (l >> 16) & 0xff;
1407
1408 l = itoa64_to_int (buf[12]) << 0;
1409 l |= itoa64_to_int (buf[13]) << 6;
1410 l |= itoa64_to_int (buf[14]) << 12;
1411 l |= itoa64_to_int (buf[15]) << 18;
1412
1413 digest[11] = (l >> 0) & 0xff;
1414 digest[10] = (l >> 8) & 0xff;
1415 digest[ 9] = (l >> 16) & 0xff;
1416
1417 l = itoa64_to_int (buf[16]) << 0;
1418 l |= itoa64_to_int (buf[17]) << 6;
1419 l |= itoa64_to_int (buf[18]) << 12;
1420 l |= itoa64_to_int (buf[19]) << 18;
1421
1422 digest[14] = (l >> 0) & 0xff;
1423 digest[13] = (l >> 8) & 0xff;
1424 digest[12] = (l >> 16) & 0xff;
1425
1426 l = itoa64_to_int (buf[20]) << 0;
1427 l |= itoa64_to_int (buf[21]) << 6;
1428 l |= itoa64_to_int (buf[22]) << 12;
1429 l |= itoa64_to_int (buf[23]) << 18;
1430
1431 digest[17] = (l >> 0) & 0xff;
1432 digest[16] = (l >> 8) & 0xff;
1433 digest[15] = (l >> 16) & 0xff;
1434
1435 l = itoa64_to_int (buf[24]) << 0;
1436 l |= itoa64_to_int (buf[25]) << 6;
1437 l |= itoa64_to_int (buf[26]) << 12;
1438 l |= itoa64_to_int (buf[27]) << 18;
1439
1440 digest[20] = (l >> 0) & 0xff;
1441 digest[19] = (l >> 8) & 0xff;
1442 digest[18] = (l >> 16) & 0xff;
1443
1444 l = itoa64_to_int (buf[28]) << 0;
1445 l |= itoa64_to_int (buf[29]) << 6;
1446 l |= itoa64_to_int (buf[30]) << 12;
1447 l |= itoa64_to_int (buf[31]) << 18;
1448
1449 digest[23] = (l >> 0) & 0xff;
1450 digest[22] = (l >> 8) & 0xff;
1451 digest[21] = (l >> 16) & 0xff;
1452
1453 l = itoa64_to_int (buf[32]) << 0;
1454 l |= itoa64_to_int (buf[33]) << 6;
1455 l |= itoa64_to_int (buf[34]) << 12;
1456 l |= itoa64_to_int (buf[35]) << 18;
1457
1458 digest[26] = (l >> 0) & 0xff;
1459 digest[25] = (l >> 8) & 0xff;
1460 digest[24] = (l >> 16) & 0xff;
1461
1462 l = itoa64_to_int (buf[36]) << 0;
1463 l |= itoa64_to_int (buf[37]) << 6;
1464 l |= itoa64_to_int (buf[38]) << 12;
1465 l |= itoa64_to_int (buf[39]) << 18;
1466
1467 digest[29] = (l >> 0) & 0xff;
1468 digest[28] = (l >> 8) & 0xff;
1469 digest[27] = (l >> 16) & 0xff;
1470
1471 l = itoa64_to_int (buf[40]) << 0;
1472 l |= itoa64_to_int (buf[41]) << 6;
1473 l |= itoa64_to_int (buf[42]) << 12;
1474
1475 //digest[32] = (l >> 0) & 0xff;
1476 digest[31] = (l >> 8) & 0xff;
1477 digest[30] = (l >> 16) & 0xff;
1478 }
1479
1480 void sha256aix_encode (u8 digest[32], u8 buf[43])
1481 {
1482 int l;
1483
1484 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1485
1486 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1487 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1488 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1489 buf[ 3] = int_to_itoa64 (l & 0x3f);
1490
1491 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1492
1493 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1494 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1495 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1496 buf[ 7] = int_to_itoa64 (l & 0x3f);
1497
1498 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1499
1500 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1501 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1502 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[11] = int_to_itoa64 (l & 0x3f);
1504
1505 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1506
1507 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1508 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1509 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[15] = int_to_itoa64 (l & 0x3f);
1511
1512 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1513
1514 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1515 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1516 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[19] = int_to_itoa64 (l & 0x3f);
1518
1519 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1520
1521 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1522 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1523 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[23] = int_to_itoa64 (l & 0x3f);
1525
1526 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1527
1528 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1529 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1530 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[27] = int_to_itoa64 (l & 0x3f);
1532
1533 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1534
1535 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1536 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1537 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[31] = int_to_itoa64 (l & 0x3f);
1539
1540 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1541
1542 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1543 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1544 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[35] = int_to_itoa64 (l & 0x3f);
1546
1547 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1548
1549 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1550 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1551 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1552 buf[39] = int_to_itoa64 (l & 0x3f);
1553
1554 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1555
1556 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1557 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1558 buf[42] = int_to_itoa64 (l & 0x3f);
1559 }
1560
1561 void sha512aix_decode (u8 digest[64], u8 buf[86])
1562 {
1563 int l;
1564
1565 l = itoa64_to_int (buf[ 0]) << 0;
1566 l |= itoa64_to_int (buf[ 1]) << 6;
1567 l |= itoa64_to_int (buf[ 2]) << 12;
1568 l |= itoa64_to_int (buf[ 3]) << 18;
1569
1570 digest[ 2] = (l >> 0) & 0xff;
1571 digest[ 1] = (l >> 8) & 0xff;
1572 digest[ 0] = (l >> 16) & 0xff;
1573
1574 l = itoa64_to_int (buf[ 4]) << 0;
1575 l |= itoa64_to_int (buf[ 5]) << 6;
1576 l |= itoa64_to_int (buf[ 6]) << 12;
1577 l |= itoa64_to_int (buf[ 7]) << 18;
1578
1579 digest[ 5] = (l >> 0) & 0xff;
1580 digest[ 4] = (l >> 8) & 0xff;
1581 digest[ 3] = (l >> 16) & 0xff;
1582
1583 l = itoa64_to_int (buf[ 8]) << 0;
1584 l |= itoa64_to_int (buf[ 9]) << 6;
1585 l |= itoa64_to_int (buf[10]) << 12;
1586 l |= itoa64_to_int (buf[11]) << 18;
1587
1588 digest[ 8] = (l >> 0) & 0xff;
1589 digest[ 7] = (l >> 8) & 0xff;
1590 digest[ 6] = (l >> 16) & 0xff;
1591
1592 l = itoa64_to_int (buf[12]) << 0;
1593 l |= itoa64_to_int (buf[13]) << 6;
1594 l |= itoa64_to_int (buf[14]) << 12;
1595 l |= itoa64_to_int (buf[15]) << 18;
1596
1597 digest[11] = (l >> 0) & 0xff;
1598 digest[10] = (l >> 8) & 0xff;
1599 digest[ 9] = (l >> 16) & 0xff;
1600
1601 l = itoa64_to_int (buf[16]) << 0;
1602 l |= itoa64_to_int (buf[17]) << 6;
1603 l |= itoa64_to_int (buf[18]) << 12;
1604 l |= itoa64_to_int (buf[19]) << 18;
1605
1606 digest[14] = (l >> 0) & 0xff;
1607 digest[13] = (l >> 8) & 0xff;
1608 digest[12] = (l >> 16) & 0xff;
1609
1610 l = itoa64_to_int (buf[20]) << 0;
1611 l |= itoa64_to_int (buf[21]) << 6;
1612 l |= itoa64_to_int (buf[22]) << 12;
1613 l |= itoa64_to_int (buf[23]) << 18;
1614
1615 digest[17] = (l >> 0) & 0xff;
1616 digest[16] = (l >> 8) & 0xff;
1617 digest[15] = (l >> 16) & 0xff;
1618
1619 l = itoa64_to_int (buf[24]) << 0;
1620 l |= itoa64_to_int (buf[25]) << 6;
1621 l |= itoa64_to_int (buf[26]) << 12;
1622 l |= itoa64_to_int (buf[27]) << 18;
1623
1624 digest[20] = (l >> 0) & 0xff;
1625 digest[19] = (l >> 8) & 0xff;
1626 digest[18] = (l >> 16) & 0xff;
1627
1628 l = itoa64_to_int (buf[28]) << 0;
1629 l |= itoa64_to_int (buf[29]) << 6;
1630 l |= itoa64_to_int (buf[30]) << 12;
1631 l |= itoa64_to_int (buf[31]) << 18;
1632
1633 digest[23] = (l >> 0) & 0xff;
1634 digest[22] = (l >> 8) & 0xff;
1635 digest[21] = (l >> 16) & 0xff;
1636
1637 l = itoa64_to_int (buf[32]) << 0;
1638 l |= itoa64_to_int (buf[33]) << 6;
1639 l |= itoa64_to_int (buf[34]) << 12;
1640 l |= itoa64_to_int (buf[35]) << 18;
1641
1642 digest[26] = (l >> 0) & 0xff;
1643 digest[25] = (l >> 8) & 0xff;
1644 digest[24] = (l >> 16) & 0xff;
1645
1646 l = itoa64_to_int (buf[36]) << 0;
1647 l |= itoa64_to_int (buf[37]) << 6;
1648 l |= itoa64_to_int (buf[38]) << 12;
1649 l |= itoa64_to_int (buf[39]) << 18;
1650
1651 digest[29] = (l >> 0) & 0xff;
1652 digest[28] = (l >> 8) & 0xff;
1653 digest[27] = (l >> 16) & 0xff;
1654
1655 l = itoa64_to_int (buf[40]) << 0;
1656 l |= itoa64_to_int (buf[41]) << 6;
1657 l |= itoa64_to_int (buf[42]) << 12;
1658 l |= itoa64_to_int (buf[43]) << 18;
1659
1660 digest[32] = (l >> 0) & 0xff;
1661 digest[31] = (l >> 8) & 0xff;
1662 digest[30] = (l >> 16) & 0xff;
1663
1664 l = itoa64_to_int (buf[44]) << 0;
1665 l |= itoa64_to_int (buf[45]) << 6;
1666 l |= itoa64_to_int (buf[46]) << 12;
1667 l |= itoa64_to_int (buf[47]) << 18;
1668
1669 digest[35] = (l >> 0) & 0xff;
1670 digest[34] = (l >> 8) & 0xff;
1671 digest[33] = (l >> 16) & 0xff;
1672
1673 l = itoa64_to_int (buf[48]) << 0;
1674 l |= itoa64_to_int (buf[49]) << 6;
1675 l |= itoa64_to_int (buf[50]) << 12;
1676 l |= itoa64_to_int (buf[51]) << 18;
1677
1678 digest[38] = (l >> 0) & 0xff;
1679 digest[37] = (l >> 8) & 0xff;
1680 digest[36] = (l >> 16) & 0xff;
1681
1682 l = itoa64_to_int (buf[52]) << 0;
1683 l |= itoa64_to_int (buf[53]) << 6;
1684 l |= itoa64_to_int (buf[54]) << 12;
1685 l |= itoa64_to_int (buf[55]) << 18;
1686
1687 digest[41] = (l >> 0) & 0xff;
1688 digest[40] = (l >> 8) & 0xff;
1689 digest[39] = (l >> 16) & 0xff;
1690
1691 l = itoa64_to_int (buf[56]) << 0;
1692 l |= itoa64_to_int (buf[57]) << 6;
1693 l |= itoa64_to_int (buf[58]) << 12;
1694 l |= itoa64_to_int (buf[59]) << 18;
1695
1696 digest[44] = (l >> 0) & 0xff;
1697 digest[43] = (l >> 8) & 0xff;
1698 digest[42] = (l >> 16) & 0xff;
1699
1700 l = itoa64_to_int (buf[60]) << 0;
1701 l |= itoa64_to_int (buf[61]) << 6;
1702 l |= itoa64_to_int (buf[62]) << 12;
1703 l |= itoa64_to_int (buf[63]) << 18;
1704
1705 digest[47] = (l >> 0) & 0xff;
1706 digest[46] = (l >> 8) & 0xff;
1707 digest[45] = (l >> 16) & 0xff;
1708
1709 l = itoa64_to_int (buf[64]) << 0;
1710 l |= itoa64_to_int (buf[65]) << 6;
1711 l |= itoa64_to_int (buf[66]) << 12;
1712 l |= itoa64_to_int (buf[67]) << 18;
1713
1714 digest[50] = (l >> 0) & 0xff;
1715 digest[49] = (l >> 8) & 0xff;
1716 digest[48] = (l >> 16) & 0xff;
1717
1718 l = itoa64_to_int (buf[68]) << 0;
1719 l |= itoa64_to_int (buf[69]) << 6;
1720 l |= itoa64_to_int (buf[70]) << 12;
1721 l |= itoa64_to_int (buf[71]) << 18;
1722
1723 digest[53] = (l >> 0) & 0xff;
1724 digest[52] = (l >> 8) & 0xff;
1725 digest[51] = (l >> 16) & 0xff;
1726
1727 l = itoa64_to_int (buf[72]) << 0;
1728 l |= itoa64_to_int (buf[73]) << 6;
1729 l |= itoa64_to_int (buf[74]) << 12;
1730 l |= itoa64_to_int (buf[75]) << 18;
1731
1732 digest[56] = (l >> 0) & 0xff;
1733 digest[55] = (l >> 8) & 0xff;
1734 digest[54] = (l >> 16) & 0xff;
1735
1736 l = itoa64_to_int (buf[76]) << 0;
1737 l |= itoa64_to_int (buf[77]) << 6;
1738 l |= itoa64_to_int (buf[78]) << 12;
1739 l |= itoa64_to_int (buf[79]) << 18;
1740
1741 digest[59] = (l >> 0) & 0xff;
1742 digest[58] = (l >> 8) & 0xff;
1743 digest[57] = (l >> 16) & 0xff;
1744
1745 l = itoa64_to_int (buf[80]) << 0;
1746 l |= itoa64_to_int (buf[81]) << 6;
1747 l |= itoa64_to_int (buf[82]) << 12;
1748 l |= itoa64_to_int (buf[83]) << 18;
1749
1750 digest[62] = (l >> 0) & 0xff;
1751 digest[61] = (l >> 8) & 0xff;
1752 digest[60] = (l >> 16) & 0xff;
1753
1754 l = itoa64_to_int (buf[84]) << 0;
1755 l |= itoa64_to_int (buf[85]) << 6;
1756
1757 digest[63] = (l >> 16) & 0xff;
1758 }
1759
1760 void sha512aix_encode (u8 digest[64], u8 buf[86])
1761 {
1762 int l;
1763
1764 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1765
1766 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1767 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1768 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1769 buf[ 3] = int_to_itoa64 (l & 0x3f);
1770
1771 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1772
1773 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1774 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1775 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1776 buf[ 7] = int_to_itoa64 (l & 0x3f);
1777
1778 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1779
1780 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1781 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1782 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[11] = int_to_itoa64 (l & 0x3f);
1784
1785 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1786
1787 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1788 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1789 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[15] = int_to_itoa64 (l & 0x3f);
1791
1792 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1793
1794 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1795 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1796 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[19] = int_to_itoa64 (l & 0x3f);
1798
1799 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1800
1801 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1802 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1803 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[23] = int_to_itoa64 (l & 0x3f);
1805
1806 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1807
1808 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1809 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1810 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[27] = int_to_itoa64 (l & 0x3f);
1812
1813 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1814
1815 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1816 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1817 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[31] = int_to_itoa64 (l & 0x3f);
1819
1820 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1821
1822 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1823 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1824 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[35] = int_to_itoa64 (l & 0x3f);
1826
1827 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1828
1829 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1830 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1831 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[39] = int_to_itoa64 (l & 0x3f);
1833
1834 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1835
1836 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1837 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1838 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[43] = int_to_itoa64 (l & 0x3f);
1840
1841 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1842
1843 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1844 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1845 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[47] = int_to_itoa64 (l & 0x3f);
1847
1848 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1849
1850 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1851 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1852 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[51] = int_to_itoa64 (l & 0x3f);
1854
1855 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1856
1857 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1858 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1859 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[55] = int_to_itoa64 (l & 0x3f);
1861
1862 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1863
1864 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1865 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1866 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[59] = int_to_itoa64 (l & 0x3f);
1868
1869 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1870
1871 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1872 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1873 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[63] = int_to_itoa64 (l & 0x3f);
1875
1876 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1877
1878 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1879 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1880 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[67] = int_to_itoa64 (l & 0x3f);
1882
1883 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1884
1885 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1886 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1887 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[71] = int_to_itoa64 (l & 0x3f);
1889
1890 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1891
1892 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1893 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1894 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[75] = int_to_itoa64 (l & 0x3f);
1896
1897 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1898
1899 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1900 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1901 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[79] = int_to_itoa64 (l & 0x3f);
1903
1904 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1905
1906 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1907 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1908 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1909 buf[83] = int_to_itoa64 (l & 0x3f);
1910
1911 l = 0 | 0 | (digest[63] << 16);
1912
1913 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1914 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1915 }
1916
1917 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1918 {
1919 int l;
1920
1921 l = itoa64_to_int (buf[ 0]) << 0;
1922 l |= itoa64_to_int (buf[ 1]) << 6;
1923 l |= itoa64_to_int (buf[ 2]) << 12;
1924 l |= itoa64_to_int (buf[ 3]) << 18;
1925
1926 digest[ 0] = (l >> 16) & 0xff;
1927 digest[10] = (l >> 8) & 0xff;
1928 digest[20] = (l >> 0) & 0xff;
1929
1930 l = itoa64_to_int (buf[ 4]) << 0;
1931 l |= itoa64_to_int (buf[ 5]) << 6;
1932 l |= itoa64_to_int (buf[ 6]) << 12;
1933 l |= itoa64_to_int (buf[ 7]) << 18;
1934
1935 digest[21] = (l >> 16) & 0xff;
1936 digest[ 1] = (l >> 8) & 0xff;
1937 digest[11] = (l >> 0) & 0xff;
1938
1939 l = itoa64_to_int (buf[ 8]) << 0;
1940 l |= itoa64_to_int (buf[ 9]) << 6;
1941 l |= itoa64_to_int (buf[10]) << 12;
1942 l |= itoa64_to_int (buf[11]) << 18;
1943
1944 digest[12] = (l >> 16) & 0xff;
1945 digest[22] = (l >> 8) & 0xff;
1946 digest[ 2] = (l >> 0) & 0xff;
1947
1948 l = itoa64_to_int (buf[12]) << 0;
1949 l |= itoa64_to_int (buf[13]) << 6;
1950 l |= itoa64_to_int (buf[14]) << 12;
1951 l |= itoa64_to_int (buf[15]) << 18;
1952
1953 digest[ 3] = (l >> 16) & 0xff;
1954 digest[13] = (l >> 8) & 0xff;
1955 digest[23] = (l >> 0) & 0xff;
1956
1957 l = itoa64_to_int (buf[16]) << 0;
1958 l |= itoa64_to_int (buf[17]) << 6;
1959 l |= itoa64_to_int (buf[18]) << 12;
1960 l |= itoa64_to_int (buf[19]) << 18;
1961
1962 digest[24] = (l >> 16) & 0xff;
1963 digest[ 4] = (l >> 8) & 0xff;
1964 digest[14] = (l >> 0) & 0xff;
1965
1966 l = itoa64_to_int (buf[20]) << 0;
1967 l |= itoa64_to_int (buf[21]) << 6;
1968 l |= itoa64_to_int (buf[22]) << 12;
1969 l |= itoa64_to_int (buf[23]) << 18;
1970
1971 digest[15] = (l >> 16) & 0xff;
1972 digest[25] = (l >> 8) & 0xff;
1973 digest[ 5] = (l >> 0) & 0xff;
1974
1975 l = itoa64_to_int (buf[24]) << 0;
1976 l |= itoa64_to_int (buf[25]) << 6;
1977 l |= itoa64_to_int (buf[26]) << 12;
1978 l |= itoa64_to_int (buf[27]) << 18;
1979
1980 digest[ 6] = (l >> 16) & 0xff;
1981 digest[16] = (l >> 8) & 0xff;
1982 digest[26] = (l >> 0) & 0xff;
1983
1984 l = itoa64_to_int (buf[28]) << 0;
1985 l |= itoa64_to_int (buf[29]) << 6;
1986 l |= itoa64_to_int (buf[30]) << 12;
1987 l |= itoa64_to_int (buf[31]) << 18;
1988
1989 digest[27] = (l >> 16) & 0xff;
1990 digest[ 7] = (l >> 8) & 0xff;
1991 digest[17] = (l >> 0) & 0xff;
1992
1993 l = itoa64_to_int (buf[32]) << 0;
1994 l |= itoa64_to_int (buf[33]) << 6;
1995 l |= itoa64_to_int (buf[34]) << 12;
1996 l |= itoa64_to_int (buf[35]) << 18;
1997
1998 digest[18] = (l >> 16) & 0xff;
1999 digest[28] = (l >> 8) & 0xff;
2000 digest[ 8] = (l >> 0) & 0xff;
2001
2002 l = itoa64_to_int (buf[36]) << 0;
2003 l |= itoa64_to_int (buf[37]) << 6;
2004 l |= itoa64_to_int (buf[38]) << 12;
2005 l |= itoa64_to_int (buf[39]) << 18;
2006
2007 digest[ 9] = (l >> 16) & 0xff;
2008 digest[19] = (l >> 8) & 0xff;
2009 digest[29] = (l >> 0) & 0xff;
2010
2011 l = itoa64_to_int (buf[40]) << 0;
2012 l |= itoa64_to_int (buf[41]) << 6;
2013 l |= itoa64_to_int (buf[42]) << 12;
2014
2015 digest[31] = (l >> 8) & 0xff;
2016 digest[30] = (l >> 0) & 0xff;
2017 }
2018
2019 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2020 {
2021 int l;
2022
2023 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2024
2025 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2026 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2027 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029
2030 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2031
2032 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2033 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2034 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036
2037 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2038
2039 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2040 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2041 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043
2044 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2045
2046 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2047 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2048 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050
2051 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2052
2053 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2054 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2055 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057
2058 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2059
2060 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2061 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2062 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064
2065 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2066
2067 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2068 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2069 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071
2072 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2073
2074 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2075 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2076 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078
2079 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2080
2081 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2082 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2083 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085
2086 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2087
2088 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2089 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2090 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2091 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092
2093 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2094
2095 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2096 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2097 buf[42] = int_to_itoa64 (l & 0x3f);
2098 }
2099
2100 void drupal7_decode (u8 digest[64], u8 buf[44])
2101 {
2102 int l;
2103
2104 l = itoa64_to_int (buf[ 0]) << 0;
2105 l |= itoa64_to_int (buf[ 1]) << 6;
2106 l |= itoa64_to_int (buf[ 2]) << 12;
2107 l |= itoa64_to_int (buf[ 3]) << 18;
2108
2109 digest[ 0] = (l >> 0) & 0xff;
2110 digest[ 1] = (l >> 8) & 0xff;
2111 digest[ 2] = (l >> 16) & 0xff;
2112
2113 l = itoa64_to_int (buf[ 4]) << 0;
2114 l |= itoa64_to_int (buf[ 5]) << 6;
2115 l |= itoa64_to_int (buf[ 6]) << 12;
2116 l |= itoa64_to_int (buf[ 7]) << 18;
2117
2118 digest[ 3] = (l >> 0) & 0xff;
2119 digest[ 4] = (l >> 8) & 0xff;
2120 digest[ 5] = (l >> 16) & 0xff;
2121
2122 l = itoa64_to_int (buf[ 8]) << 0;
2123 l |= itoa64_to_int (buf[ 9]) << 6;
2124 l |= itoa64_to_int (buf[10]) << 12;
2125 l |= itoa64_to_int (buf[11]) << 18;
2126
2127 digest[ 6] = (l >> 0) & 0xff;
2128 digest[ 7] = (l >> 8) & 0xff;
2129 digest[ 8] = (l >> 16) & 0xff;
2130
2131 l = itoa64_to_int (buf[12]) << 0;
2132 l |= itoa64_to_int (buf[13]) << 6;
2133 l |= itoa64_to_int (buf[14]) << 12;
2134 l |= itoa64_to_int (buf[15]) << 18;
2135
2136 digest[ 9] = (l >> 0) & 0xff;
2137 digest[10] = (l >> 8) & 0xff;
2138 digest[11] = (l >> 16) & 0xff;
2139
2140 l = itoa64_to_int (buf[16]) << 0;
2141 l |= itoa64_to_int (buf[17]) << 6;
2142 l |= itoa64_to_int (buf[18]) << 12;
2143 l |= itoa64_to_int (buf[19]) << 18;
2144
2145 digest[12] = (l >> 0) & 0xff;
2146 digest[13] = (l >> 8) & 0xff;
2147 digest[14] = (l >> 16) & 0xff;
2148
2149 l = itoa64_to_int (buf[20]) << 0;
2150 l |= itoa64_to_int (buf[21]) << 6;
2151 l |= itoa64_to_int (buf[22]) << 12;
2152 l |= itoa64_to_int (buf[23]) << 18;
2153
2154 digest[15] = (l >> 0) & 0xff;
2155 digest[16] = (l >> 8) & 0xff;
2156 digest[17] = (l >> 16) & 0xff;
2157
2158 l = itoa64_to_int (buf[24]) << 0;
2159 l |= itoa64_to_int (buf[25]) << 6;
2160 l |= itoa64_to_int (buf[26]) << 12;
2161 l |= itoa64_to_int (buf[27]) << 18;
2162
2163 digest[18] = (l >> 0) & 0xff;
2164 digest[19] = (l >> 8) & 0xff;
2165 digest[20] = (l >> 16) & 0xff;
2166
2167 l = itoa64_to_int (buf[28]) << 0;
2168 l |= itoa64_to_int (buf[29]) << 6;
2169 l |= itoa64_to_int (buf[30]) << 12;
2170 l |= itoa64_to_int (buf[31]) << 18;
2171
2172 digest[21] = (l >> 0) & 0xff;
2173 digest[22] = (l >> 8) & 0xff;
2174 digest[23] = (l >> 16) & 0xff;
2175
2176 l = itoa64_to_int (buf[32]) << 0;
2177 l |= itoa64_to_int (buf[33]) << 6;
2178 l |= itoa64_to_int (buf[34]) << 12;
2179 l |= itoa64_to_int (buf[35]) << 18;
2180
2181 digest[24] = (l >> 0) & 0xff;
2182 digest[25] = (l >> 8) & 0xff;
2183 digest[26] = (l >> 16) & 0xff;
2184
2185 l = itoa64_to_int (buf[36]) << 0;
2186 l |= itoa64_to_int (buf[37]) << 6;
2187 l |= itoa64_to_int (buf[38]) << 12;
2188 l |= itoa64_to_int (buf[39]) << 18;
2189
2190 digest[27] = (l >> 0) & 0xff;
2191 digest[28] = (l >> 8) & 0xff;
2192 digest[29] = (l >> 16) & 0xff;
2193
2194 l = itoa64_to_int (buf[40]) << 0;
2195 l |= itoa64_to_int (buf[41]) << 6;
2196 l |= itoa64_to_int (buf[42]) << 12;
2197 l |= itoa64_to_int (buf[43]) << 18;
2198
2199 digest[30] = (l >> 0) & 0xff;
2200 digest[31] = (l >> 8) & 0xff;
2201 digest[32] = (l >> 16) & 0xff;
2202
2203 digest[33] = 0;
2204 digest[34] = 0;
2205 digest[35] = 0;
2206 digest[36] = 0;
2207 digest[37] = 0;
2208 digest[38] = 0;
2209 digest[39] = 0;
2210 digest[40] = 0;
2211 digest[41] = 0;
2212 digest[42] = 0;
2213 digest[43] = 0;
2214 digest[44] = 0;
2215 digest[45] = 0;
2216 digest[46] = 0;
2217 digest[47] = 0;
2218 digest[48] = 0;
2219 digest[49] = 0;
2220 digest[50] = 0;
2221 digest[51] = 0;
2222 digest[52] = 0;
2223 digest[53] = 0;
2224 digest[54] = 0;
2225 digest[55] = 0;
2226 digest[56] = 0;
2227 digest[57] = 0;
2228 digest[58] = 0;
2229 digest[59] = 0;
2230 digest[60] = 0;
2231 digest[61] = 0;
2232 digest[62] = 0;
2233 digest[63] = 0;
2234 }
2235
2236 void drupal7_encode (u8 digest[64], u8 buf[43])
2237 {
2238 int l;
2239
2240 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2241
2242 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2243 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2244 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2245 buf[ 3] = int_to_itoa64 (l & 0x3f);
2246
2247 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2248
2249 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2250 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2251 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2252 buf[ 7] = int_to_itoa64 (l & 0x3f);
2253
2254 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2255
2256 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2257 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2258 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[11] = int_to_itoa64 (l & 0x3f);
2260
2261 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2262
2263 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2264 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2265 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[15] = int_to_itoa64 (l & 0x3f);
2267
2268 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2269
2270 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2271 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2272 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[19] = int_to_itoa64 (l & 0x3f);
2274
2275 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2276
2277 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2278 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2279 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[23] = int_to_itoa64 (l & 0x3f);
2281
2282 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2283
2284 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2285 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2286 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[27] = int_to_itoa64 (l & 0x3f);
2288
2289 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2290
2291 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2292 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2293 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[31] = int_to_itoa64 (l & 0x3f);
2295
2296 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2297
2298 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2299 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2300 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[35] = int_to_itoa64 (l & 0x3f);
2302
2303 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2304
2305 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2306 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2307 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 buf[39] = int_to_itoa64 (l & 0x3f);
2309
2310 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2311
2312 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2313 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2314 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2315 //buf[43] = int_to_itoa64 (l & 0x3f);
2316 }
2317
2318 /**
2319 * tty
2320 */
2321
2322 #ifdef LINUX
2323 static struct termio savemodes;
2324 static int havemodes = 0;
2325
2326 int tty_break()
2327 {
2328 struct termio modmodes;
2329
2330 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2331
2332 havemodes = 1;
2333
2334 modmodes = savemodes;
2335 modmodes.c_lflag &= ~ICANON;
2336 modmodes.c_cc[VMIN] = 1;
2337 modmodes.c_cc[VTIME] = 0;
2338
2339 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2340 }
2341
2342 int tty_getchar()
2343 {
2344 fd_set rfds;
2345
2346 FD_ZERO (&rfds);
2347
2348 FD_SET (fileno (stdin), &rfds);
2349
2350 struct timeval tv;
2351
2352 tv.tv_sec = 1;
2353 tv.tv_usec = 0;
2354
2355 int retval = select (1, &rfds, NULL, NULL, &tv);
2356
2357 if (retval == 0) return 0;
2358 if (retval == -1) return -1;
2359
2360 return getchar();
2361 }
2362
2363 int tty_fix()
2364 {
2365 if (!havemodes) return 0;
2366
2367 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2368 }
2369 #endif
2370
2371 #ifdef OSX
2372 static struct termios savemodes;
2373 static int havemodes = 0;
2374
2375 int tty_break()
2376 {
2377 struct termios modmodes;
2378
2379 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2380
2381 havemodes = 1;
2382
2383 modmodes = savemodes;
2384 modmodes.c_lflag &= ~ICANON;
2385 modmodes.c_cc[VMIN] = 1;
2386 modmodes.c_cc[VTIME] = 0;
2387
2388 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2389 }
2390
2391 int tty_getchar()
2392 {
2393 fd_set rfds;
2394
2395 FD_ZERO (&rfds);
2396
2397 FD_SET (fileno (stdin), &rfds);
2398
2399 struct timeval tv;
2400
2401 tv.tv_sec = 1;
2402 tv.tv_usec = 0;
2403
2404 int retval = select (1, &rfds, NULL, NULL, &tv);
2405
2406 if (retval == 0) return 0;
2407 if (retval == -1) return -1;
2408
2409 return getchar();
2410 }
2411
2412 int tty_fix()
2413 {
2414 if (!havemodes) return 0;
2415
2416 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2417 }
2418 #endif
2419
2420 #ifdef WIN
2421 static DWORD saveMode = 0;
2422
2423 int tty_break()
2424 {
2425 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2426
2427 GetConsoleMode (stdinHandle, &saveMode);
2428 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2429
2430 return 0;
2431 }
2432
2433 int tty_getchar()
2434 {
2435 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2436
2437 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2438
2439 if (rc == WAIT_TIMEOUT) return 0;
2440 if (rc == WAIT_ABANDONED) return -1;
2441 if (rc == WAIT_FAILED) return -1;
2442
2443 // The whole ReadConsoleInput () part is a workaround.
2444 // For some unknown reason, maybe a mingw bug, a random signal
2445 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2446 // Then it wants to read with getche () a keyboard input
2447 // which has never been made.
2448
2449 INPUT_RECORD buf[100];
2450
2451 DWORD num = 0;
2452
2453 memset (buf, 0, sizeof (buf));
2454
2455 ReadConsoleInput (stdinHandle, buf, 100, &num);
2456
2457 FlushConsoleInputBuffer (stdinHandle);
2458
2459 for (uint i = 0; i < num; i++)
2460 {
2461 if (buf[i].EventType != KEY_EVENT) continue;
2462
2463 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2464
2465 if (KeyEvent.bKeyDown != TRUE) continue;
2466
2467 return KeyEvent.uChar.AsciiChar;
2468 }
2469
2470 return 0;
2471 }
2472
2473 int tty_fix()
2474 {
2475 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2476
2477 SetConsoleMode (stdinHandle, saveMode);
2478
2479 return 0;
2480 }
2481 #endif
2482
2483 /**
2484 * mem alloc
2485 */
2486
2487 #define MSG_ENOMEM "Insufficient memory available"
2488
2489 void *mycalloc (size_t nmemb, size_t size)
2490 {
2491 void *p = calloc (nmemb, size);
2492
2493 if (p == NULL)
2494 {
2495 log_error ("ERROR: %s", MSG_ENOMEM);
2496
2497 exit (-1);
2498 }
2499
2500 return (p);
2501 }
2502
2503 void *mymalloc (size_t size)
2504 {
2505 void *p = malloc (size);
2506
2507 if (p == NULL)
2508 {
2509 log_error ("ERROR: %s", MSG_ENOMEM);
2510
2511 exit (-1);
2512 }
2513
2514 memset (p, 0, size);
2515
2516 return (p);
2517 }
2518
2519 void myfree (void *ptr)
2520 {
2521 if (ptr == NULL) return;
2522
2523 free (ptr);
2524 }
2525
2526 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2527 {
2528 void *p = realloc (ptr, oldsz + add);
2529
2530 if (p == NULL)
2531 {
2532 log_error ("ERROR: %s", MSG_ENOMEM);
2533
2534 exit (-1);
2535 }
2536
2537 memset ((char *) p + oldsz, 0, add);
2538
2539 return (p);
2540 }
2541
2542 char *mystrdup (const char *s)
2543 {
2544 const size_t len = strlen (s);
2545
2546 char *b = (char *) mymalloc (len + 1);
2547
2548 memcpy (b, s, len);
2549
2550 return (b);
2551 }
2552
2553 FILE *logfile_open (char *logfile)
2554 {
2555 FILE *fp = fopen (logfile, "ab");
2556
2557 if (fp == NULL)
2558 {
2559 fp = stdout;
2560 }
2561
2562 return fp;
2563 }
2564
2565 void logfile_close (FILE *fp)
2566 {
2567 if (fp == stdout) return;
2568
2569 fclose (fp);
2570 }
2571
2572 void logfile_append (const char *fmt, ...)
2573 {
2574 if (data.logfile_disable == 1) return;
2575
2576 FILE *fp = logfile_open (data.logfile);
2577
2578 va_list ap;
2579
2580 va_start (ap, fmt);
2581
2582 vfprintf (fp, fmt, ap);
2583
2584 va_end (ap);
2585
2586 fputc ('\n', fp);
2587
2588 fflush (fp);
2589
2590 logfile_close (fp);
2591 }
2592
2593 int logfile_generate_id ()
2594 {
2595 const int n = rand ();
2596
2597 time_t t;
2598
2599 time (&t);
2600
2601 return t + n;
2602 }
2603
2604 char *logfile_generate_topid ()
2605 {
2606 const int id = logfile_generate_id ();
2607
2608 char *topid = (char *) mymalloc (1 + 16 + 1);
2609
2610 snprintf (topid, 1 + 16, "TOP%08x", id);
2611
2612 return topid;
2613 }
2614
2615 char *logfile_generate_subid ()
2616 {
2617 const int id = logfile_generate_id ();
2618
2619 char *subid = (char *) mymalloc (1 + 16 + 1);
2620
2621 snprintf (subid, 1 + 16, "SUB%08x", id);
2622
2623 return subid;
2624 }
2625
2626 /**
2627 * system
2628 */
2629
2630 #if F_SETLKW
2631 void lock_file (FILE *fp)
2632 {
2633 struct flock lock;
2634
2635 memset (&lock, 0, sizeof (struct flock));
2636
2637 lock.l_type = F_WRLCK;
2638 while (fcntl(fileno(fp), F_SETLKW, &lock))
2639 {
2640 if (errno != EINTR)
2641 {
2642 log_error ("ERROR: failed acquiring write lock: %s", strerror (errno));
2643
2644 exit (-1);
2645 }
2646 }
2647 }
2648
2649 void unlock_file (FILE *fp)
2650 {
2651 struct flock lock;
2652
2653 memset (&lock, 0, sizeof (struct flock));
2654
2655 lock.l_type = F_UNLCK;
2656 fcntl(fileno(fp), F_SETLK, &lock);
2657 }
2658 #endif /* F_SETLKW */
2659
2660 #ifdef _WIN
2661 void fsync (int fd)
2662 {
2663 HANDLE h = (HANDLE) _get_osfhandle (fd);
2664
2665 FlushFileBuffers (h);
2666 }
2667 #endif
2668
2669 /**
2670 * thermal
2671 */
2672
2673 #ifdef HAVE_HWMON
2674 #if defined(_WIN) && defined(HAVE_NVAPI)
2675 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2676 {
2677 NvU32 pGpuCount;
2678
2679 if (hc_NvAPI_EnumPhysicalGPUs (nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2680
2681 if (pGpuCount == 0)
2682 {
2683 log_info ("WARN: No NvAPI adapters found");
2684
2685 return (0);
2686 }
2687
2688 return (pGpuCount);
2689 }
2690 #endif // _WIN && HAVE_NVAPI
2691
2692 #if defined(LINUX) && defined(HAVE_NVML)
2693 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2694 {
2695 int pGpuCount = 0;
2696
2697 for (uint i = 0; i < DEVICES_MAX; i++)
2698 {
2699 if (hc_NVML_nvmlDeviceGetHandleByIndex (data.hm_dll_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2700
2701 // can be used to determine if the device by index matches the cuda device by index
2702 // char name[100]; memset (name, 0, sizeof (name));
2703 // hc_NVML_nvmlDeviceGetName (data.hm_dll_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2704
2705 pGpuCount++;
2706 }
2707
2708 if (pGpuCount == 0)
2709 {
2710 log_info ("WARN: No NVML adapters found");
2711
2712 return (0);
2713 }
2714
2715 return (pGpuCount);
2716 }
2717 #endif // LINUX && HAVE_NVML
2718
2719 #if defined(HAVE_ADL) || defined(HAVE_NVML)
2720 void hm_close (HM_LIB hm_dll)
2721 {
2722 #ifdef _POSIX
2723 dlclose (hm_dll);
2724
2725 #elif _WIN
2726 FreeLibrary (hm_dll);
2727
2728 #endif
2729 }
2730
2731 HM_LIB hm_init (const cl_uint vendor_id)
2732 {
2733 HM_LIB hm_dll = NULL;
2734
2735 #ifdef HAVE_ADL
2736 if (vendor_id == VENDOR_ID_AMD)
2737 {
2738 #ifdef _POSIX
2739 hm_dll = dlopen ("libatiadlxx.so", RTLD_LAZY | RTLD_GLOBAL);
2740
2741 #elif _WIN
2742 hm_dll = LoadLibrary ("atiadlxx.dll");
2743
2744 if (hm_dll == NULL)
2745 {
2746 hm_dll = LoadLibrary ("atiadlxy.dll");
2747 }
2748
2749 #endif
2750 }
2751 #endif
2752
2753 #if defined(LINUX) && defined(HAVE_NVML)
2754 if (vendor_id == VENDOR_ID_NV)
2755 {
2756 hm_dll = dlopen ("libnvidia-ml.so", RTLD_LAZY | RTLD_GLOBAL);
2757 }
2758 #endif
2759
2760 return hm_dll;
2761 }
2762 #endif // HAVE_ADL || HAVE_NVML
2763
2764 #ifdef HAVE_ADL
2765 int get_adapters_num_amd (HM_LIB hm_dll_amd, int *iNumberAdapters)
2766 {
2767 if (hc_ADL_Adapter_NumberOfAdapters_Get (hm_dll_amd, iNumberAdapters) != ADL_OK) return -1;
2768
2769 if (iNumberAdapters == 0)
2770 {
2771 log_info ("WARN: No ADL adapters found.");
2772
2773 return -1;
2774 }
2775
2776 return 0;
2777 }
2778
2779 /*
2780 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2781 {
2782 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2783 ADLODParameters lpOdParameters;
2784
2785 lpOdParameters.iSize = sizeof (ADLODParameters);
2786 size_t plevels_size = 0;
2787
2788 if (hc_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2789
2790 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2791 __func__, iAdapterIndex,
2792 lpOdParameters.iNumberOfPerformanceLevels,
2793 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2794 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2795
2796 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2797
2798 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2799
2800 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2801
2802 if (hc_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2803
2804 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2805 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2806 __func__, iAdapterIndex, j,
2807 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2808
2809 myfree (lpOdPerformanceLevels);
2810
2811 return 0;
2812 }
2813 */
2814
2815 LPAdapterInfo hm_get_adapter_info_amd (HM_LIB hm_dll_amd, int iNumberAdapters)
2816 {
2817 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2818
2819 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2820
2821 if (hc_ADL_Adapter_AdapterInfo_Get (hm_dll_amd, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2822
2823 return lpAdapterInfo;
2824 }
2825
2826 /*
2827 //
2828 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2829 //
2830
2831 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2832 {
2833 u32 idx = -1;
2834
2835 for (uint i = 0; i < num_adl_adapters; i++)
2836 {
2837 int opencl_bus_num = hm_device[i].busid;
2838 int opencl_dev_num = hm_device[i].devid;
2839
2840 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2841 {
2842 idx = i;
2843
2844 break;
2845 }
2846 }
2847
2848 if (idx >= DEVICES_MAX) return -1;
2849
2850 return idx;
2851 }
2852
2853 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2854 {
2855 for (uint i = 0; i < opencl_num_devices; i++)
2856 {
2857 cl_device_topology_amd device_topology;
2858
2859 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2860
2861 hm_device[i].busid = device_topology.pcie.bus;
2862 hm_device[i].devid = device_topology.pcie.device;
2863 }
2864 }
2865 */
2866
2867 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2868 {
2869 // basically bubble sort
2870
2871 for (int i = 0; i < num_adl_adapters; i++)
2872 {
2873 for (int j = 0; j < num_adl_adapters - 1; j++)
2874 {
2875 // get info of adapter [x]
2876
2877 u32 adapter_index_x = valid_adl_device_list[j];
2878 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2879
2880 u32 bus_num_x = info_x.iBusNumber;
2881 u32 dev_num_x = info_x.iDeviceNumber;
2882
2883 // get info of adapter [y]
2884
2885 u32 adapter_index_y = valid_adl_device_list[j + 1];
2886 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2887
2888 u32 bus_num_y = info_y.iBusNumber;
2889 u32 dev_num_y = info_y.iDeviceNumber;
2890
2891 uint need_swap = 0;
2892
2893 if (bus_num_y < bus_num_x)
2894 {
2895 need_swap = 1;
2896 }
2897 else if (bus_num_y == bus_num_x)
2898 {
2899 if (dev_num_y < dev_num_x)
2900 {
2901 need_swap = 1;
2902 }
2903 }
2904
2905 if (need_swap == 1)
2906 {
2907 u32 temp = valid_adl_device_list[j + 1];
2908
2909 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2910 valid_adl_device_list[j + 0] = temp;
2911 }
2912 }
2913 }
2914 }
2915
2916 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2917 {
2918 *num_adl_adapters = 0;
2919
2920 u32 *adl_adapters = NULL;
2921
2922 int *bus_numbers = NULL;
2923 int *device_numbers = NULL;
2924
2925 for (int i = 0; i < iNumberAdapters; i++)
2926 {
2927 AdapterInfo info = lpAdapterInfo[i];
2928
2929 if (strlen (info.strUDID) < 1) continue;
2930
2931 #ifdef WIN
2932 if (info.iVendorID != 1002) continue;
2933 #else
2934 if (info.iVendorID != 0x1002) continue;
2935 #endif
2936
2937 if (info.iBusNumber < 0) continue;
2938 if (info.iDeviceNumber < 0) continue;
2939
2940 int found = 0;
2941
2942 for (int pos = 0; pos < *num_adl_adapters; pos++)
2943 {
2944 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2945 {
2946 found = 1;
2947 break;
2948 }
2949 }
2950
2951 if (found) continue;
2952
2953 // add it to the list
2954
2955 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2956
2957 adl_adapters[*num_adl_adapters] = i;
2958
2959 // rest is just bookkeeping
2960
2961 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2962 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2963
2964 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2965 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2966
2967 (*num_adl_adapters)++;
2968 }
2969
2970 myfree (bus_numbers);
2971 myfree (device_numbers);
2972
2973 // sort the list by increasing bus id, device id number
2974
2975 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2976
2977 return adl_adapters;
2978 }
2979
2980 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)
2981 {
2982 // loop through all valid devices
2983
2984 for (int i = 0; i < num_adl_adapters; i++)
2985 {
2986 u32 adapter_index = valid_adl_device_list[i];
2987
2988 // get AdapterInfo
2989
2990 AdapterInfo info = lpAdapterInfo[adapter_index];
2991
2992 // unfortunately this doesn't work since bus id and dev id are not unique
2993 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2994 // if (opencl_device_index == -1) continue;
2995
2996 int opencl_device_index = i;
2997
2998 // if (hm_show_performance_level (hm_dll_amd, info.iAdapterIndex) != 0) return -1;
2999
3000 // get fanspeed info
3001
3002 if (hm_device[opencl_device_index].od_version == 5)
3003 {
3004 ADLFanSpeedInfo FanSpeedInfo;
3005
3006 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
3007
3008 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
3009
3010 if (hc_ADL_Overdrive5_FanSpeedInfo_Get (hm_dll_amd, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
3011
3012 // check read and write capability in fanspeedinfo
3013
3014 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
3015 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
3016 {
3017 hm_device[opencl_device_index].fan_supported = 1;
3018 }
3019 else
3020 {
3021 hm_device[opencl_device_index].fan_supported = 0;
3022 }
3023 }
3024 else // od_version == 6
3025 {
3026 ADLOD6FanSpeedInfo faninfo;
3027
3028 memset (&faninfo, 0, sizeof (faninfo));
3029
3030 if (hc_ADL_Overdrive6_FanSpeed_Get (hm_dll_amd, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
3031
3032 // check read capability in fanspeedinfo
3033
3034 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
3035 {
3036 hm_device[opencl_device_index].fan_supported = 1;
3037 }
3038 else
3039 {
3040 hm_device[opencl_device_index].fan_supported = 0;
3041 }
3042 }
3043 }
3044
3045 return 0;
3046 }
3047
3048 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)
3049 {
3050 for (int i = 0; i < num_adl_adapters; i++)
3051 {
3052 u32 adapter_index = valid_adl_device_list[i];
3053
3054 // get AdapterInfo
3055
3056 AdapterInfo info = lpAdapterInfo[adapter_index];
3057
3058 // get overdrive version
3059
3060 int od_supported = 0;
3061 int od_enabled = 0;
3062 int od_version = 0;
3063
3064 if (hc_ADL_Overdrive_Caps (hm_dll_amd, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3065
3066 // store the overdrive version in hm_device
3067
3068 // unfortunately this doesn't work since bus id and dev id are not unique
3069 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3070 // if (opencl_device_index == -1) continue;
3071
3072 int opencl_device_index = i;
3073
3074 hm_device[opencl_device_index].od_version = od_version;
3075 }
3076
3077 return 0;
3078 }
3079
3080 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3081 {
3082 for (int i = 0; i < num_adl_adapters; i++)
3083 {
3084 u32 adapter_index = valid_adl_device_list[i];
3085
3086 // get AdapterInfo
3087
3088 AdapterInfo info = lpAdapterInfo[adapter_index];
3089
3090 // store the iAdapterIndex in hm_device
3091
3092 // unfortunately this doesn't work since bus id and dev id are not unique
3093 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3094 // if (opencl_device_index == -1) continue;
3095
3096 int opencl_device_index = i;
3097
3098 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3099 }
3100
3101 return num_adl_adapters;
3102 }
3103 #endif // HAVE_ADL
3104
3105 int hm_get_temperature_with_device_id (const uint device_id)
3106 {
3107 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3108
3109 #ifdef HAVE_ADL
3110 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3111 {
3112 if (data.hm_dll_amd)
3113 {
3114 if (data.hm_device[device_id].od_version == 5)
3115 {
3116 ADLTemperature Temperature;
3117
3118 Temperature.iSize = sizeof (ADLTemperature);
3119
3120 if (hc_ADL_Overdrive5_Temperature_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3121
3122 return Temperature.iTemperature / 1000;
3123 }
3124 else if (data.hm_device[device_id].od_version == 6)
3125 {
3126 int Temperature = 0;
3127
3128 if (hc_ADL_Overdrive6_Temperature_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3129
3130 return Temperature / 1000;
3131 }
3132 }
3133 }
3134 #endif
3135
3136 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3137 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3138 {
3139 #if defined(LINUX) && defined(HAVE_NVML)
3140 int temperature = 0;
3141
3142 hc_NVML_nvmlDeviceGetTemperature (data.hm_dll_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3143
3144 return temperature;
3145 #endif
3146
3147 #if defined(WIN) && defined(HAVE_NVAPI)
3148 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3149
3150 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3151 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3152 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3153 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3154
3155 if (hc_NvAPI_GPU_GetThermalSettings (data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3156
3157 return pThermalSettings.sensor[0].currentTemp;
3158 #endif // WIN && HAVE_NVAPI
3159 }
3160 #endif // HAVE_NVML || HAVE_NVAPI
3161
3162 return -1;
3163 }
3164
3165 int hm_get_fanspeed_with_device_id (const uint device_id)
3166 {
3167 // we shouldn't really need this extra CL_DEVICE_TYPE_GPU check, because fan_supported should not be set w/ CPUs
3168 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3169
3170 if (data.hm_device[device_id].fan_supported == 1)
3171 {
3172 #ifdef HAVE_ADL
3173 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3174 {
3175 if (data.hm_dll_amd)
3176 {
3177 if (data.hm_device[device_id].od_version == 5)
3178 {
3179 ADLFanSpeedValue lpFanSpeedValue;
3180
3181 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3182
3183 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3184 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3185 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3186
3187 if (hc_ADL_Overdrive5_FanSpeed_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3188
3189 return lpFanSpeedValue.iFanSpeed;
3190 }
3191 else // od_version == 6
3192 {
3193 ADLOD6FanSpeedInfo faninfo;
3194
3195 memset (&faninfo, 0, sizeof (faninfo));
3196
3197 if (hc_ADL_Overdrive6_FanSpeed_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3198
3199 return faninfo.iFanSpeedPercent;
3200 }
3201 }
3202 }
3203 #endif // HAVE_ADL
3204
3205 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3206 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3207 {
3208 #if defined(LINUX) && defined(HAVE_NVML)
3209 int speed = 0;
3210
3211 hc_NVML_nvmlDeviceGetFanSpeed (data.hm_dll_nv, 1, data.hm_device[device_id].adapter_index.nv, (unsigned int *) &speed);
3212
3213 return speed;
3214 #endif
3215
3216 #if defined(WIN) && defined(HAVE_NVAPI)
3217 NvU32 speed = 0;
3218
3219 hc_NvAPI_GPU_GetTachReading (data.hm_device[device_id].adapter_index.nv, &speed);
3220
3221 return speed;
3222 #endif
3223 }
3224 #endif // HAVE_NVML || HAVE_NVAPI
3225 }
3226
3227 return -1;
3228 }
3229
3230 int hm_get_utilization_with_device_id (const uint device_id)
3231 {
3232 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3233
3234 #ifdef HAVE_ADL
3235 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3236 {
3237 if (data.hm_dll_amd)
3238 {
3239 ADLPMActivity PMActivity;
3240
3241 PMActivity.iSize = sizeof (ADLPMActivity);
3242
3243 if (hc_ADL_Overdrive_CurrentActivity_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3244
3245 return PMActivity.iActivityPercent;
3246 }
3247 }
3248 #endif // HAVE_ADL
3249
3250 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3251 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3252 {
3253 #if defined(LINUX) && defined(HAVE_NVML)
3254 nvmlUtilization_t utilization;
3255
3256 hc_NVML_nvmlDeviceGetUtilizationRates (data.hm_dll_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3257
3258 return utilization.gpu;
3259 #endif
3260
3261 #if defined(WIN) && defined(HAVE_NVAPI)
3262 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3263
3264 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3265
3266 if (hc_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3267
3268 return pDynamicPstatesInfoEx.utilization[0].percentage;
3269 #endif
3270 }
3271 #endif // HAVE_NVML || HAVE_NVAPI
3272
3273 return -1;
3274 }
3275
3276 #ifdef HAVE_ADL
3277 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3278 {
3279 if (data.hm_device[device_id].fan_supported == 1)
3280 {
3281 if (data.hm_dll_amd)
3282 {
3283 if (data.hm_device[device_id].od_version == 5)
3284 {
3285 ADLFanSpeedValue lpFanSpeedValue;
3286
3287 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3288
3289 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3290 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3291 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3292 lpFanSpeedValue.iFanSpeed = fanspeed;
3293
3294 if (hc_ADL_Overdrive5_FanSpeed_Set (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3295
3296 return 0;
3297 }
3298 else // od_version == 6
3299 {
3300 ADLOD6FanSpeedValue fan_speed_value;
3301
3302 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3303
3304 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3305 fan_speed_value.iFanSpeed = fanspeed;
3306
3307 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;
3308
3309 return 0;
3310 }
3311 }
3312 }
3313
3314 return -1;
3315 }
3316 #endif
3317
3318 // helper function for status display
3319
3320 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3321 {
3322 #define VALUE_NOT_AVAILABLE "N/A"
3323
3324 if (value == -1)
3325 {
3326 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3327 }
3328 else
3329 {
3330 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3331 }
3332 }
3333 #endif // HAVE_HWMON
3334
3335 /**
3336 * maskprocessor
3337 */
3338
3339 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3340 {
3341 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3342
3343 if (css_cnt > SP_PW_MAX)
3344 {
3345 log_error ("ERROR: mask length is too long");
3346
3347 exit (-1);
3348 }
3349
3350 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3351 {
3352 uint *uniq_tbl = uniq_tbls[css_pos];
3353
3354 uint *cs_buf = css[css_pos].cs_buf;
3355 uint cs_len = css[css_pos].cs_len;
3356
3357 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3358 {
3359 uint c = cs_buf[cs_pos] & 0xff;
3360
3361 uniq_tbl[c] = 1;
3362 }
3363 }
3364 }
3365
3366 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3367 {
3368 cs_t *cs = &css[css_cnt];
3369
3370 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3371
3372 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3373
3374 size_t i;
3375
3376 for (i = 0; i < cs->cs_len; i++)
3377 {
3378 const uint u = cs->cs_buf[i];
3379
3380 css_uniq[u] = 1;
3381 }
3382
3383 for (i = 0; i < in_len; i++)
3384 {
3385 uint u = in_buf[i] & 0xff;
3386
3387 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3388
3389 if (css_uniq[u] == 1) continue;
3390
3391 css_uniq[u] = 1;
3392
3393 cs->cs_buf[cs->cs_len] = u;
3394
3395 cs->cs_len++;
3396 }
3397
3398 myfree (css_uniq);
3399 }
3400
3401 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3402 {
3403 size_t in_pos;
3404
3405 for (in_pos = 0; in_pos < in_len; in_pos++)
3406 {
3407 uint p0 = in_buf[in_pos] & 0xff;
3408
3409 if (interpret == 1 && p0 == '?')
3410 {
3411 in_pos++;
3412
3413 if (in_pos == in_len) break;
3414
3415 uint p1 = in_buf[in_pos] & 0xff;
3416
3417 switch (p1)
3418 {
3419 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3420 break;
3421 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3422 break;
3423 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3424 break;
3425 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3426 break;
3427 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3428 break;
3429 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3430 break;
3431 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3432 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3433 break;
3434 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3435 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3436 break;
3437 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3438 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3439 break;
3440 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3441 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3442 break;
3443 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3444 break;
3445 default: log_error ("Syntax error: %s", in_buf);
3446 exit (-1);
3447 }
3448 }
3449 else
3450 {
3451 if (data.hex_charset)
3452 {
3453 in_pos++;
3454
3455 if (in_pos == in_len)
3456 {
3457 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3458
3459 exit (-1);
3460 }
3461
3462 uint p1 = in_buf[in_pos] & 0xff;
3463
3464 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3465 {
3466 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3467
3468 exit (-1);
3469 }
3470
3471 uint chr = 0;
3472
3473 chr = hex_convert (p1) << 0;
3474 chr |= hex_convert (p0) << 4;
3475
3476 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3477 }
3478 else
3479 {
3480 uint chr = p0;
3481
3482 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3483 }
3484 }
3485 }
3486 }
3487
3488 u64 mp_get_sum (uint css_cnt, cs_t *css)
3489 {
3490 u64 sum = 1;
3491
3492 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3493 {
3494 sum *= css[css_pos].cs_len;
3495 }
3496
3497 return (sum);
3498 }
3499
3500 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3501 {
3502 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3503
3504 uint mask_pos;
3505 uint css_pos;
3506
3507 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3508 {
3509 char p0 = mask_buf[mask_pos];
3510
3511 if (p0 == '?')
3512 {
3513 mask_pos++;
3514
3515 if (mask_pos == mask_len) break;
3516
3517 char p1 = mask_buf[mask_pos];
3518
3519 uint chr = p1;
3520
3521 switch (p1)
3522 {
3523 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3524 break;
3525 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3526 break;
3527 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3528 break;
3529 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3530 break;
3531 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3532 break;
3533 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3534 break;
3535 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3536 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3537 break;
3538 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3539 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3540 break;
3541 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3542 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3543 break;
3544 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3545 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3546 break;
3547 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3548 break;
3549 default: log_error ("ERROR: syntax error: %s", mask_buf);
3550 exit (-1);
3551 }
3552 }
3553 else
3554 {
3555 if (data.hex_charset)
3556 {
3557 mask_pos++;
3558
3559 // if there is no 2nd hex character, show an error:
3560
3561 if (mask_pos == mask_len)
3562 {
3563 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3564
3565 exit (-1);
3566 }
3567
3568 char p1 = mask_buf[mask_pos];
3569
3570 // if they are not valid hex character, show an error:
3571
3572 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3573 {
3574 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3575
3576 exit (-1);
3577 }
3578
3579 uint chr = 0;
3580
3581 chr |= hex_convert (p1) << 0;
3582 chr |= hex_convert (p0) << 4;
3583
3584 mp_add_cs_buf (&chr, 1, css, css_pos);
3585 }
3586 else
3587 {
3588 uint chr = p0;
3589
3590 mp_add_cs_buf (&chr, 1, css, css_pos);
3591 }
3592 }
3593 }
3594
3595 if (css_pos == 0)
3596 {
3597 log_error ("ERROR: invalid mask length (0)");
3598
3599 exit (-1);
3600 }
3601
3602 *css_cnt = css_pos;
3603
3604 return (css);
3605 }
3606
3607 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3608 {
3609 for (int i = 0; i < css_cnt; i++)
3610 {
3611 uint len = css[i].cs_len;
3612 u64 next = val / len;
3613 uint pos = val % len;
3614 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3615 val = next;
3616 }
3617 }
3618
3619 void mp_cut_at (char *mask, uint max)
3620 {
3621 uint i;
3622 uint j;
3623 uint mask_len = strlen (mask);
3624
3625 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3626 {
3627 if (mask[i] == '?') i++;
3628 }
3629
3630 mask[i] = 0;
3631 }
3632
3633 void mp_setup_sys (cs_t *mp_sys)
3634 {
3635 uint pos;
3636 uint chr;
3637 uint donec[CHARSIZ] = { 0 };
3638
3639 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3640 mp_sys[0].cs_buf[pos++] = chr;
3641 mp_sys[0].cs_len = pos; }
3642
3643 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3644 mp_sys[1].cs_buf[pos++] = chr;
3645 mp_sys[1].cs_len = pos; }
3646
3647 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3648 mp_sys[2].cs_buf[pos++] = chr;
3649 mp_sys[2].cs_len = pos; }
3650
3651 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3652 mp_sys[3].cs_buf[pos++] = chr;
3653 mp_sys[3].cs_len = pos; }
3654
3655 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3656 mp_sys[4].cs_len = pos; }
3657
3658 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3659 mp_sys[5].cs_len = pos; }
3660 }
3661
3662 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3663 {
3664 FILE *fp = fopen (buf, "rb");
3665
3666 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3667 {
3668 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3669 }
3670 else
3671 {
3672 char mp_file[1024] = { 0 };
3673
3674 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3675
3676 fclose (fp);
3677
3678 len = in_superchop (mp_file);
3679
3680 if (len == 0)
3681 {
3682 log_info ("WARNING: charset file corrupted");
3683
3684 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3685 }
3686 else
3687 {
3688 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3689 }
3690 }
3691 }
3692
3693 void mp_reset_usr (cs_t *mp_usr, uint index)
3694 {
3695 mp_usr[index].cs_len = 0;
3696
3697 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3698 }
3699
3700 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3701 {
3702 char *new_mask_buf = (char *) mymalloc (256);
3703
3704 uint mask_pos;
3705
3706 uint css_pos;
3707
3708 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3709 {
3710 if (css_pos == len) break;
3711
3712 char p0 = mask_buf[mask_pos];
3713
3714 new_mask_buf[mask_pos] = p0;
3715
3716 if (p0 == '?')
3717 {
3718 mask_pos++;
3719
3720 if (mask_pos == mask_len) break;
3721
3722 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3723 }
3724 else
3725 {
3726 if (data.hex_charset)
3727 {
3728 mask_pos++;
3729
3730 if (mask_pos == mask_len)
3731 {
3732 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3733
3734 exit (-1);
3735 }
3736
3737 char p1 = mask_buf[mask_pos];
3738
3739 // if they are not valid hex character, show an error:
3740
3741 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3742 {
3743 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3744
3745 exit (-1);
3746 }
3747
3748 new_mask_buf[mask_pos] = p1;
3749 }
3750 }
3751 }
3752
3753 if (css_pos == len) return (new_mask_buf);
3754
3755 myfree (new_mask_buf);
3756
3757 return (NULL);
3758 }
3759
3760 /**
3761 * statprocessor
3762 */
3763
3764 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3765 {
3766 u64 sum = 1;
3767
3768 uint i;
3769
3770 for (i = start; i < stop; i++)
3771 {
3772 sum *= root_css_buf[i].cs_len;
3773 }
3774
3775 return (sum);
3776 }
3777
3778 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3779 {
3780 u64 v = ctx;
3781
3782 cs_t *cs = &root_css_buf[start];
3783
3784 uint i;
3785
3786 for (i = start; i < stop; i++)
3787 {
3788 const u64 m = v % cs->cs_len;
3789 const u64 d = v / cs->cs_len;
3790
3791 v = d;
3792
3793 const uint k = cs->cs_buf[m];
3794
3795 pw_buf[i - start] = (char) k;
3796
3797 cs = &markov_css_buf[(i * CHARSIZ) + k];
3798 }
3799 }
3800
3801 int sp_comp_val (const void *p1, const void *p2)
3802 {
3803 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3804 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3805
3806 return b2->val - b1->val;
3807 }
3808
3809 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)
3810 {
3811 uint i;
3812 uint j;
3813 uint k;
3814
3815 /**
3816 * Initialize hcstats
3817 */
3818
3819 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3820
3821 u64 *root_stats_ptr = root_stats_buf;
3822
3823 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3824
3825 for (i = 0; i < SP_PW_MAX; i++)
3826 {
3827 root_stats_buf_by_pos[i] = root_stats_ptr;
3828
3829 root_stats_ptr += CHARSIZ;
3830 }
3831
3832 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3833
3834 u64 *markov_stats_ptr = markov_stats_buf;
3835
3836 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3837
3838 for (i = 0; i < SP_PW_MAX; i++)
3839 {
3840 for (j = 0; j < CHARSIZ; j++)
3841 {
3842 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3843
3844 markov_stats_ptr += CHARSIZ;
3845 }
3846 }
3847
3848 /**
3849 * Load hcstats File
3850 */
3851
3852 if (hcstat == NULL)
3853 {
3854 char hcstat_tmp[256] = { 0 };
3855
3856 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3857
3858 hcstat = hcstat_tmp;
3859 }
3860
3861 FILE *fd = fopen (hcstat, "rb");
3862
3863 if (fd == NULL)
3864 {
3865 log_error ("%s: %s", hcstat, strerror (errno));
3866
3867 exit (-1);
3868 }
3869
3870 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3871 {
3872 log_error ("%s: Could not load data", hcstat);
3873
3874 fclose (fd);
3875
3876 exit (-1);
3877 }
3878
3879 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3880 {
3881 log_error ("%s: Could not load data", hcstat);
3882
3883 fclose (fd);
3884
3885 exit (-1);
3886 }
3887
3888 fclose (fd);
3889
3890 /**
3891 * Markov modifier of hcstat_table on user request
3892 */
3893
3894 if (disable)
3895 {
3896 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3897 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3898 }
3899
3900 if (classic)
3901 {
3902 /* Add all stats to first position */
3903
3904 for (i = 1; i < SP_PW_MAX; i++)
3905 {
3906 u64 *out = root_stats_buf_by_pos[0];
3907 u64 *in = root_stats_buf_by_pos[i];
3908
3909 for (j = 0; j < CHARSIZ; j++)
3910 {
3911 *out++ += *in++;
3912 }
3913 }
3914
3915 for (i = 1; i < SP_PW_MAX; i++)
3916 {
3917 u64 *out = markov_stats_buf_by_key[0][0];
3918 u64 *in = markov_stats_buf_by_key[i][0];
3919
3920 for (j = 0; j < CHARSIZ; j++)
3921 {
3922 for (k = 0; k < CHARSIZ; k++)
3923 {
3924 *out++ += *in++;
3925 }
3926 }
3927 }
3928
3929 /* copy them to all pw_positions */
3930
3931 for (i = 1; i < SP_PW_MAX; i++)
3932 {
3933 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
3934 }
3935
3936 for (i = 1; i < SP_PW_MAX; i++)
3937 {
3938 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
3939 }
3940 }
3941
3942 /**
3943 * Initialize tables
3944 */
3945
3946 hcstat_table_t *root_table_ptr = root_table_buf;
3947
3948 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3949
3950 for (i = 0; i < SP_PW_MAX; i++)
3951 {
3952 root_table_buf_by_pos[i] = root_table_ptr;
3953
3954 root_table_ptr += CHARSIZ;
3955 }
3956
3957 hcstat_table_t *markov_table_ptr = markov_table_buf;
3958
3959 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3960
3961 for (i = 0; i < SP_PW_MAX; i++)
3962 {
3963 for (j = 0; j < CHARSIZ; j++)
3964 {
3965 markov_table_buf_by_key[i][j] = markov_table_ptr;
3966
3967 markov_table_ptr += CHARSIZ;
3968 }
3969 }
3970
3971 /**
3972 * Convert hcstat to tables
3973 */
3974
3975 for (i = 0; i < SP_ROOT_CNT; i++)
3976 {
3977 uint key = i % CHARSIZ;
3978
3979 root_table_buf[i].key = key;
3980 root_table_buf[i].val = root_stats_buf[i];
3981 }
3982
3983 for (i = 0; i < SP_MARKOV_CNT; i++)
3984 {
3985 uint key = i % CHARSIZ;
3986
3987 markov_table_buf[i].key = key;
3988 markov_table_buf[i].val = markov_stats_buf[i];
3989 }
3990
3991 myfree (root_stats_buf);
3992 myfree (markov_stats_buf);
3993
3994 /**
3995 * Finally sort them
3996 */
3997
3998 for (i = 0; i < SP_PW_MAX; i++)
3999 {
4000 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4001 }
4002
4003 for (i = 0; i < SP_PW_MAX; i++)
4004 {
4005 for (j = 0; j < CHARSIZ; j++)
4006 {
4007 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4008 }
4009 }
4010 }
4011
4012 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])
4013 {
4014 /**
4015 * Convert tables to css
4016 */
4017
4018 for (uint i = 0; i < SP_ROOT_CNT; i++)
4019 {
4020 uint pw_pos = i / CHARSIZ;
4021
4022 cs_t *cs = &root_css_buf[pw_pos];
4023
4024 if (cs->cs_len == threshold) continue;
4025
4026 uint key = root_table_buf[i].key;
4027
4028 if (uniq_tbls[pw_pos][key] == 0) continue;
4029
4030 cs->cs_buf[cs->cs_len] = key;
4031
4032 cs->cs_len++;
4033 }
4034
4035 /**
4036 * Convert table to css
4037 */
4038
4039 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4040 {
4041 uint c = i / CHARSIZ;
4042
4043 cs_t *cs = &markov_css_buf[c];
4044
4045 if (cs->cs_len == threshold) continue;
4046
4047 uint pw_pos = c / CHARSIZ;
4048
4049 uint key = markov_table_buf[i].key;
4050
4051 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4052
4053 cs->cs_buf[cs->cs_len] = key;
4054
4055 cs->cs_len++;
4056 }
4057
4058 /*
4059 for (uint i = 0; i < 8; i++)
4060 {
4061 for (uint j = 0x20; j < 0x80; j++)
4062 {
4063 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4064
4065 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4066
4067 for (uint k = 0; k < 10; k++)
4068 {
4069 printf (" %u\n", ptr->cs_buf[k]);
4070 }
4071 }
4072 }
4073 */
4074 }
4075
4076 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4077 {
4078 for (uint i = 0; i < SP_PW_MAX; i += 2)
4079 {
4080 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4081
4082 out += CHARSIZ;
4083 in += CHARSIZ;
4084
4085 out->key = 0;
4086 out->val = 1;
4087
4088 out++;
4089
4090 for (uint j = 1; j < CHARSIZ; j++)
4091 {
4092 out->key = j;
4093 out->val = 0;
4094
4095 out++;
4096 }
4097 }
4098 }
4099
4100 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4101 {
4102 for (uint i = 0; i < SP_PW_MAX; i += 2)
4103 {
4104 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4105
4106 out += CHARSIZ * CHARSIZ;
4107 in += CHARSIZ * CHARSIZ;
4108
4109 for (uint j = 0; j < CHARSIZ; j++)
4110 {
4111 out->key = 0;
4112 out->val = 1;
4113
4114 out++;
4115
4116 for (uint k = 1; k < CHARSIZ; k++)
4117 {
4118 out->key = k;
4119 out->val = 0;
4120
4121 out++;
4122 }
4123 }
4124 }
4125 }
4126
4127 /**
4128 * mixed shared functions
4129 */
4130
4131 void dump_hex (const u8 *s, const int sz)
4132 {
4133 for (int i = 0; i < sz; i++)
4134 {
4135 log_info_nn ("%02x ", s[i]);
4136 }
4137
4138 log_info ("");
4139 }
4140
4141 void usage_mini_print (const char *progname)
4142 {
4143 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4144 }
4145
4146 void usage_big_print (const char *progname)
4147 {
4148 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4149 }
4150
4151 char *get_exec_path ()
4152 {
4153 int exec_path_len = 1024;
4154
4155 char *exec_path = (char *) mymalloc (exec_path_len);
4156
4157 #ifdef LINUX
4158
4159 char tmp[32] = { 0 };
4160
4161 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4162
4163 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4164
4165 #elif WIN
4166
4167 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4168
4169 #elif OSX
4170
4171 uint size = exec_path_len;
4172
4173 if (_NSGetExecutablePath (exec_path, &size) != 0)
4174 {
4175 log_error("! executable path buffer too small\n");
4176
4177 exit (-1);
4178 }
4179
4180 const int len = strlen (exec_path);
4181
4182 #else
4183 #error Your Operating System is not supported or detected
4184 #endif
4185
4186 exec_path[len] = 0;
4187
4188 return exec_path;
4189 }
4190
4191 char *get_install_dir (const char *progname)
4192 {
4193 char *install_dir = mystrdup (progname);
4194 char *last_slash = NULL;
4195
4196 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4197 {
4198 *last_slash = 0;
4199 }
4200 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4201 {
4202 *last_slash = 0;
4203 }
4204 else
4205 {
4206 install_dir[0] = '.';
4207 install_dir[1] = 0;
4208 }
4209
4210 return (install_dir);
4211 }
4212
4213 char *get_profile_dir (const char *homedir)
4214 {
4215 #define DOT_HASHCAT ".hashcat"
4216
4217 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4218
4219 char *profile_dir = (char *) mymalloc (len + 1);
4220
4221 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4222
4223 return profile_dir;
4224 }
4225
4226 char *get_session_dir (const char *profile_dir)
4227 {
4228 #define SESSIONS_FOLDER "sessions"
4229
4230 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4231
4232 char *session_dir = (char *) mymalloc (len + 1);
4233
4234 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4235
4236 return session_dir;
4237 }
4238
4239 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4240 {
4241 uint crc = ~0;
4242
4243 FILE *fd = fopen (filename, "rb");
4244
4245 if (fd == NULL)
4246 {
4247 log_error ("%s: %s", filename, strerror (errno));
4248
4249 exit (-1);
4250 }
4251
4252 #define MAX_KEY_SIZE (1024 * 1024)
4253
4254 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4255
4256 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4257
4258 fclose (fd);
4259
4260 int kpos = 0;
4261
4262 for (int fpos = 0; fpos < nread; fpos++)
4263 {
4264 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4265
4266 keytab[kpos++] += (crc >> 24) & 0xff;
4267 keytab[kpos++] += (crc >> 16) & 0xff;
4268 keytab[kpos++] += (crc >> 8) & 0xff;
4269 keytab[kpos++] += (crc >> 0) & 0xff;
4270
4271 if (kpos >= 64) kpos = 0;
4272 }
4273
4274 myfree (buf);
4275 }
4276
4277 void set_cpu_affinity (char *cpu_affinity)
4278 {
4279 #ifdef WIN
4280 DWORD_PTR aff_mask = 0;
4281 #elif LINUX
4282 cpu_set_t cpuset;
4283 CPU_ZERO (&cpuset);
4284 #endif
4285
4286 if (cpu_affinity)
4287 {
4288 char *devices = strdup (cpu_affinity);
4289
4290 char *next = strtok (devices, ",");
4291
4292 do
4293 {
4294 uint cpu_id = atoi (next);
4295
4296 if (cpu_id == 0)
4297 {
4298 #ifdef WIN
4299 aff_mask = 0;
4300 #elif LINUX
4301 CPU_ZERO (&cpuset);
4302 #endif
4303
4304 break;
4305 }
4306
4307 if (cpu_id > 32)
4308 {
4309 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4310
4311 exit (-1);
4312 }
4313
4314 #ifdef WIN
4315 aff_mask |= 1 << (cpu_id - 1);
4316 #elif LINUX
4317 CPU_SET ((cpu_id - 1), &cpuset);
4318 #endif
4319
4320 } while ((next = strtok (NULL, ",")) != NULL);
4321
4322 free (devices);
4323 }
4324
4325 #ifdef WIN
4326 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4327 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4328 #elif LINUX
4329 pthread_t thread = pthread_self ();
4330 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4331 #endif
4332 }
4333
4334 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4335 {
4336 char *element, *end;
4337
4338 end = (char *) base + nmemb * size;
4339
4340 for (element = (char *) base; element < end; element += size)
4341 if (!compar (element, key))
4342 return element;
4343
4344 return NULL;
4345 }
4346
4347 int sort_by_salt (const void *v1, const void *v2)
4348 {
4349 const salt_t *s1 = (const salt_t *) v1;
4350 const salt_t *s2 = (const salt_t *) v2;
4351
4352 const int res1 = s1->salt_len - s2->salt_len;
4353
4354 if (res1 != 0) return (res1);
4355
4356 const int res2 = s1->salt_iter - s2->salt_iter;
4357
4358 if (res2 != 0) return (res2);
4359
4360 uint n;
4361
4362 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 n = 8;
4371
4372 while (n--)
4373 {
4374 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4375 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4376 }
4377
4378 return (0);
4379 }
4380
4381 int sort_by_salt_buf (const void *v1, const void *v2)
4382 {
4383 const pot_t *p1 = (const pot_t *) v1;
4384 const pot_t *p2 = (const pot_t *) v2;
4385
4386 const hash_t *h1 = &p1->hash;
4387 const hash_t *h2 = &p2->hash;
4388
4389 const salt_t *s1 = h1->salt;
4390 const salt_t *s2 = h2->salt;
4391
4392 uint n = 12;
4393
4394 while (n--)
4395 {
4396 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4397 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4398 }
4399
4400 return 0;
4401 }
4402
4403 int sort_by_hash_t_salt (const void *v1, const void *v2)
4404 {
4405 const hash_t *h1 = (const hash_t *) v1;
4406 const hash_t *h2 = (const hash_t *) v2;
4407
4408 const salt_t *s1 = h1->salt;
4409 const salt_t *s2 = h2->salt;
4410
4411 // testphase: this should work
4412 uint n = 12;
4413
4414 while (n--)
4415 {
4416 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4417 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4418 }
4419
4420 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4421 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4422 if (s1->salt_len > s2->salt_len) return ( 1);
4423 if (s1->salt_len < s2->salt_len) return (-1);
4424
4425 uint n = s1->salt_len;
4426
4427 while (n--)
4428 {
4429 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4430 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4431 }
4432 */
4433
4434 return 0;
4435 }
4436
4437 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4438 {
4439 const hash_t *h1 = (const hash_t *) v1;
4440 const hash_t *h2 = (const hash_t *) v2;
4441
4442 const salt_t *s1 = h1->salt;
4443 const salt_t *s2 = h2->salt;
4444
4445 // 12 - 2 (since last 2 uints contain the digest)
4446 uint n = 10;
4447
4448 while (n--)
4449 {
4450 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4451 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4452 }
4453
4454 return 0;
4455 }
4456
4457 int sort_by_hash_no_salt (const void *v1, const void *v2)
4458 {
4459 const hash_t *h1 = (const hash_t *) v1;
4460 const hash_t *h2 = (const hash_t *) v2;
4461
4462 const void *d1 = h1->digest;
4463 const void *d2 = h2->digest;
4464
4465 return data.sort_by_digest (d1, d2);
4466 }
4467
4468 int sort_by_hash (const void *v1, const void *v2)
4469 {
4470 const hash_t *h1 = (const hash_t *) v1;
4471 const hash_t *h2 = (const hash_t *) v2;
4472
4473 if (data.isSalted)
4474 {
4475 const salt_t *s1 = h1->salt;
4476 const salt_t *s2 = h2->salt;
4477
4478 int res = sort_by_salt (s1, s2);
4479
4480 if (res != 0) return (res);
4481 }
4482
4483 const void *d1 = h1->digest;
4484 const void *d2 = h2->digest;
4485
4486 return data.sort_by_digest (d1, d2);
4487 }
4488
4489 int sort_by_pot (const void *v1, const void *v2)
4490 {
4491 const pot_t *p1 = (const pot_t *) v1;
4492 const pot_t *p2 = (const pot_t *) v2;
4493
4494 const hash_t *h1 = &p1->hash;
4495 const hash_t *h2 = &p2->hash;
4496
4497 return sort_by_hash (h1, h2);
4498 }
4499
4500 int sort_by_mtime (const void *p1, const void *p2)
4501 {
4502 const char **f1 = (const char **) p1;
4503 const char **f2 = (const char **) p2;
4504
4505 struct stat s1; stat (*f1, &s1);
4506 struct stat s2; stat (*f2, &s2);
4507
4508 return s2.st_mtime - s1.st_mtime;
4509 }
4510
4511 int sort_by_cpu_rule (const void *p1, const void *p2)
4512 {
4513 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4514 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4515
4516 return memcmp (r1, r2, sizeof (cpu_rule_t));
4517 }
4518
4519 int sort_by_kernel_rule (const void *p1, const void *p2)
4520 {
4521 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4522 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4523
4524 return memcmp (r1, r2, sizeof (kernel_rule_t));
4525 }
4526
4527 int sort_by_stringptr (const void *p1, const void *p2)
4528 {
4529 const char **s1 = (const char **) p1;
4530 const char **s2 = (const char **) p2;
4531
4532 return strcmp (*s1, *s2);
4533 }
4534
4535 int sort_by_dictstat (const void *s1, const void *s2)
4536 {
4537 dictstat_t *d1 = (dictstat_t *) s1;
4538 dictstat_t *d2 = (dictstat_t *) s2;
4539
4540 #ifdef LINUX
4541 d2->stat.st_atim = d1->stat.st_atim;
4542 #else
4543 d2->stat.st_atime = d1->stat.st_atime;
4544 #endif
4545
4546 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4547 }
4548
4549 int sort_by_bitmap (const void *p1, const void *p2)
4550 {
4551 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4552 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4553
4554 return b1->collisions - b2->collisions;
4555 }
4556
4557 int sort_by_digest_4_2 (const void *v1, const void *v2)
4558 {
4559 const u32 *d1 = (const u32 *) v1;
4560 const u32 *d2 = (const u32 *) v2;
4561
4562 uint n = 2;
4563
4564 while (n--)
4565 {
4566 if (d1[n] > d2[n]) return ( 1);
4567 if (d1[n] < d2[n]) return (-1);
4568 }
4569
4570 return (0);
4571 }
4572
4573 int sort_by_digest_4_4 (const void *v1, const void *v2)
4574 {
4575 const u32 *d1 = (const u32 *) v1;
4576 const u32 *d2 = (const u32 *) v2;
4577
4578 uint n = 4;
4579
4580 while (n--)
4581 {
4582 if (d1[n] > d2[n]) return ( 1);
4583 if (d1[n] < d2[n]) return (-1);
4584 }
4585
4586 return (0);
4587 }
4588
4589 int sort_by_digest_4_5 (const void *v1, const void *v2)
4590 {
4591 const u32 *d1 = (const u32 *) v1;
4592 const u32 *d2 = (const u32 *) v2;
4593
4594 uint n = 5;
4595
4596 while (n--)
4597 {
4598 if (d1[n] > d2[n]) return ( 1);
4599 if (d1[n] < d2[n]) return (-1);
4600 }
4601
4602 return (0);
4603 }
4604
4605 int sort_by_digest_4_6 (const void *v1, const void *v2)
4606 {
4607 const u32 *d1 = (const u32 *) v1;
4608 const u32 *d2 = (const u32 *) v2;
4609
4610 uint n = 6;
4611
4612 while (n--)
4613 {
4614 if (d1[n] > d2[n]) return ( 1);
4615 if (d1[n] < d2[n]) return (-1);
4616 }
4617
4618 return (0);
4619 }
4620
4621 int sort_by_digest_4_8 (const void *v1, const void *v2)
4622 {
4623 const u32 *d1 = (const u32 *) v1;
4624 const u32 *d2 = (const u32 *) v2;
4625
4626 uint n = 8;
4627
4628 while (n--)
4629 {
4630 if (d1[n] > d2[n]) return ( 1);
4631 if (d1[n] < d2[n]) return (-1);
4632 }
4633
4634 return (0);
4635 }
4636
4637 int sort_by_digest_4_16 (const void *v1, const void *v2)
4638 {
4639 const u32 *d1 = (const u32 *) v1;
4640 const u32 *d2 = (const u32 *) v2;
4641
4642 uint n = 16;
4643
4644 while (n--)
4645 {
4646 if (d1[n] > d2[n]) return ( 1);
4647 if (d1[n] < d2[n]) return (-1);
4648 }
4649
4650 return (0);
4651 }
4652
4653 int sort_by_digest_4_32 (const void *v1, const void *v2)
4654 {
4655 const u32 *d1 = (const u32 *) v1;
4656 const u32 *d2 = (const u32 *) v2;
4657
4658 uint n = 32;
4659
4660 while (n--)
4661 {
4662 if (d1[n] > d2[n]) return ( 1);
4663 if (d1[n] < d2[n]) return (-1);
4664 }
4665
4666 return (0);
4667 }
4668
4669 int sort_by_digest_4_64 (const void *v1, const void *v2)
4670 {
4671 const u32 *d1 = (const u32 *) v1;
4672 const u32 *d2 = (const u32 *) v2;
4673
4674 uint n = 64;
4675
4676 while (n--)
4677 {
4678 if (d1[n] > d2[n]) return ( 1);
4679 if (d1[n] < d2[n]) return (-1);
4680 }
4681
4682 return (0);
4683 }
4684
4685 int sort_by_digest_8_8 (const void *v1, const void *v2)
4686 {
4687 const u64 *d1 = (const u64 *) v1;
4688 const u64 *d2 = (const u64 *) v2;
4689
4690 uint n = 8;
4691
4692 while (n--)
4693 {
4694 if (d1[n] > d2[n]) return ( 1);
4695 if (d1[n] < d2[n]) return (-1);
4696 }
4697
4698 return (0);
4699 }
4700
4701 int sort_by_digest_8_16 (const void *v1, const void *v2)
4702 {
4703 const u64 *d1 = (const u64 *) v1;
4704 const u64 *d2 = (const u64 *) v2;
4705
4706 uint n = 16;
4707
4708 while (n--)
4709 {
4710 if (d1[n] > d2[n]) return ( 1);
4711 if (d1[n] < d2[n]) return (-1);
4712 }
4713
4714 return (0);
4715 }
4716
4717 int sort_by_digest_8_25 (const void *v1, const void *v2)
4718 {
4719 const u64 *d1 = (const u64 *) v1;
4720 const u64 *d2 = (const u64 *) v2;
4721
4722 uint n = 25;
4723
4724 while (n--)
4725 {
4726 if (d1[n] > d2[n]) return ( 1);
4727 if (d1[n] < d2[n]) return (-1);
4728 }
4729
4730 return (0);
4731 }
4732
4733 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4734 {
4735 const u32 *d1 = (const u32 *) v1;
4736 const u32 *d2 = (const u32 *) v2;
4737
4738 const uint dgst_pos0 = data.dgst_pos0;
4739 const uint dgst_pos1 = data.dgst_pos1;
4740 const uint dgst_pos2 = data.dgst_pos2;
4741 const uint dgst_pos3 = data.dgst_pos3;
4742
4743 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4744 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4745 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4746 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4747 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4748 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4749 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4750 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4751
4752 return (0);
4753 }
4754
4755 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)
4756 {
4757 uint outfile_autohex = data.outfile_autohex;
4758
4759 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4760
4761 FILE *debug_fp = NULL;
4762
4763 if (debug_file != NULL)
4764 {
4765 debug_fp = fopen (debug_file, "ab");
4766
4767 lock_file (debug_fp);
4768 }
4769 else
4770 {
4771 debug_fp = stderr;
4772 }
4773
4774 if (debug_fp == NULL)
4775 {
4776 log_info ("WARNING: Could not open debug-file for writing");
4777 }
4778 else
4779 {
4780 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4781 {
4782 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4783
4784 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4785 }
4786
4787 fwrite (rule_ptr, rule_len, 1, debug_fp);
4788
4789 if (debug_mode == 4)
4790 {
4791 fputc (':', debug_fp);
4792
4793 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4794 }
4795
4796 fputc ('\n', debug_fp);
4797
4798 if (debug_file != NULL) fclose (debug_fp);
4799 }
4800 }
4801
4802 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4803 {
4804 int needs_hexify = 0;
4805
4806 if (outfile_autohex == 1)
4807 {
4808 for (uint i = 0; i < plain_len; i++)
4809 {
4810 if (plain_ptr[i] < 0x20)
4811 {
4812 needs_hexify = 1;
4813
4814 break;
4815 }
4816
4817 if (plain_ptr[i] > 0x7f)
4818 {
4819 needs_hexify = 1;
4820
4821 break;
4822 }
4823 }
4824 }
4825
4826 if (needs_hexify == 1)
4827 {
4828 fprintf (fp, "$HEX[");
4829
4830 for (uint i = 0; i < plain_len; i++)
4831 {
4832 fprintf (fp, "%02x", plain_ptr[i]);
4833 }
4834
4835 fprintf (fp, "]");
4836 }
4837 else
4838 {
4839 fwrite (plain_ptr, plain_len, 1, fp);
4840 }
4841 }
4842
4843 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)
4844 {
4845 uint outfile_format = data.outfile_format;
4846
4847 char separator = data.separator;
4848
4849 if (outfile_format & OUTFILE_FMT_HASH)
4850 {
4851 fprintf (out_fp, "%s", out_buf);
4852
4853 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4854 {
4855 fputc (separator, out_fp);
4856 }
4857 }
4858 else if (data.username)
4859 {
4860 if (username != NULL)
4861 {
4862 for (uint i = 0; i < user_len; i++)
4863 {
4864 fprintf (out_fp, "%c", username[i]);
4865 }
4866
4867 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4868 {
4869 fputc (separator, out_fp);
4870 }
4871 }
4872 }
4873
4874 if (outfile_format & OUTFILE_FMT_PLAIN)
4875 {
4876 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4877
4878 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4879 {
4880 fputc (separator, out_fp);
4881 }
4882 }
4883
4884 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4885 {
4886 for (uint i = 0; i < plain_len; i++)
4887 {
4888 fprintf (out_fp, "%02x", plain_ptr[i]);
4889 }
4890
4891 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4892 {
4893 fputc (separator, out_fp);
4894 }
4895 }
4896
4897 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4898 {
4899 #ifdef _WIN
4900 __mingw_fprintf (out_fp, "%llu", crackpos);
4901 #endif
4902
4903 #ifdef _POSIX
4904 #ifdef __x86_64__
4905 fprintf (out_fp, "%lu", (unsigned long) crackpos);
4906 #else
4907 fprintf (out_fp, "%llu", crackpos);
4908 #endif
4909 #endif
4910 }
4911
4912 fputc ('\n', out_fp);
4913 }
4914
4915 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)
4916 {
4917 pot_t pot_key;
4918
4919 pot_key.hash.salt = hashes_buf->salt;
4920 pot_key.hash.digest = hashes_buf->digest;
4921
4922 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4923
4924 if (pot_ptr)
4925 {
4926 log_info_nn ("");
4927
4928 input_buf[input_len] = 0;
4929
4930 // user
4931 unsigned char *username = NULL;
4932 uint user_len = 0;
4933
4934 if (data.username)
4935 {
4936 user_t *user = hashes_buf->hash_info->user;
4937
4938 if (user)
4939 {
4940 username = (unsigned char *) (user->user_name);
4941
4942 user_len = user->user_len;
4943 }
4944 }
4945
4946 // do output the line
4947 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4948 }
4949 }
4950
4951 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4952 #define LM_MASKED_PLAIN "[notfound]"
4953
4954 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)
4955 {
4956 // left
4957
4958 pot_t pot_left_key;
4959
4960 pot_left_key.hash.salt = hash_left->salt;
4961 pot_left_key.hash.digest = hash_left->digest;
4962
4963 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4964
4965 // right
4966
4967 uint weak_hash_found = 0;
4968
4969 pot_t pot_right_key;
4970
4971 pot_right_key.hash.salt = hash_right->salt;
4972 pot_right_key.hash.digest = hash_right->digest;
4973
4974 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4975
4976 if (pot_right_ptr == NULL)
4977 {
4978 // special case, if "weak hash"
4979
4980 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4981 {
4982 weak_hash_found = 1;
4983
4984 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4985
4986 // in theory this is not needed, but we are paranoia:
4987
4988 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4989 pot_right_ptr->plain_len = 0;
4990 }
4991 }
4992
4993 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4994 {
4995 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
4996
4997 return;
4998 }
4999
5000 // at least one half was found:
5001
5002 log_info_nn ("");
5003
5004 input_buf[input_len] = 0;
5005
5006 // user
5007
5008 unsigned char *username = NULL;
5009 uint user_len = 0;
5010
5011 if (data.username)
5012 {
5013 user_t *user = hash_left->hash_info->user;
5014
5015 if (user)
5016 {
5017 username = (unsigned char *) (user->user_name);
5018
5019 user_len = user->user_len;
5020 }
5021 }
5022
5023 // mask the part which was not found
5024
5025 uint left_part_masked = 0;
5026 uint right_part_masked = 0;
5027
5028 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5029
5030 if (pot_left_ptr == NULL)
5031 {
5032 left_part_masked = 1;
5033
5034 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5035
5036 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5037
5038 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5039 pot_left_ptr->plain_len = mask_plain_len;
5040 }
5041
5042 if (pot_right_ptr == NULL)
5043 {
5044 right_part_masked = 1;
5045
5046 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5047
5048 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5049
5050 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5051 pot_right_ptr->plain_len = mask_plain_len;
5052 }
5053
5054 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5055
5056 pot_t pot_ptr;
5057
5058 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5059
5060 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5061
5062 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5063
5064 // do output the line
5065
5066 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5067
5068 if (weak_hash_found == 1) myfree (pot_right_ptr);
5069
5070 if (left_part_masked == 1) myfree (pot_left_ptr);
5071 if (right_part_masked == 1) myfree (pot_right_ptr);
5072 }
5073
5074 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)
5075 {
5076 pot_t pot_key;
5077
5078 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5079
5080 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5081
5082 if (pot_ptr == NULL)
5083 {
5084 log_info_nn ("");
5085
5086 input_buf[input_len] = 0;
5087
5088 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5089 }
5090 }
5091
5092 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)
5093 {
5094 // left
5095
5096 pot_t pot_left_key;
5097
5098 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5099
5100 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5101
5102 // right
5103
5104 pot_t pot_right_key;
5105
5106 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5107
5108 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5109
5110 uint weak_hash_found = 0;
5111
5112 if (pot_right_ptr == NULL)
5113 {
5114 // special case, if "weak hash"
5115
5116 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5117 {
5118 weak_hash_found = 1;
5119
5120 // we just need that pot_right_ptr is not a NULL pointer
5121
5122 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5123 }
5124 }
5125
5126 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5127 {
5128 if (weak_hash_found == 1) myfree (pot_right_ptr);
5129
5130 return;
5131 }
5132
5133 // ... at least one part was not cracked
5134
5135 log_info_nn ("");
5136
5137 input_buf[input_len] = 0;
5138
5139 // only show the hash part which is still not cracked
5140
5141 uint user_len = input_len - 32;
5142
5143 char *hash_output = (char *) mymalloc (33);
5144
5145 memcpy (hash_output, input_buf, input_len);
5146
5147 if (pot_left_ptr != NULL)
5148 {
5149 // only show right part (because left part was already found)
5150
5151 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5152
5153 hash_output[user_len + 16] = 0;
5154 }
5155
5156 if (pot_right_ptr != NULL)
5157 {
5158 // only show left part (because right part was already found)
5159
5160 memcpy (hash_output + user_len, input_buf + user_len, 16);
5161
5162 hash_output[user_len + 16] = 0;
5163 }
5164
5165 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5166
5167 myfree (hash_output);
5168
5169 if (weak_hash_found == 1) myfree (pot_right_ptr);
5170 }
5171
5172 uint setup_opencl_platforms_filter (char *opencl_platforms)
5173 {
5174 uint opencl_platforms_filter = 0;
5175
5176 if (opencl_platforms)
5177 {
5178 char *platforms = strdup (opencl_platforms);
5179
5180 char *next = strtok (platforms, ",");
5181
5182 do
5183 {
5184 int platform = atoi (next);
5185
5186 if (platform < 1 || platform > 32)
5187 {
5188 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5189
5190 exit (-1);
5191 }
5192
5193 opencl_platforms_filter |= 1 << (platform - 1);
5194
5195 } while ((next = strtok (NULL, ",")) != NULL);
5196
5197 free (platforms);
5198 }
5199 else
5200 {
5201 opencl_platforms_filter = -1;
5202 }
5203
5204 return opencl_platforms_filter;
5205 }
5206
5207 u32 setup_devices_filter (char *opencl_devices)
5208 {
5209 u32 devices_filter = 0;
5210
5211 if (opencl_devices)
5212 {
5213 char *devices = strdup (opencl_devices);
5214
5215 char *next = strtok (devices, ",");
5216
5217 do
5218 {
5219 int device_id = atoi (next);
5220
5221 if (device_id < 1 || device_id > 32)
5222 {
5223 log_error ("ERROR: invalid device_id %u specified", device_id);
5224
5225 exit (-1);
5226 }
5227
5228 devices_filter |= 1 << (device_id - 1);
5229
5230 } while ((next = strtok (NULL, ",")) != NULL);
5231
5232 free (devices);
5233 }
5234 else
5235 {
5236 devices_filter = -1;
5237 }
5238
5239 return devices_filter;
5240 }
5241
5242 cl_device_type setup_device_types_filter (char *opencl_device_types)
5243 {
5244 cl_device_type device_types_filter = 0;
5245
5246 if (opencl_device_types)
5247 {
5248 char *device_types = strdup (opencl_device_types);
5249
5250 char *next = strtok (device_types, ",");
5251
5252 do
5253 {
5254 int device_type = atoi (next);
5255
5256 if (device_type < 1 || device_type > 3)
5257 {
5258 log_error ("ERROR: invalid device_type %u specified", device_type);
5259
5260 exit (-1);
5261 }
5262
5263 device_types_filter |= 1 << device_type;
5264
5265 } while ((next = strtok (NULL, ",")) != NULL);
5266
5267 free (device_types);
5268 }
5269 else
5270 {
5271 // Do not use CPU by default, this often reduces GPU performance because
5272 // the CPU is too busy to handle GPU synchronization
5273
5274 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5275 }
5276
5277 return device_types_filter;
5278 }
5279
5280 u32 get_random_num (const u32 min, const u32 max)
5281 {
5282 if (min == max) return (min);
5283
5284 return ((rand () % (max - min)) + min);
5285 }
5286
5287 u32 mydivc32 (const u32 dividend, const u32 divisor)
5288 {
5289 u32 quotient = dividend / divisor;
5290
5291 if (dividend % divisor) quotient++;
5292
5293 return quotient;
5294 }
5295
5296 u64 mydivc64 (const u64 dividend, const u64 divisor)
5297 {
5298 u64 quotient = dividend / divisor;
5299
5300 if (dividend % divisor) quotient++;
5301
5302 return quotient;
5303 }
5304
5305 void format_timer_display (struct tm *tm, char *buf, size_t len)
5306 {
5307 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5308 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5309
5310 if (tm->tm_year - 70)
5311 {
5312 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5313 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5314
5315 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5316 }
5317 else if (tm->tm_yday)
5318 {
5319 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5320 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5321
5322 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5323 }
5324 else if (tm->tm_hour)
5325 {
5326 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5327 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5328
5329 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5330 }
5331 else if (tm->tm_min)
5332 {
5333 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5334 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5335
5336 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5337 }
5338 else
5339 {
5340 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5341
5342 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5343 }
5344 }
5345
5346 void format_speed_display (float val, char *buf, size_t len)
5347 {
5348 if (val <= 0)
5349 {
5350 buf[0] = '0';
5351 buf[1] = ' ';
5352 buf[2] = 0;
5353
5354 return;
5355 }
5356
5357 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5358
5359 uint level = 0;
5360
5361 while (val > 99999)
5362 {
5363 val /= 1000;
5364
5365 level++;
5366 }
5367
5368 /* generate output */
5369
5370 if (level == 0)
5371 {
5372 snprintf (buf, len - 1, "%.0f ", val);
5373 }
5374 else
5375 {
5376 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5377 }
5378 }
5379
5380 void lowercase (u8 *buf, int len)
5381 {
5382 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5383 }
5384
5385 void uppercase (u8 *buf, int len)
5386 {
5387 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5388 }
5389
5390 int fgetl (FILE *fp, char *line_buf)
5391 {
5392 int line_len = 0;
5393
5394 while (!feof (fp))
5395 {
5396 const int c = fgetc (fp);
5397
5398 if (c == EOF) break;
5399
5400 line_buf[line_len] = (char) c;
5401
5402 line_len++;
5403
5404 if (line_len == BUFSIZ) line_len--;
5405
5406 if (c == '\n') break;
5407 }
5408
5409 if (line_len == 0) return 0;
5410
5411 if (line_buf[line_len - 1] == '\n')
5412 {
5413 line_len--;
5414
5415 line_buf[line_len] = 0;
5416 }
5417
5418 if (line_len == 0) return 0;
5419
5420 if (line_buf[line_len - 1] == '\r')
5421 {
5422 line_len--;
5423
5424 line_buf[line_len] = 0;
5425 }
5426
5427 return (line_len);
5428 }
5429
5430 int in_superchop (char *buf)
5431 {
5432 int len = strlen (buf);
5433
5434 while (len)
5435 {
5436 if (buf[len - 1] == '\n')
5437 {
5438 len--;
5439
5440 continue;
5441 }
5442
5443 if (buf[len - 1] == '\r')
5444 {
5445 len--;
5446
5447 continue;
5448 }
5449
5450 break;
5451 }
5452
5453 buf[len] = 0;
5454
5455 return len;
5456 }
5457
5458 char **scan_directory (const char *path)
5459 {
5460 char *tmp_path = mystrdup (path);
5461
5462 size_t tmp_path_len = strlen (tmp_path);
5463
5464 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5465 {
5466 tmp_path[tmp_path_len - 1] = 0;
5467
5468 tmp_path_len = strlen (tmp_path);
5469 }
5470
5471 char **files = NULL;
5472
5473 int num_files = 0;
5474
5475 DIR *d = NULL;
5476
5477 if ((d = opendir (tmp_path)) != NULL)
5478 {
5479 #ifdef OSX
5480 struct dirent e;
5481
5482 for (;;) {
5483 memset (&e, 0, sizeof (e));
5484 struct dirent *de = NULL;
5485
5486 if (readdir_r (d, &e, &de) != 0)
5487 {
5488 log_error ("ERROR: readdir_r() failed");
5489
5490 break;
5491 }
5492
5493 if (de == NULL) break;
5494 #else
5495 struct dirent *de;
5496
5497 while ((de = readdir (d)) != NULL)
5498 {
5499 #endif
5500 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5501
5502 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5503
5504 char *path_file = (char *) mymalloc (path_size + 1);
5505
5506 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5507
5508 path_file[path_size] = 0;
5509
5510 DIR *d_test;
5511
5512 if ((d_test = opendir (path_file)) != NULL)
5513 {
5514 closedir (d_test);
5515
5516 myfree (path_file);
5517 }
5518 else
5519 {
5520 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5521
5522 num_files++;
5523
5524 files[num_files - 1] = path_file;
5525 }
5526 }
5527
5528 closedir (d);
5529 }
5530 else if (errno == ENOTDIR)
5531 {
5532 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5533
5534 num_files++;
5535
5536 files[num_files - 1] = mystrdup (path);
5537 }
5538
5539 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5540
5541 num_files++;
5542
5543 files[num_files - 1] = NULL;
5544
5545 myfree (tmp_path);
5546
5547 return (files);
5548 }
5549
5550 int count_dictionaries (char **dictionary_files)
5551 {
5552 if (dictionary_files == NULL) return 0;
5553
5554 int cnt = 0;
5555
5556 for (int d = 0; dictionary_files[d] != NULL; d++)
5557 {
5558 cnt++;
5559 }
5560
5561 return (cnt);
5562 }
5563
5564 char *stroptitype (const uint opti_type)
5565 {
5566 switch (opti_type)
5567 {
5568 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5569 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5570 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5571 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5572 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5573 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5574 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5575 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5576 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5577 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5578 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5579 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5580 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5581 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5582 }
5583
5584 return (NULL);
5585 }
5586
5587 char *strparser (const uint parser_status)
5588 {
5589 switch (parser_status)
5590 {
5591 case PARSER_OK: return ((char *) PA_000); break;
5592 case PARSER_COMMENT: return ((char *) PA_001); break;
5593 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5594 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5595 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5596 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5597 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5598 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5599 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5600 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5601 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5602 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5603 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5604 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5605 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5606 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5607 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5608 }
5609
5610 return ((char *) PA_255);
5611 }
5612
5613 char *strhashtype (const uint hash_mode)
5614 {
5615 switch (hash_mode)
5616 {
5617 case 0: return ((char *) HT_00000); break;
5618 case 10: return ((char *) HT_00010); break;
5619 case 11: return ((char *) HT_00011); break;
5620 case 12: return ((char *) HT_00012); break;
5621 case 20: return ((char *) HT_00020); break;
5622 case 21: return ((char *) HT_00021); break;
5623 case 22: return ((char *) HT_00022); break;
5624 case 23: return ((char *) HT_00023); break;
5625 case 30: return ((char *) HT_00030); break;
5626 case 40: return ((char *) HT_00040); break;
5627 case 50: return ((char *) HT_00050); break;
5628 case 60: return ((char *) HT_00060); break;
5629 case 100: return ((char *) HT_00100); break;
5630 case 101: return ((char *) HT_00101); break;
5631 case 110: return ((char *) HT_00110); break;
5632 case 111: return ((char *) HT_00111); break;
5633 case 112: return ((char *) HT_00112); break;
5634 case 120: return ((char *) HT_00120); break;
5635 case 121: return ((char *) HT_00121); break;
5636 case 122: return ((char *) HT_00122); break;
5637 case 124: return ((char *) HT_00124); break;
5638 case 130: return ((char *) HT_00130); break;
5639 case 131: return ((char *) HT_00131); break;
5640 case 132: return ((char *) HT_00132); break;
5641 case 133: return ((char *) HT_00133); break;
5642 case 140: return ((char *) HT_00140); break;
5643 case 141: return ((char *) HT_00141); break;
5644 case 150: return ((char *) HT_00150); break;
5645 case 160: return ((char *) HT_00160); break;
5646 case 190: return ((char *) HT_00190); break;
5647 case 200: return ((char *) HT_00200); break;
5648 case 300: return ((char *) HT_00300); break;
5649 case 400: return ((char *) HT_00400); break;
5650 case 500: return ((char *) HT_00500); break;
5651 case 501: return ((char *) HT_00501); break;
5652 case 900: return ((char *) HT_00900); break;
5653 case 910: return ((char *) HT_00910); break;
5654 case 1000: return ((char *) HT_01000); break;
5655 case 1100: return ((char *) HT_01100); break;
5656 case 1400: return ((char *) HT_01400); break;
5657 case 1410: return ((char *) HT_01410); break;
5658 case 1420: return ((char *) HT_01420); break;
5659 case 1421: return ((char *) HT_01421); break;
5660 case 1430: return ((char *) HT_01430); break;
5661 case 1440: return ((char *) HT_01440); break;
5662 case 1441: return ((char *) HT_01441); break;
5663 case 1450: return ((char *) HT_01450); break;
5664 case 1460: return ((char *) HT_01460); break;
5665 case 1500: return ((char *) HT_01500); break;
5666 case 1600: return ((char *) HT_01600); break;
5667 case 1700: return ((char *) HT_01700); break;
5668 case 1710: return ((char *) HT_01710); break;
5669 case 1711: return ((char *) HT_01711); break;
5670 case 1720: return ((char *) HT_01720); break;
5671 case 1722: return ((char *) HT_01722); break;
5672 case 1730: return ((char *) HT_01730); break;
5673 case 1731: return ((char *) HT_01731); break;
5674 case 1740: return ((char *) HT_01740); break;
5675 case 1750: return ((char *) HT_01750); break;
5676 case 1760: return ((char *) HT_01760); break;
5677 case 1800: return ((char *) HT_01800); break;
5678 case 2100: return ((char *) HT_02100); break;
5679 case 2400: return ((char *) HT_02400); break;
5680 case 2410: return ((char *) HT_02410); break;
5681 case 2500: return ((char *) HT_02500); break;
5682 case 2600: return ((char *) HT_02600); break;
5683 case 2611: return ((char *) HT_02611); break;
5684 case 2612: return ((char *) HT_02612); break;
5685 case 2711: return ((char *) HT_02711); break;
5686 case 2811: return ((char *) HT_02811); break;
5687 case 3000: return ((char *) HT_03000); break;
5688 case 3100: return ((char *) HT_03100); break;
5689 case 3200: return ((char *) HT_03200); break;
5690 case 3710: return ((char *) HT_03710); break;
5691 case 3711: return ((char *) HT_03711); break;
5692 case 3800: return ((char *) HT_03800); break;
5693 case 4300: return ((char *) HT_04300); break;
5694 case 4400: return ((char *) HT_04400); break;
5695 case 4500: return ((char *) HT_04500); break;
5696 case 4700: return ((char *) HT_04700); break;
5697 case 4800: return ((char *) HT_04800); break;
5698 case 4900: return ((char *) HT_04900); break;
5699 case 5000: return ((char *) HT_05000); break;
5700 case 5100: return ((char *) HT_05100); break;
5701 case 5200: return ((char *) HT_05200); break;
5702 case 5300: return ((char *) HT_05300); break;
5703 case 5400: return ((char *) HT_05400); break;
5704 case 5500: return ((char *) HT_05500); break;
5705 case 5600: return ((char *) HT_05600); break;
5706 case 5700: return ((char *) HT_05700); break;
5707 case 5800: return ((char *) HT_05800); break;
5708 case 6000: return ((char *) HT_06000); break;
5709 case 6100: return ((char *) HT_06100); break;
5710 case 6211: return ((char *) HT_06211); break;
5711 case 6212: return ((char *) HT_06212); break;
5712 case 6213: return ((char *) HT_06213); break;
5713 case 6221: return ((char *) HT_06221); break;
5714 case 6222: return ((char *) HT_06222); break;
5715 case 6223: return ((char *) HT_06223); break;
5716 case 6231: return ((char *) HT_06231); break;
5717 case 6232: return ((char *) HT_06232); break;
5718 case 6233: return ((char *) HT_06233); break;
5719 case 6241: return ((char *) HT_06241); break;
5720 case 6242: return ((char *) HT_06242); break;
5721 case 6243: return ((char *) HT_06243); break;
5722 case 6300: return ((char *) HT_06300); break;
5723 case 6400: return ((char *) HT_06400); break;
5724 case 6500: return ((char *) HT_06500); break;
5725 case 6600: return ((char *) HT_06600); break;
5726 case 6700: return ((char *) HT_06700); break;
5727 case 6800: return ((char *) HT_06800); break;
5728 case 6900: return ((char *) HT_06900); break;
5729 case 7100: return ((char *) HT_07100); break;
5730 case 7200: return ((char *) HT_07200); break;
5731 case 7300: return ((char *) HT_07300); break;
5732 case 7400: return ((char *) HT_07400); break;
5733 case 7500: return ((char *) HT_07500); break;
5734 case 7600: return ((char *) HT_07600); break;
5735 case 7700: return ((char *) HT_07700); break;
5736 case 7800: return ((char *) HT_07800); break;
5737 case 7900: return ((char *) HT_07900); break;
5738 case 8000: return ((char *) HT_08000); break;
5739 case 8100: return ((char *) HT_08100); break;
5740 case 8200: return ((char *) HT_08200); break;
5741 case 8300: return ((char *) HT_08300); break;
5742 case 8400: return ((char *) HT_08400); break;
5743 case 8500: return ((char *) HT_08500); break;
5744 case 8600: return ((char *) HT_08600); break;
5745 case 8700: return ((char *) HT_08700); break;
5746 case 8800: return ((char *) HT_08800); break;
5747 case 8900: return ((char *) HT_08900); break;
5748 case 9000: return ((char *) HT_09000); break;
5749 case 9100: return ((char *) HT_09100); break;
5750 case 9200: return ((char *) HT_09200); break;
5751 case 9300: return ((char *) HT_09300); break;
5752 case 9400: return ((char *) HT_09400); break;
5753 case 9500: return ((char *) HT_09500); break;
5754 case 9600: return ((char *) HT_09600); break;
5755 case 9700: return ((char *) HT_09700); break;
5756 case 9710: return ((char *) HT_09710); break;
5757 case 9720: return ((char *) HT_09720); break;
5758 case 9800: return ((char *) HT_09800); break;
5759 case 9810: return ((char *) HT_09810); break;
5760 case 9820: return ((char *) HT_09820); break;
5761 case 9900: return ((char *) HT_09900); break;
5762 case 10000: return ((char *) HT_10000); break;
5763 case 10100: return ((char *) HT_10100); break;
5764 case 10200: return ((char *) HT_10200); break;
5765 case 10300: return ((char *) HT_10300); break;
5766 case 10400: return ((char *) HT_10400); break;
5767 case 10410: return ((char *) HT_10410); break;
5768 case 10420: return ((char *) HT_10420); break;
5769 case 10500: return ((char *) HT_10500); break;
5770 case 10600: return ((char *) HT_10600); break;
5771 case 10700: return ((char *) HT_10700); break;
5772 case 10800: return ((char *) HT_10800); break;
5773 case 10900: return ((char *) HT_10900); break;
5774 case 11000: return ((char *) HT_11000); break;
5775 case 11100: return ((char *) HT_11100); break;
5776 case 11200: return ((char *) HT_11200); break;
5777 case 11300: return ((char *) HT_11300); break;
5778 case 11400: return ((char *) HT_11400); break;
5779 case 11500: return ((char *) HT_11500); break;
5780 case 11600: return ((char *) HT_11600); break;
5781 case 11700: return ((char *) HT_11700); break;
5782 case 11800: return ((char *) HT_11800); break;
5783 case 11900: return ((char *) HT_11900); break;
5784 case 12000: return ((char *) HT_12000); break;
5785 case 12100: return ((char *) HT_12100); break;
5786 case 12200: return ((char *) HT_12200); break;
5787 case 12300: return ((char *) HT_12300); break;
5788 case 12400: return ((char *) HT_12400); break;
5789 case 12500: return ((char *) HT_12500); break;
5790 case 12600: return ((char *) HT_12600); break;
5791 case 12700: return ((char *) HT_12700); break;
5792 case 12800: return ((char *) HT_12800); break;
5793 case 12900: return ((char *) HT_12900); break;
5794 case 13000: return ((char *) HT_13000); break;
5795 }
5796
5797 return ((char *) "Unknown");
5798 }
5799
5800 char *strstatus (const uint devices_status)
5801 {
5802 switch (devices_status)
5803 {
5804 case STATUS_INIT: return ((char *) ST_0000); break;
5805 case STATUS_STARTING: return ((char *) ST_0001); break;
5806 case STATUS_RUNNING: return ((char *) ST_0002); break;
5807 case STATUS_PAUSED: return ((char *) ST_0003); break;
5808 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5809 case STATUS_CRACKED: return ((char *) ST_0005); break;
5810 case STATUS_ABORTED: return ((char *) ST_0006); break;
5811 case STATUS_QUIT: return ((char *) ST_0007); break;
5812 case STATUS_BYPASS: return ((char *) ST_0008); break;
5813 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5814 }
5815
5816 return ((char *) "Unknown");
5817 }
5818
5819 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5820 {
5821 uint hash_type = data.hash_type;
5822 uint hash_mode = data.hash_mode;
5823 uint salt_type = data.salt_type;
5824 uint opts_type = data.opts_type;
5825 uint opti_type = data.opti_type;
5826 uint dgst_size = data.dgst_size;
5827
5828 char *hashfile = data.hashfile;
5829
5830 uint len = 4096;
5831
5832 uint digest_buf[64] = { 0 };
5833
5834 u64 *digest_buf64 = (u64 *) digest_buf;
5835
5836 char *digests_buf_ptr = (char *) data.digests_buf;
5837
5838 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5839
5840 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5841 {
5842 uint tt;
5843
5844 switch (hash_type)
5845 {
5846 case HASH_TYPE_DESCRYPT:
5847 FP (digest_buf[1], digest_buf[0], tt);
5848 break;
5849
5850 case HASH_TYPE_DESRACF:
5851 digest_buf[0] = rotl32 (digest_buf[0], 29);
5852 digest_buf[1] = rotl32 (digest_buf[1], 29);
5853
5854 FP (digest_buf[1], digest_buf[0], tt);
5855 break;
5856
5857 case HASH_TYPE_LM:
5858 FP (digest_buf[1], digest_buf[0], tt);
5859 break;
5860
5861 case HASH_TYPE_NETNTLM:
5862 digest_buf[0] = rotl32 (digest_buf[0], 29);
5863 digest_buf[1] = rotl32 (digest_buf[1], 29);
5864 digest_buf[2] = rotl32 (digest_buf[2], 29);
5865 digest_buf[3] = rotl32 (digest_buf[3], 29);
5866
5867 FP (digest_buf[1], digest_buf[0], tt);
5868 FP (digest_buf[3], digest_buf[2], tt);
5869 break;
5870
5871 case HASH_TYPE_BSDICRYPT:
5872 digest_buf[0] = rotl32 (digest_buf[0], 31);
5873 digest_buf[1] = rotl32 (digest_buf[1], 31);
5874
5875 FP (digest_buf[1], digest_buf[0], tt);
5876 break;
5877 }
5878 }
5879
5880 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5881 {
5882 switch (hash_type)
5883 {
5884 case HASH_TYPE_MD4:
5885 digest_buf[0] += MD4M_A;
5886 digest_buf[1] += MD4M_B;
5887 digest_buf[2] += MD4M_C;
5888 digest_buf[3] += MD4M_D;
5889 break;
5890
5891 case HASH_TYPE_MD5:
5892 digest_buf[0] += MD5M_A;
5893 digest_buf[1] += MD5M_B;
5894 digest_buf[2] += MD5M_C;
5895 digest_buf[3] += MD5M_D;
5896 break;
5897
5898 case HASH_TYPE_SHA1:
5899 digest_buf[0] += SHA1M_A;
5900 digest_buf[1] += SHA1M_B;
5901 digest_buf[2] += SHA1M_C;
5902 digest_buf[3] += SHA1M_D;
5903 digest_buf[4] += SHA1M_E;
5904 break;
5905
5906 case HASH_TYPE_SHA256:
5907 digest_buf[0] += SHA256M_A;
5908 digest_buf[1] += SHA256M_B;
5909 digest_buf[2] += SHA256M_C;
5910 digest_buf[3] += SHA256M_D;
5911 digest_buf[4] += SHA256M_E;
5912 digest_buf[5] += SHA256M_F;
5913 digest_buf[6] += SHA256M_G;
5914 digest_buf[7] += SHA256M_H;
5915 break;
5916
5917 case HASH_TYPE_SHA384:
5918 digest_buf64[0] += SHA384M_A;
5919 digest_buf64[1] += SHA384M_B;
5920 digest_buf64[2] += SHA384M_C;
5921 digest_buf64[3] += SHA384M_D;
5922 digest_buf64[4] += SHA384M_E;
5923 digest_buf64[5] += SHA384M_F;
5924 digest_buf64[6] += 0;
5925 digest_buf64[7] += 0;
5926 break;
5927
5928 case HASH_TYPE_SHA512:
5929 digest_buf64[0] += SHA512M_A;
5930 digest_buf64[1] += SHA512M_B;
5931 digest_buf64[2] += SHA512M_C;
5932 digest_buf64[3] += SHA512M_D;
5933 digest_buf64[4] += SHA512M_E;
5934 digest_buf64[5] += SHA512M_F;
5935 digest_buf64[6] += SHA512M_G;
5936 digest_buf64[7] += SHA512M_H;
5937 break;
5938 }
5939 }
5940
5941 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5942 {
5943 if (dgst_size == DGST_SIZE_4_2)
5944 {
5945 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5946 }
5947 else if (dgst_size == DGST_SIZE_4_4)
5948 {
5949 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5950 }
5951 else if (dgst_size == DGST_SIZE_4_5)
5952 {
5953 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5954 }
5955 else if (dgst_size == DGST_SIZE_4_6)
5956 {
5957 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5958 }
5959 else if (dgst_size == DGST_SIZE_4_8)
5960 {
5961 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5962 }
5963 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5964 {
5965 if (hash_type == HASH_TYPE_WHIRLPOOL)
5966 {
5967 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5968 }
5969 else if (hash_type == HASH_TYPE_SHA384)
5970 {
5971 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5972 }
5973 else if (hash_type == HASH_TYPE_SHA512)
5974 {
5975 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5976 }
5977 else if (hash_type == HASH_TYPE_GOST)
5978 {
5979 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5980 }
5981 }
5982 else if (dgst_size == DGST_SIZE_4_64)
5983 {
5984 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5985 }
5986 else if (dgst_size == DGST_SIZE_8_25)
5987 {
5988 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5989 }
5990 }
5991
5992 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5993 | (data.salt_type == SALT_TYPE_EXTERN)
5994 | (data.salt_type == SALT_TYPE_EMBEDDED));
5995
5996 salt_t salt;
5997
5998 if (isSalted)
5999 {
6000 memset (&salt, 0, sizeof (salt_t));
6001
6002 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6003
6004 char *ptr = (char *) salt.salt_buf;
6005
6006 uint len = salt.salt_len;
6007
6008 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6009 {
6010 uint tt;
6011
6012 switch (hash_type)
6013 {
6014 case HASH_TYPE_NETNTLM:
6015
6016 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6017 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6018
6019 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6020
6021 break;
6022 }
6023 }
6024
6025 if (opts_type & OPTS_TYPE_ST_UNICODE)
6026 {
6027 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6028 {
6029 ptr[i] = ptr[j];
6030 }
6031
6032 len = len / 2;
6033 }
6034
6035 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6036 {
6037 uint max = salt.salt_len / 4;
6038
6039 if (len % 4) max++;
6040
6041 for (uint i = 0; i < max; i++)
6042 {
6043 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6044 }
6045 }
6046
6047 if (opts_type & OPTS_TYPE_ST_HEX)
6048 {
6049 char tmp[64] = { 0 };
6050
6051 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6052 {
6053 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6054 }
6055
6056 len = len * 2;
6057
6058 memcpy (ptr, tmp, len);
6059 }
6060
6061 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6062
6063 memset (ptr + len, 0, memset_size);
6064
6065 salt.salt_len = len;
6066 }
6067
6068 //
6069 // some modes require special encoding
6070 //
6071
6072 uint out_buf_plain[256] = { 0 };
6073 uint out_buf_salt[256] = { 0 };
6074
6075 char tmp_buf[1024] = { 0 };
6076
6077 char *ptr_plain = (char *) out_buf_plain;
6078 char *ptr_salt = (char *) out_buf_salt;
6079
6080 if (hash_mode == 22)
6081 {
6082 char username[30] = { 0 };
6083
6084 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6085
6086 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6087
6088 u16 *ptr = (u16 *) digest_buf;
6089
6090 tmp_buf[ 0] = sig[0];
6091 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6092 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6093 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6094 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6095 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6096 tmp_buf[ 6] = sig[1];
6097 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6098 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6099 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6100 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6101 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6102 tmp_buf[12] = sig[2];
6103 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6104 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6105 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6106 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6107 tmp_buf[17] = sig[3];
6108 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6109 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6110 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6111 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6112 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6113 tmp_buf[23] = sig[4];
6114 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6115 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6116 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6117 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6118 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6119 tmp_buf[29] = sig[5];
6120
6121 snprintf (out_buf, len-1, "%s:%s",
6122 tmp_buf,
6123 username);
6124 }
6125 else if (hash_mode == 23)
6126 {
6127 // do not show the \nskyper\n part in output
6128
6129 char *salt_buf_ptr = (char *) salt.salt_buf;
6130
6131 salt_buf_ptr[salt.salt_len - 8] = 0;
6132
6133 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6134 digest_buf[0],
6135 digest_buf[1],
6136 digest_buf[2],
6137 digest_buf[3],
6138 salt_buf_ptr);
6139 }
6140 else if (hash_mode == 101)
6141 {
6142 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6143
6144 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6145 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6146 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6147 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6148 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6149
6150 memcpy (tmp_buf, digest_buf, 20);
6151
6152 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6153
6154 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6155 }
6156 else if (hash_mode == 111)
6157 {
6158 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6159
6160 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6161 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6162 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6163 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6164 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6165
6166 memcpy (tmp_buf, digest_buf, 20);
6167 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6168
6169 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6170
6171 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6172 }
6173 else if (hash_mode == 122)
6174 {
6175 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6176 (char *) salt.salt_buf,
6177 digest_buf[0],
6178 digest_buf[1],
6179 digest_buf[2],
6180 digest_buf[3],
6181 digest_buf[4]);
6182 }
6183 else if (hash_mode == 124)
6184 {
6185 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6186 (char *) salt.salt_buf,
6187 digest_buf[0],
6188 digest_buf[1],
6189 digest_buf[2],
6190 digest_buf[3],
6191 digest_buf[4]);
6192 }
6193 else if (hash_mode == 131)
6194 {
6195 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6196 (char *) salt.salt_buf,
6197 0, 0, 0, 0, 0,
6198 digest_buf[0],
6199 digest_buf[1],
6200 digest_buf[2],
6201 digest_buf[3],
6202 digest_buf[4]);
6203 }
6204 else if (hash_mode == 132)
6205 {
6206 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6207 (char *) salt.salt_buf,
6208 digest_buf[0],
6209 digest_buf[1],
6210 digest_buf[2],
6211 digest_buf[3],
6212 digest_buf[4]);
6213 }
6214 else if (hash_mode == 133)
6215 {
6216 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6217
6218 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6219 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6220 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6221 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6222 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6223
6224 memcpy (tmp_buf, digest_buf, 20);
6225
6226 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6227
6228 snprintf (out_buf, len-1, "%s", ptr_plain);
6229 }
6230 else if (hash_mode == 141)
6231 {
6232 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6233
6234 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6235
6236 memset (tmp_buf, 0, sizeof (tmp_buf));
6237
6238 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6239
6240 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6241 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6242 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6243 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6244 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6245
6246 memcpy (tmp_buf, digest_buf, 20);
6247
6248 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6249
6250 ptr_plain[27] = 0;
6251
6252 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6253 }
6254 else if (hash_mode == 400)
6255 {
6256 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6257
6258 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6259 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6260 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6261 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6262
6263 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6264
6265 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6266 }
6267 else if (hash_mode == 500)
6268 {
6269 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6270
6271 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6272 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6273 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6274 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6275
6276 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6277
6278 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6279 {
6280 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6281 }
6282 else
6283 {
6284 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6285 }
6286 }
6287 else if (hash_mode == 501)
6288 {
6289 uint digest_idx = salt.digests_offset + digest_pos;
6290
6291 hashinfo_t **hashinfo_ptr = data.hash_info;
6292 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6293
6294 snprintf (out_buf, len-1, "%s", hash_buf);
6295 }
6296 else if (hash_mode == 1421)
6297 {
6298 u8 *salt_ptr = (u8 *) salt.salt_buf;
6299
6300 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6301 salt_ptr[0],
6302 salt_ptr[1],
6303 salt_ptr[2],
6304 salt_ptr[3],
6305 salt_ptr[4],
6306 salt_ptr[5],
6307 digest_buf[0],
6308 digest_buf[1],
6309 digest_buf[2],
6310 digest_buf[3],
6311 digest_buf[4],
6312 digest_buf[5],
6313 digest_buf[6],
6314 digest_buf[7]);
6315 }
6316 else if (hash_mode == 1441)
6317 {
6318 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6319
6320 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6321
6322 memset (tmp_buf, 0, sizeof (tmp_buf));
6323
6324 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6325
6326 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6327 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6328 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6329 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6330 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6331 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6332 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6333 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6334
6335 memcpy (tmp_buf, digest_buf, 32);
6336
6337 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6338
6339 ptr_plain[43] = 0;
6340
6341 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6342 }
6343 else if (hash_mode == 1500)
6344 {
6345 out_buf[0] = salt.salt_sign[0] & 0xff;
6346 out_buf[1] = salt.salt_sign[1] & 0xff;
6347 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6348 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6349 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6350
6351 memset (tmp_buf, 0, sizeof (tmp_buf));
6352
6353 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6354
6355 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6356 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6357
6358 memcpy (tmp_buf, digest_buf, 8);
6359
6360 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6361
6362 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6363
6364 out_buf[13] = 0;
6365 }
6366 else if (hash_mode == 1600)
6367 {
6368 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6369
6370 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6371 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6372 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6373 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6374
6375 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6376
6377 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6378 {
6379 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6380 }
6381 else
6382 {
6383 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6384 }
6385 }
6386 else if (hash_mode == 1711)
6387 {
6388 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6389
6390 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6391 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6392 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6393 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6394 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6395 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6396 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6397 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6398
6399 memcpy (tmp_buf, digest_buf, 64);
6400 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6401
6402 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6403
6404 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6405 }
6406 else if (hash_mode == 1722)
6407 {
6408 uint *ptr = digest_buf;
6409
6410 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6411 (unsigned char *) salt.salt_buf,
6412 ptr[ 1], ptr[ 0],
6413 ptr[ 3], ptr[ 2],
6414 ptr[ 5], ptr[ 4],
6415 ptr[ 7], ptr[ 6],
6416 ptr[ 9], ptr[ 8],
6417 ptr[11], ptr[10],
6418 ptr[13], ptr[12],
6419 ptr[15], ptr[14]);
6420 }
6421 else if (hash_mode == 1731)
6422 {
6423 uint *ptr = digest_buf;
6424
6425 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6426 (unsigned char *) salt.salt_buf,
6427 ptr[ 1], ptr[ 0],
6428 ptr[ 3], ptr[ 2],
6429 ptr[ 5], ptr[ 4],
6430 ptr[ 7], ptr[ 6],
6431 ptr[ 9], ptr[ 8],
6432 ptr[11], ptr[10],
6433 ptr[13], ptr[12],
6434 ptr[15], ptr[14]);
6435 }
6436 else if (hash_mode == 1800)
6437 {
6438 // temp workaround
6439
6440 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6441 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6442 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6443 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6444 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6445 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6446 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6447 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6448
6449 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6450
6451 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6452 {
6453 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6454 }
6455 else
6456 {
6457 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6458 }
6459 }
6460 else if (hash_mode == 2100)
6461 {
6462 uint pos = 0;
6463
6464 snprintf (out_buf + pos, len-1, "%s%i#",
6465 SIGNATURE_DCC2,
6466 salt.salt_iter + 1);
6467
6468 uint signature_len = strlen (out_buf);
6469
6470 pos += signature_len;
6471 len -= signature_len;
6472
6473 char *salt_ptr = (char *) salt.salt_buf;
6474
6475 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6476
6477 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6478 byte_swap_32 (digest_buf[0]),
6479 byte_swap_32 (digest_buf[1]),
6480 byte_swap_32 (digest_buf[2]),
6481 byte_swap_32 (digest_buf[3]));
6482 }
6483 else if ((hash_mode == 2400) || (hash_mode == 2410))
6484 {
6485 memcpy (tmp_buf, digest_buf, 16);
6486
6487 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6488
6489 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6490 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6491 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6492 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6493
6494 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6495 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6496 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6497 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6498
6499 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6500 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6501 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6502 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6503
6504 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6505 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6506 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6507 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6508
6509 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6510 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6511 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6512 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6513
6514 out_buf[16] = 0;
6515 }
6516 else if (hash_mode == 2500)
6517 {
6518 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6519
6520 wpa_t *wpa = &wpas[salt_pos];
6521
6522 uint pke[25] = { 0 };
6523
6524 char *pke_ptr = (char *) pke;
6525
6526 for (uint i = 0; i < 25; i++)
6527 {
6528 pke[i] = byte_swap_32 (wpa->pke[i]);
6529 }
6530
6531 unsigned char mac1[6] = { 0 };
6532 unsigned char mac2[6] = { 0 };
6533
6534 memcpy (mac1, pke_ptr + 23, 6);
6535 memcpy (mac2, pke_ptr + 29, 6);
6536
6537 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6538 (char *) salt.salt_buf,
6539 mac1[0],
6540 mac1[1],
6541 mac1[2],
6542 mac1[3],
6543 mac1[4],
6544 mac1[5],
6545 mac2[0],
6546 mac2[1],
6547 mac2[2],
6548 mac2[3],
6549 mac2[4],
6550 mac2[5]);
6551 }
6552 else if (hash_mode == 4400)
6553 {
6554 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6555 byte_swap_32 (digest_buf[0]),
6556 byte_swap_32 (digest_buf[1]),
6557 byte_swap_32 (digest_buf[2]),
6558 byte_swap_32 (digest_buf[3]));
6559 }
6560 else if (hash_mode == 4700)
6561 {
6562 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6563 byte_swap_32 (digest_buf[0]),
6564 byte_swap_32 (digest_buf[1]),
6565 byte_swap_32 (digest_buf[2]),
6566 byte_swap_32 (digest_buf[3]),
6567 byte_swap_32 (digest_buf[4]));
6568 }
6569 else if (hash_mode == 4800)
6570 {
6571 u8 chap_id_byte = (u8) salt.salt_buf[4];
6572
6573 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6574 digest_buf[0],
6575 digest_buf[1],
6576 digest_buf[2],
6577 digest_buf[3],
6578 byte_swap_32 (salt.salt_buf[0]),
6579 byte_swap_32 (salt.salt_buf[1]),
6580 byte_swap_32 (salt.salt_buf[2]),
6581 byte_swap_32 (salt.salt_buf[3]),
6582 chap_id_byte);
6583 }
6584 else if (hash_mode == 4900)
6585 {
6586 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6587 byte_swap_32 (digest_buf[0]),
6588 byte_swap_32 (digest_buf[1]),
6589 byte_swap_32 (digest_buf[2]),
6590 byte_swap_32 (digest_buf[3]),
6591 byte_swap_32 (digest_buf[4]));
6592 }
6593 else if (hash_mode == 5100)
6594 {
6595 snprintf (out_buf, len-1, "%08x%08x",
6596 digest_buf[0],
6597 digest_buf[1]);
6598 }
6599 else if (hash_mode == 5200)
6600 {
6601 snprintf (out_buf, len-1, "%s", hashfile);
6602 }
6603 else if (hash_mode == 5300)
6604 {
6605 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6606
6607 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6608
6609 int buf_len = len -1;
6610
6611 // msg_buf
6612
6613 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6614
6615 for (uint i = 0; i < ikepsk_msg_len; i++)
6616 {
6617 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6618 {
6619 snprintf (out_buf, buf_len, ":");
6620
6621 buf_len--;
6622 out_buf++;
6623 }
6624
6625 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6626
6627 buf_len -= 8;
6628 out_buf += 8;
6629 }
6630
6631 // nr_buf
6632
6633 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6634
6635 for (uint i = 0; i < ikepsk_nr_len; i++)
6636 {
6637 if ((i == 0) || (i == 5))
6638 {
6639 snprintf (out_buf, buf_len, ":");
6640
6641 buf_len--;
6642 out_buf++;
6643 }
6644
6645 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6646
6647 buf_len -= 8;
6648 out_buf += 8;
6649 }
6650
6651 // digest_buf
6652
6653 for (uint i = 0; i < 4; i++)
6654 {
6655 if (i == 0)
6656 {
6657 snprintf (out_buf, buf_len, ":");
6658
6659 buf_len--;
6660 out_buf++;
6661 }
6662
6663 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6664
6665 buf_len -= 8;
6666 out_buf += 8;
6667 }
6668 }
6669 else if (hash_mode == 5400)
6670 {
6671 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6672
6673 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6674
6675 int buf_len = len -1;
6676
6677 // msg_buf
6678
6679 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6680
6681 for (uint i = 0; i < ikepsk_msg_len; i++)
6682 {
6683 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6684 {
6685 snprintf (out_buf, buf_len, ":");
6686
6687 buf_len--;
6688 out_buf++;
6689 }
6690
6691 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6692
6693 buf_len -= 8;
6694 out_buf += 8;
6695 }
6696
6697 // nr_buf
6698
6699 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6700
6701 for (uint i = 0; i < ikepsk_nr_len; i++)
6702 {
6703 if ((i == 0) || (i == 5))
6704 {
6705 snprintf (out_buf, buf_len, ":");
6706
6707 buf_len--;
6708 out_buf++;
6709 }
6710
6711 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6712
6713 buf_len -= 8;
6714 out_buf += 8;
6715 }
6716
6717 // digest_buf
6718
6719 for (uint i = 0; i < 5; i++)
6720 {
6721 if (i == 0)
6722 {
6723 snprintf (out_buf, buf_len, ":");
6724
6725 buf_len--;
6726 out_buf++;
6727 }
6728
6729 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6730
6731 buf_len -= 8;
6732 out_buf += 8;
6733 }
6734 }
6735 else if (hash_mode == 5500)
6736 {
6737 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6738
6739 netntlm_t *netntlm = &netntlms[salt_pos];
6740
6741 char user_buf[64] = { 0 };
6742 char domain_buf[64] = { 0 };
6743 char srvchall_buf[1024] = { 0 };
6744 char clichall_buf[1024] = { 0 };
6745
6746 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6747 {
6748 char *ptr = (char *) netntlm->userdomain_buf;
6749
6750 user_buf[i] = ptr[j];
6751 }
6752
6753 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6754 {
6755 char *ptr = (char *) netntlm->userdomain_buf;
6756
6757 domain_buf[i] = ptr[netntlm->user_len + j];
6758 }
6759
6760 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6761 {
6762 u8 *ptr = (u8 *) netntlm->chall_buf;
6763
6764 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6765 }
6766
6767 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6768 {
6769 u8 *ptr = (u8 *) netntlm->chall_buf;
6770
6771 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6772 }
6773
6774 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6775 user_buf,
6776 domain_buf,
6777 srvchall_buf,
6778 digest_buf[0],
6779 digest_buf[1],
6780 digest_buf[2],
6781 digest_buf[3],
6782 byte_swap_32 (salt.salt_buf_pc[0]),
6783 byte_swap_32 (salt.salt_buf_pc[1]),
6784 clichall_buf);
6785 }
6786 else if (hash_mode == 5600)
6787 {
6788 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6789
6790 netntlm_t *netntlm = &netntlms[salt_pos];
6791
6792 char user_buf[64] = { 0 };
6793 char domain_buf[64] = { 0 };
6794 char srvchall_buf[1024] = { 0 };
6795 char clichall_buf[1024] = { 0 };
6796
6797 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6798 {
6799 char *ptr = (char *) netntlm->userdomain_buf;
6800
6801 user_buf[i] = ptr[j];
6802 }
6803
6804 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6805 {
6806 char *ptr = (char *) netntlm->userdomain_buf;
6807
6808 domain_buf[i] = ptr[netntlm->user_len + j];
6809 }
6810
6811 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6812 {
6813 u8 *ptr = (u8 *) netntlm->chall_buf;
6814
6815 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6816 }
6817
6818 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6819 {
6820 u8 *ptr = (u8 *) netntlm->chall_buf;
6821
6822 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6823 }
6824
6825 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6826 user_buf,
6827 domain_buf,
6828 srvchall_buf,
6829 digest_buf[0],
6830 digest_buf[1],
6831 digest_buf[2],
6832 digest_buf[3],
6833 clichall_buf);
6834 }
6835 else if (hash_mode == 5700)
6836 {
6837 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6838
6839 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6840 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6841 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6842 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6843 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6844 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6845 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6846 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6847
6848 memcpy (tmp_buf, digest_buf, 32);
6849
6850 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6851
6852 ptr_plain[43] = 0;
6853
6854 snprintf (out_buf, len-1, "%s", ptr_plain);
6855 }
6856 else if (hash_mode == 5800)
6857 {
6858 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6859 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6860 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6861 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6862 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6863
6864 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6865 digest_buf[0],
6866 digest_buf[1],
6867 digest_buf[2],
6868 digest_buf[3],
6869 digest_buf[4]);
6870 }
6871 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6872 {
6873 snprintf (out_buf, len-1, "%s", hashfile);
6874 }
6875 else if (hash_mode == 6300)
6876 {
6877 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6878
6879 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6880 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6881 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6882 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6883
6884 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6885
6886 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6887 }
6888 else if (hash_mode == 6400)
6889 {
6890 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6891
6892 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6893 }
6894 else if (hash_mode == 6500)
6895 {
6896 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6897
6898 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6899 }
6900 else if (hash_mode == 6600)
6901 {
6902 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6903
6904 agilekey_t *agilekey = &agilekeys[salt_pos];
6905
6906 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6907 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6908
6909 uint buf_len = len - 1;
6910
6911 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6912 buf_len -= 22;
6913
6914 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6915 {
6916 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6917
6918 buf_len -= 2;
6919 }
6920 }
6921 else if (hash_mode == 6700)
6922 {
6923 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6924
6925 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6926 }
6927 else if (hash_mode == 6800)
6928 {
6929 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6930 }
6931 else if (hash_mode == 7100)
6932 {
6933 uint *ptr = digest_buf;
6934
6935 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6936
6937 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6938
6939 uint esalt[8] = { 0 };
6940
6941 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6942 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6943 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6944 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6945 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6946 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6947 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6948 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6949
6950 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",
6951 SIGNATURE_SHA512OSX,
6952 salt.salt_iter + 1,
6953 esalt[ 0], esalt[ 1],
6954 esalt[ 2], esalt[ 3],
6955 esalt[ 4], esalt[ 5],
6956 esalt[ 6], esalt[ 7],
6957 ptr [ 1], ptr [ 0],
6958 ptr [ 3], ptr [ 2],
6959 ptr [ 5], ptr [ 4],
6960 ptr [ 7], ptr [ 6],
6961 ptr [ 9], ptr [ 8],
6962 ptr [11], ptr [10],
6963 ptr [13], ptr [12],
6964 ptr [15], ptr [14]);
6965 }
6966 else if (hash_mode == 7200)
6967 {
6968 uint *ptr = digest_buf;
6969
6970 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6971
6972 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6973
6974 uint len_used = 0;
6975
6976 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6977
6978 len_used = strlen (out_buf);
6979
6980 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6981
6982 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6983 {
6984 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6985 }
6986
6987 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",
6988 ptr [ 1], ptr [ 0],
6989 ptr [ 3], ptr [ 2],
6990 ptr [ 5], ptr [ 4],
6991 ptr [ 7], ptr [ 6],
6992 ptr [ 9], ptr [ 8],
6993 ptr [11], ptr [10],
6994 ptr [13], ptr [12],
6995 ptr [15], ptr [14]);
6996 }
6997 else if (hash_mode == 7300)
6998 {
6999 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7000
7001 rakp_t *rakp = &rakps[salt_pos];
7002
7003 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7004 {
7005 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7006 }
7007
7008 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7009 digest_buf[0],
7010 digest_buf[1],
7011 digest_buf[2],
7012 digest_buf[3],
7013 digest_buf[4]);
7014 }
7015 else if (hash_mode == 7400)
7016 {
7017 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7018
7019 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7020 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7021 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7022 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7023 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7024 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7025 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7026 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7027
7028 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7029
7030 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7031 {
7032 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7033 }
7034 else
7035 {
7036 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7037 }
7038 }
7039 else if (hash_mode == 7500)
7040 {
7041 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7042
7043 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7044
7045 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7046 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7047
7048 char data[128] = { 0 };
7049
7050 char *ptr_data = data;
7051
7052 for (uint i = 0; i < 36; i++, ptr_data += 2)
7053 {
7054 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7055 }
7056
7057 for (uint i = 0; i < 16; i++, ptr_data += 2)
7058 {
7059 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7060 }
7061
7062 *ptr_data = 0;
7063
7064 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7065 SIGNATURE_KRB5PA,
7066 (char *) krb5pa->user,
7067 (char *) krb5pa->realm,
7068 (char *) krb5pa->salt,
7069 data);
7070 }
7071 else if (hash_mode == 7700)
7072 {
7073 snprintf (out_buf, len-1, "%s$%08X%08X",
7074 (char *) salt.salt_buf,
7075 digest_buf[0],
7076 digest_buf[1]);
7077 }
7078 else if (hash_mode == 7800)
7079 {
7080 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7081 (char *) salt.salt_buf,
7082 digest_buf[0],
7083 digest_buf[1],
7084 digest_buf[2],
7085 digest_buf[3],
7086 digest_buf[4]);
7087 }
7088 else if (hash_mode == 7900)
7089 {
7090 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7091
7092 // ugly hack start
7093
7094 char *tmp = (char *) salt.salt_buf_pc;
7095
7096 ptr_plain[42] = tmp[0];
7097
7098 // ugly hack end
7099
7100 ptr_plain[43] = 0;
7101
7102 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7103 }
7104 else if (hash_mode == 8000)
7105 {
7106 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7107 (unsigned char *) salt.salt_buf,
7108 digest_buf[0],
7109 digest_buf[1],
7110 digest_buf[2],
7111 digest_buf[3],
7112 digest_buf[4],
7113 digest_buf[5],
7114 digest_buf[6],
7115 digest_buf[7]);
7116 }
7117 else if (hash_mode == 8100)
7118 {
7119 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7120 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7121
7122 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7123 (unsigned char *) salt.salt_buf,
7124 digest_buf[0],
7125 digest_buf[1],
7126 digest_buf[2],
7127 digest_buf[3],
7128 digest_buf[4]);
7129 }
7130 else if (hash_mode == 8200)
7131 {
7132 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7133
7134 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7135
7136 char data_buf[4096] = { 0 };
7137
7138 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7139 {
7140 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7141 }
7142
7143 data_buf[cloudkey->data_len * 2] = 0;
7144
7145 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7146 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7147 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7148 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7149 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7150 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7151 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7152 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7153
7154 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7155 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7156 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7157 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7158
7159 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7160 digest_buf[0],
7161 digest_buf[1],
7162 digest_buf[2],
7163 digest_buf[3],
7164 digest_buf[4],
7165 digest_buf[5],
7166 digest_buf[6],
7167 digest_buf[7],
7168 salt.salt_buf[0],
7169 salt.salt_buf[1],
7170 salt.salt_buf[2],
7171 salt.salt_buf[3],
7172 salt.salt_iter + 1,
7173 data_buf);
7174 }
7175 else if (hash_mode == 8300)
7176 {
7177 char digest_buf_c[34] = { 0 };
7178
7179 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7180
7181 digest_buf_c[32] = 0;
7182
7183 // domain
7184
7185 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7186
7187 char domain_buf_c[33] = { 0 };
7188
7189 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7190
7191 for (uint i = 0; i < salt_pc_len; i++)
7192 {
7193 const char next = domain_buf_c[i];
7194
7195 domain_buf_c[i] = '.';
7196
7197 i += next;
7198 }
7199
7200 domain_buf_c[salt_pc_len] = 0;
7201
7202 // final
7203
7204 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7205 }
7206 else if (hash_mode == 8500)
7207 {
7208 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7209 }
7210 else if (hash_mode == 2612)
7211 {
7212 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7213 SIGNATURE_PHPS,
7214 (char *) salt.salt_buf,
7215 digest_buf[0],
7216 digest_buf[1],
7217 digest_buf[2],
7218 digest_buf[3]);
7219 }
7220 else if (hash_mode == 3711)
7221 {
7222 char *salt_ptr = (char *) salt.salt_buf;
7223
7224 salt_ptr[salt.salt_len - 1] = 0;
7225
7226 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7227 SIGNATURE_MEDIAWIKI_B,
7228 salt_ptr,
7229 digest_buf[0],
7230 digest_buf[1],
7231 digest_buf[2],
7232 digest_buf[3]);
7233 }
7234 else if (hash_mode == 8800)
7235 {
7236 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7237
7238 androidfde_t *androidfde = &androidfdes[salt_pos];
7239
7240 char tmp[3073] = { 0 };
7241
7242 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7243 {
7244 sprintf (tmp + j, "%08x", androidfde->data[i]);
7245 }
7246
7247 tmp[3072] = 0;
7248
7249 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7250 SIGNATURE_ANDROIDFDE,
7251 byte_swap_32 (salt.salt_buf[0]),
7252 byte_swap_32 (salt.salt_buf[1]),
7253 byte_swap_32 (salt.salt_buf[2]),
7254 byte_swap_32 (salt.salt_buf[3]),
7255 byte_swap_32 (digest_buf[0]),
7256 byte_swap_32 (digest_buf[1]),
7257 byte_swap_32 (digest_buf[2]),
7258 byte_swap_32 (digest_buf[3]),
7259 tmp);
7260 }
7261 else if (hash_mode == 8900)
7262 {
7263 uint N = salt.scrypt_N;
7264 uint r = salt.scrypt_r;
7265 uint p = salt.scrypt_p;
7266
7267 char base64_salt[32] = { 0 };
7268
7269 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7270
7271 memset (tmp_buf, 0, 46);
7272
7273 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7274 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7275 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7276 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7277 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7278 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7279 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7280 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7281 digest_buf[8] = 0; // needed for base64_encode ()
7282
7283 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7284
7285 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7286 SIGNATURE_SCRYPT,
7287 N,
7288 r,
7289 p,
7290 base64_salt,
7291 tmp_buf);
7292 }
7293 else if (hash_mode == 9000)
7294 {
7295 snprintf (out_buf, len-1, "%s", hashfile);
7296 }
7297 else if (hash_mode == 9200)
7298 {
7299 // salt
7300
7301 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7302
7303 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7304
7305 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7306
7307 // hash
7308
7309 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7310 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7311 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7312 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7313 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7314 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7315 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7316 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7317 digest_buf[8] = 0; // needed for base64_encode ()
7318
7319 char tmp_buf[64] = { 0 };
7320
7321 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7322 tmp_buf[43] = 0; // cut it here
7323
7324 // output
7325
7326 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7327 }
7328 else if (hash_mode == 9300)
7329 {
7330 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7331 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7332 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7333 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7334 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7335 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7336 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7337 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7338 digest_buf[8] = 0; // needed for base64_encode ()
7339
7340 char tmp_buf[64] = { 0 };
7341
7342 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7343 tmp_buf[43] = 0; // cut it here
7344
7345 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7346
7347 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7348 }
7349 else if (hash_mode == 9400)
7350 {
7351 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7352
7353 office2007_t *office2007 = &office2007s[salt_pos];
7354
7355 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7356 SIGNATURE_OFFICE2007,
7357 2007,
7358 20,
7359 office2007->keySize,
7360 16,
7361 salt.salt_buf[0],
7362 salt.salt_buf[1],
7363 salt.salt_buf[2],
7364 salt.salt_buf[3],
7365 office2007->encryptedVerifier[0],
7366 office2007->encryptedVerifier[1],
7367 office2007->encryptedVerifier[2],
7368 office2007->encryptedVerifier[3],
7369 office2007->encryptedVerifierHash[0],
7370 office2007->encryptedVerifierHash[1],
7371 office2007->encryptedVerifierHash[2],
7372 office2007->encryptedVerifierHash[3],
7373 office2007->encryptedVerifierHash[4]);
7374 }
7375 else if (hash_mode == 9500)
7376 {
7377 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7378
7379 office2010_t *office2010 = &office2010s[salt_pos];
7380
7381 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,
7382
7383 salt.salt_buf[0],
7384 salt.salt_buf[1],
7385 salt.salt_buf[2],
7386 salt.salt_buf[3],
7387 office2010->encryptedVerifier[0],
7388 office2010->encryptedVerifier[1],
7389 office2010->encryptedVerifier[2],
7390 office2010->encryptedVerifier[3],
7391 office2010->encryptedVerifierHash[0],
7392 office2010->encryptedVerifierHash[1],
7393 office2010->encryptedVerifierHash[2],
7394 office2010->encryptedVerifierHash[3],
7395 office2010->encryptedVerifierHash[4],
7396 office2010->encryptedVerifierHash[5],
7397 office2010->encryptedVerifierHash[6],
7398 office2010->encryptedVerifierHash[7]);
7399 }
7400 else if (hash_mode == 9600)
7401 {
7402 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7403
7404 office2013_t *office2013 = &office2013s[salt_pos];
7405
7406 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,
7407
7408 salt.salt_buf[0],
7409 salt.salt_buf[1],
7410 salt.salt_buf[2],
7411 salt.salt_buf[3],
7412 office2013->encryptedVerifier[0],
7413 office2013->encryptedVerifier[1],
7414 office2013->encryptedVerifier[2],
7415 office2013->encryptedVerifier[3],
7416 office2013->encryptedVerifierHash[0],
7417 office2013->encryptedVerifierHash[1],
7418 office2013->encryptedVerifierHash[2],
7419 office2013->encryptedVerifierHash[3],
7420 office2013->encryptedVerifierHash[4],
7421 office2013->encryptedVerifierHash[5],
7422 office2013->encryptedVerifierHash[6],
7423 office2013->encryptedVerifierHash[7]);
7424 }
7425 else if (hash_mode == 9700)
7426 {
7427 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7428
7429 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7430
7431 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7432 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7433 byte_swap_32 (salt.salt_buf[0]),
7434 byte_swap_32 (salt.salt_buf[1]),
7435 byte_swap_32 (salt.salt_buf[2]),
7436 byte_swap_32 (salt.salt_buf[3]),
7437 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7438 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7439 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7440 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7441 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7442 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7443 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7444 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7445 }
7446 else if (hash_mode == 9710)
7447 {
7448 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7449
7450 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7451
7452 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7453 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7454 byte_swap_32 (salt.salt_buf[0]),
7455 byte_swap_32 (salt.salt_buf[1]),
7456 byte_swap_32 (salt.salt_buf[2]),
7457 byte_swap_32 (salt.salt_buf[3]),
7458 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7459 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7460 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7461 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7462 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7463 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7464 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7465 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7466 }
7467 else if (hash_mode == 9720)
7468 {
7469 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7470
7471 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7472
7473 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7474
7475 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7476 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7477 byte_swap_32 (salt.salt_buf[0]),
7478 byte_swap_32 (salt.salt_buf[1]),
7479 byte_swap_32 (salt.salt_buf[2]),
7480 byte_swap_32 (salt.salt_buf[3]),
7481 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7482 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7483 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7484 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7485 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7486 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7487 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7488 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7489 rc4key[0],
7490 rc4key[1],
7491 rc4key[2],
7492 rc4key[3],
7493 rc4key[4]);
7494 }
7495 else if (hash_mode == 9800)
7496 {
7497 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7498
7499 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7500
7501 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7502 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7503 salt.salt_buf[0],
7504 salt.salt_buf[1],
7505 salt.salt_buf[2],
7506 salt.salt_buf[3],
7507 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7508 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7509 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7510 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7511 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7512 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7513 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7514 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7515 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7516 }
7517 else if (hash_mode == 9810)
7518 {
7519 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7520
7521 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7522
7523 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7524 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7525 salt.salt_buf[0],
7526 salt.salt_buf[1],
7527 salt.salt_buf[2],
7528 salt.salt_buf[3],
7529 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7530 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7531 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7532 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7533 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7534 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7535 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7536 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7537 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7538 }
7539 else if (hash_mode == 9820)
7540 {
7541 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7542
7543 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7544
7545 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7546
7547 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7548 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7549 salt.salt_buf[0],
7550 salt.salt_buf[1],
7551 salt.salt_buf[2],
7552 salt.salt_buf[3],
7553 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7554 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7555 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7556 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7557 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7558 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7559 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7560 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7561 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7562 rc4key[0],
7563 rc4key[1],
7564 rc4key[2],
7565 rc4key[3],
7566 rc4key[4]);
7567 }
7568 else if (hash_mode == 10000)
7569 {
7570 // salt
7571
7572 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7573
7574 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7575
7576 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7577
7578 // hash
7579
7580 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7581 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7582 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7583 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7584 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7585 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7586 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7587 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7588 digest_buf[8] = 0; // needed for base64_encode ()
7589
7590 char tmp_buf[64] = { 0 };
7591
7592 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7593
7594 // output
7595
7596 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7597 }
7598 else if (hash_mode == 10100)
7599 {
7600 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7601 digest_buf[0],
7602 digest_buf[1],
7603 2,
7604 4,
7605 byte_swap_32 (salt.salt_buf[0]),
7606 byte_swap_32 (salt.salt_buf[1]),
7607 byte_swap_32 (salt.salt_buf[2]),
7608 byte_swap_32 (salt.salt_buf[3]));
7609 }
7610 else if (hash_mode == 10200)
7611 {
7612 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7613
7614 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7615
7616 // challenge
7617
7618 char challenge[100] = { 0 };
7619
7620 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7621
7622 // response
7623
7624 char tmp_buf[100] = { 0 };
7625
7626 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7627 (char *) cram_md5->user,
7628 digest_buf[0],
7629 digest_buf[1],
7630 digest_buf[2],
7631 digest_buf[3]);
7632
7633 char response[100] = { 0 };
7634
7635 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7636
7637 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7638 }
7639 else if (hash_mode == 10300)
7640 {
7641 char tmp_buf[100] = { 0 };
7642
7643 memcpy (tmp_buf + 0, digest_buf, 20);
7644 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7645
7646 uint tmp_len = 20 + salt.salt_len;
7647
7648 // base64 encode it
7649
7650 char base64_encoded[100] = { 0 };
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] = { 0 };
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] = { 0 };
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] = { 0 };
8454
8455 // salt
8456
8457 memcpy (buf + 0, salt.salt_buf, 16);
8458
8459 buf[3] -= -4;
8460
8461 // iteration
8462
8463 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8464
8465 // chars
8466
8467 buf[26] = salt.salt_buf_pc[0];
8468 buf[27] = salt.salt_buf_pc[1];
8469
8470 // digest
8471
8472 memcpy (buf + 28, digest_buf, 8);
8473
8474 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8475
8476 tmp_buf[49] = 0;
8477
8478 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8479 }
8480 else if (hash_type == HASH_TYPE_CRC32)
8481 {
8482 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8483 }
8484 }
8485
8486 if (salt_type == SALT_TYPE_INTERN)
8487 {
8488 size_t pos = strlen (out_buf);
8489
8490 out_buf[pos] = data.separator;
8491
8492 char *ptr = (char *) salt.salt_buf;
8493
8494 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8495
8496 out_buf[pos + 1 + salt.salt_len] = 0;
8497 }
8498 }
8499
8500 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8501 {
8502 memset (hccap, 0, sizeof (hccap_t));
8503
8504 salt_t *salt = &data.salts_buf[salt_pos];
8505
8506 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8507
8508 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8509 wpa_t *wpa = &wpas[salt_pos];
8510
8511 hccap->keyver = wpa->keyver;
8512
8513 hccap->eapol_size = wpa->eapol_size;
8514
8515 if (wpa->keyver != 1)
8516 {
8517 uint eapol_tmp[64] = { 0 };
8518
8519 for (uint i = 0; i < 64; i++)
8520 {
8521 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8522 }
8523
8524 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8525 }
8526 else
8527 {
8528 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8529 }
8530
8531 uint pke_tmp[25] = { 0 };
8532
8533 for (int i = 5; i < 25; i++)
8534 {
8535 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8536 }
8537
8538 char *pke_ptr = (char *) pke_tmp;
8539
8540 memcpy (hccap->mac1, pke_ptr + 23, 6);
8541 memcpy (hccap->mac2, pke_ptr + 29, 6);
8542 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8543 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8544
8545 char *digests_buf_ptr = (char *) data.digests_buf;
8546
8547 uint dgst_size = data.dgst_size;
8548
8549 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8550
8551 if (wpa->keyver != 1)
8552 {
8553 uint digest_tmp[4] = { 0 };
8554
8555 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8556 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8557 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8558 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8559
8560 memcpy (hccap->keymic, digest_tmp, 16);
8561 }
8562 else
8563 {
8564 memcpy (hccap->keymic, digest_ptr, 16);
8565 }
8566 }
8567
8568 void SuspendThreads ()
8569 {
8570 if (data.devices_status == STATUS_RUNNING)
8571 {
8572 hc_timer_set (&data.timer_paused);
8573
8574 data.devices_status = STATUS_PAUSED;
8575
8576 log_info ("Paused");
8577 }
8578 }
8579
8580 void ResumeThreads ()
8581 {
8582 if (data.devices_status == STATUS_PAUSED)
8583 {
8584 float ms_paused;
8585
8586 hc_timer_get (data.timer_paused, ms_paused);
8587
8588 data.ms_paused += ms_paused;
8589
8590 data.devices_status = STATUS_RUNNING;
8591
8592 log_info ("Resumed");
8593 }
8594 }
8595
8596 void bypass ()
8597 {
8598 if (data.devices_status != STATUS_RUNNING) return;
8599
8600 data.devices_status = STATUS_BYPASS;
8601
8602 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8603 }
8604
8605 void stop_at_checkpoint ()
8606 {
8607 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8608 {
8609 if (data.devices_status != STATUS_RUNNING) return;
8610 }
8611
8612 // this feature only makes sense if --restore-disable was not specified
8613
8614 if (data.restore_disable == 1)
8615 {
8616 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8617
8618 return;
8619 }
8620
8621 // check if monitoring of Restore Point updates should be enabled or disabled
8622
8623 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8624 {
8625 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8626
8627 // save the current restore point value
8628
8629 data.checkpoint_cur_words = get_lowest_words_done ();
8630
8631 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8632 }
8633 else
8634 {
8635 data.devices_status = STATUS_RUNNING;
8636
8637 // reset the global value for checkpoint checks
8638
8639 data.checkpoint_cur_words = 0;
8640
8641 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8642 }
8643 }
8644
8645 void myabort ()
8646 {
8647 if (data.devices_status == STATUS_INIT) return;
8648 if (data.devices_status == STATUS_STARTING) return;
8649
8650 data.devices_status = STATUS_ABORTED;
8651 }
8652
8653 void myquit ()
8654 {
8655 if (data.devices_status == STATUS_INIT) return;
8656 if (data.devices_status == STATUS_STARTING) return;
8657
8658 data.devices_status = STATUS_QUIT;
8659 }
8660
8661 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8662 {
8663 FILE *fp = fopen (kernel_file, "rb");
8664
8665 if (fp != NULL)
8666 {
8667 struct stat st;
8668
8669 memset (&st, 0, sizeof (st));
8670
8671 stat (kernel_file, &st);
8672
8673 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8674
8675 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8676
8677 if (num_read != (size_t) st.st_size)
8678 {
8679 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8680
8681 exit (-1);
8682 }
8683
8684 fclose (fp);
8685
8686 buf[st.st_size] = 0;
8687
8688 for (int i = 0; i < num_devices; i++)
8689 {
8690 kernel_lengths[i] = (size_t) st.st_size;
8691
8692 kernel_sources[i] = buf;
8693 }
8694 }
8695 else
8696 {
8697 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8698
8699 exit (-1);
8700 }
8701
8702 return;
8703 }
8704
8705 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8706 {
8707 if (binary_size > 0)
8708 {
8709 FILE *fp = fopen (dst, "wb");
8710
8711 lock_file (fp);
8712 fwrite (binary, sizeof (u8), binary_size, fp);
8713
8714 fflush (fp);
8715 fclose (fp);
8716 }
8717 }
8718
8719 /**
8720 * restore
8721 */
8722
8723 restore_data_t *init_restore (int argc, char **argv)
8724 {
8725 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8726
8727 if (data.restore_disable == 0)
8728 {
8729 FILE *fp = fopen (data.eff_restore_file, "rb");
8730
8731 if (fp)
8732 {
8733 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8734
8735 if (nread != 1)
8736 {
8737 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8738
8739 exit (-1);
8740 }
8741
8742 fclose (fp);
8743
8744 if (rd->pid)
8745 {
8746 char pidbin[BUFSIZ] = { 0 };
8747
8748 int pidbin_len = -1;
8749
8750 #ifdef _POSIX
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] = { 0 };
8783
8784 int pidbin2_len = -1;
8785
8786 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8787 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8788
8789 pidbin[pidbin_len] = 0;
8790 pidbin2[pidbin2_len] = 0;
8791
8792 if (pidbin2_len)
8793 {
8794 if (strcmp (pidbin, pidbin2) == 0)
8795 {
8796 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8797
8798 exit (-1);
8799 }
8800 }
8801 #endif
8802 }
8803
8804 if (rd->version_bin < RESTORE_MIN)
8805 {
8806 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8807
8808 exit (-1);
8809 }
8810 }
8811 }
8812
8813 memset (rd, 0, sizeof (restore_data_t));
8814
8815 rd->version_bin = VERSION_BIN;
8816
8817 #ifdef _POSIX
8818 rd->pid = getpid ();
8819 #elif _WIN
8820 rd->pid = GetCurrentProcessId ();
8821 #endif
8822
8823 if (getcwd (rd->cwd, 255) == NULL)
8824 {
8825 myfree (rd);
8826
8827 return (NULL);
8828 }
8829
8830 rd->argc = argc;
8831 rd->argv = argv;
8832
8833 return (rd);
8834 }
8835
8836 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8837 {
8838 FILE *fp = fopen (eff_restore_file, "rb");
8839
8840 if (fp == NULL)
8841 {
8842 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8843
8844 exit (-1);
8845 }
8846
8847 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8848 {
8849 log_error ("ERROR: cannot read %s", eff_restore_file);
8850
8851 exit (-1);
8852 }
8853
8854 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8855
8856 for (uint i = 0; i < rd->argc; i++)
8857 {
8858 char buf[BUFSIZ] = { 0 };
8859
8860 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8861 {
8862 log_error ("ERROR: cannot read %s", eff_restore_file);
8863
8864 exit (-1);
8865 }
8866
8867 size_t len = strlen (buf);
8868
8869 if (len) buf[len - 1] = 0;
8870
8871 rd->argv[i] = mystrdup (buf);
8872 }
8873
8874 fclose (fp);
8875
8876 char new_cwd[1024] = { 0 };
8877
8878 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8879
8880 if (nwd == NULL)
8881 {
8882 log_error ("Restore file is corrupted");
8883 }
8884
8885 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8886 {
8887 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8888 {
8889 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8890
8891 exit (-1);
8892 }
8893
8894 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8895 }
8896
8897 if (chdir (rd->cwd))
8898 {
8899 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8900
8901 exit (-1);
8902 }
8903 }
8904
8905 u64 get_lowest_words_done ()
8906 {
8907 u64 words_cur = -1;
8908
8909 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8910 {
8911 hc_device_param_t *device_param = &data.devices_param[device_id];
8912
8913 if (device_param->skipped) continue;
8914
8915 const u64 words_done = device_param->words_done;
8916
8917 if (words_done < words_cur) words_cur = words_done;
8918 }
8919
8920 // It's possible that a device's workload isn't finished right after a restore-case.
8921 // In that case, this function would return 0 and overwrite the real restore point
8922 // There's also data.words_cur which is set to rd->words_cur but it changes while
8923 // the attack is running therefore we should stick to rd->words_cur.
8924 // Note that -s influences rd->words_cur we should keep a close look on that.
8925
8926 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8927
8928 return words_cur;
8929 }
8930
8931 void write_restore (const char *new_restore_file, restore_data_t *rd)
8932 {
8933 u64 words_cur = get_lowest_words_done ();
8934
8935 rd->words_cur = words_cur;
8936
8937 FILE *fp = fopen (new_restore_file, "wb");
8938
8939 if (fp == NULL)
8940 {
8941 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8942
8943 exit (-1);
8944 }
8945
8946 if (setvbuf (fp, NULL, _IONBF, 0))
8947 {
8948 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8949
8950 exit (-1);
8951 }
8952
8953 fwrite (rd, sizeof (restore_data_t), 1, fp);
8954
8955 for (uint i = 0; i < rd->argc; i++)
8956 {
8957 fprintf (fp, "%s", rd->argv[i]);
8958 fputc ('\n', fp);
8959 }
8960
8961 fflush (fp);
8962
8963 fsync (fileno (fp));
8964
8965 fclose (fp);
8966 }
8967
8968 void cycle_restore ()
8969 {
8970 const char *eff_restore_file = data.eff_restore_file;
8971 const char *new_restore_file = data.new_restore_file;
8972
8973 restore_data_t *rd = data.rd;
8974
8975 write_restore (new_restore_file, rd);
8976
8977 struct stat st;
8978
8979 memset (&st, 0, sizeof(st));
8980
8981 if (stat (eff_restore_file, &st) == 0)
8982 {
8983 if (unlink (eff_restore_file))
8984 {
8985 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8986 }
8987 }
8988
8989 if (rename (new_restore_file, eff_restore_file))
8990 {
8991 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8992 }
8993 }
8994
8995 void check_checkpoint ()
8996 {
8997 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8998
8999 u64 words_cur = get_lowest_words_done ();
9000
9001 if (words_cur != data.checkpoint_cur_words)
9002 {
9003 myabort ();
9004 }
9005 }
9006
9007 /**
9008 * adjustments
9009 */
9010
9011 uint set_kernel_accel (uint hash_mode)
9012 {
9013 switch (hash_mode)
9014 {
9015 case 0: return GET_ACCEL (0);
9016 case 10: return GET_ACCEL (10);
9017 case 11: return GET_ACCEL (11);
9018 case 12: return GET_ACCEL (12);
9019 case 20: return GET_ACCEL (20);
9020 case 21: return GET_ACCEL (21);
9021 case 22: return GET_ACCEL (22);
9022 case 23: return GET_ACCEL (23);
9023 case 30: return GET_ACCEL (30);
9024 case 40: return GET_ACCEL (40);
9025 case 50: return GET_ACCEL (50);
9026 case 60: return GET_ACCEL (60);
9027 case 100: return GET_ACCEL (100);
9028 case 101: return GET_ACCEL (101);
9029 case 110: return GET_ACCEL (110);
9030 case 111: return GET_ACCEL (111);
9031 case 112: return GET_ACCEL (112);
9032 case 120: return GET_ACCEL (120);
9033 case 121: return GET_ACCEL (121);
9034 case 122: return GET_ACCEL (122);
9035 case 124: return GET_ACCEL (124);
9036 case 130: return GET_ACCEL (130);
9037 case 131: return GET_ACCEL (131);
9038 case 132: return GET_ACCEL (132);
9039 case 133: return GET_ACCEL (133);
9040 case 140: return GET_ACCEL (140);
9041 case 141: return GET_ACCEL (141);
9042 case 150: return GET_ACCEL (150);
9043 case 160: return GET_ACCEL (160);
9044 case 190: return GET_ACCEL (190);
9045 case 200: return GET_ACCEL (200);
9046 case 300: return GET_ACCEL (300);
9047 case 400: return GET_ACCEL (400);
9048 case 500: return GET_ACCEL (500);
9049 case 501: return GET_ACCEL (501);
9050 case 900: return GET_ACCEL (900);
9051 case 910: return GET_ACCEL (910);
9052 case 1000: return GET_ACCEL (1000);
9053 case 1100: return GET_ACCEL (1100);
9054 case 1400: return GET_ACCEL (1400);
9055 case 1410: return GET_ACCEL (1410);
9056 case 1420: return GET_ACCEL (1420);
9057 case 1421: return GET_ACCEL (1421);
9058 case 1430: return GET_ACCEL (1430);
9059 case 1440: return GET_ACCEL (1440);
9060 case 1441: return GET_ACCEL (1441);
9061 case 1450: return GET_ACCEL (1450);
9062 case 1460: return GET_ACCEL (1460);
9063 case 1500: return GET_ACCEL (1500);
9064 case 1600: return GET_ACCEL (1600);
9065 case 1700: return GET_ACCEL (1700);
9066 case 1710: return GET_ACCEL (1710);
9067 case 1711: return GET_ACCEL (1711);
9068 case 1720: return GET_ACCEL (1720);
9069 case 1722: return GET_ACCEL (1722);
9070 case 1730: return GET_ACCEL (1730);
9071 case 1731: return GET_ACCEL (1731);
9072 case 1740: return GET_ACCEL (1740);
9073 case 1750: return GET_ACCEL (1750);
9074 case 1760: return GET_ACCEL (1760);
9075 case 1800: return GET_ACCEL (1800);
9076 case 2100: return GET_ACCEL (2100);
9077 case 2400: return GET_ACCEL (2400);
9078 case 2410: return GET_ACCEL (2410);
9079 case 2500: return GET_ACCEL (2500);
9080 case 2600: return GET_ACCEL (2600);
9081 case 2611: return GET_ACCEL (2611);
9082 case 2612: return GET_ACCEL (2612);
9083 case 2711: return GET_ACCEL (2711);
9084 case 2811: return GET_ACCEL (2811);
9085 case 3000: return GET_ACCEL (3000);
9086 case 3100: return GET_ACCEL (3100);
9087 case 3200: return GET_ACCEL (3200);
9088 case 3710: return GET_ACCEL (3710);
9089 case 3711: return GET_ACCEL (3711);
9090 case 3800: return GET_ACCEL (3800);
9091 case 4300: return GET_ACCEL (4300);
9092 case 4400: return GET_ACCEL (4400);
9093 case 4500: return GET_ACCEL (4500);
9094 case 4700: return GET_ACCEL (4700);
9095 case 4800: return GET_ACCEL (4800);
9096 case 4900: return GET_ACCEL (4900);
9097 case 5000: return GET_ACCEL (5000);
9098 case 5100: return GET_ACCEL (5100);
9099 case 5200: return GET_ACCEL (5200);
9100 case 5300: return GET_ACCEL (5300);
9101 case 5400: return GET_ACCEL (5400);
9102 case 5500: return GET_ACCEL (5500);
9103 case 5600: return GET_ACCEL (5600);
9104 case 5700: return GET_ACCEL (5700);
9105 case 5800: return GET_ACCEL (5800);
9106 case 6000: return GET_ACCEL (6000);
9107 case 6100: return GET_ACCEL (6100);
9108 case 6211: return GET_ACCEL (6211);
9109 case 6212: return GET_ACCEL (6212);
9110 case 6213: return GET_ACCEL (6213);
9111 case 6221: return GET_ACCEL (6221);
9112 case 6222: return GET_ACCEL (6222);
9113 case 6223: return GET_ACCEL (6223);
9114 case 6231: return GET_ACCEL (6231);
9115 case 6232: return GET_ACCEL (6232);
9116 case 6233: return GET_ACCEL (6233);
9117 case 6241: return GET_ACCEL (6241);
9118 case 6242: return GET_ACCEL (6242);
9119 case 6243: return GET_ACCEL (6243);
9120 case 6300: return GET_ACCEL (6300);
9121 case 6400: return GET_ACCEL (6400);
9122 case 6500: return GET_ACCEL (6500);
9123 case 6600: return GET_ACCEL (6600);
9124 case 6700: return GET_ACCEL (6700);
9125 case 6800: return GET_ACCEL (6800);
9126 case 6900: return GET_ACCEL (6900);
9127 case 7100: return GET_ACCEL (7100);
9128 case 7200: return GET_ACCEL (7200);
9129 case 7300: return GET_ACCEL (7300);
9130 case 7400: return GET_ACCEL (7400);
9131 case 7500: return GET_ACCEL (7500);
9132 case 7600: return GET_ACCEL (7600);
9133 case 7700: return GET_ACCEL (7700);
9134 case 7800: return GET_ACCEL (7800);
9135 case 7900: return GET_ACCEL (7900);
9136 case 8000: return GET_ACCEL (8000);
9137 case 8100: return GET_ACCEL (8100);
9138 case 8200: return GET_ACCEL (8200);
9139 case 8300: return GET_ACCEL (8300);
9140 case 8400: return GET_ACCEL (8400);
9141 case 8500: return GET_ACCEL (8500);
9142 case 8600: return GET_ACCEL (8600);
9143 case 8700: return GET_ACCEL (8700);
9144 case 8800: return GET_ACCEL (8800);
9145 case 8900: return GET_ACCEL (8900);
9146 case 9000: return GET_ACCEL (9000);
9147 case 9100: return GET_ACCEL (9100);
9148 case 9200: return GET_ACCEL (9200);
9149 case 9300: return GET_ACCEL (9300);
9150 case 9400: return GET_ACCEL (9400);
9151 case 9500: return GET_ACCEL (9500);
9152 case 9600: return GET_ACCEL (9600);
9153 case 9700: return GET_ACCEL (9700);
9154 case 9710: return GET_ACCEL (9710);
9155 case 9720: return GET_ACCEL (9720);
9156 case 9800: return GET_ACCEL (9800);
9157 case 9810: return GET_ACCEL (9810);
9158 case 9820: return GET_ACCEL (9820);
9159 case 9900: return GET_ACCEL (9900);
9160 case 10000: return GET_ACCEL (10000);
9161 case 10100: return GET_ACCEL (10100);
9162 case 10200: return GET_ACCEL (10200);
9163 case 10300: return GET_ACCEL (10300);
9164 case 10400: return GET_ACCEL (10400);
9165 case 10410: return GET_ACCEL (10410);
9166 case 10420: return GET_ACCEL (10420);
9167 case 10500: return GET_ACCEL (10500);
9168 case 10600: return GET_ACCEL (10600);
9169 case 10700: return GET_ACCEL (10700);
9170 case 10800: return GET_ACCEL (10800);
9171 case 10900: return GET_ACCEL (10900);
9172 case 11000: return GET_ACCEL (11000);
9173 case 11100: return GET_ACCEL (11100);
9174 case 11200: return GET_ACCEL (11200);
9175 case 11300: return GET_ACCEL (11300);
9176 case 11400: return GET_ACCEL (11400);
9177 case 11500: return GET_ACCEL (11500);
9178 case 11600: return GET_ACCEL (11600);
9179 case 11700: return GET_ACCEL (11700);
9180 case 11800: return GET_ACCEL (11800);
9181 case 11900: return GET_ACCEL (11900);
9182 case 12000: return GET_ACCEL (12000);
9183 case 12100: return GET_ACCEL (12100);
9184 case 12200: return GET_ACCEL (12200);
9185 case 12300: return GET_ACCEL (12300);
9186 case 12400: return GET_ACCEL (12400);
9187 case 12500: return GET_ACCEL (12500);
9188 case 12600: return GET_ACCEL (12600);
9189 case 12700: return GET_ACCEL (12700);
9190 case 12800: return GET_ACCEL (12800);
9191 case 12900: return GET_ACCEL (12900);
9192 case 13000: return GET_ACCEL (13000);
9193 }
9194
9195 return 0;
9196 }
9197
9198 uint set_kernel_loops (uint hash_mode)
9199 {
9200 switch (hash_mode)
9201 {
9202 case 0: return GET_LOOPS (0);
9203 case 10: return GET_LOOPS (10);
9204 case 11: return GET_LOOPS (11);
9205 case 12: return GET_LOOPS (12);
9206 case 20: return GET_LOOPS (20);
9207 case 21: return GET_LOOPS (21);
9208 case 22: return GET_LOOPS (22);
9209 case 23: return GET_LOOPS (23);
9210 case 30: return GET_LOOPS (30);
9211 case 40: return GET_LOOPS (40);
9212 case 50: return GET_LOOPS (50);
9213 case 60: return GET_LOOPS (60);
9214 case 100: return GET_LOOPS (100);
9215 case 101: return GET_LOOPS (101);
9216 case 110: return GET_LOOPS (110);
9217 case 111: return GET_LOOPS (111);
9218 case 112: return GET_LOOPS (112);
9219 case 120: return GET_LOOPS (120);
9220 case 121: return GET_LOOPS (121);
9221 case 122: return GET_LOOPS (122);
9222 case 124: return GET_LOOPS (124);
9223 case 130: return GET_LOOPS (130);
9224 case 131: return GET_LOOPS (131);
9225 case 132: return GET_LOOPS (132);
9226 case 133: return GET_LOOPS (133);
9227 case 140: return GET_LOOPS (140);
9228 case 141: return GET_LOOPS (141);
9229 case 150: return GET_LOOPS (150);
9230 case 160: return GET_LOOPS (160);
9231 case 190: return GET_LOOPS (190);
9232 case 200: return GET_LOOPS (200);
9233 case 300: return GET_LOOPS (300);
9234 case 400: return GET_LOOPS (400);
9235 case 500: return GET_LOOPS (500);
9236 case 501: return GET_LOOPS (501);
9237 case 900: return GET_LOOPS (900);
9238 case 910: return GET_LOOPS (910);
9239 case 1000: return GET_LOOPS (1000);
9240 case 1100: return GET_LOOPS (1100);
9241 case 1400: return GET_LOOPS (1400);
9242 case 1410: return GET_LOOPS (1410);
9243 case 1420: return GET_LOOPS (1420);
9244 case 1421: return GET_LOOPS (1421);
9245 case 1430: return GET_LOOPS (1430);
9246 case 1440: return GET_LOOPS (1440);
9247 case 1441: return GET_LOOPS (1441);
9248 case 1450: return GET_LOOPS (1450);
9249 case 1460: return GET_LOOPS (1460);
9250 case 1500: return GET_LOOPS (1500);
9251 case 1600: return GET_LOOPS (1600);
9252 case 1700: return GET_LOOPS (1700);
9253 case 1710: return GET_LOOPS (1710);
9254 case 1711: return GET_LOOPS (1711);
9255 case 1720: return GET_LOOPS (1720);
9256 case 1722: return GET_LOOPS (1722);
9257 case 1730: return GET_LOOPS (1730);
9258 case 1731: return GET_LOOPS (1731);
9259 case 1740: return GET_LOOPS (1740);
9260 case 1750: return GET_LOOPS (1750);
9261 case 1760: return GET_LOOPS (1760);
9262 case 1800: return GET_LOOPS (1800);
9263 case 2100: return GET_LOOPS (2100);
9264 case 2400: return GET_LOOPS (2400);
9265 case 2410: return GET_LOOPS (2410);
9266 case 2500: return GET_LOOPS (2500);
9267 case 2600: return GET_LOOPS (2600);
9268 case 2611: return GET_LOOPS (2611);
9269 case 2612: return GET_LOOPS (2612);
9270 case 2711: return GET_LOOPS (2711);
9271 case 2811: return GET_LOOPS (2811);
9272 case 3000: return GET_LOOPS (3000);
9273 case 3100: return GET_LOOPS (3100);
9274 case 3200: return GET_LOOPS (3200);
9275 case 3710: return GET_LOOPS (3710);
9276 case 3711: return GET_LOOPS (3711);
9277 case 3800: return GET_LOOPS (3800);
9278 case 4300: return GET_LOOPS (4300);
9279 case 4400: return GET_LOOPS (4400);
9280 case 4500: return GET_LOOPS (4500);
9281 case 4700: return GET_LOOPS (4700);
9282 case 4800: return GET_LOOPS (4800);
9283 case 4900: return GET_LOOPS (4900);
9284 case 5000: return GET_LOOPS (5000);
9285 case 5100: return GET_LOOPS (5100);
9286 case 5200: return GET_LOOPS (5200);
9287 case 5300: return GET_LOOPS (5300);
9288 case 5400: return GET_LOOPS (5400);
9289 case 5500: return GET_LOOPS (5500);
9290 case 5600: return GET_LOOPS (5600);
9291 case 5700: return GET_LOOPS (5700);
9292 case 5800: return GET_LOOPS (5800);
9293 case 6000: return GET_LOOPS (6000);
9294 case 6100: return GET_LOOPS (6100);
9295 case 6211: return GET_LOOPS (6211);
9296 case 6212: return GET_LOOPS (6212);
9297 case 6213: return GET_LOOPS (6213);
9298 case 6221: return GET_LOOPS (6221);
9299 case 6222: return GET_LOOPS (6222);
9300 case 6223: return GET_LOOPS (6223);
9301 case 6231: return GET_LOOPS (6231);
9302 case 6232: return GET_LOOPS (6232);
9303 case 6233: return GET_LOOPS (6233);
9304 case 6241: return GET_LOOPS (6241);
9305 case 6242: return GET_LOOPS (6242);
9306 case 6243: return GET_LOOPS (6243);
9307 case 6300: return GET_LOOPS (6300);
9308 case 6400: return GET_LOOPS (6400);
9309 case 6500: return GET_LOOPS (6500);
9310 case 6600: return GET_LOOPS (6600);
9311 case 6700: return GET_LOOPS (6700);
9312 case 6800: return GET_LOOPS (6800);
9313 case 6900: return GET_LOOPS (6900);
9314 case 7100: return GET_LOOPS (7100);
9315 case 7200: return GET_LOOPS (7200);
9316 case 7300: return GET_LOOPS (7300);
9317 case 7400: return GET_LOOPS (7400);
9318 case 7500: return GET_LOOPS (7500);
9319 case 7600: return GET_LOOPS (7600);
9320 case 7700: return GET_LOOPS (7700);
9321 case 7800: return GET_LOOPS (7800);
9322 case 7900: return GET_LOOPS (7900);
9323 case 8000: return GET_LOOPS (8000);
9324 case 8100: return GET_LOOPS (8100);
9325 case 8200: return GET_LOOPS (8200);
9326 case 8300: return GET_LOOPS (8300);
9327 case 8400: return GET_LOOPS (8400);
9328 case 8500: return GET_LOOPS (8500);
9329 case 8600: return GET_LOOPS (8600);
9330 case 8700: return GET_LOOPS (8700);
9331 case 8800: return GET_LOOPS (8800);
9332 case 8900: return GET_LOOPS (8900);
9333 case 9000: return GET_LOOPS (9000);
9334 case 9100: return GET_LOOPS (9100);
9335 case 9200: return GET_LOOPS (9200);
9336 case 9300: return GET_LOOPS (9300);
9337 case 9400: return GET_LOOPS (9400);
9338 case 9500: return GET_LOOPS (9500);
9339 case 9600: return GET_LOOPS (9600);
9340 case 9700: return GET_LOOPS (9700);
9341 case 9710: return GET_LOOPS (9710);
9342 case 9720: return GET_LOOPS (9720);
9343 case 9800: return GET_LOOPS (9800);
9344 case 9810: return GET_LOOPS (9810);
9345 case 9820: return GET_LOOPS (9820);
9346 case 9900: return GET_LOOPS (9900);
9347 case 10000: return GET_LOOPS (10000);
9348 case 10100: return GET_LOOPS (10100);
9349 case 10200: return GET_LOOPS (10200);
9350 case 10300: return GET_LOOPS (10300);
9351 case 10400: return GET_LOOPS (10400);
9352 case 10410: return GET_LOOPS (10410);
9353 case 10420: return GET_LOOPS (10420);
9354 case 10500: return GET_LOOPS (10500);
9355 case 10600: return GET_LOOPS (10600);
9356 case 10700: return GET_LOOPS (10700);
9357 case 10800: return GET_LOOPS (10800);
9358 case 10900: return GET_LOOPS (10900);
9359 case 11000: return GET_LOOPS (11000);
9360 case 11100: return GET_LOOPS (11100);
9361 case 11200: return GET_LOOPS (11200);
9362 case 11300: return GET_LOOPS (11300);
9363 case 11400: return GET_LOOPS (11400);
9364 case 11500: return GET_LOOPS (11500);
9365 case 11600: return GET_LOOPS (11600);
9366 case 11700: return GET_LOOPS (11700);
9367 case 11800: return GET_LOOPS (11800);
9368 case 11900: return GET_LOOPS (11900);
9369 case 12000: return GET_LOOPS (12000);
9370 case 12100: return GET_LOOPS (12100);
9371 case 12200: return GET_LOOPS (12200);
9372 case 12300: return GET_LOOPS (12300);
9373 case 12400: return GET_LOOPS (12400);
9374 case 12500: return GET_LOOPS (12500);
9375 case 12600: return GET_LOOPS (12600);
9376 case 12700: return GET_LOOPS (12700);
9377 case 12800: return GET_LOOPS (12800);
9378 case 12900: return GET_LOOPS (12900);
9379 case 13000: return GET_LOOPS (13000);
9380 }
9381
9382 return 0;
9383 }
9384
9385 /**
9386 * parser
9387 */
9388
9389 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9390 {
9391 u8 tmp[256] = { 0 };
9392
9393 if (salt_len > sizeof (tmp))
9394 {
9395 return UINT_MAX;
9396 }
9397
9398 memcpy (tmp, in, salt_len);
9399
9400 if (data.opts_type & OPTS_TYPE_ST_HEX)
9401 {
9402 if ((salt_len % 2) == 0)
9403 {
9404 u32 new_salt_len = salt_len / 2;
9405
9406 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9407 {
9408 u8 p0 = tmp[j + 0];
9409 u8 p1 = tmp[j + 1];
9410
9411 tmp[i] = hex_convert (p1) << 0;
9412 tmp[i] |= hex_convert (p0) << 4;
9413 }
9414
9415 salt_len = new_salt_len;
9416 }
9417 else
9418 {
9419 return UINT_MAX;
9420 }
9421 }
9422 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9423 {
9424 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9425 }
9426
9427 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9428
9429 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9430 {
9431 if (salt_len < 20)
9432 {
9433 u32 *tmp_uint = (u32 *) tmp;
9434
9435 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9436 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9437 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9438 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9439 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9440 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9441 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9442 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9443 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9444 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9445
9446 salt_len = salt_len * 2;
9447 }
9448 else
9449 {
9450 return UINT_MAX;
9451 }
9452 }
9453
9454 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9455 {
9456 lowercase (tmp, salt_len);
9457 }
9458
9459 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9460 {
9461 uppercase (tmp, salt_len);
9462 }
9463
9464 u32 len = salt_len;
9465
9466 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9467 {
9468 tmp[len++] = 0x80;
9469 }
9470
9471 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9472 {
9473 tmp[len++] = 0x01;
9474 }
9475
9476 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9477 {
9478 u32 *tmp_uint = (uint *) tmp;
9479
9480 u32 max = len / 4;
9481
9482 if (len % 4) max++;
9483
9484 for (u32 i = 0; i < max; i++)
9485 {
9486 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9487 }
9488
9489 // Important: we may need to increase the length of memcpy since
9490 // we don't want to "loose" some swapped bytes (could happen if
9491 // they do not perfectly fit in the 4-byte blocks)
9492 // Memcpy does always copy the bytes in the BE order, but since
9493 // we swapped them, some important bytes could be in positions
9494 // we normally skip with the original len
9495
9496 if (len % 4) len += 4 - (len % 4);
9497 }
9498
9499 memcpy (out, tmp, len);
9500
9501 return (salt_len);
9502 }
9503
9504 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9505 {
9506 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9507
9508 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9509
9510 u32 *digest = (u32 *) hash_buf->digest;
9511
9512 salt_t *salt = hash_buf->salt;
9513
9514 memcpy ((char *) salt->salt_sign, input_buf, 6);
9515
9516 char *iter_pos = input_buf + 4;
9517
9518 salt->salt_iter = 1 << atoi (iter_pos);
9519
9520 char *salt_pos = strchr (iter_pos, '$');
9521
9522 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9523
9524 salt_pos++;
9525
9526 uint salt_len = 16;
9527
9528 salt->salt_len = salt_len;
9529
9530 u8 tmp_buf[100] = { 0 };
9531
9532 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9533
9534 char *salt_buf_ptr = (char *) salt->salt_buf;
9535
9536 memcpy (salt_buf_ptr, tmp_buf, 16);
9537
9538 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9539 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9540 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9541 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9542
9543 char *hash_pos = salt_pos + 22;
9544
9545 memset (tmp_buf, 0, sizeof (tmp_buf));
9546
9547 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9548
9549 memcpy (digest, tmp_buf, 24);
9550
9551 digest[0] = byte_swap_32 (digest[0]);
9552 digest[1] = byte_swap_32 (digest[1]);
9553 digest[2] = byte_swap_32 (digest[2]);
9554 digest[3] = byte_swap_32 (digest[3]);
9555 digest[4] = byte_swap_32 (digest[4]);
9556 digest[5] = byte_swap_32 (digest[5]);
9557
9558 digest[5] &= ~0xff; // its just 23 not 24 !
9559
9560 return (PARSER_OK);
9561 }
9562
9563 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9564 {
9565 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9566
9567 u32 *digest = (u32 *) hash_buf->digest;
9568
9569 u8 tmp_buf[100] = { 0 };
9570
9571 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9572
9573 memcpy (digest, tmp_buf, 32);
9574
9575 digest[0] = byte_swap_32 (digest[0]);
9576 digest[1] = byte_swap_32 (digest[1]);
9577 digest[2] = byte_swap_32 (digest[2]);
9578 digest[3] = byte_swap_32 (digest[3]);
9579 digest[4] = byte_swap_32 (digest[4]);
9580 digest[5] = byte_swap_32 (digest[5]);
9581 digest[6] = byte_swap_32 (digest[6]);
9582 digest[7] = byte_swap_32 (digest[7]);
9583
9584 digest[0] -= SHA256M_A;
9585 digest[1] -= SHA256M_B;
9586 digest[2] -= SHA256M_C;
9587 digest[3] -= SHA256M_D;
9588 digest[4] -= SHA256M_E;
9589 digest[5] -= SHA256M_F;
9590 digest[6] -= SHA256M_G;
9591 digest[7] -= SHA256M_H;
9592
9593 return (PARSER_OK);
9594 }
9595
9596 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9597 {
9598 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9599
9600 u32 *digest = (u32 *) hash_buf->digest;
9601
9602 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9603 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9604
9605 digest[0] = byte_swap_32 (digest[0]);
9606 digest[1] = byte_swap_32 (digest[1]);
9607
9608 uint tt;
9609
9610 IP (digest[0], digest[1], tt);
9611
9612 digest[0] = digest[0];
9613 digest[1] = digest[1];
9614 digest[2] = 0;
9615 digest[3] = 0;
9616
9617 return (PARSER_OK);
9618 }
9619
9620 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9621 {
9622 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9623
9624 u32 *digest = (u32 *) hash_buf->digest;
9625
9626 salt_t *salt = hash_buf->salt;
9627
9628 char *hash_pos = input_buf + 8;
9629
9630 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9631 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9632 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9633 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9634 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9635
9636 digest[0] -= SHA1M_A;
9637 digest[1] -= SHA1M_B;
9638 digest[2] -= SHA1M_C;
9639 digest[3] -= SHA1M_D;
9640 digest[4] -= SHA1M_E;
9641
9642 uint salt_len = 8;
9643
9644 char *salt_buf_ptr = (char *) salt->salt_buf;
9645
9646 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9647
9648 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9649
9650 salt->salt_len = salt_len;
9651
9652 return (PARSER_OK);
9653 }
9654
9655 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9656 {
9657 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9658
9659 u64 *digest = (u64 *) hash_buf->digest;
9660
9661 salt_t *salt = hash_buf->salt;
9662
9663 char *hash_pos = input_buf + 8;
9664
9665 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9666 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9667 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9668 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9669 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9670 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9671 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9672 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9673
9674 digest[0] -= SHA512M_A;
9675 digest[1] -= SHA512M_B;
9676 digest[2] -= SHA512M_C;
9677 digest[3] -= SHA512M_D;
9678 digest[4] -= SHA512M_E;
9679 digest[5] -= SHA512M_F;
9680 digest[6] -= SHA512M_G;
9681 digest[7] -= SHA512M_H;
9682
9683 uint salt_len = 8;
9684
9685 char *salt_buf_ptr = (char *) salt->salt_buf;
9686
9687 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9688
9689 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9690
9691 salt->salt_len = salt_len;
9692
9693 return (PARSER_OK);
9694 }
9695
9696 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9697 {
9698 if (data.opts_type & OPTS_TYPE_ST_HEX)
9699 {
9700 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9701 }
9702 else
9703 {
9704 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9705 }
9706
9707 u32 *digest = (u32 *) hash_buf->digest;
9708
9709 salt_t *salt = hash_buf->salt;
9710
9711 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9712 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9713 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9714 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9715
9716 digest[0] = byte_swap_32 (digest[0]);
9717 digest[1] = byte_swap_32 (digest[1]);
9718 digest[2] = byte_swap_32 (digest[2]);
9719 digest[3] = byte_swap_32 (digest[3]);
9720
9721 digest[0] -= MD5M_A;
9722 digest[1] -= MD5M_B;
9723 digest[2] -= MD5M_C;
9724 digest[3] -= MD5M_D;
9725
9726 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9727
9728 uint salt_len = input_len - 32 - 1;
9729
9730 char *salt_buf = input_buf + 32 + 1;
9731
9732 char *salt_buf_ptr = (char *) salt->salt_buf;
9733
9734 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9735
9736 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9737
9738 salt->salt_len = salt_len;
9739
9740 return (PARSER_OK);
9741 }
9742
9743 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9744 {
9745 if (data.opts_type & OPTS_TYPE_ST_HEX)
9746 {
9747 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9748 }
9749 else
9750 {
9751 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9752 }
9753
9754 // unscramble
9755
9756 char clean_input_buf[32] = { 0 };
9757
9758 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9759 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9760
9761 for (int i = 0, j = 0, k = 0; i < 30; i++)
9762 {
9763 if (i == pos[j])
9764 {
9765 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9766
9767 j++;
9768 }
9769 else
9770 {
9771 clean_input_buf[k] = input_buf[i];
9772
9773 k++;
9774 }
9775 }
9776
9777 // base64 decode
9778
9779 u32 *digest = (u32 *) hash_buf->digest;
9780
9781 salt_t *salt = hash_buf->salt;
9782
9783 u32 a, b, c, d, e, f;
9784
9785 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9786 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9787 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9788 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9789 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9790 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9791
9792 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9793 | (((d << 12) | (e << 6) | (f)) << 0);
9794
9795 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9796 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9797 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9798 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9799 e = base64_to_int (clean_input_buf[10] & 0x7f);
9800 f = base64_to_int (clean_input_buf[11] & 0x7f);
9801
9802 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9803 | (((d << 12) | (e << 6) | (f)) << 0);
9804
9805 a = base64_to_int (clean_input_buf[12] & 0x7f);
9806 b = base64_to_int (clean_input_buf[13] & 0x7f);
9807 c = base64_to_int (clean_input_buf[14] & 0x7f);
9808 d = base64_to_int (clean_input_buf[15] & 0x7f);
9809 e = base64_to_int (clean_input_buf[16] & 0x7f);
9810 f = base64_to_int (clean_input_buf[17] & 0x7f);
9811
9812 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9813 | (((d << 12) | (e << 6) | (f)) << 0);
9814
9815 a = base64_to_int (clean_input_buf[18] & 0x7f);
9816 b = base64_to_int (clean_input_buf[19] & 0x7f);
9817 c = base64_to_int (clean_input_buf[20] & 0x7f);
9818 d = base64_to_int (clean_input_buf[21] & 0x7f);
9819 e = base64_to_int (clean_input_buf[22] & 0x7f);
9820 f = base64_to_int (clean_input_buf[23] & 0x7f);
9821
9822 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9823 | (((d << 12) | (e << 6) | (f)) << 0);
9824
9825 digest[0] = byte_swap_32 (digest[0]);
9826 digest[1] = byte_swap_32 (digest[1]);
9827 digest[2] = byte_swap_32 (digest[2]);
9828 digest[3] = byte_swap_32 (digest[3]);
9829
9830 digest[0] -= MD5M_A;
9831 digest[1] -= MD5M_B;
9832 digest[2] -= MD5M_C;
9833 digest[3] -= MD5M_D;
9834
9835 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9836
9837 uint salt_len = input_len - 30 - 1;
9838
9839 char *salt_buf = input_buf + 30 + 1;
9840
9841 char *salt_buf_ptr = (char *) salt->salt_buf;
9842
9843 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9844
9845 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9846 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9847
9848 salt->salt_len = salt_len;
9849
9850 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9851
9852 salt->salt_len += 22;
9853
9854 return (PARSER_OK);
9855 }
9856
9857 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9858 {
9859 if (data.opts_type & OPTS_TYPE_ST_HEX)
9860 {
9861 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9862 }
9863 else
9864 {
9865 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9866 }
9867
9868 u32 *digest = (u32 *) hash_buf->digest;
9869
9870 salt_t *salt = hash_buf->salt;
9871
9872 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9873 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9874 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9875 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9876 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
9877
9878 digest[0] -= SHA1M_A;
9879 digest[1] -= SHA1M_B;
9880 digest[2] -= SHA1M_C;
9881 digest[3] -= SHA1M_D;
9882 digest[4] -= SHA1M_E;
9883
9884 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9885
9886 uint salt_len = input_len - 40 - 1;
9887
9888 char *salt_buf = input_buf + 40 + 1;
9889
9890 char *salt_buf_ptr = (char *) salt->salt_buf;
9891
9892 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9893
9894 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9895
9896 salt->salt_len = salt_len;
9897
9898 return (PARSER_OK);
9899 }
9900
9901 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9902 {
9903 if (data.opts_type & OPTS_TYPE_ST_HEX)
9904 {
9905 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9906 }
9907 else
9908 {
9909 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9910 }
9911
9912 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9913
9914 char *iter_pos = input_buf + 6;
9915
9916 salt_t *salt = hash_buf->salt;
9917
9918 uint iter = atoi (iter_pos);
9919
9920 if (iter < 1)
9921 {
9922 iter = ROUNDS_DCC2;
9923 }
9924
9925 salt->salt_iter = iter - 1;
9926
9927 char *salt_pos = strchr (iter_pos, '#');
9928
9929 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9930
9931 salt_pos++;
9932
9933 char *digest_pos = strchr (salt_pos, '#');
9934
9935 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9936
9937 digest_pos++;
9938
9939 uint salt_len = digest_pos - salt_pos - 1;
9940
9941 u32 *digest = (u32 *) hash_buf->digest;
9942
9943 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
9944 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
9945 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
9946 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
9947
9948 char *salt_buf_ptr = (char *) salt->salt_buf;
9949
9950 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9951
9952 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9953
9954 salt->salt_len = salt_len;
9955
9956 return (PARSER_OK);
9957 }
9958
9959 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9960 {
9961 u32 *digest = (u32 *) hash_buf->digest;
9962
9963 salt_t *salt = hash_buf->salt;
9964
9965 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9966
9967 hccap_t in;
9968
9969 memcpy (&in, input_buf, input_len);
9970
9971 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9972
9973 memcpy (digest, in.keymic, 16);
9974
9975 /*
9976 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9977 The phrase "Pairwise key expansion"
9978 Access Point Address (referred to as Authenticator Address AA)
9979 Supplicant Address (referred to as Supplicant Address SA)
9980 Access Point Nonce (referred to as Authenticator Anonce)
9981 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9982 */
9983
9984 uint salt_len = strlen (in.essid);
9985
9986 memcpy (salt->salt_buf, in.essid, salt_len);
9987
9988 salt->salt_len = salt_len;
9989
9990 salt->salt_iter = ROUNDS_WPA2 - 1;
9991
9992 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9993
9994 memcpy (pke_ptr, "Pairwise key expansion", 23);
9995
9996 if (memcmp (in.mac1, in.mac2, 6) < 0)
9997 {
9998 memcpy (pke_ptr + 23, in.mac1, 6);
9999 memcpy (pke_ptr + 29, in.mac2, 6);
10000 }
10001 else
10002 {
10003 memcpy (pke_ptr + 23, in.mac2, 6);
10004 memcpy (pke_ptr + 29, in.mac1, 6);
10005 }
10006
10007 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10008 {
10009 memcpy (pke_ptr + 35, in.nonce1, 32);
10010 memcpy (pke_ptr + 67, in.nonce2, 32);
10011 }
10012 else
10013 {
10014 memcpy (pke_ptr + 35, in.nonce2, 32);
10015 memcpy (pke_ptr + 67, in.nonce1, 32);
10016 }
10017
10018 for (int i = 0; i < 25; i++)
10019 {
10020 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10021 }
10022
10023 wpa->keyver = in.keyver;
10024
10025 if (wpa->keyver > 255)
10026 {
10027 log_info ("ATTENTION!");
10028 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10029 log_info (" This could be due to a recent aircrack-ng bug.");
10030 log_info (" The key version was automatically reset to a reasonable value.");
10031 log_info ("");
10032
10033 wpa->keyver &= 0xff;
10034 }
10035
10036 wpa->eapol_size = in.eapol_size;
10037
10038 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10039
10040 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10041
10042 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10043
10044 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10045
10046 if (wpa->keyver == 1)
10047 {
10048 // nothing to do
10049 }
10050 else
10051 {
10052 digest[0] = byte_swap_32 (digest[0]);
10053 digest[1] = byte_swap_32 (digest[1]);
10054 digest[2] = byte_swap_32 (digest[2]);
10055 digest[3] = byte_swap_32 (digest[3]);
10056
10057 for (int i = 0; i < 64; i++)
10058 {
10059 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10060 }
10061 }
10062
10063 salt->salt_buf[10] = digest[1];
10064 salt->salt_buf[11] = digest[2];
10065
10066 return (PARSER_OK);
10067 }
10068
10069 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10070 {
10071 u32 *digest = (u32 *) hash_buf->digest;
10072
10073 salt_t *salt = hash_buf->salt;
10074
10075 if (input_len == 0)
10076 {
10077 log_error ("Password Safe v2 container not specified");
10078
10079 exit (-1);
10080 }
10081
10082 FILE *fp = fopen (input_buf, "rb");
10083
10084 if (fp == NULL)
10085 {
10086 log_error ("%s: %s", input_buf, strerror (errno));
10087
10088 exit (-1);
10089 }
10090
10091 psafe2_hdr buf;
10092
10093 memset (&buf, 0, sizeof (psafe2_hdr));
10094
10095 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10096
10097 fclose (fp);
10098
10099 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10100
10101 salt->salt_buf[0] = buf.random[0];
10102 salt->salt_buf[1] = buf.random[1];
10103
10104 salt->salt_len = 8;
10105 salt->salt_iter = 1000;
10106
10107 digest[0] = byte_swap_32 (buf.hash[0]);
10108 digest[1] = byte_swap_32 (buf.hash[1]);
10109 digest[2] = byte_swap_32 (buf.hash[2]);
10110 digest[3] = byte_swap_32 (buf.hash[3]);
10111 digest[4] = byte_swap_32 (buf.hash[4]);
10112
10113 return (PARSER_OK);
10114 }
10115
10116 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10117 {
10118 u32 *digest = (u32 *) hash_buf->digest;
10119
10120 salt_t *salt = hash_buf->salt;
10121
10122 if (input_len == 0)
10123 {
10124 log_error (".psafe3 not specified");
10125
10126 exit (-1);
10127 }
10128
10129 FILE *fp = fopen (input_buf, "rb");
10130
10131 if (fp == NULL)
10132 {
10133 log_error ("%s: %s", input_buf, strerror (errno));
10134
10135 exit (-1);
10136 }
10137
10138 psafe3_t in;
10139
10140 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10141
10142 fclose (fp);
10143
10144 data.hashfile = input_buf; // we will need this in case it gets cracked
10145
10146 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10147
10148 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10149
10150 salt->salt_iter = in.iterations + 1;
10151
10152 salt->salt_buf[0] = in.salt_buf[0];
10153 salt->salt_buf[1] = in.salt_buf[1];
10154 salt->salt_buf[2] = in.salt_buf[2];
10155 salt->salt_buf[3] = in.salt_buf[3];
10156 salt->salt_buf[4] = in.salt_buf[4];
10157 salt->salt_buf[5] = in.salt_buf[5];
10158 salt->salt_buf[6] = in.salt_buf[6];
10159 salt->salt_buf[7] = in.salt_buf[7];
10160
10161 salt->salt_len = 32;
10162
10163 digest[0] = in.hash_buf[0];
10164 digest[1] = in.hash_buf[1];
10165 digest[2] = in.hash_buf[2];
10166 digest[3] = in.hash_buf[3];
10167 digest[4] = in.hash_buf[4];
10168 digest[5] = in.hash_buf[5];
10169 digest[6] = in.hash_buf[6];
10170 digest[7] = in.hash_buf[7];
10171
10172 digest[0] = byte_swap_32 (digest[0]);
10173 digest[1] = byte_swap_32 (digest[1]);
10174 digest[2] = byte_swap_32 (digest[2]);
10175 digest[3] = byte_swap_32 (digest[3]);
10176 digest[4] = byte_swap_32 (digest[4]);
10177 digest[5] = byte_swap_32 (digest[5]);
10178 digest[6] = byte_swap_32 (digest[6]);
10179 digest[7] = byte_swap_32 (digest[7]);
10180
10181 return (PARSER_OK);
10182 }
10183
10184 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10185 {
10186 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10187
10188 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10189
10190 u32 *digest = (u32 *) hash_buf->digest;
10191
10192 salt_t *salt = hash_buf->salt;
10193
10194 char *iter_pos = input_buf + 3;
10195
10196 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10197
10198 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10199
10200 memcpy ((char *) salt->salt_sign, input_buf, 4);
10201
10202 salt->salt_iter = salt_iter;
10203
10204 char *salt_pos = iter_pos + 1;
10205
10206 uint salt_len = 8;
10207
10208 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10209
10210 salt->salt_len = salt_len;
10211
10212 char *hash_pos = salt_pos + salt_len;
10213
10214 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10215
10216 return (PARSER_OK);
10217 }
10218
10219 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10220 {
10221 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10222
10223 u32 *digest = (u32 *) hash_buf->digest;
10224
10225 salt_t *salt = hash_buf->salt;
10226
10227 char *salt_pos = input_buf + 3;
10228
10229 uint iterations_len = 0;
10230
10231 if (memcmp (salt_pos, "rounds=", 7) == 0)
10232 {
10233 salt_pos += 7;
10234
10235 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10236
10237 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10238 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10239
10240 salt_pos[0] = 0x0;
10241
10242 salt->salt_iter = atoi (salt_pos - iterations_len);
10243
10244 salt_pos += 1;
10245
10246 iterations_len += 8;
10247 }
10248 else
10249 {
10250 salt->salt_iter = ROUNDS_MD5CRYPT;
10251 }
10252
10253 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10254
10255 char *hash_pos = strchr (salt_pos, '$');
10256
10257 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10258
10259 uint salt_len = hash_pos - salt_pos;
10260
10261 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10262
10263 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10264
10265 salt->salt_len = salt_len;
10266
10267 hash_pos++;
10268
10269 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10270
10271 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10272
10273 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10274
10275 return (PARSER_OK);
10276 }
10277
10278 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10279 {
10280 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10281
10282 u32 *digest = (u32 *) hash_buf->digest;
10283
10284 salt_t *salt = hash_buf->salt;
10285
10286 char *salt_pos = input_buf + 6;
10287
10288 uint iterations_len = 0;
10289
10290 if (memcmp (salt_pos, "rounds=", 7) == 0)
10291 {
10292 salt_pos += 7;
10293
10294 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10295
10296 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10297 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10298
10299 salt_pos[0] = 0x0;
10300
10301 salt->salt_iter = atoi (salt_pos - iterations_len);
10302
10303 salt_pos += 1;
10304
10305 iterations_len += 8;
10306 }
10307 else
10308 {
10309 salt->salt_iter = ROUNDS_MD5CRYPT;
10310 }
10311
10312 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10313
10314 char *hash_pos = strchr (salt_pos, '$');
10315
10316 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10317
10318 uint salt_len = hash_pos - salt_pos;
10319
10320 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10321
10322 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10323
10324 salt->salt_len = salt_len;
10325
10326 hash_pos++;
10327
10328 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10329
10330 return (PARSER_OK);
10331 }
10332
10333 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10334 {
10335 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10336
10337 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10338
10339 u32 *digest = (u32 *) hash_buf->digest;
10340
10341 salt_t *salt = hash_buf->salt;
10342
10343 char *salt_pos = input_buf + 14;
10344
10345 char *hash_pos = strchr (salt_pos, '*');
10346
10347 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10348
10349 hash_pos++;
10350
10351 uint salt_len = hash_pos - salt_pos - 1;
10352
10353 char *salt_buf_ptr = (char *) salt->salt_buf;
10354
10355 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10356
10357 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10358
10359 salt->salt_len = salt_len;
10360
10361 u8 tmp_buf[100] = { 0 };
10362
10363 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10364
10365 memcpy (digest, tmp_buf, 20);
10366
10367 digest[0] = byte_swap_32 (digest[0]);
10368 digest[1] = byte_swap_32 (digest[1]);
10369 digest[2] = byte_swap_32 (digest[2]);
10370 digest[3] = byte_swap_32 (digest[3]);
10371 digest[4] = byte_swap_32 (digest[4]);
10372
10373 digest[0] -= SHA1M_A;
10374 digest[1] -= SHA1M_B;
10375 digest[2] -= SHA1M_C;
10376 digest[3] -= SHA1M_D;
10377 digest[4] -= SHA1M_E;
10378
10379 return (PARSER_OK);
10380 }
10381
10382 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10383 {
10384 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10385
10386 unsigned char c12 = itoa64_to_int (input_buf[12]);
10387
10388 if (c12 & 3) return (PARSER_HASH_VALUE);
10389
10390 u32 *digest = (u32 *) hash_buf->digest;
10391
10392 salt_t *salt = hash_buf->salt;
10393
10394 // for ascii_digest
10395 salt->salt_sign[0] = input_buf[0];
10396 salt->salt_sign[1] = input_buf[1];
10397
10398 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10399 | itoa64_to_int (input_buf[1]) << 6;
10400
10401 salt->salt_len = 2;
10402
10403 u8 tmp_buf[100] = { 0 };
10404
10405 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10406
10407 memcpy (digest, tmp_buf, 8);
10408
10409 uint tt;
10410
10411 IP (digest[0], digest[1], tt);
10412
10413 digest[2] = 0;
10414 digest[3] = 0;
10415
10416 return (PARSER_OK);
10417 }
10418
10419 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10420 {
10421 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10422
10423 u32 *digest = (u32 *) hash_buf->digest;
10424
10425 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10426 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10427 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10428 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10429
10430 digest[0] = byte_swap_32 (digest[0]);
10431 digest[1] = byte_swap_32 (digest[1]);
10432 digest[2] = byte_swap_32 (digest[2]);
10433 digest[3] = byte_swap_32 (digest[3]);
10434
10435 digest[0] -= MD4M_A;
10436 digest[1] -= MD4M_B;
10437 digest[2] -= MD4M_C;
10438 digest[3] -= MD4M_D;
10439
10440 return (PARSER_OK);
10441 }
10442
10443 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10444 {
10445 if (data.opts_type & OPTS_TYPE_ST_HEX)
10446 {
10447 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10448 }
10449 else
10450 {
10451 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10452 }
10453
10454 u32 *digest = (u32 *) hash_buf->digest;
10455
10456 salt_t *salt = hash_buf->salt;
10457
10458 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10459 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10460 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10461 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10462
10463 digest[0] = byte_swap_32 (digest[0]);
10464 digest[1] = byte_swap_32 (digest[1]);
10465 digest[2] = byte_swap_32 (digest[2]);
10466 digest[3] = byte_swap_32 (digest[3]);
10467
10468 digest[0] -= MD4M_A;
10469 digest[1] -= MD4M_B;
10470 digest[2] -= MD4M_C;
10471 digest[3] -= MD4M_D;
10472
10473 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10474
10475 uint salt_len = input_len - 32 - 1;
10476
10477 char *salt_buf = input_buf + 32 + 1;
10478
10479 char *salt_buf_ptr = (char *) salt->salt_buf;
10480
10481 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10482
10483 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10484
10485 salt->salt_len = salt_len;
10486
10487 return (PARSER_OK);
10488 }
10489
10490 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10491 {
10492 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10493
10494 u32 *digest = (u32 *) hash_buf->digest;
10495
10496 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10497 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10498 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10499 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10500
10501 digest[0] = byte_swap_32 (digest[0]);
10502 digest[1] = byte_swap_32 (digest[1]);
10503 digest[2] = byte_swap_32 (digest[2]);
10504 digest[3] = byte_swap_32 (digest[3]);
10505
10506 digest[0] -= MD5M_A;
10507 digest[1] -= MD5M_B;
10508 digest[2] -= MD5M_C;
10509 digest[3] -= MD5M_D;
10510
10511 return (PARSER_OK);
10512 }
10513
10514 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10515 {
10516 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10517
10518 u32 *digest = (u32 *) hash_buf->digest;
10519
10520 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10521 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10522 digest[2] = 0;
10523 digest[3] = 0;
10524
10525 digest[0] = byte_swap_32 (digest[0]);
10526 digest[1] = byte_swap_32 (digest[1]);
10527
10528 return (PARSER_OK);
10529 }
10530
10531 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10532 {
10533 if (data.opts_type & OPTS_TYPE_ST_HEX)
10534 {
10535 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10536 }
10537 else
10538 {
10539 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10540 }
10541
10542 u32 *digest = (u32 *) hash_buf->digest;
10543
10544 salt_t *salt = hash_buf->salt;
10545
10546 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10547 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10548 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10549 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10550
10551 digest[0] = byte_swap_32 (digest[0]);
10552 digest[1] = byte_swap_32 (digest[1]);
10553 digest[2] = byte_swap_32 (digest[2]);
10554 digest[3] = byte_swap_32 (digest[3]);
10555
10556 digest[0] -= MD5M_A;
10557 digest[1] -= MD5M_B;
10558 digest[2] -= MD5M_C;
10559 digest[3] -= MD5M_D;
10560
10561 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10562
10563 uint salt_len = input_len - 32 - 1;
10564
10565 char *salt_buf = input_buf + 32 + 1;
10566
10567 char *salt_buf_ptr = (char *) salt->salt_buf;
10568
10569 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10570
10571 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10572
10573 salt->salt_len = salt_len;
10574
10575 return (PARSER_OK);
10576 }
10577
10578 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10579 {
10580 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10581
10582 u32 *digest = (u32 *) hash_buf->digest;
10583
10584 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10585 | itoa64_to_int (input_buf[ 1]) << 6
10586 | itoa64_to_int (input_buf[ 2]) << 12
10587 | itoa64_to_int (input_buf[ 3]) << 18;
10588 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10589 | itoa64_to_int (input_buf[ 5]) << 6
10590 | itoa64_to_int (input_buf[ 6]) << 12
10591 | itoa64_to_int (input_buf[ 7]) << 18;
10592 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10593 | itoa64_to_int (input_buf[ 9]) << 6
10594 | itoa64_to_int (input_buf[10]) << 12
10595 | itoa64_to_int (input_buf[11]) << 18;
10596 digest[3] = itoa64_to_int (input_buf[12]) << 0
10597 | itoa64_to_int (input_buf[13]) << 6
10598 | itoa64_to_int (input_buf[14]) << 12
10599 | itoa64_to_int (input_buf[15]) << 18;
10600
10601 digest[0] -= MD5M_A;
10602 digest[1] -= MD5M_B;
10603 digest[2] -= MD5M_C;
10604 digest[3] -= MD5M_D;
10605
10606 digest[0] &= 0x00ffffff;
10607 digest[1] &= 0x00ffffff;
10608 digest[2] &= 0x00ffffff;
10609 digest[3] &= 0x00ffffff;
10610
10611 return (PARSER_OK);
10612 }
10613
10614 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10615 {
10616 if (data.opts_type & OPTS_TYPE_ST_HEX)
10617 {
10618 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10619 }
10620 else
10621 {
10622 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10623 }
10624
10625 u32 *digest = (u32 *) hash_buf->digest;
10626
10627 salt_t *salt = hash_buf->salt;
10628
10629 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10630 | itoa64_to_int (input_buf[ 1]) << 6
10631 | itoa64_to_int (input_buf[ 2]) << 12
10632 | itoa64_to_int (input_buf[ 3]) << 18;
10633 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10634 | itoa64_to_int (input_buf[ 5]) << 6
10635 | itoa64_to_int (input_buf[ 6]) << 12
10636 | itoa64_to_int (input_buf[ 7]) << 18;
10637 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10638 | itoa64_to_int (input_buf[ 9]) << 6
10639 | itoa64_to_int (input_buf[10]) << 12
10640 | itoa64_to_int (input_buf[11]) << 18;
10641 digest[3] = itoa64_to_int (input_buf[12]) << 0
10642 | itoa64_to_int (input_buf[13]) << 6
10643 | itoa64_to_int (input_buf[14]) << 12
10644 | itoa64_to_int (input_buf[15]) << 18;
10645
10646 digest[0] -= MD5M_A;
10647 digest[1] -= MD5M_B;
10648 digest[2] -= MD5M_C;
10649 digest[3] -= MD5M_D;
10650
10651 digest[0] &= 0x00ffffff;
10652 digest[1] &= 0x00ffffff;
10653 digest[2] &= 0x00ffffff;
10654 digest[3] &= 0x00ffffff;
10655
10656 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10657
10658 uint salt_len = input_len - 16 - 1;
10659
10660 char *salt_buf = input_buf + 16 + 1;
10661
10662 char *salt_buf_ptr = (char *) salt->salt_buf;
10663
10664 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10665
10666 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10667
10668 salt->salt_len = salt_len;
10669
10670 return (PARSER_OK);
10671 }
10672
10673 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10674 {
10675 key[0] = (nthash[0] >> 0);
10676 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10677 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10678 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10679 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10680 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10681 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10682 key[7] = (nthash[6] << 1);
10683
10684 key[0] |= 0x01;
10685 key[1] |= 0x01;
10686 key[2] |= 0x01;
10687 key[3] |= 0x01;
10688 key[4] |= 0x01;
10689 key[5] |= 0x01;
10690 key[6] |= 0x01;
10691 key[7] |= 0x01;
10692 }
10693
10694 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10695 {
10696 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10697
10698 u32 *digest = (u32 *) hash_buf->digest;
10699
10700 salt_t *salt = hash_buf->salt;
10701
10702 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10703
10704 /**
10705 * parse line
10706 */
10707
10708 char *user_pos = input_buf;
10709
10710 char *unused_pos = strchr (user_pos, ':');
10711
10712 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10713
10714 uint user_len = unused_pos - user_pos;
10715
10716 if (user_len > 60) return (PARSER_SALT_LENGTH);
10717
10718 unused_pos++;
10719
10720 char *domain_pos = strchr (unused_pos, ':');
10721
10722 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10723
10724 uint unused_len = domain_pos - unused_pos;
10725
10726 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10727
10728 domain_pos++;
10729
10730 char *srvchall_pos = strchr (domain_pos, ':');
10731
10732 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10733
10734 uint domain_len = srvchall_pos - domain_pos;
10735
10736 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10737
10738 srvchall_pos++;
10739
10740 char *hash_pos = strchr (srvchall_pos, ':');
10741
10742 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10743
10744 uint srvchall_len = hash_pos - srvchall_pos;
10745
10746 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10747
10748 hash_pos++;
10749
10750 char *clichall_pos = strchr (hash_pos, ':');
10751
10752 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10753
10754 uint hash_len = clichall_pos - hash_pos;
10755
10756 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10757
10758 clichall_pos++;
10759
10760 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10761
10762 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10763
10764 /**
10765 * store some data for later use
10766 */
10767
10768 netntlm->user_len = user_len * 2;
10769 netntlm->domain_len = domain_len * 2;
10770 netntlm->srvchall_len = srvchall_len / 2;
10771 netntlm->clichall_len = clichall_len / 2;
10772
10773 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10774 char *chall_ptr = (char *) netntlm->chall_buf;
10775
10776 /**
10777 * handle username and domainname
10778 */
10779
10780 for (uint i = 0; i < user_len; i++)
10781 {
10782 *userdomain_ptr++ = user_pos[i];
10783 *userdomain_ptr++ = 0;
10784 }
10785
10786 for (uint i = 0; i < domain_len; i++)
10787 {
10788 *userdomain_ptr++ = domain_pos[i];
10789 *userdomain_ptr++ = 0;
10790 }
10791
10792 /**
10793 * handle server challenge encoding
10794 */
10795
10796 for (uint i = 0; i < srvchall_len; i += 2)
10797 {
10798 const char p0 = srvchall_pos[i + 0];
10799 const char p1 = srvchall_pos[i + 1];
10800
10801 *chall_ptr++ = hex_convert (p1) << 0
10802 | hex_convert (p0) << 4;
10803 }
10804
10805 /**
10806 * handle client challenge encoding
10807 */
10808
10809 for (uint i = 0; i < clichall_len; i += 2)
10810 {
10811 const char p0 = clichall_pos[i + 0];
10812 const char p1 = clichall_pos[i + 1];
10813
10814 *chall_ptr++ = hex_convert (p1) << 0
10815 | hex_convert (p0) << 4;
10816 }
10817
10818 /**
10819 * store data
10820 */
10821
10822 char *salt_buf_ptr = (char *) salt->salt_buf;
10823
10824 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10825
10826 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10827
10828 salt->salt_len = salt_len;
10829
10830 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10831 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10832 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10833 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10834
10835 digest[0] = byte_swap_32 (digest[0]);
10836 digest[1] = byte_swap_32 (digest[1]);
10837 digest[2] = byte_swap_32 (digest[2]);
10838 digest[3] = byte_swap_32 (digest[3]);
10839
10840 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10841
10842 uint digest_tmp[2] = { 0 };
10843
10844 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10845 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
10846
10847 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10848 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10849
10850 /* special case 2: ESS */
10851
10852 if (srvchall_len == 48)
10853 {
10854 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10855 {
10856 uint w[16] = { 0 };
10857
10858 w[ 0] = netntlm->chall_buf[6];
10859 w[ 1] = netntlm->chall_buf[7];
10860 w[ 2] = netntlm->chall_buf[0];
10861 w[ 3] = netntlm->chall_buf[1];
10862 w[ 4] = 0x80;
10863 w[14] = 16 * 8;
10864
10865 uint dgst[4] = { 0 };
10866
10867 dgst[0] = MAGIC_A;
10868 dgst[1] = MAGIC_B;
10869 dgst[2] = MAGIC_C;
10870 dgst[3] = MAGIC_D;
10871
10872 md5_64 (w, dgst);
10873
10874 salt->salt_buf[0] = dgst[0];
10875 salt->salt_buf[1] = dgst[1];
10876 }
10877 }
10878
10879 /* precompute netntlmv1 exploit start */
10880
10881 for (uint i = 0; i < 0x10000; i++)
10882 {
10883 uint key_md4[2] = { i, 0 };
10884 uint key_des[2] = { 0, 0 };
10885
10886 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
10887
10888 uint Kc[16] = { 0 };
10889 uint Kd[16] = { 0 };
10890
10891 _des_keysetup (key_des, Kc, Kd, c_skb);
10892
10893 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10894
10895 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10896
10897 if (data3[0] != digest_tmp[0]) continue;
10898 if (data3[1] != digest_tmp[1]) continue;
10899
10900 salt->salt_buf[2] = i;
10901
10902 salt->salt_len = 24;
10903
10904 break;
10905 }
10906
10907 salt->salt_buf_pc[0] = digest_tmp[0];
10908 salt->salt_buf_pc[1] = digest_tmp[1];
10909
10910 /* precompute netntlmv1 exploit stop */
10911
10912 u32 tt;
10913
10914 IP (digest[0], digest[1], tt);
10915 IP (digest[2], digest[3], tt);
10916
10917 digest[0] = rotr32 (digest[0], 29);
10918 digest[1] = rotr32 (digest[1], 29);
10919 digest[2] = rotr32 (digest[2], 29);
10920 digest[3] = rotr32 (digest[3], 29);
10921
10922 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10923
10924 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
10925 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
10926
10927 return (PARSER_OK);
10928 }
10929
10930 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10931 {
10932 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10933
10934 u32 *digest = (u32 *) hash_buf->digest;
10935
10936 salt_t *salt = hash_buf->salt;
10937
10938 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10939
10940 /**
10941 * parse line
10942 */
10943
10944 char *user_pos = input_buf;
10945
10946 char *unused_pos = strchr (user_pos, ':');
10947
10948 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10949
10950 uint user_len = unused_pos - user_pos;
10951
10952 if (user_len > 60) return (PARSER_SALT_LENGTH);
10953
10954 unused_pos++;
10955
10956 char *domain_pos = strchr (unused_pos, ':');
10957
10958 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10959
10960 uint unused_len = domain_pos - unused_pos;
10961
10962 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10963
10964 domain_pos++;
10965
10966 char *srvchall_pos = strchr (domain_pos, ':');
10967
10968 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10969
10970 uint domain_len = srvchall_pos - domain_pos;
10971
10972 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10973
10974 srvchall_pos++;
10975
10976 char *hash_pos = strchr (srvchall_pos, ':');
10977
10978 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10979
10980 uint srvchall_len = hash_pos - srvchall_pos;
10981
10982 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10983
10984 hash_pos++;
10985
10986 char *clichall_pos = strchr (hash_pos, ':');
10987
10988 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10989
10990 uint hash_len = clichall_pos - hash_pos;
10991
10992 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10993
10994 clichall_pos++;
10995
10996 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10997
10998 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10999
11000 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11001
11002 /**
11003 * store some data for later use
11004 */
11005
11006 netntlm->user_len = user_len * 2;
11007 netntlm->domain_len = domain_len * 2;
11008 netntlm->srvchall_len = srvchall_len / 2;
11009 netntlm->clichall_len = clichall_len / 2;
11010
11011 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11012 char *chall_ptr = (char *) netntlm->chall_buf;
11013
11014 /**
11015 * handle username and domainname
11016 */
11017
11018 for (uint i = 0; i < user_len; i++)
11019 {
11020 *userdomain_ptr++ = toupper (user_pos[i]);
11021 *userdomain_ptr++ = 0;
11022 }
11023
11024 for (uint i = 0; i < domain_len; i++)
11025 {
11026 *userdomain_ptr++ = domain_pos[i];
11027 *userdomain_ptr++ = 0;
11028 }
11029
11030 *userdomain_ptr++ = 0x80;
11031
11032 /**
11033 * handle server challenge encoding
11034 */
11035
11036 for (uint i = 0; i < srvchall_len; i += 2)
11037 {
11038 const char p0 = srvchall_pos[i + 0];
11039 const char p1 = srvchall_pos[i + 1];
11040
11041 *chall_ptr++ = hex_convert (p1) << 0
11042 | hex_convert (p0) << 4;
11043 }
11044
11045 /**
11046 * handle client challenge encoding
11047 */
11048
11049 for (uint i = 0; i < clichall_len; i += 2)
11050 {
11051 const char p0 = clichall_pos[i + 0];
11052 const char p1 = clichall_pos[i + 1];
11053
11054 *chall_ptr++ = hex_convert (p1) << 0
11055 | hex_convert (p0) << 4;
11056 }
11057
11058 *chall_ptr++ = 0x80;
11059
11060 /**
11061 * handle hash itself
11062 */
11063
11064 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11065 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11066 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11067 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11068
11069 digest[0] = byte_swap_32 (digest[0]);
11070 digest[1] = byte_swap_32 (digest[1]);
11071 digest[2] = byte_swap_32 (digest[2]);
11072 digest[3] = byte_swap_32 (digest[3]);
11073
11074 /**
11075 * reuse challange data as salt_buf, its the buffer that is most likely unique
11076 */
11077
11078 salt->salt_buf[0] = 0;
11079 salt->salt_buf[1] = 0;
11080 salt->salt_buf[2] = 0;
11081 salt->salt_buf[3] = 0;
11082 salt->salt_buf[4] = 0;
11083 salt->salt_buf[5] = 0;
11084 salt->salt_buf[6] = 0;
11085 salt->salt_buf[7] = 0;
11086
11087 uint *uptr;
11088
11089 uptr = (uint *) netntlm->userdomain_buf;
11090
11091 for (uint i = 0; i < 16; i += 16)
11092 {
11093 md5_64 (uptr, salt->salt_buf);
11094 }
11095
11096 uptr = (uint *) netntlm->chall_buf;
11097
11098 for (uint i = 0; i < 256; i += 16)
11099 {
11100 md5_64 (uptr, salt->salt_buf);
11101 }
11102
11103 salt->salt_len = 16;
11104
11105 return (PARSER_OK);
11106 }
11107
11108 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11109 {
11110 if (data.opts_type & OPTS_TYPE_ST_HEX)
11111 {
11112 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11113 }
11114 else
11115 {
11116 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11117 }
11118
11119 u32 *digest = (u32 *) hash_buf->digest;
11120
11121 salt_t *salt = hash_buf->salt;
11122
11123 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11124 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11125 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11126 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11127
11128 digest[0] = byte_swap_32 (digest[0]);
11129 digest[1] = byte_swap_32 (digest[1]);
11130 digest[2] = byte_swap_32 (digest[2]);
11131 digest[3] = byte_swap_32 (digest[3]);
11132
11133 digest[0] -= MD5M_A;
11134 digest[1] -= MD5M_B;
11135 digest[2] -= MD5M_C;
11136 digest[3] -= MD5M_D;
11137
11138 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11139
11140 uint salt_len = input_len - 32 - 1;
11141
11142 char *salt_buf = input_buf + 32 + 1;
11143
11144 char *salt_buf_ptr = (char *) salt->salt_buf;
11145
11146 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11147
11148 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11149
11150 salt->salt_len = salt_len;
11151
11152 return (PARSER_OK);
11153 }
11154
11155 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11156 {
11157 if (data.opts_type & OPTS_TYPE_ST_HEX)
11158 {
11159 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11160 }
11161 else
11162 {
11163 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11164 }
11165
11166 u32 *digest = (u32 *) hash_buf->digest;
11167
11168 salt_t *salt = hash_buf->salt;
11169
11170 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11171 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11172 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11173 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11174
11175 digest[0] = byte_swap_32 (digest[0]);
11176 digest[1] = byte_swap_32 (digest[1]);
11177 digest[2] = byte_swap_32 (digest[2]);
11178 digest[3] = byte_swap_32 (digest[3]);
11179
11180 digest[0] -= MD5M_A;
11181 digest[1] -= MD5M_B;
11182 digest[2] -= MD5M_C;
11183 digest[3] -= MD5M_D;
11184
11185 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11186
11187 uint salt_len = input_len - 32 - 1;
11188
11189 char *salt_buf = input_buf + 32 + 1;
11190
11191 char *salt_buf_ptr = (char *) salt->salt_buf;
11192
11193 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11194
11195 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11196
11197 salt->salt_len = salt_len;
11198
11199 return (PARSER_OK);
11200 }
11201
11202 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11203 {
11204 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11205
11206 u32 *digest = (u32 *) hash_buf->digest;
11207
11208 salt_t *salt = hash_buf->salt;
11209
11210 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11211 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11212 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11213 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11214
11215 digest[0] = byte_swap_32 (digest[0]);
11216 digest[1] = byte_swap_32 (digest[1]);
11217 digest[2] = byte_swap_32 (digest[2]);
11218 digest[3] = byte_swap_32 (digest[3]);
11219
11220 digest[0] -= MD5M_A;
11221 digest[1] -= MD5M_B;
11222 digest[2] -= MD5M_C;
11223 digest[3] -= MD5M_D;
11224
11225 /**
11226 * This is a virtual salt. While the algorithm is basically not salted
11227 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11228 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11229 */
11230
11231 char *salt_buf_ptr = (char *) salt->salt_buf;
11232
11233 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11234
11235 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11236
11237 salt->salt_len = salt_len;
11238
11239 return (PARSER_OK);
11240 }
11241
11242 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11243 {
11244 if (data.opts_type & OPTS_TYPE_ST_HEX)
11245 {
11246 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11247 }
11248 else
11249 {
11250 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11251 }
11252
11253 u32 *digest = (u32 *) hash_buf->digest;
11254
11255 salt_t *salt = hash_buf->salt;
11256
11257 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11258 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11259 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11260 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11261
11262 digest[0] = byte_swap_32 (digest[0]);
11263 digest[1] = byte_swap_32 (digest[1]);
11264 digest[2] = byte_swap_32 (digest[2]);
11265 digest[3] = byte_swap_32 (digest[3]);
11266
11267 digest[0] -= MD5M_A;
11268 digest[1] -= MD5M_B;
11269 digest[2] -= MD5M_C;
11270 digest[3] -= MD5M_D;
11271
11272 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11273
11274 uint salt_len = input_len - 32 - 1;
11275
11276 char *salt_buf = input_buf + 32 + 1;
11277
11278 char *salt_buf_ptr = (char *) salt->salt_buf;
11279
11280 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11281
11282 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11283
11284 salt->salt_len = salt_len;
11285
11286 return (PARSER_OK);
11287 }
11288
11289 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11290 {
11291 if (data.opts_type & OPTS_TYPE_ST_HEX)
11292 {
11293 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11294 }
11295 else
11296 {
11297 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11298 }
11299
11300 u32 *digest = (u32 *) hash_buf->digest;
11301
11302 salt_t *salt = hash_buf->salt;
11303
11304 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11305 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11306 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11307 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11308
11309 digest[0] = byte_swap_32 (digest[0]);
11310 digest[1] = byte_swap_32 (digest[1]);
11311 digest[2] = byte_swap_32 (digest[2]);
11312 digest[3] = byte_swap_32 (digest[3]);
11313
11314 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11315
11316 uint salt_len = input_len - 32 - 1;
11317
11318 char *salt_buf = input_buf + 32 + 1;
11319
11320 char *salt_buf_ptr = (char *) salt->salt_buf;
11321
11322 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11323
11324 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11325
11326 salt->salt_len = salt_len;
11327
11328 return (PARSER_OK);
11329 }
11330
11331 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11332 {
11333 if (data.opts_type & OPTS_TYPE_ST_HEX)
11334 {
11335 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11336 }
11337 else
11338 {
11339 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11340 }
11341
11342 u32 *digest = (u32 *) hash_buf->digest;
11343
11344 salt_t *salt = hash_buf->salt;
11345
11346 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11347 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11348 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11349 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11350
11351 digest[0] = byte_swap_32 (digest[0]);
11352 digest[1] = byte_swap_32 (digest[1]);
11353 digest[2] = byte_swap_32 (digest[2]);
11354 digest[3] = byte_swap_32 (digest[3]);
11355
11356 digest[0] -= MD4M_A;
11357 digest[1] -= MD4M_B;
11358 digest[2] -= MD4M_C;
11359 digest[3] -= MD4M_D;
11360
11361 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11362
11363 uint salt_len = input_len - 32 - 1;
11364
11365 char *salt_buf = input_buf + 32 + 1;
11366
11367 char *salt_buf_ptr = (char *) salt->salt_buf;
11368
11369 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11370
11371 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11372
11373 salt->salt_len = salt_len;
11374
11375 return (PARSER_OK);
11376 }
11377
11378 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11379 {
11380 if (data.opts_type & OPTS_TYPE_ST_HEX)
11381 {
11382 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11383 }
11384 else
11385 {
11386 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11387 }
11388
11389 u32 *digest = (u32 *) hash_buf->digest;
11390
11391 salt_t *salt = hash_buf->salt;
11392
11393 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11394 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11395 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11396 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11397
11398 digest[0] = byte_swap_32 (digest[0]);
11399 digest[1] = byte_swap_32 (digest[1]);
11400 digest[2] = byte_swap_32 (digest[2]);
11401 digest[3] = byte_swap_32 (digest[3]);
11402
11403 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11404
11405 uint salt_len = input_len - 32 - 1;
11406
11407 char *salt_buf = input_buf + 32 + 1;
11408
11409 uint salt_pc_block[16] = { 0 };
11410
11411 char *salt_pc_block_ptr = (char *) salt_pc_block;
11412
11413 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11414
11415 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11416
11417 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11418
11419 salt_pc_block[14] = salt_len * 8;
11420
11421 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11422
11423 md5_64 (salt_pc_block, salt_pc_digest);
11424
11425 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11426 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11427 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11428 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11429
11430 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11431
11432 memcpy (salt_buf_ptr, salt_buf, salt_len);
11433
11434 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11435
11436 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11437 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11438 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11439 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11440
11441 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11442
11443 return (PARSER_OK);
11444 }
11445
11446 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11447 {
11448 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11449
11450 u32 *digest = (u32 *) hash_buf->digest;
11451
11452 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11453 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11454 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11455 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11456 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11457
11458 digest[0] -= SHA1M_A;
11459 digest[1] -= SHA1M_B;
11460 digest[2] -= SHA1M_C;
11461 digest[3] -= SHA1M_D;
11462 digest[4] -= SHA1M_E;
11463
11464 return (PARSER_OK);
11465 }
11466
11467 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11468 {
11469 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11470
11471 u32 *digest = (u32 *) hash_buf->digest;
11472
11473 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11474 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11475 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11476 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11477 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11478
11479 return (PARSER_OK);
11480 }
11481
11482 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11483 {
11484 if (data.opts_type & OPTS_TYPE_ST_HEX)
11485 {
11486 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11487 }
11488 else
11489 {
11490 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11491 }
11492
11493 u32 *digest = (u32 *) hash_buf->digest;
11494
11495 salt_t *salt = hash_buf->salt;
11496
11497 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11498 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11499 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11500 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11501 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11502
11503 digest[0] -= SHA1M_A;
11504 digest[1] -= SHA1M_B;
11505 digest[2] -= SHA1M_C;
11506 digest[3] -= SHA1M_D;
11507 digest[4] -= SHA1M_E;
11508
11509 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11510
11511 uint salt_len = input_len - 40 - 1;
11512
11513 char *salt_buf = input_buf + 40 + 1;
11514
11515 char *salt_buf_ptr = (char *) salt->salt_buf;
11516
11517 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11518
11519 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11520
11521 salt->salt_len = salt_len;
11522
11523 return (PARSER_OK);
11524 }
11525
11526 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11527 {
11528 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11529
11530 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11531
11532 u32 *digest = (u32 *) hash_buf->digest;
11533
11534 u8 tmp_buf[100] = { 0 };
11535
11536 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11537
11538 memcpy (digest, tmp_buf, 20);
11539
11540 digest[0] = byte_swap_32 (digest[0]);
11541 digest[1] = byte_swap_32 (digest[1]);
11542 digest[2] = byte_swap_32 (digest[2]);
11543 digest[3] = byte_swap_32 (digest[3]);
11544 digest[4] = byte_swap_32 (digest[4]);
11545
11546 digest[0] -= SHA1M_A;
11547 digest[1] -= SHA1M_B;
11548 digest[2] -= SHA1M_C;
11549 digest[3] -= SHA1M_D;
11550 digest[4] -= SHA1M_E;
11551
11552 return (PARSER_OK);
11553 }
11554
11555 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11556 {
11557 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11558
11559 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11560
11561 u32 *digest = (u32 *) hash_buf->digest;
11562
11563 salt_t *salt = hash_buf->salt;
11564
11565 u8 tmp_buf[100] = { 0 };
11566
11567 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11568
11569 memcpy (digest, tmp_buf, 20);
11570
11571 salt->salt_len = tmp_len - 20;
11572
11573 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11574
11575 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11576 {
11577 char *ptr = (char *) salt->salt_buf;
11578
11579 ptr[salt->salt_len] = 0x80;
11580 }
11581
11582 digest[0] = byte_swap_32 (digest[0]);
11583 digest[1] = byte_swap_32 (digest[1]);
11584 digest[2] = byte_swap_32 (digest[2]);
11585 digest[3] = byte_swap_32 (digest[3]);
11586 digest[4] = byte_swap_32 (digest[4]);
11587
11588 digest[0] -= SHA1M_A;
11589 digest[1] -= SHA1M_B;
11590 digest[2] -= SHA1M_C;
11591 digest[3] -= SHA1M_D;
11592 digest[4] -= SHA1M_E;
11593
11594 return (PARSER_OK);
11595 }
11596
11597 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11598 {
11599 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11600
11601 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11602
11603 u32 *digest = (u32 *) hash_buf->digest;
11604
11605 salt_t *salt = hash_buf->salt;
11606
11607 char *salt_buf = input_buf + 6;
11608
11609 uint salt_len = 8;
11610
11611 char *salt_buf_ptr = (char *) salt->salt_buf;
11612
11613 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11614
11615 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11616
11617 salt->salt_len = salt_len;
11618
11619 char *hash_pos = input_buf + 6 + 8 + 40;
11620
11621 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11622 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11623 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11624 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11625 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11626
11627 digest[0] -= SHA1M_A;
11628 digest[1] -= SHA1M_B;
11629 digest[2] -= SHA1M_C;
11630 digest[3] -= SHA1M_D;
11631 digest[4] -= SHA1M_E;
11632
11633 return (PARSER_OK);
11634 }
11635
11636 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11637 {
11638 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11639
11640 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11641
11642 u32 *digest = (u32 *) hash_buf->digest;
11643
11644 salt_t *salt = hash_buf->salt;
11645
11646 char *salt_buf = input_buf + 6;
11647
11648 uint salt_len = 8;
11649
11650 char *salt_buf_ptr = (char *) salt->salt_buf;
11651
11652 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11653
11654 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11655
11656 salt->salt_len = salt_len;
11657
11658 char *hash_pos = input_buf + 6 + 8;
11659
11660 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11661 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11662 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11663 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11664 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11665
11666 digest[0] -= SHA1M_A;
11667 digest[1] -= SHA1M_B;
11668 digest[2] -= SHA1M_C;
11669 digest[3] -= SHA1M_D;
11670 digest[4] -= SHA1M_E;
11671
11672 return (PARSER_OK);
11673 }
11674
11675 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11676 {
11677 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11678
11679 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11680
11681 u64 *digest = (u64 *) hash_buf->digest;
11682
11683 salt_t *salt = hash_buf->salt;
11684
11685 char *salt_buf = input_buf + 6;
11686
11687 uint salt_len = 8;
11688
11689 char *salt_buf_ptr = (char *) salt->salt_buf;
11690
11691 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11692
11693 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11694
11695 salt->salt_len = salt_len;
11696
11697 char *hash_pos = input_buf + 6 + 8;
11698
11699 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11700 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11701 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11702 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11703 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11704 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11705 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11706 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11707
11708 digest[0] -= SHA512M_A;
11709 digest[1] -= SHA512M_B;
11710 digest[2] -= SHA512M_C;
11711 digest[3] -= SHA512M_D;
11712 digest[4] -= SHA512M_E;
11713 digest[5] -= SHA512M_F;
11714 digest[6] -= SHA512M_G;
11715 digest[7] -= SHA512M_H;
11716
11717 return (PARSER_OK);
11718 }
11719
11720 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11721 {
11722 if (data.opts_type & OPTS_TYPE_ST_HEX)
11723 {
11724 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11725 }
11726 else
11727 {
11728 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11729 }
11730
11731 u32 *digest = (u32 *) hash_buf->digest;
11732
11733 salt_t *salt = hash_buf->salt;
11734
11735 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11736 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11737 digest[2] = 0;
11738 digest[3] = 0;
11739
11740 digest[0] = byte_swap_32 (digest[0]);
11741 digest[1] = byte_swap_32 (digest[1]);
11742
11743 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11744
11745 uint salt_len = input_len - 16 - 1;
11746
11747 char *salt_buf = input_buf + 16 + 1;
11748
11749 char *salt_buf_ptr = (char *) salt->salt_buf;
11750
11751 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11752
11753 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11754
11755 salt->salt_len = salt_len;
11756
11757 return (PARSER_OK);
11758 }
11759
11760 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11761 {
11762 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
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] = hex_to_u32 ((const u8 *) &input_buf[16]);
11771 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11772 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11773
11774 digest[0] -= SHA1M_A;
11775 digest[1] -= SHA1M_B;
11776 digest[2] -= SHA1M_C;
11777 digest[3] -= SHA1M_D;
11778 digest[4] -= SHA1M_E;
11779
11780 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11781
11782 uint salt_len = input_len - 40 - 1;
11783
11784 char *salt_buf = input_buf + 40 + 1;
11785
11786 char *salt_buf_ptr = (char *) salt->salt_buf;
11787
11788 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11789
11790 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11791
11792 salt->salt_len = salt_len;
11793
11794 return (PARSER_OK);
11795 }
11796
11797 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11798 {
11799 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11800
11801 u32 *digest = (u32 *) hash_buf->digest;
11802
11803 salt_t *salt = hash_buf->salt;
11804
11805 char *hash_pos = input_buf;
11806
11807 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11808 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11809 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11810 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11811 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
11812 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
11813 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
11814 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
11815 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
11816 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
11817 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
11818 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
11819 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
11820 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
11821 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
11822 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
11823
11824 char *salt_pos = input_buf + 128;
11825
11826 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
11827 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
11828 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
11829 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
11830
11831 salt->salt_iter = ROUNDS_ORACLET - 1;
11832 salt->salt_len = 16;
11833
11834 return (PARSER_OK);
11835 }
11836
11837 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11838 {
11839 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11840
11841 u32 *digest = (u32 *) hash_buf->digest;
11842
11843 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11844 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11845 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11846 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11847 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11848 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11849 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11850 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11851
11852 digest[0] -= SHA256M_A;
11853 digest[1] -= SHA256M_B;
11854 digest[2] -= SHA256M_C;
11855 digest[3] -= SHA256M_D;
11856 digest[4] -= SHA256M_E;
11857 digest[5] -= SHA256M_F;
11858 digest[6] -= SHA256M_G;
11859 digest[7] -= SHA256M_H;
11860
11861 return (PARSER_OK);
11862 }
11863
11864 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11865 {
11866 if (data.opts_type & OPTS_TYPE_ST_HEX)
11867 {
11868 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11869 }
11870 else
11871 {
11872 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11873 }
11874
11875 u32 *digest = (u32 *) hash_buf->digest;
11876
11877 salt_t *salt = hash_buf->salt;
11878
11879 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11880 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11881 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11882 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11883 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11884 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11885 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11886 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11887
11888 digest[0] -= SHA256M_A;
11889 digest[1] -= SHA256M_B;
11890 digest[2] -= SHA256M_C;
11891 digest[3] -= SHA256M_D;
11892 digest[4] -= SHA256M_E;
11893 digest[5] -= SHA256M_F;
11894 digest[6] -= SHA256M_G;
11895 digest[7] -= SHA256M_H;
11896
11897 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11898
11899 uint salt_len = input_len - 64 - 1;
11900
11901 char *salt_buf = input_buf + 64 + 1;
11902
11903 char *salt_buf_ptr = (char *) salt->salt_buf;
11904
11905 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11906
11907 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11908
11909 salt->salt_len = salt_len;
11910
11911 return (PARSER_OK);
11912 }
11913
11914 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11915 {
11916 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11917
11918 u64 *digest = (u64 *) hash_buf->digest;
11919
11920 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11921 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11922 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11923 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11924 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11925 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11926 digest[6] = 0;
11927 digest[7] = 0;
11928
11929 digest[0] -= SHA384M_A;
11930 digest[1] -= SHA384M_B;
11931 digest[2] -= SHA384M_C;
11932 digest[3] -= SHA384M_D;
11933 digest[4] -= SHA384M_E;
11934 digest[5] -= SHA384M_F;
11935 digest[6] -= 0;
11936 digest[7] -= 0;
11937
11938 return (PARSER_OK);
11939 }
11940
11941 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11942 {
11943 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11944
11945 u64 *digest = (u64 *) hash_buf->digest;
11946
11947 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11948 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11949 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11950 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11951 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11952 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11953 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11954 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11955
11956 digest[0] -= SHA512M_A;
11957 digest[1] -= SHA512M_B;
11958 digest[2] -= SHA512M_C;
11959 digest[3] -= SHA512M_D;
11960 digest[4] -= SHA512M_E;
11961 digest[5] -= SHA512M_F;
11962 digest[6] -= SHA512M_G;
11963 digest[7] -= SHA512M_H;
11964
11965 return (PARSER_OK);
11966 }
11967
11968 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11969 {
11970 if (data.opts_type & OPTS_TYPE_ST_HEX)
11971 {
11972 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11973 }
11974 else
11975 {
11976 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11977 }
11978
11979 u64 *digest = (u64 *) hash_buf->digest;
11980
11981 salt_t *salt = hash_buf->salt;
11982
11983 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11984 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11985 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11986 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11987 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11988 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11989 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11990 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11991
11992 digest[0] -= SHA512M_A;
11993 digest[1] -= SHA512M_B;
11994 digest[2] -= SHA512M_C;
11995 digest[3] -= SHA512M_D;
11996 digest[4] -= SHA512M_E;
11997 digest[5] -= SHA512M_F;
11998 digest[6] -= SHA512M_G;
11999 digest[7] -= SHA512M_H;
12000
12001 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12002
12003 uint salt_len = input_len - 128 - 1;
12004
12005 char *salt_buf = input_buf + 128 + 1;
12006
12007 char *salt_buf_ptr = (char *) salt->salt_buf;
12008
12009 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12010
12011 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12012
12013 salt->salt_len = salt_len;
12014
12015 return (PARSER_OK);
12016 }
12017
12018 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12019 {
12020 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12021
12022 u64 *digest = (u64 *) hash_buf->digest;
12023
12024 salt_t *salt = hash_buf->salt;
12025
12026 char *salt_pos = input_buf + 3;
12027
12028 uint iterations_len = 0;
12029
12030 if (memcmp (salt_pos, "rounds=", 7) == 0)
12031 {
12032 salt_pos += 7;
12033
12034 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12035
12036 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12037 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12038
12039 salt_pos[0] = 0x0;
12040
12041 salt->salt_iter = atoi (salt_pos - iterations_len);
12042
12043 salt_pos += 1;
12044
12045 iterations_len += 8;
12046 }
12047 else
12048 {
12049 salt->salt_iter = ROUNDS_SHA512CRYPT;
12050 }
12051
12052 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12053
12054 char *hash_pos = strchr (salt_pos, '$');
12055
12056 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12057
12058 uint salt_len = hash_pos - salt_pos;
12059
12060 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12061
12062 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12063
12064 salt->salt_len = salt_len;
12065
12066 hash_pos++;
12067
12068 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12069
12070 return (PARSER_OK);
12071 }
12072
12073 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12074 {
12075 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12076
12077 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12078
12079 u64 *digest = (u64 *) hash_buf->digest;
12080
12081 salt_t *salt = hash_buf->salt;
12082
12083 uint keccak_mdlen = input_len / 2;
12084
12085 for (uint i = 0; i < keccak_mdlen / 8; i++)
12086 {
12087 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12088
12089 digest[i] = byte_swap_64 (digest[i]);
12090 }
12091
12092 salt->keccak_mdlen = keccak_mdlen;
12093
12094 return (PARSER_OK);
12095 }
12096
12097 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12098 {
12099 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12100
12101 u32 *digest = (u32 *) hash_buf->digest;
12102
12103 salt_t *salt = hash_buf->salt;
12104
12105 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12106
12107 /**
12108 * Parse that strange long line
12109 */
12110
12111 char *in_off[9];
12112
12113 size_t in_len[9] = { 0 };
12114
12115 in_off[0] = strtok (input_buf, ":");
12116
12117 in_len[0] = strlen (in_off[0]);
12118
12119 size_t i;
12120
12121 for (i = 1; i < 9; i++)
12122 {
12123 in_off[i] = strtok (NULL, ":");
12124
12125 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12126
12127 in_len[i] = strlen (in_off[i]);
12128 }
12129
12130 char *ptr = (char *) ikepsk->msg_buf;
12131
12132 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12133 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12134 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12135 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12136 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12137 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12138
12139 *ptr = 0x80;
12140
12141 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12142
12143 ptr = (char *) ikepsk->nr_buf;
12144
12145 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12146 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12147
12148 *ptr = 0x80;
12149
12150 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12151
12152 /**
12153 * Store to database
12154 */
12155
12156 ptr = in_off[8];
12157
12158 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12159 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12160 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12161 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12162
12163 digest[0] = byte_swap_32 (digest[0]);
12164 digest[1] = byte_swap_32 (digest[1]);
12165 digest[2] = byte_swap_32 (digest[2]);
12166 digest[3] = byte_swap_32 (digest[3]);
12167
12168 salt->salt_len = 32;
12169
12170 salt->salt_buf[0] = ikepsk->nr_buf[0];
12171 salt->salt_buf[1] = ikepsk->nr_buf[1];
12172 salt->salt_buf[2] = ikepsk->nr_buf[2];
12173 salt->salt_buf[3] = ikepsk->nr_buf[3];
12174 salt->salt_buf[4] = ikepsk->nr_buf[4];
12175 salt->salt_buf[5] = ikepsk->nr_buf[5];
12176 salt->salt_buf[6] = ikepsk->nr_buf[6];
12177 salt->salt_buf[7] = ikepsk->nr_buf[7];
12178
12179 return (PARSER_OK);
12180 }
12181
12182 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12183 {
12184 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12185
12186 u32 *digest = (u32 *) hash_buf->digest;
12187
12188 salt_t *salt = hash_buf->salt;
12189
12190 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12191
12192 /**
12193 * Parse that strange long line
12194 */
12195
12196 char *in_off[9];
12197
12198 size_t in_len[9] = { 0 };
12199
12200 in_off[0] = strtok (input_buf, ":");
12201
12202 in_len[0] = strlen (in_off[0]);
12203
12204 size_t i;
12205
12206 for (i = 1; i < 9; i++)
12207 {
12208 in_off[i] = strtok (NULL, ":");
12209
12210 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12211
12212 in_len[i] = strlen (in_off[i]);
12213 }
12214
12215 char *ptr = (char *) ikepsk->msg_buf;
12216
12217 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12218 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12219 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12220 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12221 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12222 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12223
12224 *ptr = 0x80;
12225
12226 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12227
12228 ptr = (char *) ikepsk->nr_buf;
12229
12230 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12231 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12232
12233 *ptr = 0x80;
12234
12235 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12236
12237 /**
12238 * Store to database
12239 */
12240
12241 ptr = in_off[8];
12242
12243 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12244 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12245 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12246 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12247 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12248
12249 salt->salt_len = 32;
12250
12251 salt->salt_buf[0] = ikepsk->nr_buf[0];
12252 salt->salt_buf[1] = ikepsk->nr_buf[1];
12253 salt->salt_buf[2] = ikepsk->nr_buf[2];
12254 salt->salt_buf[3] = ikepsk->nr_buf[3];
12255 salt->salt_buf[4] = ikepsk->nr_buf[4];
12256 salt->salt_buf[5] = ikepsk->nr_buf[5];
12257 salt->salt_buf[6] = ikepsk->nr_buf[6];
12258 salt->salt_buf[7] = ikepsk->nr_buf[7];
12259
12260 return (PARSER_OK);
12261 }
12262
12263 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12264 {
12265 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12266
12267 u32 *digest = (u32 *) hash_buf->digest;
12268
12269 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12270 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12271 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12272 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12273 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12274
12275 digest[0] = byte_swap_32 (digest[0]);
12276 digest[1] = byte_swap_32 (digest[1]);
12277 digest[2] = byte_swap_32 (digest[2]);
12278 digest[3] = byte_swap_32 (digest[3]);
12279 digest[4] = byte_swap_32 (digest[4]);
12280
12281 return (PARSER_OK);
12282 }
12283
12284 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12285 {
12286 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12287
12288 u32 *digest = (u32 *) hash_buf->digest;
12289
12290 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12291 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12292 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12293 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12294 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12295 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12296 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12297 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12298 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12299 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12300 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12301 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12302 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12303 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12304 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12305 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12306
12307 return (PARSER_OK);
12308 }
12309
12310 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12311 {
12312 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12313
12314 u32 *digest = (u32 *) hash_buf->digest;
12315
12316 salt_t *salt = hash_buf->salt;
12317
12318 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12319 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12320 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12321 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12322 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12323
12324 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12325
12326 uint salt_len = input_len - 40 - 1;
12327
12328 char *salt_buf = input_buf + 40 + 1;
12329
12330 char *salt_buf_ptr = (char *) salt->salt_buf;
12331
12332 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12333
12334 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12335
12336 salt->salt_len = salt_len;
12337
12338 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12339
12340 return (PARSER_OK);
12341 }
12342
12343 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12344 {
12345 u32 *digest = (u32 *) hash_buf->digest;
12346
12347 salt_t *salt = hash_buf->salt;
12348
12349 tc_t *tc = (tc_t *) hash_buf->esalt;
12350
12351 if (input_len == 0)
12352 {
12353 log_error ("TrueCrypt container not specified");
12354
12355 exit (-1);
12356 }
12357
12358 FILE *fp = fopen (input_buf, "rb");
12359
12360 if (fp == NULL)
12361 {
12362 log_error ("%s: %s", input_buf, strerror (errno));
12363
12364 exit (-1);
12365 }
12366
12367 char buf[512] = { 0 };
12368
12369 int n = fread (buf, 1, sizeof (buf), fp);
12370
12371 fclose (fp);
12372
12373 if (n != 512) return (PARSER_TC_FILE_SIZE);
12374
12375 memcpy (tc->salt_buf, buf, 64);
12376
12377 memcpy (tc->data_buf, buf + 64, 512 - 64);
12378
12379 salt->salt_buf[0] = tc->salt_buf[0];
12380
12381 salt->salt_len = 4;
12382
12383 salt->salt_iter = 1000 - 1;
12384
12385 digest[0] = tc->data_buf[0];
12386
12387 return (PARSER_OK);
12388 }
12389
12390 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12391 {
12392 u32 *digest = (u32 *) hash_buf->digest;
12393
12394 salt_t *salt = hash_buf->salt;
12395
12396 tc_t *tc = (tc_t *) hash_buf->esalt;
12397
12398 if (input_len == 0)
12399 {
12400 log_error ("TrueCrypt container not specified");
12401
12402 exit (-1);
12403 }
12404
12405 FILE *fp = fopen (input_buf, "rb");
12406
12407 if (fp == NULL)
12408 {
12409 log_error ("%s: %s", input_buf, strerror (errno));
12410
12411 exit (-1);
12412 }
12413
12414 char buf[512] = { 0 };
12415
12416 int n = fread (buf, 1, sizeof (buf), fp);
12417
12418 fclose (fp);
12419
12420 if (n != 512) return (PARSER_TC_FILE_SIZE);
12421
12422 memcpy (tc->salt_buf, buf, 64);
12423
12424 memcpy (tc->data_buf, buf + 64, 512 - 64);
12425
12426 salt->salt_buf[0] = tc->salt_buf[0];
12427
12428 salt->salt_len = 4;
12429
12430 salt->salt_iter = 2000 - 1;
12431
12432 digest[0] = tc->data_buf[0];
12433
12434 return (PARSER_OK);
12435 }
12436
12437 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12438 {
12439 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12440
12441 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12442
12443 u32 *digest = (u32 *) hash_buf->digest;
12444
12445 salt_t *salt = hash_buf->salt;
12446
12447 char *salt_pos = input_buf + 6;
12448
12449 char *hash_pos = strchr (salt_pos, '$');
12450
12451 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12452
12453 uint salt_len = hash_pos - salt_pos;
12454
12455 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12456
12457 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12458
12459 salt->salt_len = salt_len;
12460
12461 salt->salt_iter = 1000;
12462
12463 hash_pos++;
12464
12465 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12466
12467 return (PARSER_OK);
12468 }
12469
12470 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12471 {
12472 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12473
12474 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12475
12476 u32 *digest = (u32 *) hash_buf->digest;
12477
12478 salt_t *salt = hash_buf->salt;
12479
12480 char *iter_pos = input_buf + 7;
12481
12482 char *salt_pos = strchr (iter_pos, '$');
12483
12484 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12485
12486 salt_pos++;
12487
12488 char *hash_pos = strchr (salt_pos, '$');
12489
12490 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12491
12492 uint salt_len = hash_pos - salt_pos;
12493
12494 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12495
12496 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12497
12498 salt->salt_len = salt_len;
12499
12500 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12501
12502 salt->salt_sign[0] = atoi (salt_iter);
12503
12504 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12505
12506 hash_pos++;
12507
12508 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12509
12510 digest[0] = byte_swap_32 (digest[0]);
12511 digest[1] = byte_swap_32 (digest[1]);
12512 digest[2] = byte_swap_32 (digest[2]);
12513 digest[3] = byte_swap_32 (digest[3]);
12514 digest[4] = byte_swap_32 (digest[4]);
12515
12516 return (PARSER_OK);
12517 }
12518
12519 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12520 {
12521 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12522
12523 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12524
12525 u32 *digest = (u32 *) hash_buf->digest;
12526
12527 salt_t *salt = hash_buf->salt;
12528
12529 char *iter_pos = input_buf + 9;
12530
12531 char *salt_pos = strchr (iter_pos, '$');
12532
12533 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12534
12535 salt_pos++;
12536
12537 char *hash_pos = strchr (salt_pos, '$');
12538
12539 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12540
12541 uint salt_len = hash_pos - salt_pos;
12542
12543 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12544
12545 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12546
12547 salt->salt_len = salt_len;
12548
12549 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12550
12551 salt->salt_sign[0] = atoi (salt_iter);
12552
12553 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12554
12555 hash_pos++;
12556
12557 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12558
12559 digest[0] = byte_swap_32 (digest[0]);
12560 digest[1] = byte_swap_32 (digest[1]);
12561 digest[2] = byte_swap_32 (digest[2]);
12562 digest[3] = byte_swap_32 (digest[3]);
12563 digest[4] = byte_swap_32 (digest[4]);
12564 digest[5] = byte_swap_32 (digest[5]);
12565 digest[6] = byte_swap_32 (digest[6]);
12566 digest[7] = byte_swap_32 (digest[7]);
12567
12568 return (PARSER_OK);
12569 }
12570
12571 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12572 {
12573 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12574
12575 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12576
12577 u64 *digest = (u64 *) hash_buf->digest;
12578
12579 salt_t *salt = hash_buf->salt;
12580
12581 char *iter_pos = input_buf + 9;
12582
12583 char *salt_pos = strchr (iter_pos, '$');
12584
12585 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12586
12587 salt_pos++;
12588
12589 char *hash_pos = strchr (salt_pos, '$');
12590
12591 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12592
12593 uint salt_len = hash_pos - salt_pos;
12594
12595 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12596
12597 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12598
12599 salt->salt_len = salt_len;
12600
12601 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12602
12603 salt->salt_sign[0] = atoi (salt_iter);
12604
12605 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12606
12607 hash_pos++;
12608
12609 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12610
12611 digest[0] = byte_swap_64 (digest[0]);
12612 digest[1] = byte_swap_64 (digest[1]);
12613 digest[2] = byte_swap_64 (digest[2]);
12614 digest[3] = byte_swap_64 (digest[3]);
12615 digest[4] = byte_swap_64 (digest[4]);
12616 digest[5] = byte_swap_64 (digest[5]);
12617 digest[6] = byte_swap_64 (digest[6]);
12618 digest[7] = byte_swap_64 (digest[7]);
12619
12620 return (PARSER_OK);
12621 }
12622
12623 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12624 {
12625 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12626
12627 u32 *digest = (u32 *) hash_buf->digest;
12628
12629 salt_t *salt = hash_buf->salt;
12630
12631 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12632
12633 /**
12634 * parse line
12635 */
12636
12637 char *iterations_pos = input_buf;
12638
12639 char *saltbuf_pos = strchr (iterations_pos, ':');
12640
12641 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12642
12643 uint iterations_len = saltbuf_pos - iterations_pos;
12644
12645 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12646
12647 saltbuf_pos++;
12648
12649 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12650
12651 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12652
12653 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12654
12655 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12656
12657 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12658
12659 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12660
12661 cipherbuf_pos++;
12662
12663 /**
12664 * pbkdf2 iterations
12665 */
12666
12667 salt->salt_iter = atoi (iterations_pos) - 1;
12668
12669 /**
12670 * handle salt encoding
12671 */
12672
12673 char *saltbuf_ptr = (char *) salt->salt_buf;
12674
12675 for (uint i = 0; i < saltbuf_len; i += 2)
12676 {
12677 const char p0 = saltbuf_pos[i + 0];
12678 const char p1 = saltbuf_pos[i + 1];
12679
12680 *saltbuf_ptr++ = hex_convert (p1) << 0
12681 | hex_convert (p0) << 4;
12682 }
12683
12684 salt->salt_len = saltbuf_len / 2;
12685
12686 /**
12687 * handle cipher encoding
12688 */
12689
12690 uint *tmp = (uint *) mymalloc (32);
12691
12692 char *cipherbuf_ptr = (char *) tmp;
12693
12694 for (uint i = 2016; i < cipherbuf_len; i += 2)
12695 {
12696 const char p0 = cipherbuf_pos[i + 0];
12697 const char p1 = cipherbuf_pos[i + 1];
12698
12699 *cipherbuf_ptr++ = hex_convert (p1) << 0
12700 | hex_convert (p0) << 4;
12701 }
12702
12703 // iv is stored at salt_buf 4 (length 16)
12704 // data is stored at salt_buf 8 (length 16)
12705
12706 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12707 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12708 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12709 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12710
12711 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12712 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12713 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12714 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12715
12716 free (tmp);
12717
12718 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12719 {
12720 const char p0 = cipherbuf_pos[j + 0];
12721 const char p1 = cipherbuf_pos[j + 1];
12722
12723 agilekey->cipher[i] = hex_convert (p1) << 0
12724 | hex_convert (p0) << 4;
12725 }
12726
12727 /**
12728 * digest buf
12729 */
12730
12731 digest[0] = 0x10101010;
12732 digest[1] = 0x10101010;
12733 digest[2] = 0x10101010;
12734 digest[3] = 0x10101010;
12735
12736 return (PARSER_OK);
12737 }
12738
12739 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12740 {
12741 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12742
12743 u32 *digest = (u32 *) hash_buf->digest;
12744
12745 salt_t *salt = hash_buf->salt;
12746
12747 char *hashbuf_pos = input_buf;
12748
12749 char *iterations_pos = strchr (hashbuf_pos, ':');
12750
12751 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12752
12753 uint hash_len = iterations_pos - hashbuf_pos;
12754
12755 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12756
12757 iterations_pos++;
12758
12759 char *saltbuf_pos = strchr (iterations_pos, ':');
12760
12761 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12762
12763 uint iterations_len = saltbuf_pos - iterations_pos;
12764
12765 saltbuf_pos++;
12766
12767 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12768
12769 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12770
12771 char *salt_buf_ptr = (char *) salt->salt_buf;
12772
12773 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12774
12775 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12776
12777 salt->salt_len = salt_len;
12778
12779 salt->salt_iter = atoi (iterations_pos) - 1;
12780
12781 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12782 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12783 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12784 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12785
12786 return (PARSER_OK);
12787 }
12788
12789 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12790 {
12791 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12792
12793 u32 *digest = (u32 *) hash_buf->digest;
12794
12795 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12796 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12797 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12798 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12799 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12800 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12801 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12802 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12803
12804 digest[0] = byte_swap_32 (digest[0]);
12805 digest[1] = byte_swap_32 (digest[1]);
12806 digest[2] = byte_swap_32 (digest[2]);
12807 digest[3] = byte_swap_32 (digest[3]);
12808 digest[4] = byte_swap_32 (digest[4]);
12809 digest[5] = byte_swap_32 (digest[5]);
12810 digest[6] = byte_swap_32 (digest[6]);
12811 digest[7] = byte_swap_32 (digest[7]);
12812
12813 return (PARSER_OK);
12814 }
12815
12816 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12817 {
12818 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12819
12820 u32 *digest = (u32 *) hash_buf->digest;
12821
12822 salt_t *salt = hash_buf->salt;
12823
12824 char *salt_pos = input_buf + 3;
12825
12826 uint iterations_len = 0;
12827
12828 if (memcmp (salt_pos, "rounds=", 7) == 0)
12829 {
12830 salt_pos += 7;
12831
12832 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12833
12834 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12835 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12836
12837 salt_pos[0] = 0x0;
12838
12839 salt->salt_iter = atoi (salt_pos - iterations_len);
12840
12841 salt_pos += 1;
12842
12843 iterations_len += 8;
12844 }
12845 else
12846 {
12847 salt->salt_iter = ROUNDS_SHA256CRYPT;
12848 }
12849
12850 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12851
12852 char *hash_pos = strchr (salt_pos, '$');
12853
12854 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12855
12856 uint salt_len = hash_pos - salt_pos;
12857
12858 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12859
12860 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12861
12862 salt->salt_len = salt_len;
12863
12864 hash_pos++;
12865
12866 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12867
12868 return (PARSER_OK);
12869 }
12870
12871 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12872 {
12873 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12874
12875 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12876
12877 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12878
12879 u64 *digest = (u64 *) hash_buf->digest;
12880
12881 salt_t *salt = hash_buf->salt;
12882
12883 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12884
12885 char *iter_pos = input_buf + 4;
12886
12887 char *salt_pos = strchr (iter_pos, '$');
12888
12889 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12890
12891 salt_pos++;
12892
12893 char *hash_pos = strchr (salt_pos, '$');
12894
12895 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12896
12897 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12898
12899 hash_pos++;
12900
12901 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12902 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12903 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12904 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12905 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12906 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12907 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12908 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12909
12910 uint salt_len = hash_pos - salt_pos - 1;
12911
12912 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12913
12914 salt->salt_len = salt_len / 2;
12915
12916 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12917 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12918 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12919 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12920 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
12921 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
12922 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
12923 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
12924
12925 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12926 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12927 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12928 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12929 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12930 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12931 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12932 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12933 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12934 pbkdf2_sha512->salt_buf[9] = 0x80;
12935
12936 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12937
12938 salt->salt_iter = atoi (iter_pos) - 1;
12939
12940 return (PARSER_OK);
12941 }
12942
12943 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12944 {
12945 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12946
12947 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12948
12949 u32 *digest = (u32 *) hash_buf->digest;
12950
12951 salt_t *salt = hash_buf->salt;
12952
12953 char *salt_pos = input_buf + 14;
12954
12955 char *hash_pos = strchr (salt_pos, '*');
12956
12957 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12958
12959 hash_pos++;
12960
12961 uint salt_len = hash_pos - salt_pos - 1;
12962
12963 char *salt_buf_ptr = (char *) salt->salt_buf;
12964
12965 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12966
12967 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12968
12969 salt->salt_len = salt_len;
12970
12971 u8 tmp_buf[100] = { 0 };
12972
12973 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
12974
12975 memcpy (digest, tmp_buf, 32);
12976
12977 digest[0] = byte_swap_32 (digest[0]);
12978 digest[1] = byte_swap_32 (digest[1]);
12979 digest[2] = byte_swap_32 (digest[2]);
12980 digest[3] = byte_swap_32 (digest[3]);
12981 digest[4] = byte_swap_32 (digest[4]);
12982 digest[5] = byte_swap_32 (digest[5]);
12983 digest[6] = byte_swap_32 (digest[6]);
12984 digest[7] = byte_swap_32 (digest[7]);
12985
12986 digest[0] -= SHA256M_A;
12987 digest[1] -= SHA256M_B;
12988 digest[2] -= SHA256M_C;
12989 digest[3] -= SHA256M_D;
12990 digest[4] -= SHA256M_E;
12991 digest[5] -= SHA256M_F;
12992 digest[6] -= SHA256M_G;
12993 digest[7] -= SHA256M_H;
12994
12995 return (PARSER_OK);
12996 }
12997
12998 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12999 {
13000 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13001
13002 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13003
13004 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13005
13006 u64 *digest = (u64 *) hash_buf->digest;
13007
13008 salt_t *salt = hash_buf->salt;
13009
13010 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13011
13012 char *iter_pos = input_buf + 19;
13013
13014 char *salt_pos = strchr (iter_pos, '.');
13015
13016 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13017
13018 salt_pos++;
13019
13020 char *hash_pos = strchr (salt_pos, '.');
13021
13022 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13023
13024 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13025
13026 hash_pos++;
13027
13028 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13029 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13030 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13031 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13032 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13033 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13034 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13035 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13036
13037 uint salt_len = hash_pos - salt_pos - 1;
13038
13039 salt_len /= 2;
13040
13041 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13042
13043 uint i;
13044
13045 for (i = 0; i < salt_len; i++)
13046 {
13047 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13048 }
13049
13050 salt_buf_ptr[salt_len + 3] = 0x01;
13051 salt_buf_ptr[salt_len + 4] = 0x80;
13052
13053 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13054
13055 salt->salt_len = salt_len;
13056
13057 salt->salt_iter = atoi (iter_pos) - 1;
13058
13059 return (PARSER_OK);
13060 }
13061
13062 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13063 {
13064 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13065
13066 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13067
13068 u64 *digest = (u64 *) hash_buf->digest;
13069
13070 salt_t *salt = hash_buf->salt;
13071
13072 u8 tmp_buf[120] = { 0 };
13073
13074 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13075
13076 memcpy (digest, tmp_buf, 64);
13077
13078 digest[0] = byte_swap_64 (digest[0]);
13079 digest[1] = byte_swap_64 (digest[1]);
13080 digest[2] = byte_swap_64 (digest[2]);
13081 digest[3] = byte_swap_64 (digest[3]);
13082 digest[4] = byte_swap_64 (digest[4]);
13083 digest[5] = byte_swap_64 (digest[5]);
13084 digest[6] = byte_swap_64 (digest[6]);
13085 digest[7] = byte_swap_64 (digest[7]);
13086
13087 digest[0] -= SHA512M_A;
13088 digest[1] -= SHA512M_B;
13089 digest[2] -= SHA512M_C;
13090 digest[3] -= SHA512M_D;
13091 digest[4] -= SHA512M_E;
13092 digest[5] -= SHA512M_F;
13093 digest[6] -= SHA512M_G;
13094 digest[7] -= SHA512M_H;
13095
13096 salt->salt_len = tmp_len - 64;
13097
13098 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13099
13100 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13101 {
13102 char *ptr = (char *) salt->salt_buf;
13103
13104 ptr[salt->salt_len] = 0x80;
13105 }
13106
13107 return (PARSER_OK);
13108 }
13109
13110 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13111 {
13112 if (data.opts_type & OPTS_TYPE_ST_HEX)
13113 {
13114 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13115 }
13116 else
13117 {
13118 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13119 }
13120
13121 u32 *digest = (u32 *) hash_buf->digest;
13122
13123 salt_t *salt = hash_buf->salt;
13124
13125 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13126 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13127 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13128 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13129
13130 digest[0] = byte_swap_32 (digest[0]);
13131 digest[1] = byte_swap_32 (digest[1]);
13132 digest[2] = byte_swap_32 (digest[2]);
13133 digest[3] = byte_swap_32 (digest[3]);
13134
13135 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13136
13137 uint salt_len = input_len - 32 - 1;
13138
13139 char *salt_buf = input_buf + 32 + 1;
13140
13141 char *salt_buf_ptr = (char *) salt->salt_buf;
13142
13143 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13144
13145 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13146
13147 salt->salt_len = salt_len;
13148
13149 return (PARSER_OK);
13150 }
13151
13152 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13153 {
13154 if (data.opts_type & OPTS_TYPE_ST_HEX)
13155 {
13156 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13157 }
13158 else
13159 {
13160 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13161 }
13162
13163 u32 *digest = (u32 *) hash_buf->digest;
13164
13165 salt_t *salt = hash_buf->salt;
13166
13167 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13168 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13169 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13170 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13171 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13172
13173 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13174
13175 uint salt_len = input_len - 40 - 1;
13176
13177 char *salt_buf = input_buf + 40 + 1;
13178
13179 char *salt_buf_ptr = (char *) salt->salt_buf;
13180
13181 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13182
13183 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13184
13185 salt->salt_len = salt_len;
13186
13187 return (PARSER_OK);
13188 }
13189
13190 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13191 {
13192 if (data.opts_type & OPTS_TYPE_ST_HEX)
13193 {
13194 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13195 }
13196 else
13197 {
13198 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13199 }
13200
13201 u32 *digest = (u32 *) hash_buf->digest;
13202
13203 salt_t *salt = hash_buf->salt;
13204
13205 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13206 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13207 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13208 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13209 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13210 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13211 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13212 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13213
13214 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13215
13216 uint salt_len = input_len - 64 - 1;
13217
13218 char *salt_buf = input_buf + 64 + 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 hmacsha512_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_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13236 }
13237 else
13238 {
13239 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13240 }
13241
13242 u64 *digest = (u64 *) hash_buf->digest;
13243
13244 salt_t *salt = hash_buf->salt;
13245
13246 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13247 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13248 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13249 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13250 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13251 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13252 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13253 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13254
13255 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13256
13257 uint salt_len = input_len - 128 - 1;
13258
13259 char *salt_buf = input_buf + 128 + 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 krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13273 {
13274 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13275
13276 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13277
13278 u32 *digest = (u32 *) hash_buf->digest;
13279
13280 salt_t *salt = hash_buf->salt;
13281
13282 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13283
13284 /**
13285 * parse line
13286 */
13287
13288 char *user_pos = input_buf + 10 + 1;
13289
13290 char *realm_pos = strchr (user_pos, '$');
13291
13292 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13293
13294 uint user_len = realm_pos - user_pos;
13295
13296 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13297
13298 realm_pos++;
13299
13300 char *salt_pos = strchr (realm_pos, '$');
13301
13302 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13303
13304 uint realm_len = salt_pos - realm_pos;
13305
13306 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13307
13308 salt_pos++;
13309
13310 char *data_pos = strchr (salt_pos, '$');
13311
13312 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13313
13314 uint salt_len = data_pos - salt_pos;
13315
13316 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13317
13318 data_pos++;
13319
13320 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13321
13322 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13323
13324 /**
13325 * copy data
13326 */
13327
13328 memcpy (krb5pa->user, user_pos, user_len);
13329 memcpy (krb5pa->realm, realm_pos, realm_len);
13330 memcpy (krb5pa->salt, salt_pos, salt_len);
13331
13332 char *timestamp_ptr = (char *) krb5pa->timestamp;
13333
13334 for (uint i = 0; i < (36 * 2); i += 2)
13335 {
13336 const char p0 = data_pos[i + 0];
13337 const char p1 = data_pos[i + 1];
13338
13339 *timestamp_ptr++ = hex_convert (p1) << 0
13340 | hex_convert (p0) << 4;
13341 }
13342
13343 char *checksum_ptr = (char *) krb5pa->checksum;
13344
13345 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13346 {
13347 const char p0 = data_pos[i + 0];
13348 const char p1 = data_pos[i + 1];
13349
13350 *checksum_ptr++ = hex_convert (p1) << 0
13351 | hex_convert (p0) << 4;
13352 }
13353
13354 /**
13355 * copy some data to generic buffers to make sorting happy
13356 */
13357
13358 salt->salt_buf[0] = krb5pa->timestamp[0];
13359 salt->salt_buf[1] = krb5pa->timestamp[1];
13360 salt->salt_buf[2] = krb5pa->timestamp[2];
13361 salt->salt_buf[3] = krb5pa->timestamp[3];
13362 salt->salt_buf[4] = krb5pa->timestamp[4];
13363 salt->salt_buf[5] = krb5pa->timestamp[5];
13364 salt->salt_buf[6] = krb5pa->timestamp[6];
13365 salt->salt_buf[7] = krb5pa->timestamp[7];
13366 salt->salt_buf[8] = krb5pa->timestamp[8];
13367
13368 salt->salt_len = 36;
13369
13370 digest[0] = krb5pa->checksum[0];
13371 digest[1] = krb5pa->checksum[1];
13372 digest[2] = krb5pa->checksum[2];
13373 digest[3] = krb5pa->checksum[3];
13374
13375 return (PARSER_OK);
13376 }
13377
13378 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13379 {
13380 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13381
13382 u32 *digest = (u32 *) hash_buf->digest;
13383
13384 salt_t *salt = hash_buf->salt;
13385
13386 /**
13387 * parse line
13388 */
13389
13390 char *salt_pos = input_buf;
13391
13392 char *hash_pos = strchr (salt_pos, '$');
13393
13394 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13395
13396 uint salt_len = hash_pos - salt_pos;
13397
13398 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13399
13400 hash_pos++;
13401
13402 uint hash_len = input_len - 1 - salt_len;
13403
13404 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13405
13406 /**
13407 * valid some data
13408 */
13409
13410 uint user_len = 0;
13411
13412 for (uint i = 0; i < salt_len; i++)
13413 {
13414 if (salt_pos[i] == ' ') continue;
13415
13416 user_len++;
13417 }
13418
13419 // SAP user names cannot be longer than 12 characters
13420 if (user_len > 12) return (PARSER_SALT_LENGTH);
13421
13422 // SAP user name cannot start with ! or ?
13423 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13424
13425 /**
13426 * copy data
13427 */
13428
13429 char *salt_buf_ptr = (char *) salt->salt_buf;
13430
13431 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13432
13433 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13434
13435 salt->salt_len = salt_len;
13436
13437 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13438 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13439 digest[2] = 0;
13440 digest[3] = 0;
13441
13442 digest[0] = byte_swap_32 (digest[0]);
13443 digest[1] = byte_swap_32 (digest[1]);
13444
13445 return (PARSER_OK);
13446 }
13447
13448 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13449 {
13450 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13451
13452 u32 *digest = (u32 *) hash_buf->digest;
13453
13454 salt_t *salt = hash_buf->salt;
13455
13456 /**
13457 * parse line
13458 */
13459
13460 char *salt_pos = input_buf;
13461
13462 char *hash_pos = strchr (salt_pos, '$');
13463
13464 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13465
13466 uint salt_len = hash_pos - salt_pos;
13467
13468 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13469
13470 hash_pos++;
13471
13472 uint hash_len = input_len - 1 - salt_len;
13473
13474 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13475
13476 /**
13477 * valid some data
13478 */
13479
13480 uint user_len = 0;
13481
13482 for (uint i = 0; i < salt_len; i++)
13483 {
13484 if (salt_pos[i] == ' ') continue;
13485
13486 user_len++;
13487 }
13488
13489 // SAP user names cannot be longer than 12 characters
13490 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13491 // so far nobody complained so we stay with this because it helps in optimization
13492 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13493
13494 if (user_len > 12) return (PARSER_SALT_LENGTH);
13495
13496 // SAP user name cannot start with ! or ?
13497 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13498
13499 /**
13500 * copy data
13501 */
13502
13503 char *salt_buf_ptr = (char *) salt->salt_buf;
13504
13505 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13506
13507 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13508
13509 salt->salt_len = salt_len;
13510
13511 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13512 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13513 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13514 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13515 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13516
13517 return (PARSER_OK);
13518 }
13519
13520 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13521 {
13522 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13523
13524 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13525
13526 u64 *digest = (u64 *) hash_buf->digest;
13527
13528 salt_t *salt = hash_buf->salt;
13529
13530 char *iter_pos = input_buf + 3;
13531
13532 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13533
13534 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13535
13536 memcpy ((char *) salt->salt_sign, input_buf, 4);
13537
13538 salt->salt_iter = salt_iter;
13539
13540 char *salt_pos = iter_pos + 1;
13541
13542 uint salt_len = 8;
13543
13544 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13545
13546 salt->salt_len = salt_len;
13547
13548 char *hash_pos = salt_pos + salt_len;
13549
13550 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13551
13552 // ugly hack start
13553
13554 char *tmp = (char *) salt->salt_buf_pc;
13555
13556 tmp[0] = hash_pos[42];
13557
13558 // ugly hack end
13559
13560 digest[ 0] = byte_swap_64 (digest[ 0]);
13561 digest[ 1] = byte_swap_64 (digest[ 1]);
13562 digest[ 2] = byte_swap_64 (digest[ 2]);
13563 digest[ 3] = byte_swap_64 (digest[ 3]);
13564 digest[ 4] = 0;
13565 digest[ 5] = 0;
13566 digest[ 6] = 0;
13567 digest[ 7] = 0;
13568
13569 return (PARSER_OK);
13570 }
13571
13572 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13573 {
13574 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13575
13576 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13577
13578 u32 *digest = (u32 *) hash_buf->digest;
13579
13580 salt_t *salt = hash_buf->salt;
13581
13582 char *salt_buf = input_buf + 6;
13583
13584 uint salt_len = 16;
13585
13586 char *salt_buf_ptr = (char *) salt->salt_buf;
13587
13588 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13589
13590 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13591
13592 salt->salt_len = salt_len;
13593
13594 char *hash_pos = input_buf + 6 + 16;
13595
13596 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13597 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13598 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13599 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13600 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13601 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13602 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13603 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13604
13605 return (PARSER_OK);
13606 }
13607
13608 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13609 {
13610 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13611
13612 u32 *digest = (u32 *) hash_buf->digest;
13613
13614 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13615 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13616 digest[2] = 0;
13617 digest[3] = 0;
13618
13619 return (PARSER_OK);
13620 }
13621
13622 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13623 {
13624 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13625
13626 u32 *digest = (u32 *) hash_buf->digest;
13627
13628 salt_t *salt = hash_buf->salt;
13629
13630 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13631
13632 char *saltbuf_pos = input_buf;
13633
13634 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13635
13636 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13637
13638 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13639
13640 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13641 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13642
13643 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13644
13645 hashbuf_pos++;
13646
13647 uint hashbuf_len = input_len - saltbuf_len - 1;
13648
13649 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13650
13651 char *salt_ptr = (char *) saltbuf_pos;
13652 char *rakp_ptr = (char *) rakp->salt_buf;
13653
13654 uint i;
13655 uint j;
13656
13657 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13658 {
13659 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13660 }
13661
13662 rakp_ptr[j] = 0x80;
13663
13664 rakp->salt_len = j;
13665
13666 for (i = 0; i < 64; i++)
13667 {
13668 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13669 }
13670
13671 salt->salt_buf[0] = rakp->salt_buf[0];
13672 salt->salt_buf[1] = rakp->salt_buf[1];
13673 salt->salt_buf[2] = rakp->salt_buf[2];
13674 salt->salt_buf[3] = rakp->salt_buf[3];
13675 salt->salt_buf[4] = rakp->salt_buf[4];
13676 salt->salt_buf[5] = rakp->salt_buf[5];
13677 salt->salt_buf[6] = rakp->salt_buf[6];
13678 salt->salt_buf[7] = rakp->salt_buf[7];
13679
13680 salt->salt_len = 32; // muss min. 32 haben
13681
13682 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13683 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13684 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13685 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13686 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13687
13688 return (PARSER_OK);
13689 }
13690
13691 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13692 {
13693 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13694
13695 u32 *digest = (u32 *) hash_buf->digest;
13696
13697 salt_t *salt = hash_buf->salt;
13698
13699 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13700
13701 char *salt_pos = input_buf + 1;
13702
13703 memcpy (salt->salt_buf, salt_pos, 8);
13704
13705 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13706 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13707
13708 salt->salt_len = 8;
13709
13710 char *hash_pos = salt_pos + 8;
13711
13712 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13713 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13714 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13715 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13716 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13717
13718 digest[0] -= SHA1M_A;
13719 digest[1] -= SHA1M_B;
13720 digest[2] -= SHA1M_C;
13721 digest[3] -= SHA1M_D;
13722 digest[4] -= SHA1M_E;
13723
13724 return (PARSER_OK);
13725 }
13726
13727 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13728 {
13729 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13730
13731 u32 *digest = (u32 *) hash_buf->digest;
13732
13733 salt_t *salt = hash_buf->salt;
13734
13735 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13736 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13737 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13738 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13739
13740 digest[0] = byte_swap_32 (digest[0]);
13741 digest[1] = byte_swap_32 (digest[1]);
13742 digest[2] = byte_swap_32 (digest[2]);
13743 digest[3] = byte_swap_32 (digest[3]);
13744
13745 digest[0] -= MD5M_A;
13746 digest[1] -= MD5M_B;
13747 digest[2] -= MD5M_C;
13748 digest[3] -= MD5M_D;
13749
13750 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13751
13752 char *salt_buf_ptr = input_buf + 32 + 1;
13753
13754 u32 *salt_buf = salt->salt_buf;
13755
13756 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13757 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13758 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13759 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13760
13761 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13762 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13763 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13764 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13765
13766 salt->salt_len = 16 + 1;
13767
13768 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13769
13770 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13771
13772 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13773
13774 return (PARSER_OK);
13775 }
13776
13777 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13778 {
13779 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13780
13781 u32 *digest = (u32 *) hash_buf->digest;
13782
13783 salt_t *salt = hash_buf->salt;
13784
13785 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13786
13787 /**
13788 * parse line
13789 */
13790
13791 char *hashbuf_pos = input_buf;
13792
13793 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13794
13795 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13796
13797 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13798
13799 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13800
13801 saltbuf_pos++;
13802
13803 char *iteration_pos = strchr (saltbuf_pos, ':');
13804
13805 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13806
13807 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13808
13809 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13810
13811 iteration_pos++;
13812
13813 char *databuf_pos = strchr (iteration_pos, ':');
13814
13815 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13816
13817 const uint iteration_len = databuf_pos - iteration_pos;
13818
13819 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13820 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13821
13822 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13823
13824 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13825 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13826
13827 databuf_pos++;
13828
13829 // digest
13830
13831 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13832 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13833 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13834 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13835 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13836 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
13837 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
13838 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
13839
13840 // salt
13841
13842 char *saltbuf_ptr = (char *) salt->salt_buf;
13843
13844 for (uint i = 0; i < saltbuf_len; i += 2)
13845 {
13846 const char p0 = saltbuf_pos[i + 0];
13847 const char p1 = saltbuf_pos[i + 1];
13848
13849 *saltbuf_ptr++ = hex_convert (p1) << 0
13850 | hex_convert (p0) << 4;
13851 }
13852
13853 salt->salt_buf[4] = 0x01000000;
13854 salt->salt_buf[5] = 0x80;
13855
13856 salt->salt_len = saltbuf_len / 2;
13857
13858 // iteration
13859
13860 salt->salt_iter = atoi (iteration_pos) - 1;
13861
13862 // data
13863
13864 char *databuf_ptr = (char *) cloudkey->data_buf;
13865
13866 for (uint i = 0; i < databuf_len; i += 2)
13867 {
13868 const char p0 = databuf_pos[i + 0];
13869 const char p1 = databuf_pos[i + 1];
13870
13871 *databuf_ptr++ = hex_convert (p1) << 0
13872 | hex_convert (p0) << 4;
13873 }
13874
13875 *databuf_ptr++ = 0x80;
13876
13877 for (uint i = 0; i < 512; i++)
13878 {
13879 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13880 }
13881
13882 cloudkey->data_len = databuf_len / 2;
13883
13884 return (PARSER_OK);
13885 }
13886
13887 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13888 {
13889 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13890
13891 u32 *digest = (u32 *) hash_buf->digest;
13892
13893 salt_t *salt = hash_buf->salt;
13894
13895 /**
13896 * parse line
13897 */
13898
13899 char *hashbuf_pos = input_buf;
13900
13901 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13902
13903 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13904
13905 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13906
13907 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13908
13909 domainbuf_pos++;
13910
13911 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13912
13913 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13914
13915 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13916
13917 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13918
13919 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13920
13921 saltbuf_pos++;
13922
13923 char *iteration_pos = strchr (saltbuf_pos, ':');
13924
13925 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13926
13927 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13928
13929 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13930
13931 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13932
13933 iteration_pos++;
13934
13935 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13936
13937 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13938 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13939
13940 // ok, the plan for this algorithm is the following:
13941 // we have 2 salts here, the domain-name and a random salt
13942 // while both are used in the initial transformation,
13943 // only the random salt is used in the following iterations
13944 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13945 // and one that includes only the real salt (stored into salt_buf[]).
13946 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13947
13948 u8 tmp_buf[100] = { 0 };
13949
13950 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
13951
13952 memcpy (digest, tmp_buf, 20);
13953
13954 digest[0] = byte_swap_32 (digest[0]);
13955 digest[1] = byte_swap_32 (digest[1]);
13956 digest[2] = byte_swap_32 (digest[2]);
13957 digest[3] = byte_swap_32 (digest[3]);
13958 digest[4] = byte_swap_32 (digest[4]);
13959
13960 // domain
13961
13962 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13963
13964 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13965
13966 char *len_ptr = NULL;
13967
13968 for (uint i = 0; i < domainbuf_len; i++)
13969 {
13970 if (salt_buf_pc_ptr[i] == '.')
13971 {
13972 len_ptr = &salt_buf_pc_ptr[i];
13973
13974 *len_ptr = 0;
13975 }
13976 else
13977 {
13978 *len_ptr += 1;
13979 }
13980 }
13981
13982 salt->salt_buf_pc[7] = domainbuf_len;
13983
13984 // "real" salt
13985
13986 char *salt_buf_ptr = (char *) salt->salt_buf;
13987
13988 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13989
13990 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13991
13992 salt->salt_len = salt_len;
13993
13994 // iteration
13995
13996 salt->salt_iter = atoi (iteration_pos);
13997
13998 return (PARSER_OK);
13999 }
14000
14001 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14002 {
14003 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14004
14005 u32 *digest = (u32 *) hash_buf->digest;
14006
14007 salt_t *salt = hash_buf->salt;
14008
14009 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14010 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14011 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14012 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14013 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14014
14015 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14016
14017 uint salt_len = input_len - 40 - 1;
14018
14019 char *salt_buf = input_buf + 40 + 1;
14020
14021 char *salt_buf_ptr = (char *) salt->salt_buf;
14022
14023 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14024
14025 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14026
14027 salt->salt_len = salt_len;
14028
14029 return (PARSER_OK);
14030 }
14031
14032 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14033 {
14034 const u8 ascii_to_ebcdic[] =
14035 {
14036 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14037 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14038 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14039 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14040 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14041 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14042 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14043 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14044 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14045 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14046 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14047 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14048 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14049 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14050 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14051 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14052 };
14053
14054 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14055
14056 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14057
14058 u32 *digest = (u32 *) hash_buf->digest;
14059
14060 salt_t *salt = hash_buf->salt;
14061
14062 char *salt_pos = input_buf + 6 + 1;
14063
14064 char *digest_pos = strchr (salt_pos, '*');
14065
14066 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14067
14068 uint salt_len = digest_pos - salt_pos;
14069
14070 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14071
14072 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14073
14074 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14075
14076 digest_pos++;
14077
14078 char *salt_buf_ptr = (char *) salt->salt_buf;
14079 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14080
14081 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14082
14083 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14084
14085 salt->salt_len = salt_len;
14086
14087 for (uint i = 0; i < salt_len; i++)
14088 {
14089 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14090 }
14091 for (uint i = salt_len; i < 8; i++)
14092 {
14093 salt_buf_pc_ptr[i] = 0x40;
14094 }
14095
14096 uint tt;
14097
14098 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14099
14100 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14101 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14102
14103 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14104 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14105
14106 digest[0] = byte_swap_32 (digest[0]);
14107 digest[1] = byte_swap_32 (digest[1]);
14108
14109 IP (digest[0], digest[1], tt);
14110
14111 digest[0] = rotr32 (digest[0], 29);
14112 digest[1] = rotr32 (digest[1], 29);
14113 digest[2] = 0;
14114 digest[3] = 0;
14115
14116 return (PARSER_OK);
14117 }
14118
14119 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14120 {
14121 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14122
14123 u32 *digest = (u32 *) hash_buf->digest;
14124
14125 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14126 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14127 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14128 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14129
14130 digest[0] = byte_swap_32 (digest[0]);
14131 digest[1] = byte_swap_32 (digest[1]);
14132 digest[2] = byte_swap_32 (digest[2]);
14133 digest[3] = byte_swap_32 (digest[3]);
14134
14135 return (PARSER_OK);
14136 }
14137
14138 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14139 {
14140 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14141
14142 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14143
14144 u32 *digest = (u32 *) hash_buf->digest;
14145
14146 salt_t *salt = hash_buf->salt;
14147
14148 u8 tmp_buf[120] = { 0 };
14149
14150 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14151
14152 tmp_buf[3] += -4; // dont ask!
14153
14154 memcpy (salt->salt_buf, tmp_buf, 5);
14155
14156 salt->salt_len = 5;
14157
14158 memcpy (digest, tmp_buf + 5, 9);
14159
14160 // yes, only 9 byte are needed to crack, but 10 to display
14161
14162 salt->salt_buf_pc[7] = input_buf[20];
14163
14164 return (PARSER_OK);
14165 }
14166
14167 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14168 {
14169 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14170
14171 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14172
14173 u32 *digest = (u32 *) hash_buf->digest;
14174
14175 salt_t *salt = hash_buf->salt;
14176
14177 u8 tmp_buf[120] = { 0 };
14178
14179 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14180
14181 tmp_buf[3] += -4; // dont ask!
14182
14183 // salt
14184
14185 memcpy (salt->salt_buf, tmp_buf, 16);
14186
14187 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)
14188
14189 // iteration
14190
14191 char tmp_iter_buf[11] = { 0 };
14192
14193 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14194
14195 tmp_iter_buf[10] = 0;
14196
14197 salt->salt_iter = atoi (tmp_iter_buf);
14198
14199 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14200 {
14201 return (PARSER_SALT_ITERATION);
14202 }
14203
14204 salt->salt_iter--; // first round in init
14205
14206 // 2 additional bytes for display only
14207
14208 salt->salt_buf_pc[0] = tmp_buf[26];
14209 salt->salt_buf_pc[1] = tmp_buf[27];
14210
14211 // digest
14212
14213 memcpy (digest, tmp_buf + 28, 8);
14214
14215 digest[0] = byte_swap_32 (digest[0]);
14216 digest[1] = byte_swap_32 (digest[1]);
14217 digest[2] = 0;
14218 digest[3] = 0;
14219
14220 return (PARSER_OK);
14221 }
14222
14223 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14224 {
14225 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14226
14227 u32 *digest = (u32 *) hash_buf->digest;
14228
14229 salt_t *salt = hash_buf->salt;
14230
14231 char *salt_buf_pos = input_buf;
14232
14233 char *hash_buf_pos = salt_buf_pos + 6;
14234
14235 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14236 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14237 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14238 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14239 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14240 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14241 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14242 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14243
14244 digest[0] -= SHA256M_A;
14245 digest[1] -= SHA256M_B;
14246 digest[2] -= SHA256M_C;
14247 digest[3] -= SHA256M_D;
14248 digest[4] -= SHA256M_E;
14249 digest[5] -= SHA256M_F;
14250 digest[6] -= SHA256M_G;
14251 digest[7] -= SHA256M_H;
14252
14253 char *salt_buf_ptr = (char *) salt->salt_buf;
14254
14255 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14256
14257 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14258
14259 salt->salt_len = salt_len;
14260
14261 return (PARSER_OK);
14262 }
14263
14264 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14265 {
14266 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14267
14268 u32 *digest = (u32 *) hash_buf->digest;
14269
14270 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14271
14272 salt_t *salt = hash_buf->salt;
14273
14274 char *salt_buf = input_buf + 6;
14275
14276 char *digest_buf = strchr (salt_buf, '$');
14277
14278 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14279
14280 uint salt_len = digest_buf - salt_buf;
14281
14282 digest_buf++; // skip the '$' symbol
14283
14284 char *salt_buf_ptr = (char *) salt->salt_buf;
14285
14286 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14287
14288 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14289
14290 salt->salt_len = salt_len;
14291
14292 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14293 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14294 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14295 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14296
14297 digest[0] = byte_swap_32 (digest[0]);
14298 digest[1] = byte_swap_32 (digest[1]);
14299 digest[2] = byte_swap_32 (digest[2]);
14300 digest[3] = byte_swap_32 (digest[3]);
14301
14302 digest[0] -= MD5M_A;
14303 digest[1] -= MD5M_B;
14304 digest[2] -= MD5M_C;
14305 digest[3] -= MD5M_D;
14306
14307 return (PARSER_OK);
14308 }
14309
14310 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14311 {
14312 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14313
14314 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14315
14316 u32 *digest = (u32 *) hash_buf->digest;
14317
14318 salt_t *salt = hash_buf->salt;
14319
14320 char *salt_buf = input_buf + 3;
14321
14322 char *digest_buf = strchr (salt_buf, '$');
14323
14324 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14325
14326 uint salt_len = digest_buf - salt_buf;
14327
14328 digest_buf++; // skip the '$' symbol
14329
14330 char *salt_buf_ptr = (char *) salt->salt_buf;
14331
14332 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14333
14334 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14335
14336 salt_buf_ptr[salt_len] = 0x2d;
14337
14338 salt->salt_len = salt_len + 1;
14339
14340 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14341 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14342 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14343 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14344
14345 digest[0] = byte_swap_32 (digest[0]);
14346 digest[1] = byte_swap_32 (digest[1]);
14347 digest[2] = byte_swap_32 (digest[2]);
14348 digest[3] = byte_swap_32 (digest[3]);
14349
14350 digest[0] -= MD5M_A;
14351 digest[1] -= MD5M_B;
14352 digest[2] -= MD5M_C;
14353 digest[3] -= MD5M_D;
14354
14355 return (PARSER_OK);
14356 }
14357
14358 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14359 {
14360 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14361
14362 u32 *digest = (u32 *) hash_buf->digest;
14363
14364 u8 tmp_buf[100] = { 0 };
14365
14366 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14367
14368 memcpy (digest, tmp_buf, 20);
14369
14370 digest[0] = byte_swap_32 (digest[0]);
14371 digest[1] = byte_swap_32 (digest[1]);
14372 digest[2] = byte_swap_32 (digest[2]);
14373 digest[3] = byte_swap_32 (digest[3]);
14374 digest[4] = byte_swap_32 (digest[4]);
14375
14376 digest[0] -= SHA1M_A;
14377 digest[1] -= SHA1M_B;
14378 digest[2] -= SHA1M_C;
14379 digest[3] -= SHA1M_D;
14380 digest[4] -= SHA1M_E;
14381
14382 return (PARSER_OK);
14383 }
14384
14385 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14386 {
14387 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14388
14389 u32 *digest = (u32 *) hash_buf->digest;
14390
14391 salt_t *salt = hash_buf->salt;
14392
14393 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14394 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14395 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14396 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14397
14398 digest[0] = byte_swap_32 (digest[0]);
14399 digest[1] = byte_swap_32 (digest[1]);
14400 digest[2] = byte_swap_32 (digest[2]);
14401 digest[3] = byte_swap_32 (digest[3]);
14402
14403 digest[0] -= MD5M_A;
14404 digest[1] -= MD5M_B;
14405 digest[2] -= MD5M_C;
14406 digest[3] -= MD5M_D;
14407
14408 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14409
14410 uint salt_len = input_len - 32 - 1;
14411
14412 char *salt_buf = input_buf + 32 + 1;
14413
14414 char *salt_buf_ptr = (char *) salt->salt_buf;
14415
14416 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14417
14418 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14419
14420 /*
14421 * add static "salt" part
14422 */
14423
14424 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14425
14426 salt_len += 8;
14427
14428 salt->salt_len = salt_len;
14429
14430 return (PARSER_OK);
14431 }
14432
14433 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14434 {
14435 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14436
14437 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14438
14439 u32 *digest = (u32 *) hash_buf->digest;
14440
14441 salt_t *salt = hash_buf->salt;
14442
14443 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14444
14445 /**
14446 * parse line
14447 */
14448
14449 char *saltlen_pos = input_buf + 1 + 3 + 1;
14450
14451 char *saltbuf_pos = strchr (saltlen_pos, '$');
14452
14453 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14454
14455 uint saltlen_len = saltbuf_pos - saltlen_pos;
14456
14457 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14458
14459 saltbuf_pos++;
14460
14461 char *keylen_pos = strchr (saltbuf_pos, '$');
14462
14463 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14464
14465 uint saltbuf_len = keylen_pos - saltbuf_pos;
14466
14467 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14468
14469 keylen_pos++;
14470
14471 char *keybuf_pos = strchr (keylen_pos, '$');
14472
14473 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14474
14475 uint keylen_len = keybuf_pos - keylen_pos;
14476
14477 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14478
14479 keybuf_pos++;
14480
14481 char *databuf_pos = strchr (keybuf_pos, '$');
14482
14483 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14484
14485 uint keybuf_len = databuf_pos - keybuf_pos;
14486
14487 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14488
14489 databuf_pos++;
14490
14491 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14492
14493 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14494
14495 /**
14496 * copy data
14497 */
14498
14499 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14500 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14501 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14502 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14503
14504 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14505 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14506 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14507 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14508
14509 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14510 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14511 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14512 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14513
14514 salt->salt_len = 16;
14515 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14516
14517 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14518 {
14519 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14520 }
14521
14522 return (PARSER_OK);
14523 }
14524
14525 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14526 {
14527 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14528
14529 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14530
14531 u32 *digest = (u32 *) hash_buf->digest;
14532
14533 salt_t *salt = hash_buf->salt;
14534
14535 /**
14536 * parse line
14537 */
14538
14539 // first is the N salt parameter
14540
14541 char *N_pos = input_buf + 6;
14542
14543 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14544
14545 N_pos++;
14546
14547 salt->scrypt_N = atoi (N_pos);
14548
14549 // r
14550
14551 char *r_pos = strchr (N_pos, ':');
14552
14553 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14554
14555 r_pos++;
14556
14557 salt->scrypt_r = atoi (r_pos);
14558
14559 // p
14560
14561 char *p_pos = strchr (r_pos, ':');
14562
14563 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14564
14565 p_pos++;
14566
14567 salt->scrypt_p = atoi (p_pos);
14568
14569 // salt
14570
14571 char *saltbuf_pos = strchr (p_pos, ':');
14572
14573 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14574
14575 saltbuf_pos++;
14576
14577 char *hash_pos = strchr (saltbuf_pos, ':');
14578
14579 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14580
14581 hash_pos++;
14582
14583 // base64 decode
14584
14585 u8 tmp_buf[33] = { 0 };
14586
14587 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14588
14589 char *salt_buf_ptr = (char *) salt->salt_buf;
14590
14591 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14592
14593 salt->salt_len = tmp_len;
14594 salt->salt_iter = 1;
14595
14596 // digest - base64 decode
14597
14598 memset (tmp_buf, 0, sizeof (tmp_buf));
14599
14600 tmp_len = input_len - (hash_pos - input_buf);
14601
14602 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14603
14604 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14605
14606 memcpy (digest, tmp_buf, 32);
14607
14608 return (PARSER_OK);
14609 }
14610
14611 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14612 {
14613 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14614
14615 u32 *digest = (u32 *) hash_buf->digest;
14616
14617 salt_t *salt = hash_buf->salt;
14618
14619 /**
14620 * parse line
14621 */
14622
14623 char decrypted[76] = { 0 }; // iv + hash
14624
14625 juniper_decrypt_hash (input_buf, decrypted);
14626
14627 char *md5crypt_hash = decrypted + 12;
14628
14629 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14630
14631 salt->salt_iter = ROUNDS_MD5CRYPT;
14632
14633 char *salt_pos = md5crypt_hash + 3;
14634
14635 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14636
14637 salt->salt_len = hash_pos - salt_pos; // should be 8
14638
14639 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14640
14641 hash_pos++;
14642
14643 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14644
14645 return (PARSER_OK);
14646 }
14647
14648 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14649 {
14650 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14651
14652 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14653
14654 u32 *digest = (u32 *) hash_buf->digest;
14655
14656 salt_t *salt = hash_buf->salt;
14657
14658 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14659
14660 /**
14661 * parse line
14662 */
14663
14664 // first is *raw* salt
14665
14666 char *salt_pos = input_buf + 3;
14667
14668 char *hash_pos = strchr (salt_pos, '$');
14669
14670 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14671
14672 uint salt_len = hash_pos - salt_pos;
14673
14674 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14675
14676 hash_pos++;
14677
14678 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14679
14680 memcpy (salt_buf_ptr, salt_pos, 14);
14681
14682 salt_buf_ptr[17] = 0x01;
14683 salt_buf_ptr[18] = 0x80;
14684
14685 // add some stuff to normal salt to make sorted happy
14686
14687 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14688 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14689 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14690 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14691
14692 salt->salt_len = salt_len;
14693 salt->salt_iter = ROUNDS_CISCO8 - 1;
14694
14695 // base64 decode hash
14696
14697 u8 tmp_buf[100] = { 0 };
14698
14699 uint hash_len = input_len - 3 - salt_len - 1;
14700
14701 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14702
14703 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14704
14705 memcpy (digest, tmp_buf, 32);
14706
14707 digest[0] = byte_swap_32 (digest[0]);
14708 digest[1] = byte_swap_32 (digest[1]);
14709 digest[2] = byte_swap_32 (digest[2]);
14710 digest[3] = byte_swap_32 (digest[3]);
14711 digest[4] = byte_swap_32 (digest[4]);
14712 digest[5] = byte_swap_32 (digest[5]);
14713 digest[6] = byte_swap_32 (digest[6]);
14714 digest[7] = byte_swap_32 (digest[7]);
14715
14716 return (PARSER_OK);
14717 }
14718
14719 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14720 {
14721 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14722
14723 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14724
14725 u32 *digest = (u32 *) hash_buf->digest;
14726
14727 salt_t *salt = hash_buf->salt;
14728
14729 /**
14730 * parse line
14731 */
14732
14733 // first is *raw* salt
14734
14735 char *salt_pos = input_buf + 3;
14736
14737 char *hash_pos = strchr (salt_pos, '$');
14738
14739 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14740
14741 uint salt_len = hash_pos - salt_pos;
14742
14743 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14744
14745 salt->salt_len = salt_len;
14746 hash_pos++;
14747
14748 char *salt_buf_ptr = (char *) salt->salt_buf;
14749
14750 memcpy (salt_buf_ptr, salt_pos, salt_len);
14751 salt_buf_ptr[salt_len] = 0;
14752
14753 // base64 decode hash
14754
14755 u8 tmp_buf[100] = { 0 };
14756
14757 uint hash_len = input_len - 3 - salt_len - 1;
14758
14759 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14760
14761 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14762
14763 memcpy (digest, tmp_buf, 32);
14764
14765 // fixed:
14766 salt->scrypt_N = 16384;
14767 salt->scrypt_r = 1;
14768 salt->scrypt_p = 1;
14769 salt->salt_iter = 1;
14770
14771 return (PARSER_OK);
14772 }
14773
14774 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14775 {
14776 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14777
14778 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14779
14780 u32 *digest = (u32 *) hash_buf->digest;
14781
14782 salt_t *salt = hash_buf->salt;
14783
14784 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14785
14786 /**
14787 * parse line
14788 */
14789
14790 char *version_pos = input_buf + 8 + 1;
14791
14792 char *verifierHashSize_pos = strchr (version_pos, '*');
14793
14794 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14795
14796 u32 version_len = verifierHashSize_pos - version_pos;
14797
14798 if (version_len != 4) return (PARSER_SALT_LENGTH);
14799
14800 verifierHashSize_pos++;
14801
14802 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14803
14804 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14805
14806 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14807
14808 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14809
14810 keySize_pos++;
14811
14812 char *saltSize_pos = strchr (keySize_pos, '*');
14813
14814 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14815
14816 u32 keySize_len = saltSize_pos - keySize_pos;
14817
14818 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14819
14820 saltSize_pos++;
14821
14822 char *osalt_pos = strchr (saltSize_pos, '*');
14823
14824 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14825
14826 u32 saltSize_len = osalt_pos - saltSize_pos;
14827
14828 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14829
14830 osalt_pos++;
14831
14832 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14833
14834 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14835
14836 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14837
14838 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14839
14840 encryptedVerifier_pos++;
14841
14842 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14843
14844 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14845
14846 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14847
14848 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14849
14850 encryptedVerifierHash_pos++;
14851
14852 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;
14853
14854 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14855
14856 const uint version = atoi (version_pos);
14857
14858 if (version != 2007) return (PARSER_SALT_VALUE);
14859
14860 const uint verifierHashSize = atoi (verifierHashSize_pos);
14861
14862 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14863
14864 const uint keySize = atoi (keySize_pos);
14865
14866 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14867
14868 office2007->keySize = keySize;
14869
14870 const uint saltSize = atoi (saltSize_pos);
14871
14872 if (saltSize != 16) return (PARSER_SALT_VALUE);
14873
14874 /**
14875 * salt
14876 */
14877
14878 salt->salt_len = 16;
14879 salt->salt_iter = ROUNDS_OFFICE2007;
14880
14881 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14882 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14883 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14884 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14885
14886 /**
14887 * esalt
14888 */
14889
14890 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14891 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14892 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14893 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14894
14895 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14896 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14897 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14898 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14899 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14900
14901 /**
14902 * digest
14903 */
14904
14905 digest[0] = office2007->encryptedVerifierHash[0];
14906 digest[1] = office2007->encryptedVerifierHash[1];
14907 digest[2] = office2007->encryptedVerifierHash[2];
14908 digest[3] = office2007->encryptedVerifierHash[3];
14909
14910 return (PARSER_OK);
14911 }
14912
14913 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14914 {
14915 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14916
14917 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14918
14919 u32 *digest = (u32 *) hash_buf->digest;
14920
14921 salt_t *salt = hash_buf->salt;
14922
14923 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14924
14925 /**
14926 * parse line
14927 */
14928
14929 char *version_pos = input_buf + 8 + 1;
14930
14931 char *spinCount_pos = strchr (version_pos, '*');
14932
14933 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14934
14935 u32 version_len = spinCount_pos - version_pos;
14936
14937 if (version_len != 4) return (PARSER_SALT_LENGTH);
14938
14939 spinCount_pos++;
14940
14941 char *keySize_pos = strchr (spinCount_pos, '*');
14942
14943 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14944
14945 u32 spinCount_len = keySize_pos - spinCount_pos;
14946
14947 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14948
14949 keySize_pos++;
14950
14951 char *saltSize_pos = strchr (keySize_pos, '*');
14952
14953 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14954
14955 u32 keySize_len = saltSize_pos - keySize_pos;
14956
14957 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14958
14959 saltSize_pos++;
14960
14961 char *osalt_pos = strchr (saltSize_pos, '*');
14962
14963 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14964
14965 u32 saltSize_len = osalt_pos - saltSize_pos;
14966
14967 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14968
14969 osalt_pos++;
14970
14971 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14972
14973 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14974
14975 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14976
14977 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14978
14979 encryptedVerifier_pos++;
14980
14981 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14982
14983 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14984
14985 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14986
14987 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14988
14989 encryptedVerifierHash_pos++;
14990
14991 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;
14992
14993 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14994
14995 const uint version = atoi (version_pos);
14996
14997 if (version != 2010) return (PARSER_SALT_VALUE);
14998
14999 const uint spinCount = atoi (spinCount_pos);
15000
15001 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15002
15003 const uint keySize = atoi (keySize_pos);
15004
15005 if (keySize != 128) return (PARSER_SALT_VALUE);
15006
15007 const uint saltSize = atoi (saltSize_pos);
15008
15009 if (saltSize != 16) return (PARSER_SALT_VALUE);
15010
15011 /**
15012 * salt
15013 */
15014
15015 salt->salt_len = 16;
15016 salt->salt_iter = spinCount;
15017
15018 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15019 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15020 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15021 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15022
15023 /**
15024 * esalt
15025 */
15026
15027 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15028 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15029 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15030 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15031
15032 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15033 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15034 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15035 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15036 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15037 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15038 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15039 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15040
15041 /**
15042 * digest
15043 */
15044
15045 digest[0] = office2010->encryptedVerifierHash[0];
15046 digest[1] = office2010->encryptedVerifierHash[1];
15047 digest[2] = office2010->encryptedVerifierHash[2];
15048 digest[3] = office2010->encryptedVerifierHash[3];
15049
15050 return (PARSER_OK);
15051 }
15052
15053 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15054 {
15055 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15056
15057 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15058
15059 u32 *digest = (u32 *) hash_buf->digest;
15060
15061 salt_t *salt = hash_buf->salt;
15062
15063 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15064
15065 /**
15066 * parse line
15067 */
15068
15069 char *version_pos = input_buf + 8 + 1;
15070
15071 char *spinCount_pos = strchr (version_pos, '*');
15072
15073 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15074
15075 u32 version_len = spinCount_pos - version_pos;
15076
15077 if (version_len != 4) return (PARSER_SALT_LENGTH);
15078
15079 spinCount_pos++;
15080
15081 char *keySize_pos = strchr (spinCount_pos, '*');
15082
15083 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15084
15085 u32 spinCount_len = keySize_pos - spinCount_pos;
15086
15087 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15088
15089 keySize_pos++;
15090
15091 char *saltSize_pos = strchr (keySize_pos, '*');
15092
15093 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15094
15095 u32 keySize_len = saltSize_pos - keySize_pos;
15096
15097 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15098
15099 saltSize_pos++;
15100
15101 char *osalt_pos = strchr (saltSize_pos, '*');
15102
15103 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15104
15105 u32 saltSize_len = osalt_pos - saltSize_pos;
15106
15107 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15108
15109 osalt_pos++;
15110
15111 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15112
15113 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15114
15115 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15116
15117 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15118
15119 encryptedVerifier_pos++;
15120
15121 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15122
15123 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15124
15125 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15126
15127 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15128
15129 encryptedVerifierHash_pos++;
15130
15131 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;
15132
15133 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15134
15135 const uint version = atoi (version_pos);
15136
15137 if (version != 2013) return (PARSER_SALT_VALUE);
15138
15139 const uint spinCount = atoi (spinCount_pos);
15140
15141 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15142
15143 const uint keySize = atoi (keySize_pos);
15144
15145 if (keySize != 256) return (PARSER_SALT_VALUE);
15146
15147 const uint saltSize = atoi (saltSize_pos);
15148
15149 if (saltSize != 16) return (PARSER_SALT_VALUE);
15150
15151 /**
15152 * salt
15153 */
15154
15155 salt->salt_len = 16;
15156 salt->salt_iter = spinCount;
15157
15158 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15159 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15160 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15161 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15162
15163 /**
15164 * esalt
15165 */
15166
15167 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15168 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15169 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15170 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15171
15172 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15173 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15174 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15175 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15176 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15177 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15178 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15179 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15180
15181 /**
15182 * digest
15183 */
15184
15185 digest[0] = office2013->encryptedVerifierHash[0];
15186 digest[1] = office2013->encryptedVerifierHash[1];
15187 digest[2] = office2013->encryptedVerifierHash[2];
15188 digest[3] = office2013->encryptedVerifierHash[3];
15189
15190 return (PARSER_OK);
15191 }
15192
15193 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15194 {
15195 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15196
15197 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15198
15199 u32 *digest = (u32 *) hash_buf->digest;
15200
15201 salt_t *salt = hash_buf->salt;
15202
15203 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15204
15205 /**
15206 * parse line
15207 */
15208
15209 char *version_pos = input_buf + 11;
15210
15211 char *osalt_pos = strchr (version_pos, '*');
15212
15213 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15214
15215 u32 version_len = osalt_pos - version_pos;
15216
15217 if (version_len != 1) return (PARSER_SALT_LENGTH);
15218
15219 osalt_pos++;
15220
15221 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15222
15223 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15224
15225 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15226
15227 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15228
15229 encryptedVerifier_pos++;
15230
15231 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15232
15233 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15234
15235 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15236
15237 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15238
15239 encryptedVerifierHash_pos++;
15240
15241 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15242
15243 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15244
15245 const uint version = *version_pos - 0x30;
15246
15247 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15248
15249 /**
15250 * esalt
15251 */
15252
15253 oldoffice01->version = version;
15254
15255 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15256 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15257 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15258 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15259
15260 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15261 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15262 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15263 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15264
15265 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15266 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15267 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15268 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15269
15270 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15271 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15272 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15273 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15274
15275 /**
15276 * salt
15277 */
15278
15279 salt->salt_len = 16;
15280
15281 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15282 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15283 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15284 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15285
15286 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15287 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15288 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15289 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15290
15291 // this is a workaround as office produces multiple documents with the same salt
15292
15293 salt->salt_len += 32;
15294
15295 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15296 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15297 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15298 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15299 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15300 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15301 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15302 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15303
15304 /**
15305 * digest
15306 */
15307
15308 digest[0] = oldoffice01->encryptedVerifierHash[0];
15309 digest[1] = oldoffice01->encryptedVerifierHash[1];
15310 digest[2] = oldoffice01->encryptedVerifierHash[2];
15311 digest[3] = oldoffice01->encryptedVerifierHash[3];
15312
15313 return (PARSER_OK);
15314 }
15315
15316 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15317 {
15318 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15319 }
15320
15321 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15322 {
15323 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15324
15325 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15326
15327 u32 *digest = (u32 *) hash_buf->digest;
15328
15329 salt_t *salt = hash_buf->salt;
15330
15331 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15332
15333 /**
15334 * parse line
15335 */
15336
15337 char *version_pos = input_buf + 11;
15338
15339 char *osalt_pos = strchr (version_pos, '*');
15340
15341 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15342
15343 u32 version_len = osalt_pos - version_pos;
15344
15345 if (version_len != 1) return (PARSER_SALT_LENGTH);
15346
15347 osalt_pos++;
15348
15349 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15350
15351 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15352
15353 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15354
15355 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15356
15357 encryptedVerifier_pos++;
15358
15359 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15360
15361 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15362
15363 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15364
15365 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15366
15367 encryptedVerifierHash_pos++;
15368
15369 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15370
15371 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15372
15373 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15374
15375 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15376
15377 rc4key_pos++;
15378
15379 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15380
15381 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15382
15383 const uint version = *version_pos - 0x30;
15384
15385 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15386
15387 /**
15388 * esalt
15389 */
15390
15391 oldoffice01->version = version;
15392
15393 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15394 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15395 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15396 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15397
15398 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15399 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15400 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15401 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15402
15403 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15404 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15405 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15406 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15407
15408 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15409 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15410 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15411 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15412
15413 oldoffice01->rc4key[1] = 0;
15414 oldoffice01->rc4key[0] = 0;
15415
15416 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15417 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15418 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15419 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15420 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15421 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15422 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15423 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15424 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15425 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15426
15427 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15428 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15429
15430 /**
15431 * salt
15432 */
15433
15434 salt->salt_len = 16;
15435
15436 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15437 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15438 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15439 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15440
15441 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15442 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15443 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15444 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15445
15446 // this is a workaround as office produces multiple documents with the same salt
15447
15448 salt->salt_len += 32;
15449
15450 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15451 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15452 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15453 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15454 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15455 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15456 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15457 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15458
15459 /**
15460 * digest
15461 */
15462
15463 digest[0] = oldoffice01->rc4key[0];
15464 digest[1] = oldoffice01->rc4key[1];
15465 digest[2] = 0;
15466 digest[3] = 0;
15467
15468 return (PARSER_OK);
15469 }
15470
15471 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15472 {
15473 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15474
15475 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15476
15477 u32 *digest = (u32 *) hash_buf->digest;
15478
15479 salt_t *salt = hash_buf->salt;
15480
15481 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15482
15483 /**
15484 * parse line
15485 */
15486
15487 char *version_pos = input_buf + 11;
15488
15489 char *osalt_pos = strchr (version_pos, '*');
15490
15491 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15492
15493 u32 version_len = osalt_pos - version_pos;
15494
15495 if (version_len != 1) return (PARSER_SALT_LENGTH);
15496
15497 osalt_pos++;
15498
15499 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15500
15501 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15502
15503 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15504
15505 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15506
15507 encryptedVerifier_pos++;
15508
15509 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15510
15511 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15512
15513 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15514
15515 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15516
15517 encryptedVerifierHash_pos++;
15518
15519 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15520
15521 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15522
15523 const uint version = *version_pos - 0x30;
15524
15525 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15526
15527 /**
15528 * esalt
15529 */
15530
15531 oldoffice34->version = version;
15532
15533 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15534 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15535 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15536 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15537
15538 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15539 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15540 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15541 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15542
15543 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15544 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15545 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15546 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15547 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15548
15549 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15550 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15551 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15552 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15553 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15554
15555 /**
15556 * salt
15557 */
15558
15559 salt->salt_len = 16;
15560
15561 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15562 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15563 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15564 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15565
15566 // this is a workaround as office produces multiple documents with the same salt
15567
15568 salt->salt_len += 32;
15569
15570 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15571 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15572 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15573 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15574 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15575 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15576 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15577 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15578
15579 /**
15580 * digest
15581 */
15582
15583 digest[0] = oldoffice34->encryptedVerifierHash[0];
15584 digest[1] = oldoffice34->encryptedVerifierHash[1];
15585 digest[2] = oldoffice34->encryptedVerifierHash[2];
15586 digest[3] = oldoffice34->encryptedVerifierHash[3];
15587
15588 return (PARSER_OK);
15589 }
15590
15591 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15592 {
15593 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15594
15595 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15596 }
15597
15598 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15599 {
15600 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15601
15602 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15603
15604 u32 *digest = (u32 *) hash_buf->digest;
15605
15606 salt_t *salt = hash_buf->salt;
15607
15608 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15609
15610 /**
15611 * parse line
15612 */
15613
15614 char *version_pos = input_buf + 11;
15615
15616 char *osalt_pos = strchr (version_pos, '*');
15617
15618 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15619
15620 u32 version_len = osalt_pos - version_pos;
15621
15622 if (version_len != 1) return (PARSER_SALT_LENGTH);
15623
15624 osalt_pos++;
15625
15626 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15627
15628 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15629
15630 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15631
15632 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15633
15634 encryptedVerifier_pos++;
15635
15636 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15637
15638 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15639
15640 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15641
15642 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15643
15644 encryptedVerifierHash_pos++;
15645
15646 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15647
15648 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15649
15650 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15651
15652 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15653
15654 rc4key_pos++;
15655
15656 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15657
15658 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15659
15660 const uint version = *version_pos - 0x30;
15661
15662 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15663
15664 /**
15665 * esalt
15666 */
15667
15668 oldoffice34->version = version;
15669
15670 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15671 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15672 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15673 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15674
15675 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15676 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15677 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15678 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15679
15680 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15681 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15682 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15683 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15684 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15685
15686 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15687 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15688 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15689 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15690 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15691
15692 oldoffice34->rc4key[1] = 0;
15693 oldoffice34->rc4key[0] = 0;
15694
15695 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15696 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15697 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15698 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15699 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15700 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15701 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15702 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15703 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15704 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15705
15706 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15707 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15708
15709 /**
15710 * salt
15711 */
15712
15713 salt->salt_len = 16;
15714
15715 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15716 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15717 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15718 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15719
15720 // this is a workaround as office produces multiple documents with the same salt
15721
15722 salt->salt_len += 32;
15723
15724 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15725 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15726 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15727 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15728 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15729 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15730 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15731 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15732
15733 /**
15734 * digest
15735 */
15736
15737 digest[0] = oldoffice34->rc4key[0];
15738 digest[1] = oldoffice34->rc4key[1];
15739 digest[2] = 0;
15740 digest[3] = 0;
15741
15742 return (PARSER_OK);
15743 }
15744
15745 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15746 {
15747 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15748
15749 u32 *digest = (u32 *) hash_buf->digest;
15750
15751 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15752 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15753 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15754 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15755
15756 digest[0] = byte_swap_32 (digest[0]);
15757 digest[1] = byte_swap_32 (digest[1]);
15758 digest[2] = byte_swap_32 (digest[2]);
15759 digest[3] = byte_swap_32 (digest[3]);
15760
15761 return (PARSER_OK);
15762 }
15763
15764 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15765 {
15766 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15767
15768 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15769
15770 u32 *digest = (u32 *) hash_buf->digest;
15771
15772 salt_t *salt = hash_buf->salt;
15773
15774 char *signature_pos = input_buf;
15775
15776 char *salt_pos = strchr (signature_pos, '$');
15777
15778 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15779
15780 u32 signature_len = salt_pos - signature_pos;
15781
15782 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15783
15784 salt_pos++;
15785
15786 char *hash_pos = strchr (salt_pos, '$');
15787
15788 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15789
15790 u32 salt_len = hash_pos - salt_pos;
15791
15792 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15793
15794 hash_pos++;
15795
15796 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15797
15798 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15799
15800 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15801 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15802 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15803 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15804 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15805
15806 digest[0] -= SHA1M_A;
15807 digest[1] -= SHA1M_B;
15808 digest[2] -= SHA1M_C;
15809 digest[3] -= SHA1M_D;
15810 digest[4] -= SHA1M_E;
15811
15812 char *salt_buf_ptr = (char *) salt->salt_buf;
15813
15814 memcpy (salt_buf_ptr, salt_pos, salt_len);
15815
15816 salt->salt_len = salt_len;
15817
15818 return (PARSER_OK);
15819 }
15820
15821 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15822 {
15823 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15824
15825 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15826
15827 u32 *digest = (u32 *) hash_buf->digest;
15828
15829 salt_t *salt = hash_buf->salt;
15830
15831 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15832
15833 /**
15834 * parse line
15835 */
15836
15837 char *iter_pos = input_buf + 14;
15838
15839 const int iter = atoi (iter_pos);
15840
15841 if (iter < 1) return (PARSER_SALT_ITERATION);
15842
15843 salt->salt_iter = iter - 1;
15844
15845 char *salt_pos = strchr (iter_pos, '$');
15846
15847 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15848
15849 salt_pos++;
15850
15851 char *hash_pos = strchr (salt_pos, '$');
15852
15853 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15854
15855 const uint salt_len = hash_pos - salt_pos;
15856
15857 hash_pos++;
15858
15859 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15860
15861 memcpy (salt_buf_ptr, salt_pos, salt_len);
15862
15863 salt->salt_len = salt_len;
15864
15865 salt_buf_ptr[salt_len + 3] = 0x01;
15866 salt_buf_ptr[salt_len + 4] = 0x80;
15867
15868 // add some stuff to normal salt to make sorted happy
15869
15870 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15871 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15872 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15873 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15874 salt->salt_buf[4] = salt->salt_iter;
15875
15876 // base64 decode hash
15877
15878 u8 tmp_buf[100] = { 0 };
15879
15880 uint hash_len = input_len - (hash_pos - input_buf);
15881
15882 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15883
15884 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15885
15886 memcpy (digest, tmp_buf, 32);
15887
15888 digest[0] = byte_swap_32 (digest[0]);
15889 digest[1] = byte_swap_32 (digest[1]);
15890 digest[2] = byte_swap_32 (digest[2]);
15891 digest[3] = byte_swap_32 (digest[3]);
15892 digest[4] = byte_swap_32 (digest[4]);
15893 digest[5] = byte_swap_32 (digest[5]);
15894 digest[6] = byte_swap_32 (digest[6]);
15895 digest[7] = byte_swap_32 (digest[7]);
15896
15897 return (PARSER_OK);
15898 }
15899
15900 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15901 {
15902 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15903
15904 u32 *digest = (u32 *) hash_buf->digest;
15905
15906 salt_t *salt = hash_buf->salt;
15907
15908 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15909 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15910 digest[2] = 0;
15911 digest[3] = 0;
15912
15913 digest[0] = byte_swap_32 (digest[0]);
15914 digest[1] = byte_swap_32 (digest[1]);
15915
15916 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15917 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15918 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15919
15920 char iter_c = input_buf[17];
15921 char iter_d = input_buf[19];
15922
15923 // atm only defaults, let's see if there's more request
15924 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15925 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15926
15927 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15928
15929 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
15930 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
15931 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
15932 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
15933
15934 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15935 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15936 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15937 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15938
15939 salt->salt_len = 16;
15940
15941 return (PARSER_OK);
15942 }
15943
15944 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15945 {
15946 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15947
15948 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15949
15950 u32 *digest = (u32 *) hash_buf->digest;
15951
15952 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15953
15954 salt_t *salt = hash_buf->salt;
15955
15956 char *salt_pos = input_buf + 10;
15957
15958 char *hash_pos = strchr (salt_pos, '$');
15959
15960 uint salt_len = hash_pos - salt_pos;
15961
15962 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15963
15964 hash_pos++;
15965
15966 uint hash_len = input_len - 10 - salt_len - 1;
15967
15968 // base64 decode salt
15969
15970 u8 tmp_buf[100] = { 0 };
15971
15972 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
15973
15974 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15975
15976 tmp_buf[salt_len] = 0x80;
15977
15978 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15979
15980 salt->salt_len = salt_len;
15981
15982 // base64 decode salt
15983
15984 memset (tmp_buf, 0, sizeof (tmp_buf));
15985
15986 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15987
15988 uint user_len = hash_len - 32;
15989
15990 const u8 *tmp_hash = tmp_buf + user_len;
15991
15992 user_len--; // skip the trailing space
15993
15994 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
15995 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
15996 digest[2] = hex_to_u32 (&tmp_hash[16]);
15997 digest[3] = hex_to_u32 (&tmp_hash[24]);
15998
15999 digest[0] = byte_swap_32 (digest[0]);
16000 digest[1] = byte_swap_32 (digest[1]);
16001 digest[2] = byte_swap_32 (digest[2]);
16002 digest[3] = byte_swap_32 (digest[3]);
16003
16004 // store username for host only (output hash if cracked)
16005
16006 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16007 memcpy (cram_md5->user, tmp_buf, user_len);
16008
16009 return (PARSER_OK);
16010 }
16011
16012 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16013 {
16014 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16015
16016 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16017
16018 u32 *digest = (u32 *) hash_buf->digest;
16019
16020 salt_t *salt = hash_buf->salt;
16021
16022 char *iter_pos = input_buf + 10;
16023
16024 u32 iter = atoi (iter_pos);
16025
16026 if (iter < 1)
16027 {
16028 return (PARSER_SALT_ITERATION);
16029 }
16030
16031 iter--; // first iteration is special
16032
16033 salt->salt_iter = iter;
16034
16035 char *base64_pos = strchr (iter_pos, '}');
16036
16037 if (base64_pos == NULL)
16038 {
16039 return (PARSER_SIGNATURE_UNMATCHED);
16040 }
16041
16042 base64_pos++;
16043
16044 // base64 decode salt
16045
16046 u32 base64_len = input_len - (base64_pos - input_buf);
16047
16048 u8 tmp_buf[100] = { 0 };
16049
16050 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16051
16052 if (decoded_len < 24)
16053 {
16054 return (PARSER_SALT_LENGTH);
16055 }
16056
16057 // copy the salt
16058
16059 uint salt_len = decoded_len - 20;
16060
16061 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16062 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16063
16064 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16065
16066 salt->salt_len = salt_len;
16067
16068 // set digest
16069
16070 u32 *digest_ptr = (u32*) tmp_buf;
16071
16072 digest[0] = byte_swap_32 (digest_ptr[0]);
16073 digest[1] = byte_swap_32 (digest_ptr[1]);
16074 digest[2] = byte_swap_32 (digest_ptr[2]);
16075 digest[3] = byte_swap_32 (digest_ptr[3]);
16076 digest[4] = byte_swap_32 (digest_ptr[4]);
16077
16078 return (PARSER_OK);
16079 }
16080
16081 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16082 {
16083 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16084
16085 u32 *digest = (u32 *) hash_buf->digest;
16086
16087 salt_t *salt = hash_buf->salt;
16088
16089 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16090 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16091 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16092 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16093 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16094
16095 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16096
16097 uint salt_len = input_len - 40 - 1;
16098
16099 char *salt_buf = input_buf + 40 + 1;
16100
16101 char *salt_buf_ptr = (char *) salt->salt_buf;
16102
16103 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16104
16105 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16106
16107 salt->salt_len = salt_len;
16108
16109 return (PARSER_OK);
16110 }
16111
16112 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16113 {
16114 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16115
16116 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16117
16118 u32 *digest = (u32 *) hash_buf->digest;
16119
16120 salt_t *salt = hash_buf->salt;
16121
16122 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16123
16124 /**
16125 * parse line
16126 */
16127
16128 char *V_pos = input_buf + 5;
16129
16130 char *R_pos = strchr (V_pos, '*');
16131
16132 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16133
16134 u32 V_len = R_pos - V_pos;
16135
16136 R_pos++;
16137
16138 char *bits_pos = strchr (R_pos, '*');
16139
16140 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16141
16142 u32 R_len = bits_pos - R_pos;
16143
16144 bits_pos++;
16145
16146 char *P_pos = strchr (bits_pos, '*');
16147
16148 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16149
16150 u32 bits_len = P_pos - bits_pos;
16151
16152 P_pos++;
16153
16154 char *enc_md_pos = strchr (P_pos, '*');
16155
16156 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16157
16158 u32 P_len = enc_md_pos - P_pos;
16159
16160 enc_md_pos++;
16161
16162 char *id_len_pos = strchr (enc_md_pos, '*');
16163
16164 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16165
16166 u32 enc_md_len = id_len_pos - enc_md_pos;
16167
16168 id_len_pos++;
16169
16170 char *id_buf_pos = strchr (id_len_pos, '*');
16171
16172 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16173
16174 u32 id_len_len = id_buf_pos - id_len_pos;
16175
16176 id_buf_pos++;
16177
16178 char *u_len_pos = strchr (id_buf_pos, '*');
16179
16180 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16181
16182 u32 id_buf_len = u_len_pos - id_buf_pos;
16183
16184 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16185
16186 u_len_pos++;
16187
16188 char *u_buf_pos = strchr (u_len_pos, '*');
16189
16190 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16191
16192 u32 u_len_len = u_buf_pos - u_len_pos;
16193
16194 u_buf_pos++;
16195
16196 char *o_len_pos = strchr (u_buf_pos, '*');
16197
16198 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16199
16200 u32 u_buf_len = o_len_pos - u_buf_pos;
16201
16202 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16203
16204 o_len_pos++;
16205
16206 char *o_buf_pos = strchr (o_len_pos, '*');
16207
16208 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16209
16210 u32 o_len_len = o_buf_pos - o_len_pos;
16211
16212 o_buf_pos++;
16213
16214 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;
16215
16216 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16217
16218 // validate data
16219
16220 const int V = atoi (V_pos);
16221 const int R = atoi (R_pos);
16222 const int P = atoi (P_pos);
16223
16224 if (V != 1) return (PARSER_SALT_VALUE);
16225 if (R != 2) return (PARSER_SALT_VALUE);
16226
16227 const int enc_md = atoi (enc_md_pos);
16228
16229 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16230
16231 const int id_len = atoi (id_len_pos);
16232 const int u_len = atoi (u_len_pos);
16233 const int o_len = atoi (o_len_pos);
16234
16235 if (id_len != 16) return (PARSER_SALT_VALUE);
16236 if (u_len != 32) return (PARSER_SALT_VALUE);
16237 if (o_len != 32) return (PARSER_SALT_VALUE);
16238
16239 const int bits = atoi (bits_pos);
16240
16241 if (bits != 40) return (PARSER_SALT_VALUE);
16242
16243 // copy data to esalt
16244
16245 pdf->V = V;
16246 pdf->R = R;
16247 pdf->P = P;
16248
16249 pdf->enc_md = enc_md;
16250
16251 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16252 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16253 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16254 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16255 pdf->id_len = id_len;
16256
16257 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16258 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16259 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16260 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16261 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16262 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16263 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16264 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16265 pdf->u_len = u_len;
16266
16267 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16268 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16269 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16270 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16271 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16272 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16273 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16274 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16275 pdf->o_len = o_len;
16276
16277 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16278 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16279 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16280 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16281
16282 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16283 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16284 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16285 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16286 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16287 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16288 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16289 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16290
16291 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16292 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16293 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16294 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16295 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16296 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16297 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16298 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16299
16300 // we use ID for salt, maybe needs to change, we will see...
16301
16302 salt->salt_buf[0] = pdf->id_buf[0];
16303 salt->salt_buf[1] = pdf->id_buf[1];
16304 salt->salt_buf[2] = pdf->id_buf[2];
16305 salt->salt_buf[3] = pdf->id_buf[3];
16306 salt->salt_len = pdf->id_len;
16307
16308 digest[0] = pdf->u_buf[0];
16309 digest[1] = pdf->u_buf[1];
16310 digest[2] = pdf->u_buf[2];
16311 digest[3] = pdf->u_buf[3];
16312
16313 return (PARSER_OK);
16314 }
16315
16316 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16317 {
16318 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16319 }
16320
16321 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16322 {
16323 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16324
16325 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16326
16327 u32 *digest = (u32 *) hash_buf->digest;
16328
16329 salt_t *salt = hash_buf->salt;
16330
16331 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16332
16333 /**
16334 * parse line
16335 */
16336
16337 char *V_pos = input_buf + 5;
16338
16339 char *R_pos = strchr (V_pos, '*');
16340
16341 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16342
16343 u32 V_len = R_pos - V_pos;
16344
16345 R_pos++;
16346
16347 char *bits_pos = strchr (R_pos, '*');
16348
16349 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16350
16351 u32 R_len = bits_pos - R_pos;
16352
16353 bits_pos++;
16354
16355 char *P_pos = strchr (bits_pos, '*');
16356
16357 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16358
16359 u32 bits_len = P_pos - bits_pos;
16360
16361 P_pos++;
16362
16363 char *enc_md_pos = strchr (P_pos, '*');
16364
16365 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16366
16367 u32 P_len = enc_md_pos - P_pos;
16368
16369 enc_md_pos++;
16370
16371 char *id_len_pos = strchr (enc_md_pos, '*');
16372
16373 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16374
16375 u32 enc_md_len = id_len_pos - enc_md_pos;
16376
16377 id_len_pos++;
16378
16379 char *id_buf_pos = strchr (id_len_pos, '*');
16380
16381 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16382
16383 u32 id_len_len = id_buf_pos - id_len_pos;
16384
16385 id_buf_pos++;
16386
16387 char *u_len_pos = strchr (id_buf_pos, '*');
16388
16389 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16390
16391 u32 id_buf_len = u_len_pos - id_buf_pos;
16392
16393 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16394
16395 u_len_pos++;
16396
16397 char *u_buf_pos = strchr (u_len_pos, '*');
16398
16399 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16400
16401 u32 u_len_len = u_buf_pos - u_len_pos;
16402
16403 u_buf_pos++;
16404
16405 char *o_len_pos = strchr (u_buf_pos, '*');
16406
16407 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16408
16409 u32 u_buf_len = o_len_pos - u_buf_pos;
16410
16411 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16412
16413 o_len_pos++;
16414
16415 char *o_buf_pos = strchr (o_len_pos, '*');
16416
16417 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16418
16419 u32 o_len_len = o_buf_pos - o_len_pos;
16420
16421 o_buf_pos++;
16422
16423 char *rc4key_pos = strchr (o_buf_pos, ':');
16424
16425 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16426
16427 u32 o_buf_len = rc4key_pos - o_buf_pos;
16428
16429 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16430
16431 rc4key_pos++;
16432
16433 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;
16434
16435 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16436
16437 // validate data
16438
16439 const int V = atoi (V_pos);
16440 const int R = atoi (R_pos);
16441 const int P = atoi (P_pos);
16442
16443 if (V != 1) return (PARSER_SALT_VALUE);
16444 if (R != 2) return (PARSER_SALT_VALUE);
16445
16446 const int enc_md = atoi (enc_md_pos);
16447
16448 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16449
16450 const int id_len = atoi (id_len_pos);
16451 const int u_len = atoi (u_len_pos);
16452 const int o_len = atoi (o_len_pos);
16453
16454 if (id_len != 16) return (PARSER_SALT_VALUE);
16455 if (u_len != 32) return (PARSER_SALT_VALUE);
16456 if (o_len != 32) return (PARSER_SALT_VALUE);
16457
16458 const int bits = atoi (bits_pos);
16459
16460 if (bits != 40) return (PARSER_SALT_VALUE);
16461
16462 // copy data to esalt
16463
16464 pdf->V = V;
16465 pdf->R = R;
16466 pdf->P = P;
16467
16468 pdf->enc_md = enc_md;
16469
16470 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16471 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16472 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16473 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16474 pdf->id_len = id_len;
16475
16476 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16477 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16478 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16479 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16480 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16481 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16482 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16483 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16484 pdf->u_len = u_len;
16485
16486 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16487 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16488 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16489 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16490 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16491 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16492 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16493 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16494 pdf->o_len = o_len;
16495
16496 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16497 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16498 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16499 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16500
16501 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16502 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16503 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16504 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16505 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16506 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16507 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16508 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16509
16510 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16511 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16512 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16513 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16514 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16515 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16516 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16517 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16518
16519 pdf->rc4key[1] = 0;
16520 pdf->rc4key[0] = 0;
16521
16522 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16523 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16524 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16525 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16526 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16527 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16528 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16529 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16530 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16531 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16532
16533 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16534 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16535
16536 // we use ID for salt, maybe needs to change, we will see...
16537
16538 salt->salt_buf[0] = pdf->id_buf[0];
16539 salt->salt_buf[1] = pdf->id_buf[1];
16540 salt->salt_buf[2] = pdf->id_buf[2];
16541 salt->salt_buf[3] = pdf->id_buf[3];
16542 salt->salt_buf[4] = pdf->u_buf[0];
16543 salt->salt_buf[5] = pdf->u_buf[1];
16544 salt->salt_buf[6] = pdf->o_buf[0];
16545 salt->salt_buf[7] = pdf->o_buf[1];
16546 salt->salt_len = pdf->id_len + 16;
16547
16548 digest[0] = pdf->rc4key[0];
16549 digest[1] = pdf->rc4key[1];
16550 digest[2] = 0;
16551 digest[3] = 0;
16552
16553 return (PARSER_OK);
16554 }
16555
16556 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16557 {
16558 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16559
16560 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16561
16562 u32 *digest = (u32 *) hash_buf->digest;
16563
16564 salt_t *salt = hash_buf->salt;
16565
16566 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16567
16568 /**
16569 * parse line
16570 */
16571
16572 char *V_pos = input_buf + 5;
16573
16574 char *R_pos = strchr (V_pos, '*');
16575
16576 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16577
16578 u32 V_len = R_pos - V_pos;
16579
16580 R_pos++;
16581
16582 char *bits_pos = strchr (R_pos, '*');
16583
16584 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16585
16586 u32 R_len = bits_pos - R_pos;
16587
16588 bits_pos++;
16589
16590 char *P_pos = strchr (bits_pos, '*');
16591
16592 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16593
16594 u32 bits_len = P_pos - bits_pos;
16595
16596 P_pos++;
16597
16598 char *enc_md_pos = strchr (P_pos, '*');
16599
16600 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16601
16602 u32 P_len = enc_md_pos - P_pos;
16603
16604 enc_md_pos++;
16605
16606 char *id_len_pos = strchr (enc_md_pos, '*');
16607
16608 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16609
16610 u32 enc_md_len = id_len_pos - enc_md_pos;
16611
16612 id_len_pos++;
16613
16614 char *id_buf_pos = strchr (id_len_pos, '*');
16615
16616 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16617
16618 u32 id_len_len = id_buf_pos - id_len_pos;
16619
16620 id_buf_pos++;
16621
16622 char *u_len_pos = strchr (id_buf_pos, '*');
16623
16624 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16625
16626 u32 id_buf_len = u_len_pos - id_buf_pos;
16627
16628 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16629
16630 u_len_pos++;
16631
16632 char *u_buf_pos = strchr (u_len_pos, '*');
16633
16634 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16635
16636 u32 u_len_len = u_buf_pos - u_len_pos;
16637
16638 u_buf_pos++;
16639
16640 char *o_len_pos = strchr (u_buf_pos, '*');
16641
16642 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16643
16644 u32 u_buf_len = o_len_pos - u_buf_pos;
16645
16646 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16647
16648 o_len_pos++;
16649
16650 char *o_buf_pos = strchr (o_len_pos, '*');
16651
16652 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16653
16654 u32 o_len_len = o_buf_pos - o_len_pos;
16655
16656 o_buf_pos++;
16657
16658 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;
16659
16660 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16661
16662 // validate data
16663
16664 const int V = atoi (V_pos);
16665 const int R = atoi (R_pos);
16666 const int P = atoi (P_pos);
16667
16668 int vr_ok = 0;
16669
16670 if ((V == 2) && (R == 3)) vr_ok = 1;
16671 if ((V == 4) && (R == 4)) vr_ok = 1;
16672
16673 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16674
16675 const int id_len = atoi (id_len_pos);
16676 const int u_len = atoi (u_len_pos);
16677 const int o_len = atoi (o_len_pos);
16678
16679 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16680
16681 if (u_len != 32) return (PARSER_SALT_VALUE);
16682 if (o_len != 32) return (PARSER_SALT_VALUE);
16683
16684 const int bits = atoi (bits_pos);
16685
16686 if (bits != 128) return (PARSER_SALT_VALUE);
16687
16688 int enc_md = 1;
16689
16690 if (R >= 4)
16691 {
16692 enc_md = atoi (enc_md_pos);
16693 }
16694
16695 // copy data to esalt
16696
16697 pdf->V = V;
16698 pdf->R = R;
16699 pdf->P = P;
16700
16701 pdf->enc_md = enc_md;
16702
16703 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16704 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16705 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16706 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16707
16708 if (id_len == 32)
16709 {
16710 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16711 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16712 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16713 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16714 }
16715
16716 pdf->id_len = id_len;
16717
16718 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16719 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16720 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16721 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16722 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16723 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16724 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16725 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16726 pdf->u_len = u_len;
16727
16728 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16729 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16730 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16731 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16732 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16733 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16734 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16735 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16736 pdf->o_len = o_len;
16737
16738 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16739 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16740 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16741 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16742
16743 if (id_len == 32)
16744 {
16745 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16746 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16747 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16748 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16749 }
16750
16751 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16752 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16753 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16754 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16755 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16756 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16757 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16758 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16759
16760 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16761 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16762 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16763 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16764 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16765 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16766 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16767 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16768
16769 // precompute rc4 data for later use
16770
16771 uint padding[8] =
16772 {
16773 0x5e4ebf28,
16774 0x418a754e,
16775 0x564e0064,
16776 0x0801faff,
16777 0xb6002e2e,
16778 0x803e68d0,
16779 0xfea90c2f,
16780 0x7a695364
16781 };
16782
16783 // md5
16784
16785 uint salt_pc_block[32] = { 0 };
16786
16787 char *salt_pc_ptr = (char *) salt_pc_block;
16788
16789 memcpy (salt_pc_ptr, padding, 32);
16790 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16791
16792 uint salt_pc_digest[4] = { 0 };
16793
16794 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16795
16796 pdf->rc4data[0] = salt_pc_digest[0];
16797 pdf->rc4data[1] = salt_pc_digest[1];
16798
16799 // we use ID for salt, maybe needs to change, we will see...
16800
16801 salt->salt_buf[0] = pdf->id_buf[0];
16802 salt->salt_buf[1] = pdf->id_buf[1];
16803 salt->salt_buf[2] = pdf->id_buf[2];
16804 salt->salt_buf[3] = pdf->id_buf[3];
16805 salt->salt_buf[4] = pdf->u_buf[0];
16806 salt->salt_buf[5] = pdf->u_buf[1];
16807 salt->salt_buf[6] = pdf->o_buf[0];
16808 salt->salt_buf[7] = pdf->o_buf[1];
16809 salt->salt_len = pdf->id_len + 16;
16810
16811 salt->salt_iter = ROUNDS_PDF14;
16812
16813 digest[0] = pdf->u_buf[0];
16814 digest[1] = pdf->u_buf[1];
16815 digest[2] = 0;
16816 digest[3] = 0;
16817
16818 return (PARSER_OK);
16819 }
16820
16821 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16822 {
16823 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16824
16825 if (ret != PARSER_OK)
16826 {
16827 return ret;
16828 }
16829
16830 u32 *digest = (u32 *) hash_buf->digest;
16831
16832 salt_t *salt = hash_buf->salt;
16833
16834 digest[0] -= SHA256M_A;
16835 digest[1] -= SHA256M_B;
16836 digest[2] -= SHA256M_C;
16837 digest[3] -= SHA256M_D;
16838 digest[4] -= SHA256M_E;
16839 digest[5] -= SHA256M_F;
16840 digest[6] -= SHA256M_G;
16841 digest[7] -= SHA256M_H;
16842
16843 salt->salt_buf[2] = 0x80;
16844
16845 return (PARSER_OK);
16846 }
16847
16848 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16849 {
16850 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16851
16852 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16853
16854 u32 *digest = (u32 *) hash_buf->digest;
16855
16856 salt_t *salt = hash_buf->salt;
16857
16858 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16859
16860 /**
16861 * parse line
16862 */
16863
16864 char *V_pos = input_buf + 5;
16865
16866 char *R_pos = strchr (V_pos, '*');
16867
16868 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16869
16870 u32 V_len = R_pos - V_pos;
16871
16872 R_pos++;
16873
16874 char *bits_pos = strchr (R_pos, '*');
16875
16876 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16877
16878 u32 R_len = bits_pos - R_pos;
16879
16880 bits_pos++;
16881
16882 char *P_pos = strchr (bits_pos, '*');
16883
16884 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16885
16886 u32 bits_len = P_pos - bits_pos;
16887
16888 P_pos++;
16889
16890 char *enc_md_pos = strchr (P_pos, '*');
16891
16892 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16893
16894 u32 P_len = enc_md_pos - P_pos;
16895
16896 enc_md_pos++;
16897
16898 char *id_len_pos = strchr (enc_md_pos, '*');
16899
16900 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16901
16902 u32 enc_md_len = id_len_pos - enc_md_pos;
16903
16904 id_len_pos++;
16905
16906 char *id_buf_pos = strchr (id_len_pos, '*');
16907
16908 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16909
16910 u32 id_len_len = id_buf_pos - id_len_pos;
16911
16912 id_buf_pos++;
16913
16914 char *u_len_pos = strchr (id_buf_pos, '*');
16915
16916 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16917
16918 u32 id_buf_len = u_len_pos - id_buf_pos;
16919
16920 u_len_pos++;
16921
16922 char *u_buf_pos = strchr (u_len_pos, '*');
16923
16924 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16925
16926 u32 u_len_len = u_buf_pos - u_len_pos;
16927
16928 u_buf_pos++;
16929
16930 char *o_len_pos = strchr (u_buf_pos, '*');
16931
16932 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16933
16934 u32 u_buf_len = o_len_pos - u_buf_pos;
16935
16936 o_len_pos++;
16937
16938 char *o_buf_pos = strchr (o_len_pos, '*');
16939
16940 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16941
16942 u32 o_len_len = o_buf_pos - o_len_pos;
16943
16944 o_buf_pos++;
16945
16946 char *last = strchr (o_buf_pos, '*');
16947
16948 if (last == NULL) last = input_buf + input_len;
16949
16950 u32 o_buf_len = last - o_buf_pos;
16951
16952 // validate data
16953
16954 const int V = atoi (V_pos);
16955 const int R = atoi (R_pos);
16956
16957 int vr_ok = 0;
16958
16959 if ((V == 5) && (R == 5)) vr_ok = 1;
16960 if ((V == 5) && (R == 6)) vr_ok = 1;
16961
16962 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16963
16964 const int bits = atoi (bits_pos);
16965
16966 if (bits != 256) return (PARSER_SALT_VALUE);
16967
16968 int enc_md = atoi (enc_md_pos);
16969
16970 if (enc_md != 1) return (PARSER_SALT_VALUE);
16971
16972 const uint id_len = atoi (id_len_pos);
16973 const uint u_len = atoi (u_len_pos);
16974 const uint o_len = atoi (o_len_pos);
16975
16976 if (V_len > 6) return (PARSER_SALT_LENGTH);
16977 if (R_len > 6) return (PARSER_SALT_LENGTH);
16978 if (P_len > 6) return (PARSER_SALT_LENGTH);
16979 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16980 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16981 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16982 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16983 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16984
16985 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16986 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16987 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16988
16989 // copy data to esalt
16990
16991 if (u_len < 40) return (PARSER_SALT_VALUE);
16992
16993 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16994 {
16995 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
16996 }
16997
16998 salt->salt_buf[0] = pdf->u_buf[8];
16999 salt->salt_buf[1] = pdf->u_buf[9];
17000
17001 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17002 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17003
17004 salt->salt_len = 8;
17005 salt->salt_iter = ROUNDS_PDF17L8;
17006
17007 digest[0] = pdf->u_buf[0];
17008 digest[1] = pdf->u_buf[1];
17009 digest[2] = pdf->u_buf[2];
17010 digest[3] = pdf->u_buf[3];
17011 digest[4] = pdf->u_buf[4];
17012 digest[5] = pdf->u_buf[5];
17013 digest[6] = pdf->u_buf[6];
17014 digest[7] = pdf->u_buf[7];
17015
17016 return (PARSER_OK);
17017 }
17018
17019 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17020 {
17021 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17022
17023 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17024
17025 u32 *digest = (u32 *) hash_buf->digest;
17026
17027 salt_t *salt = hash_buf->salt;
17028
17029 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17030
17031 /**
17032 * parse line
17033 */
17034
17035 // iterations
17036
17037 char *iter_pos = input_buf + 7;
17038
17039 u32 iter = atoi (iter_pos);
17040
17041 if (iter < 1) return (PARSER_SALT_ITERATION);
17042 if (iter > 999999) return (PARSER_SALT_ITERATION);
17043
17044 // first is *raw* salt
17045
17046 char *salt_pos = strchr (iter_pos, ':');
17047
17048 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17049
17050 salt_pos++;
17051
17052 char *hash_pos = strchr (salt_pos, ':');
17053
17054 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17055
17056 u32 salt_len = hash_pos - salt_pos;
17057
17058 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17059
17060 hash_pos++;
17061
17062 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17063
17064 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17065
17066 // decode salt
17067
17068 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17069
17070 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17071
17072 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17073
17074 salt_buf_ptr[salt_len + 3] = 0x01;
17075 salt_buf_ptr[salt_len + 4] = 0x80;
17076
17077 salt->salt_len = salt_len;
17078 salt->salt_iter = iter - 1;
17079
17080 // decode hash
17081
17082 u8 tmp_buf[100] = { 0 };
17083
17084 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17085
17086 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17087
17088 memcpy (digest, tmp_buf, 16);
17089
17090 digest[0] = byte_swap_32 (digest[0]);
17091 digest[1] = byte_swap_32 (digest[1]);
17092 digest[2] = byte_swap_32 (digest[2]);
17093 digest[3] = byte_swap_32 (digest[3]);
17094
17095 // add some stuff to normal salt to make sorted happy
17096
17097 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17098 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17099 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17100 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17101 salt->salt_buf[4] = salt->salt_iter;
17102
17103 return (PARSER_OK);
17104 }
17105
17106 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17107 {
17108 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17109
17110 u32 *digest = (u32 *) hash_buf->digest;
17111
17112 salt_t *salt = hash_buf->salt;
17113
17114 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17115 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17116 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17117 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17118
17119 digest[0] = byte_swap_32 (digest[0]);
17120 digest[1] = byte_swap_32 (digest[1]);
17121 digest[2] = byte_swap_32 (digest[2]);
17122 digest[3] = byte_swap_32 (digest[3]);
17123
17124 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17125
17126 uint salt_len = input_len - 32 - 1;
17127
17128 char *salt_buf = input_buf + 32 + 1;
17129
17130 char *salt_buf_ptr = (char *) salt->salt_buf;
17131
17132 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17133
17134 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17135
17136 salt->salt_len = salt_len;
17137
17138 return (PARSER_OK);
17139 }
17140
17141 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17142 {
17143 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17144
17145 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17146
17147 u32 *digest = (u32 *) hash_buf->digest;
17148
17149 salt_t *salt = hash_buf->salt;
17150
17151 char *user_pos = input_buf + 10;
17152
17153 char *salt_pos = strchr (user_pos, '*');
17154
17155 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17156
17157 salt_pos++;
17158
17159 char *hash_pos = strchr (salt_pos, '*');
17160
17161 hash_pos++;
17162
17163 uint hash_len = input_len - (hash_pos - input_buf);
17164
17165 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17166
17167 uint user_len = salt_pos - user_pos - 1;
17168
17169 uint salt_len = hash_pos - salt_pos - 1;
17170
17171 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17172
17173 /*
17174 * store digest
17175 */
17176
17177 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17178 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17179 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17180 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[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 digest[0] -= MD5M_A;
17188 digest[1] -= MD5M_B;
17189 digest[2] -= MD5M_C;
17190 digest[3] -= MD5M_D;
17191
17192 /*
17193 * store salt
17194 */
17195
17196 char *salt_buf_ptr = (char *) salt->salt_buf;
17197
17198 // first 4 bytes are the "challenge"
17199
17200 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17201 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17202 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17203 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17204
17205 // append the user name
17206
17207 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17208
17209 salt->salt_len = 4 + user_len;
17210
17211 return (PARSER_OK);
17212 }
17213
17214 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17215 {
17216 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17217
17218 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17219
17220 u32 *digest = (u32 *) hash_buf->digest;
17221
17222 salt_t *salt = hash_buf->salt;
17223
17224 char *salt_pos = input_buf + 9;
17225
17226 char *hash_pos = strchr (salt_pos, '*');
17227
17228 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17229
17230 hash_pos++;
17231
17232 uint hash_len = input_len - (hash_pos - input_buf);
17233
17234 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17235
17236 uint salt_len = hash_pos - salt_pos - 1;
17237
17238 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17239
17240 /*
17241 * store digest
17242 */
17243
17244 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17245 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17246 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17247 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17248 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17249
17250 /*
17251 * store salt
17252 */
17253
17254 char *salt_buf_ptr = (char *) salt->salt_buf;
17255
17256 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17257
17258 salt->salt_len = salt_len;
17259
17260 return (PARSER_OK);
17261 }
17262
17263 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17264 {
17265 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17266
17267 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17268
17269 u32 *digest = (u32 *) hash_buf->digest;
17270
17271 salt_t *salt = hash_buf->salt;
17272
17273 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17274
17275 /**
17276 * parse line
17277 */
17278
17279 char *cry_master_len_pos = input_buf + 9;
17280
17281 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17282
17283 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17284
17285 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17286
17287 cry_master_buf_pos++;
17288
17289 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17290
17291 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17292
17293 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17294
17295 cry_salt_len_pos++;
17296
17297 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17298
17299 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17300
17301 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17302
17303 cry_salt_buf_pos++;
17304
17305 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17306
17307 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17308
17309 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17310
17311 cry_rounds_pos++;
17312
17313 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17314
17315 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17316
17317 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17318
17319 ckey_len_pos++;
17320
17321 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17322
17323 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17324
17325 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17326
17327 ckey_buf_pos++;
17328
17329 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17330
17331 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17332
17333 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17334
17335 public_key_len_pos++;
17336
17337 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17338
17339 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17340
17341 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17342
17343 public_key_buf_pos++;
17344
17345 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;
17346
17347 const uint cry_master_len = atoi (cry_master_len_pos);
17348 const uint cry_salt_len = atoi (cry_salt_len_pos);
17349 const uint ckey_len = atoi (ckey_len_pos);
17350 const uint public_key_len = atoi (public_key_len_pos);
17351
17352 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17353 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17354 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17355 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17356
17357 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17358 {
17359 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17360
17361 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17362 }
17363
17364 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17365 {
17366 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17367
17368 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17369 }
17370
17371 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17372 {
17373 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17374
17375 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17376 }
17377
17378 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17379 bitcoin_wallet->ckey_len = ckey_len / 2;
17380 bitcoin_wallet->public_key_len = public_key_len / 2;
17381
17382 /*
17383 * store digest (should be unique enought, hopefully)
17384 */
17385
17386 digest[0] = bitcoin_wallet->cry_master_buf[0];
17387 digest[1] = bitcoin_wallet->cry_master_buf[1];
17388 digest[2] = bitcoin_wallet->cry_master_buf[2];
17389 digest[3] = bitcoin_wallet->cry_master_buf[3];
17390
17391 /*
17392 * store salt
17393 */
17394
17395 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17396
17397 const uint cry_rounds = atoi (cry_rounds_pos);
17398
17399 salt->salt_iter = cry_rounds - 1;
17400
17401 char *salt_buf_ptr = (char *) salt->salt_buf;
17402
17403 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17404
17405 salt->salt_len = salt_len;
17406
17407 return (PARSER_OK);
17408 }
17409
17410 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17411 {
17412 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17413
17414 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17415
17416 u32 *digest = (u32 *) hash_buf->digest;
17417
17418 salt_t *salt = hash_buf->salt;
17419
17420 sip_t *sip = (sip_t *) hash_buf->esalt;
17421
17422 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17423
17424 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17425
17426 memcpy (temp_input_buf, input_buf, input_len);
17427
17428 // URI_server:
17429
17430 char *URI_server_pos = temp_input_buf + 6;
17431
17432 char *URI_client_pos = strchr (URI_server_pos, '*');
17433
17434 if (URI_client_pos == NULL)
17435 {
17436 myfree (temp_input_buf);
17437
17438 return (PARSER_SEPARATOR_UNMATCHED);
17439 }
17440
17441 URI_client_pos[0] = 0;
17442 URI_client_pos++;
17443
17444 uint URI_server_len = strlen (URI_server_pos);
17445
17446 if (URI_server_len > 512)
17447 {
17448 myfree (temp_input_buf);
17449
17450 return (PARSER_SALT_LENGTH);
17451 }
17452
17453 // URI_client:
17454
17455 char *user_pos = strchr (URI_client_pos, '*');
17456
17457 if (user_pos == NULL)
17458 {
17459 myfree (temp_input_buf);
17460
17461 return (PARSER_SEPARATOR_UNMATCHED);
17462 }
17463
17464 user_pos[0] = 0;
17465 user_pos++;
17466
17467 uint URI_client_len = strlen (URI_client_pos);
17468
17469 if (URI_client_len > 512)
17470 {
17471 myfree (temp_input_buf);
17472
17473 return (PARSER_SALT_LENGTH);
17474 }
17475
17476 // user:
17477
17478 char *realm_pos = strchr (user_pos, '*');
17479
17480 if (realm_pos == NULL)
17481 {
17482 myfree (temp_input_buf);
17483
17484 return (PARSER_SEPARATOR_UNMATCHED);
17485 }
17486
17487 realm_pos[0] = 0;
17488 realm_pos++;
17489
17490 uint user_len = strlen (user_pos);
17491
17492 if (user_len > 116)
17493 {
17494 myfree (temp_input_buf);
17495
17496 return (PARSER_SALT_LENGTH);
17497 }
17498
17499 // realm:
17500
17501 char *method_pos = strchr (realm_pos, '*');
17502
17503 if (method_pos == NULL)
17504 {
17505 myfree (temp_input_buf);
17506
17507 return (PARSER_SEPARATOR_UNMATCHED);
17508 }
17509
17510 method_pos[0] = 0;
17511 method_pos++;
17512
17513 uint realm_len = strlen (realm_pos);
17514
17515 if (realm_len > 116)
17516 {
17517 myfree (temp_input_buf);
17518
17519 return (PARSER_SALT_LENGTH);
17520 }
17521
17522 // method:
17523
17524 char *URI_prefix_pos = strchr (method_pos, '*');
17525
17526 if (URI_prefix_pos == NULL)
17527 {
17528 myfree (temp_input_buf);
17529
17530 return (PARSER_SEPARATOR_UNMATCHED);
17531 }
17532
17533 URI_prefix_pos[0] = 0;
17534 URI_prefix_pos++;
17535
17536 uint method_len = strlen (method_pos);
17537
17538 if (method_len > 246)
17539 {
17540 myfree (temp_input_buf);
17541
17542 return (PARSER_SALT_LENGTH);
17543 }
17544
17545 // URI_prefix:
17546
17547 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17548
17549 if (URI_resource_pos == NULL)
17550 {
17551 myfree (temp_input_buf);
17552
17553 return (PARSER_SEPARATOR_UNMATCHED);
17554 }
17555
17556 URI_resource_pos[0] = 0;
17557 URI_resource_pos++;
17558
17559 uint URI_prefix_len = strlen (URI_prefix_pos);
17560
17561 if (URI_prefix_len > 245)
17562 {
17563 myfree (temp_input_buf);
17564
17565 return (PARSER_SALT_LENGTH);
17566 }
17567
17568 // URI_resource:
17569
17570 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17571
17572 if (URI_suffix_pos == NULL)
17573 {
17574 myfree (temp_input_buf);
17575
17576 return (PARSER_SEPARATOR_UNMATCHED);
17577 }
17578
17579 URI_suffix_pos[0] = 0;
17580 URI_suffix_pos++;
17581
17582 uint URI_resource_len = strlen (URI_resource_pos);
17583
17584 if (URI_resource_len < 1 || URI_resource_len > 246)
17585 {
17586 myfree (temp_input_buf);
17587
17588 return (PARSER_SALT_LENGTH);
17589 }
17590
17591 // URI_suffix:
17592
17593 char *nonce_pos = strchr (URI_suffix_pos, '*');
17594
17595 if (nonce_pos == NULL)
17596 {
17597 myfree (temp_input_buf);
17598
17599 return (PARSER_SEPARATOR_UNMATCHED);
17600 }
17601
17602 nonce_pos[0] = 0;
17603 nonce_pos++;
17604
17605 uint URI_suffix_len = strlen (URI_suffix_pos);
17606
17607 if (URI_suffix_len > 245)
17608 {
17609 myfree (temp_input_buf);
17610
17611 return (PARSER_SALT_LENGTH);
17612 }
17613
17614 // nonce:
17615
17616 char *nonce_client_pos = strchr (nonce_pos, '*');
17617
17618 if (nonce_client_pos == NULL)
17619 {
17620 myfree (temp_input_buf);
17621
17622 return (PARSER_SEPARATOR_UNMATCHED);
17623 }
17624
17625 nonce_client_pos[0] = 0;
17626 nonce_client_pos++;
17627
17628 uint nonce_len = strlen (nonce_pos);
17629
17630 if (nonce_len < 1 || nonce_len > 50)
17631 {
17632 myfree (temp_input_buf);
17633
17634 return (PARSER_SALT_LENGTH);
17635 }
17636
17637 // nonce_client:
17638
17639 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17640
17641 if (nonce_count_pos == NULL)
17642 {
17643 myfree (temp_input_buf);
17644
17645 return (PARSER_SEPARATOR_UNMATCHED);
17646 }
17647
17648 nonce_count_pos[0] = 0;
17649 nonce_count_pos++;
17650
17651 uint nonce_client_len = strlen (nonce_client_pos);
17652
17653 if (nonce_client_len > 50)
17654 {
17655 myfree (temp_input_buf);
17656
17657 return (PARSER_SALT_LENGTH);
17658 }
17659
17660 // nonce_count:
17661
17662 char *qop_pos = strchr (nonce_count_pos, '*');
17663
17664 if (qop_pos == NULL)
17665 {
17666 myfree (temp_input_buf);
17667
17668 return (PARSER_SEPARATOR_UNMATCHED);
17669 }
17670
17671 qop_pos[0] = 0;
17672 qop_pos++;
17673
17674 uint nonce_count_len = strlen (nonce_count_pos);
17675
17676 if (nonce_count_len > 50)
17677 {
17678 myfree (temp_input_buf);
17679
17680 return (PARSER_SALT_LENGTH);
17681 }
17682
17683 // qop:
17684
17685 char *directive_pos = strchr (qop_pos, '*');
17686
17687 if (directive_pos == NULL)
17688 {
17689 myfree (temp_input_buf);
17690
17691 return (PARSER_SEPARATOR_UNMATCHED);
17692 }
17693
17694 directive_pos[0] = 0;
17695 directive_pos++;
17696
17697 uint qop_len = strlen (qop_pos);
17698
17699 if (qop_len > 50)
17700 {
17701 myfree (temp_input_buf);
17702
17703 return (PARSER_SALT_LENGTH);
17704 }
17705
17706 // directive
17707
17708 char *digest_pos = strchr (directive_pos, '*');
17709
17710 if (digest_pos == NULL)
17711 {
17712 myfree (temp_input_buf);
17713
17714 return (PARSER_SEPARATOR_UNMATCHED);
17715 }
17716
17717 digest_pos[0] = 0;
17718 digest_pos++;
17719
17720 uint directive_len = strlen (directive_pos);
17721
17722 if (directive_len != 3)
17723 {
17724 myfree (temp_input_buf);
17725
17726 return (PARSER_SALT_LENGTH);
17727 }
17728
17729 if (memcmp (directive_pos, "MD5", 3))
17730 {
17731 log_info ("ERROR: only the MD5 directive is currently supported\n");
17732
17733 myfree (temp_input_buf);
17734
17735 return (PARSER_SIP_AUTH_DIRECTIVE);
17736 }
17737
17738 /*
17739 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17740 */
17741
17742 uint md5_len = 0;
17743
17744 uint md5_max_len = 4 * 64;
17745
17746 uint md5_remaining_len = md5_max_len;
17747
17748 uint tmp_md5_buf[64] = { 0 };
17749
17750 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17751
17752 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17753
17754 md5_len += method_len + 1;
17755 tmp_md5_ptr += method_len + 1;
17756
17757 if (URI_prefix_len > 0)
17758 {
17759 md5_remaining_len = md5_max_len - md5_len;
17760
17761 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17762
17763 md5_len += URI_prefix_len + 1;
17764 tmp_md5_ptr += URI_prefix_len + 1;
17765 }
17766
17767 md5_remaining_len = md5_max_len - md5_len;
17768
17769 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17770
17771 md5_len += URI_resource_len;
17772 tmp_md5_ptr += URI_resource_len;
17773
17774 if (URI_suffix_len > 0)
17775 {
17776 md5_remaining_len = md5_max_len - md5_len;
17777
17778 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17779
17780 md5_len += 1 + URI_suffix_len;
17781 }
17782
17783 uint tmp_digest[4] = { 0 };
17784
17785 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17786
17787 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17788 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17789 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17790 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17791
17792 /*
17793 * esalt
17794 */
17795
17796 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17797
17798 uint esalt_len = 0;
17799
17800 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17801
17802 // there are 2 possibilities for the esalt:
17803
17804 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17805 {
17806 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17807
17808 if (esalt_len > max_esalt_len)
17809 {
17810 myfree (temp_input_buf);
17811
17812 return (PARSER_SALT_LENGTH);
17813 }
17814
17815 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17816 nonce_pos,
17817 nonce_count_pos,
17818 nonce_client_pos,
17819 qop_pos,
17820 tmp_digest[0],
17821 tmp_digest[1],
17822 tmp_digest[2],
17823 tmp_digest[3]);
17824 }
17825 else
17826 {
17827 esalt_len = 1 + nonce_len + 1 + 32;
17828
17829 if (esalt_len > max_esalt_len)
17830 {
17831 myfree (temp_input_buf);
17832
17833 return (PARSER_SALT_LENGTH);
17834 }
17835
17836 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17837 nonce_pos,
17838 tmp_digest[0],
17839 tmp_digest[1],
17840 tmp_digest[2],
17841 tmp_digest[3]);
17842 }
17843
17844 // add 0x80 to esalt
17845
17846 esalt_buf_ptr[esalt_len] = 0x80;
17847
17848 sip->esalt_len = esalt_len;
17849
17850 /*
17851 * actual salt
17852 */
17853
17854 char *sip_salt_ptr = (char *) sip->salt_buf;
17855
17856 uint salt_len = user_len + 1 + realm_len + 1;
17857
17858 uint max_salt_len = 119;
17859
17860 if (salt_len > max_salt_len)
17861 {
17862 myfree (temp_input_buf);
17863
17864 return (PARSER_SALT_LENGTH);
17865 }
17866
17867 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17868
17869 sip->salt_len = salt_len;
17870
17871 /*
17872 * fake salt (for sorting)
17873 */
17874
17875 char *salt_buf_ptr = (char *) salt->salt_buf;
17876
17877 max_salt_len = 55;
17878
17879 uint fake_salt_len = salt_len;
17880
17881 if (fake_salt_len > max_salt_len)
17882 {
17883 fake_salt_len = max_salt_len;
17884 }
17885
17886 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17887
17888 salt->salt_len = fake_salt_len;
17889
17890 /*
17891 * digest
17892 */
17893
17894 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
17895 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
17896 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
17897 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
17898
17899 digest[0] = byte_swap_32 (digest[0]);
17900 digest[1] = byte_swap_32 (digest[1]);
17901 digest[2] = byte_swap_32 (digest[2]);
17902 digest[3] = byte_swap_32 (digest[3]);
17903
17904 myfree (temp_input_buf);
17905
17906 return (PARSER_OK);
17907 }
17908
17909 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17910 {
17911 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17912
17913 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17914
17915 u32 *digest = (u32 *) hash_buf->digest;
17916
17917 salt_t *salt = hash_buf->salt;
17918
17919 // digest
17920
17921 char *digest_pos = input_buf;
17922
17923 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
17924 digest[1] = 0;
17925 digest[2] = 0;
17926 digest[3] = 0;
17927
17928 // salt
17929
17930 char *salt_buf = input_buf + 8 + 1;
17931
17932 uint salt_len = 8;
17933
17934 char *salt_buf_ptr = (char *) salt->salt_buf;
17935
17936 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17937
17938 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17939
17940 salt->salt_len = salt_len;
17941
17942 return (PARSER_OK);
17943 }
17944
17945 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17946 {
17947 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17948
17949 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17950
17951 u32 *digest = (u32 *) hash_buf->digest;
17952
17953 salt_t *salt = hash_buf->salt;
17954
17955 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17956
17957 /**
17958 * parse line
17959 */
17960
17961 char *p_buf_pos = input_buf + 4;
17962
17963 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17964
17965 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17966
17967 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
17968
17969 NumCyclesPower_pos++;
17970
17971 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17972
17973 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17974
17975 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17976
17977 salt_len_pos++;
17978
17979 char *salt_buf_pos = strchr (salt_len_pos, '$');
17980
17981 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17982
17983 u32 salt_len_len = salt_buf_pos - salt_len_pos;
17984
17985 salt_buf_pos++;
17986
17987 char *iv_len_pos = strchr (salt_buf_pos, '$');
17988
17989 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17990
17991 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
17992
17993 iv_len_pos++;
17994
17995 char *iv_buf_pos = strchr (iv_len_pos, '$');
17996
17997 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17998
17999 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18000
18001 iv_buf_pos++;
18002
18003 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18004
18005 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18006
18007 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18008
18009 crc_buf_pos++;
18010
18011 char *data_len_pos = strchr (crc_buf_pos, '$');
18012
18013 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18014
18015 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18016
18017 data_len_pos++;
18018
18019 char *unpack_size_pos = strchr (data_len_pos, '$');
18020
18021 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18022
18023 u32 data_len_len = unpack_size_pos - data_len_pos;
18024
18025 unpack_size_pos++;
18026
18027 char *data_buf_pos = strchr (unpack_size_pos, '$');
18028
18029 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18030
18031 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18032
18033 data_buf_pos++;
18034
18035 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;
18036
18037 const uint iter = atoi (NumCyclesPower_pos);
18038 const uint crc = atoi (crc_buf_pos);
18039 const uint p_buf = atoi (p_buf_pos);
18040 const uint salt_len = atoi (salt_len_pos);
18041 const uint iv_len = atoi (iv_len_pos);
18042 const uint unpack_size = atoi (unpack_size_pos);
18043 const uint data_len = atoi (data_len_pos);
18044
18045 /**
18046 * verify some data
18047 */
18048
18049 if (p_buf != 0) return (PARSER_SALT_VALUE);
18050 if (salt_len != 0) return (PARSER_SALT_VALUE);
18051
18052 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18053
18054 if (data_len > 384) return (PARSER_SALT_VALUE);
18055
18056 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18057
18058 /**
18059 * store data
18060 */
18061
18062 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18063 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18064 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18065 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18066
18067 seven_zip->iv_len = iv_len;
18068
18069 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18070
18071 seven_zip->salt_len = 0;
18072
18073 seven_zip->crc = crc;
18074
18075 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18076 {
18077 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18078
18079 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18080 }
18081
18082 seven_zip->data_len = data_len;
18083
18084 seven_zip->unpack_size = unpack_size;
18085
18086 // real salt
18087
18088 salt->salt_buf[0] = seven_zip->data_buf[0];
18089 salt->salt_buf[1] = seven_zip->data_buf[1];
18090 salt->salt_buf[2] = seven_zip->data_buf[2];
18091 salt->salt_buf[3] = seven_zip->data_buf[3];
18092
18093 salt->salt_len = 16;
18094
18095 salt->salt_sign[0] = iter;
18096
18097 salt->salt_iter = 1 << iter;
18098
18099 /**
18100 * digest
18101 */
18102
18103 digest[0] = crc;
18104 digest[1] = 0;
18105 digest[2] = 0;
18106 digest[3] = 0;
18107
18108 return (PARSER_OK);
18109 }
18110
18111 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18112 {
18113 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18114
18115 u32 *digest = (u32 *) hash_buf->digest;
18116
18117 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18118 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18119 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18120 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18121 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18122 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18123 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18124 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18125
18126 digest[0] = byte_swap_32 (digest[0]);
18127 digest[1] = byte_swap_32 (digest[1]);
18128 digest[2] = byte_swap_32 (digest[2]);
18129 digest[3] = byte_swap_32 (digest[3]);
18130 digest[4] = byte_swap_32 (digest[4]);
18131 digest[5] = byte_swap_32 (digest[5]);
18132 digest[6] = byte_swap_32 (digest[6]);
18133 digest[7] = byte_swap_32 (digest[7]);
18134
18135 return (PARSER_OK);
18136 }
18137
18138 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18139 {
18140 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18141
18142 u32 *digest = (u32 *) hash_buf->digest;
18143
18144 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18145 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18146 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18147 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18148 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18149 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18150 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18151 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18152 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18153 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18154 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18155 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18156 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18157 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18158 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18159 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18160
18161 digest[ 0] = byte_swap_32 (digest[ 0]);
18162 digest[ 1] = byte_swap_32 (digest[ 1]);
18163 digest[ 2] = byte_swap_32 (digest[ 2]);
18164 digest[ 3] = byte_swap_32 (digest[ 3]);
18165 digest[ 4] = byte_swap_32 (digest[ 4]);
18166 digest[ 5] = byte_swap_32 (digest[ 5]);
18167 digest[ 6] = byte_swap_32 (digest[ 6]);
18168 digest[ 7] = byte_swap_32 (digest[ 7]);
18169 digest[ 8] = byte_swap_32 (digest[ 8]);
18170 digest[ 9] = byte_swap_32 (digest[ 9]);
18171 digest[10] = byte_swap_32 (digest[10]);
18172 digest[11] = byte_swap_32 (digest[11]);
18173 digest[12] = byte_swap_32 (digest[12]);
18174 digest[13] = byte_swap_32 (digest[13]);
18175 digest[14] = byte_swap_32 (digest[14]);
18176 digest[15] = byte_swap_32 (digest[15]);
18177
18178 return (PARSER_OK);
18179 }
18180
18181 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18182 {
18183 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18184
18185 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18186
18187 u32 *digest = (u32 *) hash_buf->digest;
18188
18189 salt_t *salt = hash_buf->salt;
18190
18191 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18192
18193 /**
18194 * parse line
18195 */
18196
18197 // iterations
18198
18199 char *iter_pos = input_buf + 4;
18200
18201 u32 iter = atoi (iter_pos);
18202
18203 if (iter < 1) return (PARSER_SALT_ITERATION);
18204 if (iter > 999999) return (PARSER_SALT_ITERATION);
18205
18206 // first is *raw* salt
18207
18208 char *salt_pos = strchr (iter_pos, ':');
18209
18210 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18211
18212 salt_pos++;
18213
18214 char *hash_pos = strchr (salt_pos, ':');
18215
18216 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18217
18218 u32 salt_len = hash_pos - salt_pos;
18219
18220 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18221
18222 hash_pos++;
18223
18224 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18225
18226 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18227
18228 // decode salt
18229
18230 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18231
18232 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18233
18234 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18235
18236 salt_buf_ptr[salt_len + 3] = 0x01;
18237 salt_buf_ptr[salt_len + 4] = 0x80;
18238
18239 salt->salt_len = salt_len;
18240 salt->salt_iter = iter - 1;
18241
18242 // decode hash
18243
18244 u8 tmp_buf[100] = { 0 };
18245
18246 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18247
18248 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18249
18250 memcpy (digest, tmp_buf, 16);
18251
18252 // add some stuff to normal salt to make sorted happy
18253
18254 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18255 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18256 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18257 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18258 salt->salt_buf[4] = salt->salt_iter;
18259
18260 return (PARSER_OK);
18261 }
18262
18263 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18264 {
18265 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18266
18267 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18268
18269 u32 *digest = (u32 *) hash_buf->digest;
18270
18271 salt_t *salt = hash_buf->salt;
18272
18273 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18274
18275 /**
18276 * parse line
18277 */
18278
18279 // iterations
18280
18281 char *iter_pos = input_buf + 5;
18282
18283 u32 iter = atoi (iter_pos);
18284
18285 if (iter < 1) return (PARSER_SALT_ITERATION);
18286 if (iter > 999999) return (PARSER_SALT_ITERATION);
18287
18288 // first is *raw* salt
18289
18290 char *salt_pos = strchr (iter_pos, ':');
18291
18292 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18293
18294 salt_pos++;
18295
18296 char *hash_pos = strchr (salt_pos, ':');
18297
18298 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18299
18300 u32 salt_len = hash_pos - salt_pos;
18301
18302 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18303
18304 hash_pos++;
18305
18306 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18307
18308 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18309
18310 // decode salt
18311
18312 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18313
18314 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18315
18316 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18317
18318 salt_buf_ptr[salt_len + 3] = 0x01;
18319 salt_buf_ptr[salt_len + 4] = 0x80;
18320
18321 salt->salt_len = salt_len;
18322 salt->salt_iter = iter - 1;
18323
18324 // decode hash
18325
18326 u8 tmp_buf[100] = { 0 };
18327
18328 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18329
18330 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18331
18332 memcpy (digest, tmp_buf, 16);
18333
18334 digest[0] = byte_swap_32 (digest[0]);
18335 digest[1] = byte_swap_32 (digest[1]);
18336 digest[2] = byte_swap_32 (digest[2]);
18337 digest[3] = byte_swap_32 (digest[3]);
18338
18339 // add some stuff to normal salt to make sorted happy
18340
18341 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18342 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18343 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18344 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18345 salt->salt_buf[4] = salt->salt_iter;
18346
18347 return (PARSER_OK);
18348 }
18349
18350 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18351 {
18352 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18353
18354 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18355
18356 u64 *digest = (u64 *) hash_buf->digest;
18357
18358 salt_t *salt = hash_buf->salt;
18359
18360 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18361
18362 /**
18363 * parse line
18364 */
18365
18366 // iterations
18367
18368 char *iter_pos = input_buf + 7;
18369
18370 u32 iter = atoi (iter_pos);
18371
18372 if (iter < 1) return (PARSER_SALT_ITERATION);
18373 if (iter > 999999) return (PARSER_SALT_ITERATION);
18374
18375 // first is *raw* salt
18376
18377 char *salt_pos = strchr (iter_pos, ':');
18378
18379 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18380
18381 salt_pos++;
18382
18383 char *hash_pos = strchr (salt_pos, ':');
18384
18385 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18386
18387 u32 salt_len = hash_pos - salt_pos;
18388
18389 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18390
18391 hash_pos++;
18392
18393 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18394
18395 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18396
18397 // decode salt
18398
18399 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18400
18401 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18402
18403 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18404
18405 salt_buf_ptr[salt_len + 3] = 0x01;
18406 salt_buf_ptr[salt_len + 4] = 0x80;
18407
18408 salt->salt_len = salt_len;
18409 salt->salt_iter = iter - 1;
18410
18411 // decode hash
18412
18413 u8 tmp_buf[100] = { 0 };
18414
18415 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18416
18417 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18418
18419 memcpy (digest, tmp_buf, 64);
18420
18421 digest[0] = byte_swap_64 (digest[0]);
18422 digest[1] = byte_swap_64 (digest[1]);
18423 digest[2] = byte_swap_64 (digest[2]);
18424 digest[3] = byte_swap_64 (digest[3]);
18425 digest[4] = byte_swap_64 (digest[4]);
18426 digest[5] = byte_swap_64 (digest[5]);
18427 digest[6] = byte_swap_64 (digest[6]);
18428 digest[7] = byte_swap_64 (digest[7]);
18429
18430 // add some stuff to normal salt to make sorted happy
18431
18432 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18433 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18434 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18435 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18436 salt->salt_buf[4] = salt->salt_iter;
18437
18438 return (PARSER_OK);
18439 }
18440
18441 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18442 {
18443 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18444
18445 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18446
18447 uint *digest = (uint *) hash_buf->digest;
18448
18449 salt_t *salt = hash_buf->salt;
18450
18451 /**
18452 * parse line
18453 */
18454
18455 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18456
18457 char *hash_pos = strchr (salt_pos, '$');
18458
18459 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18460
18461 u32 salt_len = hash_pos - salt_pos;
18462
18463 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18464
18465 hash_pos++;
18466
18467 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18468
18469 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18470
18471 // decode hash
18472
18473 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18474 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18475 digest[ 2] = 0;
18476 digest[ 3] = 0;
18477 digest[ 4] = 0;
18478 digest[ 5] = 0;
18479 digest[ 6] = 0;
18480 digest[ 7] = 0;
18481 digest[ 8] = 0;
18482 digest[ 9] = 0;
18483 digest[10] = 0;
18484 digest[11] = 0;
18485 digest[12] = 0;
18486 digest[13] = 0;
18487 digest[14] = 0;
18488 digest[15] = 0;
18489
18490 // decode salt
18491
18492 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18493 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18494
18495 salt->salt_iter = ROUNDS_ECRYPTFS;
18496 salt->salt_len = 8;
18497
18498 return (PARSER_OK);
18499 }
18500
18501 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18502 {
18503 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18504
18505 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18506
18507 unsigned char c19 = itoa64_to_int (input_buf[19]);
18508
18509 if (c19 & 3) return (PARSER_HASH_VALUE);
18510
18511 salt_t *salt = hash_buf->salt;
18512
18513 u32 *digest = (u32 *) hash_buf->digest;
18514
18515 // iteration count
18516
18517 salt->salt_iter = itoa64_to_int (input_buf[1])
18518 | itoa64_to_int (input_buf[2]) << 6
18519 | itoa64_to_int (input_buf[3]) << 12
18520 | itoa64_to_int (input_buf[4]) << 18;
18521
18522 // set salt
18523
18524 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18525 | itoa64_to_int (input_buf[6]) << 6
18526 | itoa64_to_int (input_buf[7]) << 12
18527 | itoa64_to_int (input_buf[8]) << 18;
18528
18529 salt->salt_len = 4;
18530
18531 u8 tmp_buf[100] = { 0 };
18532
18533 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18534
18535 memcpy (digest, tmp_buf, 8);
18536
18537 uint tt;
18538
18539 IP (digest[0], digest[1], tt);
18540
18541 digest[0] = rotr32 (digest[0], 31);
18542 digest[1] = rotr32 (digest[1], 31);
18543 digest[2] = 0;
18544 digest[3] = 0;
18545
18546 return (PARSER_OK);
18547 }
18548
18549 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18550 {
18551 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18552
18553 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18554
18555 u32 *digest = (u32 *) hash_buf->digest;
18556
18557 salt_t *salt = hash_buf->salt;
18558
18559 /**
18560 * parse line
18561 */
18562
18563 char *type_pos = input_buf + 6 + 1;
18564
18565 char *salt_pos = strchr (type_pos, '*');
18566
18567 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18568
18569 u32 type_len = salt_pos - type_pos;
18570
18571 if (type_len != 1) return (PARSER_SALT_LENGTH);
18572
18573 salt_pos++;
18574
18575 char *crypted_pos = strchr (salt_pos, '*');
18576
18577 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18578
18579 u32 salt_len = crypted_pos - salt_pos;
18580
18581 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18582
18583 crypted_pos++;
18584
18585 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18586
18587 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18588
18589 /**
18590 * copy data
18591 */
18592
18593 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18594 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18595
18596 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18597 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18598
18599 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18600 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18601 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18602 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18603
18604 salt->salt_len = 24;
18605 salt->salt_iter = ROUNDS_RAR3;
18606
18607 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18608 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18609
18610 digest[0] = 0xc43d7b00;
18611 digest[1] = 0x40070000;
18612 digest[2] = 0;
18613 digest[3] = 0;
18614
18615 return (PARSER_OK);
18616 }
18617
18618 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18619 {
18620 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18621
18622 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18623
18624 u32 *digest = (u32 *) hash_buf->digest;
18625
18626 salt_t *salt = hash_buf->salt;
18627
18628 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18629
18630 /**
18631 * parse line
18632 */
18633
18634 char *param0_pos = input_buf + 1 + 4 + 1;
18635
18636 char *param1_pos = strchr (param0_pos, '$');
18637
18638 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18639
18640 u32 param0_len = param1_pos - param0_pos;
18641
18642 param1_pos++;
18643
18644 char *param2_pos = strchr (param1_pos, '$');
18645
18646 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18647
18648 u32 param1_len = param2_pos - param1_pos;
18649
18650 param2_pos++;
18651
18652 char *param3_pos = strchr (param2_pos, '$');
18653
18654 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18655
18656 u32 param2_len = param3_pos - param2_pos;
18657
18658 param3_pos++;
18659
18660 char *param4_pos = strchr (param3_pos, '$');
18661
18662 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18663
18664 u32 param3_len = param4_pos - param3_pos;
18665
18666 param4_pos++;
18667
18668 char *param5_pos = strchr (param4_pos, '$');
18669
18670 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18671
18672 u32 param4_len = param5_pos - param4_pos;
18673
18674 param5_pos++;
18675
18676 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18677
18678 char *salt_buf = param1_pos;
18679 char *iv = param3_pos;
18680 char *pswcheck = param5_pos;
18681
18682 const uint salt_len = atoi (param0_pos);
18683 const uint iterations = atoi (param2_pos);
18684 const uint pswcheck_len = atoi (param4_pos);
18685
18686 /**
18687 * verify some data
18688 */
18689
18690 if (param1_len != 32) return (PARSER_SALT_VALUE);
18691 if (param3_len != 32) return (PARSER_SALT_VALUE);
18692 if (param5_len != 16) return (PARSER_SALT_VALUE);
18693
18694 if (salt_len != 16) return (PARSER_SALT_VALUE);
18695 if (iterations == 0) return (PARSER_SALT_VALUE);
18696 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18697
18698 /**
18699 * store data
18700 */
18701
18702 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18703 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18704 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18705 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18706
18707 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18708 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18709 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18710 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18711
18712 salt->salt_len = 16;
18713
18714 salt->salt_sign[0] = iterations;
18715
18716 salt->salt_iter = ((1 << iterations) + 32) - 1;
18717
18718 /**
18719 * digest buf
18720 */
18721
18722 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18723 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18724 digest[2] = 0;
18725 digest[3] = 0;
18726
18727 return (PARSER_OK);
18728 }
18729
18730 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18731 {
18732 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18733
18734 u32 *digest = (u32 *) hash_buf->digest;
18735
18736 salt_t *salt = hash_buf->salt;
18737
18738 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18739 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18740 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18741 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18742 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18743 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18744 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18745 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18746
18747 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18748
18749 uint salt_len = input_len - 64 - 1;
18750
18751 char *salt_buf = input_buf + 64 + 1;
18752
18753 char *salt_buf_ptr = (char *) salt->salt_buf;
18754
18755 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18756
18757 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18758
18759 salt->salt_len = salt_len;
18760
18761 /**
18762 * we can precompute the first sha256 transform
18763 */
18764
18765 uint w[16] = { 0 };
18766
18767 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18768 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18769 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18770 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18771 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18772 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18773 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18774 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18775 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18776 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18777 w[10] = byte_swap_32 (salt->salt_buf[10]);
18778 w[11] = byte_swap_32 (salt->salt_buf[11]);
18779 w[12] = byte_swap_32 (salt->salt_buf[12]);
18780 w[13] = byte_swap_32 (salt->salt_buf[13]);
18781 w[14] = byte_swap_32 (salt->salt_buf[14]);
18782 w[15] = byte_swap_32 (salt->salt_buf[15]);
18783
18784 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
18785
18786 sha256_64 (w, pc256);
18787
18788 salt->salt_buf_pc[0] = pc256[0];
18789 salt->salt_buf_pc[1] = pc256[1];
18790 salt->salt_buf_pc[2] = pc256[2];
18791 salt->salt_buf_pc[3] = pc256[3];
18792 salt->salt_buf_pc[4] = pc256[4];
18793 salt->salt_buf_pc[5] = pc256[5];
18794 salt->salt_buf_pc[6] = pc256[6];
18795 salt->salt_buf_pc[7] = pc256[7];
18796
18797 digest[0] -= pc256[0];
18798 digest[1] -= pc256[1];
18799 digest[2] -= pc256[2];
18800 digest[3] -= pc256[3];
18801 digest[4] -= pc256[4];
18802 digest[5] -= pc256[5];
18803 digest[6] -= pc256[6];
18804 digest[7] -= pc256[7];
18805
18806 return (PARSER_OK);
18807 }
18808
18809 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18810 {
18811 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18812
18813 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18814
18815 u32 *digest = (u32 *) hash_buf->digest;
18816
18817 salt_t *salt = hash_buf->salt;
18818
18819 /**
18820 * parse line
18821 */
18822
18823 char *data_len_pos = input_buf + 1 + 10 + 1;
18824
18825 char *data_buf_pos = strchr (data_len_pos, '$');
18826
18827 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18828
18829 u32 data_len_len = data_buf_pos - data_len_pos;
18830
18831 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18832 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18833
18834 data_buf_pos++;
18835
18836 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18837
18838 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18839
18840 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18841
18842 u32 data_len = atoi (data_len_pos);
18843
18844 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18845
18846 /**
18847 * salt
18848 */
18849
18850 char *salt_pos = data_buf_pos;
18851
18852 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18853 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18854 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
18855 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
18856
18857 // this is actually the CT, which is also the hash later (if matched)
18858
18859 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
18860 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
18861 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
18862 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
18863
18864 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18865
18866 salt->salt_iter = 10 - 1;
18867
18868 /**
18869 * digest buf
18870 */
18871
18872 digest[0] = salt->salt_buf[4];
18873 digest[1] = salt->salt_buf[5];
18874 digest[2] = salt->salt_buf[6];
18875 digest[3] = salt->salt_buf[7];
18876
18877 return (PARSER_OK);
18878 }
18879
18880 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18881 {
18882 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18883
18884 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18885
18886 u32 *digest = (u32 *) hash_buf->digest;
18887
18888 salt_t *salt = hash_buf->salt;
18889
18890 /**
18891 * parse line
18892 */
18893
18894 char *salt_pos = input_buf + 11 + 1;
18895
18896 char *iter_pos = strchr (salt_pos, ',');
18897
18898 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18899
18900 u32 salt_len = iter_pos - salt_pos;
18901
18902 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18903
18904 iter_pos++;
18905
18906 char *hash_pos = strchr (iter_pos, ',');
18907
18908 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18909
18910 u32 iter_len = hash_pos - iter_pos;
18911
18912 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18913
18914 hash_pos++;
18915
18916 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18917
18918 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18919
18920 /**
18921 * salt
18922 */
18923
18924 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18925 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18926 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
18927 salt->salt_buf[3] = 0x00018000;
18928
18929 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18930 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18931 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18932 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18933
18934 salt->salt_len = salt_len / 2;
18935
18936 salt->salt_iter = atoi (iter_pos) - 1;
18937
18938 /**
18939 * digest buf
18940 */
18941
18942 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18943 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18944 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18945 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18946 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18947 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18948 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
18949 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
18950
18951 return (PARSER_OK);
18952 }
18953
18954 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18955 {
18956 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
18957
18958 u32 *digest = (u32 *) hash_buf->digest;
18959
18960 salt_t *salt = hash_buf->salt;
18961
18962 /**
18963 * parse line
18964 */
18965
18966 char *hash_pos = input_buf + 64;
18967 char *salt1_pos = input_buf + 128;
18968 char *salt2_pos = input_buf;
18969
18970 /**
18971 * salt
18972 */
18973
18974 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
18975 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
18976 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
18977 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
18978
18979 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
18980 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
18981 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
18982 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
18983
18984 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
18985 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
18986 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
18987 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
18988
18989 salt->salt_len = 48;
18990
18991 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
18992
18993 /**
18994 * digest buf
18995 */
18996
18997 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18998 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18999 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19000 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19001 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19002 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19003 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19004 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19005
19006 return (PARSER_OK);
19007 }
19008
19009 /**
19010 * parallel running threads
19011 */
19012
19013 #ifdef WIN
19014
19015 BOOL WINAPI sigHandler_default (DWORD sig)
19016 {
19017 switch (sig)
19018 {
19019 case CTRL_CLOSE_EVENT:
19020
19021 /*
19022 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
19023 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
19024 * function otherwise it is too late (e.g. after returning from this function)
19025 */
19026
19027 myabort ();
19028
19029 SetConsoleCtrlHandler (NULL, TRUE);
19030
19031 hc_sleep (10);
19032
19033 return TRUE;
19034
19035 case CTRL_C_EVENT:
19036 case CTRL_LOGOFF_EVENT:
19037 case CTRL_SHUTDOWN_EVENT:
19038
19039 myabort ();
19040
19041 SetConsoleCtrlHandler (NULL, TRUE);
19042
19043 return TRUE;
19044 }
19045
19046 return FALSE;
19047 }
19048
19049 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19050 {
19051 switch (sig)
19052 {
19053 case CTRL_CLOSE_EVENT:
19054
19055 myabort ();
19056
19057 SetConsoleCtrlHandler (NULL, TRUE);
19058
19059 hc_sleep (10);
19060
19061 return TRUE;
19062
19063 case CTRL_C_EVENT:
19064 case CTRL_LOGOFF_EVENT:
19065 case CTRL_SHUTDOWN_EVENT:
19066
19067 myquit ();
19068
19069 SetConsoleCtrlHandler (NULL, TRUE);
19070
19071 return TRUE;
19072 }
19073
19074 return FALSE;
19075 }
19076
19077 void hc_signal (BOOL WINAPI (callback) (DWORD))
19078 {
19079 if (callback == NULL)
19080 {
19081 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19082 }
19083 else
19084 {
19085 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19086 }
19087 }
19088
19089 #else
19090
19091 void sigHandler_default (int sig)
19092 {
19093 myabort ();
19094
19095 signal (sig, NULL);
19096 }
19097
19098 void sigHandler_benchmark (int sig)
19099 {
19100 myquit ();
19101
19102 signal (sig, NULL);
19103 }
19104
19105 void hc_signal (void (callback) (int))
19106 {
19107 if (callback == NULL) callback = SIG_DFL;
19108
19109 signal (SIGINT, callback);
19110 signal (SIGTERM, callback);
19111 signal (SIGABRT, callback);
19112 }
19113
19114 #endif
19115
19116 void status_display ();
19117
19118 void *thread_keypress (void *p)
19119 {
19120 int benchmark = *((int *) p);
19121
19122 uint quiet = data.quiet;
19123
19124 tty_break();
19125
19126 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19127 {
19128 int ch = tty_getchar();
19129
19130 if (ch == -1) break;
19131
19132 if (ch == 0) continue;
19133
19134 #ifdef _POSIX
19135 if (ch != '\n')
19136 #endif
19137
19138 hc_thread_mutex_lock (mux_display);
19139
19140 log_info ("");
19141
19142 switch (ch)
19143 {
19144 case 's':
19145 case '\n':
19146
19147 log_info ("");
19148
19149 status_display ();
19150
19151 log_info ("");
19152
19153 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19154 if (quiet == 0) fflush (stdout);
19155
19156 break;
19157
19158 case 'b':
19159
19160 log_info ("");
19161
19162 bypass ();
19163
19164 log_info ("");
19165
19166 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19167 if (quiet == 0) fflush (stdout);
19168
19169 break;
19170
19171 case 'p':
19172
19173 log_info ("");
19174
19175 SuspendThreads ();
19176
19177 log_info ("");
19178
19179 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19180 if (quiet == 0) fflush (stdout);
19181
19182 break;
19183
19184 case 'r':
19185
19186 log_info ("");
19187
19188 ResumeThreads ();
19189
19190 log_info ("");
19191
19192 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19193 if (quiet == 0) fflush (stdout);
19194
19195 break;
19196
19197 case 'c':
19198
19199 log_info ("");
19200
19201 if (benchmark == 1) break;
19202
19203 stop_at_checkpoint ();
19204
19205 log_info ("");
19206
19207 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19208 if (quiet == 0) fflush (stdout);
19209
19210 break;
19211
19212 case 'q':
19213
19214 log_info ("");
19215
19216 if (benchmark == 1)
19217 {
19218 myquit ();
19219 }
19220 else
19221 {
19222 myabort ();
19223 }
19224
19225 break;
19226 }
19227
19228 hc_thread_mutex_unlock (mux_display);
19229 }
19230
19231 tty_fix();
19232
19233 return (p);
19234 }
19235
19236 /**
19237 * rules common
19238 */
19239
19240 bool class_num (const u8 c)
19241 {
19242 return ((c >= '0') && (c <= '9'));
19243 }
19244
19245 bool class_lower (const u8 c)
19246 {
19247 return ((c >= 'a') && (c <= 'z'));
19248 }
19249
19250 bool class_upper (const u8 c)
19251 {
19252 return ((c >= 'A') && (c <= 'Z'));
19253 }
19254
19255 bool class_alpha (const u8 c)
19256 {
19257 return (class_lower (c) || class_upper (c));
19258 }
19259
19260 int conv_ctoi (const u8 c)
19261 {
19262 if (class_num (c))
19263 {
19264 return c - '0';
19265 }
19266 else if (class_upper (c))
19267 {
19268 return c - 'A' + 10;
19269 }
19270
19271 return -1;
19272 }
19273
19274 int conv_itoc (const u8 c)
19275 {
19276 if (c < 10)
19277 {
19278 return c + '0';
19279 }
19280 else if (c < 37)
19281 {
19282 return c + 'A' - 10;
19283 }
19284
19285 return -1;
19286 }
19287
19288 /**
19289 * device rules
19290 */
19291
19292 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19293 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19294 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19295 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19296 #define MAX_KERNEL_RULES 255
19297 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19298 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19299 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19300
19301 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19302 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19303 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19304 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19305
19306 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19307 {
19308 uint rule_pos;
19309 uint rule_cnt;
19310
19311 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19312 {
19313 switch (rule_buf[rule_pos])
19314 {
19315 case ' ':
19316 rule_cnt--;
19317 break;
19318
19319 case RULE_OP_MANGLE_NOOP:
19320 SET_NAME (rule, rule_buf[rule_pos]);
19321 break;
19322
19323 case RULE_OP_MANGLE_LREST:
19324 SET_NAME (rule, rule_buf[rule_pos]);
19325 break;
19326
19327 case RULE_OP_MANGLE_UREST:
19328 SET_NAME (rule, rule_buf[rule_pos]);
19329 break;
19330
19331 case RULE_OP_MANGLE_LREST_UFIRST:
19332 SET_NAME (rule, rule_buf[rule_pos]);
19333 break;
19334
19335 case RULE_OP_MANGLE_UREST_LFIRST:
19336 SET_NAME (rule, rule_buf[rule_pos]);
19337 break;
19338
19339 case RULE_OP_MANGLE_TREST:
19340 SET_NAME (rule, rule_buf[rule_pos]);
19341 break;
19342
19343 case RULE_OP_MANGLE_TOGGLE_AT:
19344 SET_NAME (rule, rule_buf[rule_pos]);
19345 SET_P0_CONV (rule, rule_buf[rule_pos]);
19346 break;
19347
19348 case RULE_OP_MANGLE_REVERSE:
19349 SET_NAME (rule, rule_buf[rule_pos]);
19350 break;
19351
19352 case RULE_OP_MANGLE_DUPEWORD:
19353 SET_NAME (rule, rule_buf[rule_pos]);
19354 break;
19355
19356 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19357 SET_NAME (rule, rule_buf[rule_pos]);
19358 SET_P0_CONV (rule, rule_buf[rule_pos]);
19359 break;
19360
19361 case RULE_OP_MANGLE_REFLECT:
19362 SET_NAME (rule, rule_buf[rule_pos]);
19363 break;
19364
19365 case RULE_OP_MANGLE_ROTATE_LEFT:
19366 SET_NAME (rule, rule_buf[rule_pos]);
19367 break;
19368
19369 case RULE_OP_MANGLE_ROTATE_RIGHT:
19370 SET_NAME (rule, rule_buf[rule_pos]);
19371 break;
19372
19373 case RULE_OP_MANGLE_APPEND:
19374 SET_NAME (rule, rule_buf[rule_pos]);
19375 SET_P0 (rule, rule_buf[rule_pos]);
19376 break;
19377
19378 case RULE_OP_MANGLE_PREPEND:
19379 SET_NAME (rule, rule_buf[rule_pos]);
19380 SET_P0 (rule, rule_buf[rule_pos]);
19381 break;
19382
19383 case RULE_OP_MANGLE_DELETE_FIRST:
19384 SET_NAME (rule, rule_buf[rule_pos]);
19385 break;
19386
19387 case RULE_OP_MANGLE_DELETE_LAST:
19388 SET_NAME (rule, rule_buf[rule_pos]);
19389 break;
19390
19391 case RULE_OP_MANGLE_DELETE_AT:
19392 SET_NAME (rule, rule_buf[rule_pos]);
19393 SET_P0_CONV (rule, rule_buf[rule_pos]);
19394 break;
19395
19396 case RULE_OP_MANGLE_EXTRACT:
19397 SET_NAME (rule, rule_buf[rule_pos]);
19398 SET_P0_CONV (rule, rule_buf[rule_pos]);
19399 SET_P1_CONV (rule, rule_buf[rule_pos]);
19400 break;
19401
19402 case RULE_OP_MANGLE_OMIT:
19403 SET_NAME (rule, rule_buf[rule_pos]);
19404 SET_P0_CONV (rule, rule_buf[rule_pos]);
19405 SET_P1_CONV (rule, rule_buf[rule_pos]);
19406 break;
19407
19408 case RULE_OP_MANGLE_INSERT:
19409 SET_NAME (rule, rule_buf[rule_pos]);
19410 SET_P0_CONV (rule, rule_buf[rule_pos]);
19411 SET_P1 (rule, rule_buf[rule_pos]);
19412 break;
19413
19414 case RULE_OP_MANGLE_OVERSTRIKE:
19415 SET_NAME (rule, rule_buf[rule_pos]);
19416 SET_P0_CONV (rule, rule_buf[rule_pos]);
19417 SET_P1 (rule, rule_buf[rule_pos]);
19418 break;
19419
19420 case RULE_OP_MANGLE_TRUNCATE_AT:
19421 SET_NAME (rule, rule_buf[rule_pos]);
19422 SET_P0_CONV (rule, rule_buf[rule_pos]);
19423 break;
19424
19425 case RULE_OP_MANGLE_REPLACE:
19426 SET_NAME (rule, rule_buf[rule_pos]);
19427 SET_P0 (rule, rule_buf[rule_pos]);
19428 SET_P1 (rule, rule_buf[rule_pos]);
19429 break;
19430
19431 case RULE_OP_MANGLE_PURGECHAR:
19432 return (-1);
19433 break;
19434
19435 case RULE_OP_MANGLE_TOGGLECASE_REC:
19436 return (-1);
19437 break;
19438
19439 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19440 SET_NAME (rule, rule_buf[rule_pos]);
19441 SET_P0_CONV (rule, rule_buf[rule_pos]);
19442 break;
19443
19444 case RULE_OP_MANGLE_DUPECHAR_LAST:
19445 SET_NAME (rule, rule_buf[rule_pos]);
19446 SET_P0_CONV (rule, rule_buf[rule_pos]);
19447 break;
19448
19449 case RULE_OP_MANGLE_DUPECHAR_ALL:
19450 SET_NAME (rule, rule_buf[rule_pos]);
19451 break;
19452
19453 case RULE_OP_MANGLE_SWITCH_FIRST:
19454 SET_NAME (rule, rule_buf[rule_pos]);
19455 break;
19456
19457 case RULE_OP_MANGLE_SWITCH_LAST:
19458 SET_NAME (rule, rule_buf[rule_pos]);
19459 break;
19460
19461 case RULE_OP_MANGLE_SWITCH_AT:
19462 SET_NAME (rule, rule_buf[rule_pos]);
19463 SET_P0_CONV (rule, rule_buf[rule_pos]);
19464 SET_P1_CONV (rule, rule_buf[rule_pos]);
19465 break;
19466
19467 case RULE_OP_MANGLE_CHR_SHIFTL:
19468 SET_NAME (rule, rule_buf[rule_pos]);
19469 SET_P0_CONV (rule, rule_buf[rule_pos]);
19470 break;
19471
19472 case RULE_OP_MANGLE_CHR_SHIFTR:
19473 SET_NAME (rule, rule_buf[rule_pos]);
19474 SET_P0_CONV (rule, rule_buf[rule_pos]);
19475 break;
19476
19477 case RULE_OP_MANGLE_CHR_INCR:
19478 SET_NAME (rule, rule_buf[rule_pos]);
19479 SET_P0_CONV (rule, rule_buf[rule_pos]);
19480 break;
19481
19482 case RULE_OP_MANGLE_CHR_DECR:
19483 SET_NAME (rule, rule_buf[rule_pos]);
19484 SET_P0_CONV (rule, rule_buf[rule_pos]);
19485 break;
19486
19487 case RULE_OP_MANGLE_REPLACE_NP1:
19488 SET_NAME (rule, rule_buf[rule_pos]);
19489 SET_P0_CONV (rule, rule_buf[rule_pos]);
19490 break;
19491
19492 case RULE_OP_MANGLE_REPLACE_NM1:
19493 SET_NAME (rule, rule_buf[rule_pos]);
19494 SET_P0_CONV (rule, rule_buf[rule_pos]);
19495 break;
19496
19497 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19498 SET_NAME (rule, rule_buf[rule_pos]);
19499 SET_P0_CONV (rule, rule_buf[rule_pos]);
19500 break;
19501
19502 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19503 SET_NAME (rule, rule_buf[rule_pos]);
19504 SET_P0_CONV (rule, rule_buf[rule_pos]);
19505 break;
19506
19507 case RULE_OP_MANGLE_TITLE:
19508 SET_NAME (rule, rule_buf[rule_pos]);
19509 break;
19510
19511 default:
19512 return (-1);
19513 break;
19514 }
19515 }
19516
19517 if (rule_pos < rule_len) return (-1);
19518
19519 return (0);
19520 }
19521
19522 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19523 {
19524 uint rule_cnt;
19525 uint rule_pos;
19526 uint rule_len = BUFSIZ - 1; // maximum possible len
19527
19528 char rule_cmd;
19529
19530 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19531 {
19532 GET_NAME (rule);
19533
19534 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19535
19536 switch (rule_cmd)
19537 {
19538 case RULE_OP_MANGLE_NOOP:
19539 rule_buf[rule_pos] = rule_cmd;
19540 break;
19541
19542 case RULE_OP_MANGLE_LREST:
19543 rule_buf[rule_pos] = rule_cmd;
19544 break;
19545
19546 case RULE_OP_MANGLE_UREST:
19547 rule_buf[rule_pos] = rule_cmd;
19548 break;
19549
19550 case RULE_OP_MANGLE_LREST_UFIRST:
19551 rule_buf[rule_pos] = rule_cmd;
19552 break;
19553
19554 case RULE_OP_MANGLE_UREST_LFIRST:
19555 rule_buf[rule_pos] = rule_cmd;
19556 break;
19557
19558 case RULE_OP_MANGLE_TREST:
19559 rule_buf[rule_pos] = rule_cmd;
19560 break;
19561
19562 case RULE_OP_MANGLE_TOGGLE_AT:
19563 rule_buf[rule_pos] = rule_cmd;
19564 GET_P0_CONV (rule);
19565 break;
19566
19567 case RULE_OP_MANGLE_REVERSE:
19568 rule_buf[rule_pos] = rule_cmd;
19569 break;
19570
19571 case RULE_OP_MANGLE_DUPEWORD:
19572 rule_buf[rule_pos] = rule_cmd;
19573 break;
19574
19575 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19576 rule_buf[rule_pos] = rule_cmd;
19577 GET_P0_CONV (rule);
19578 break;
19579
19580 case RULE_OP_MANGLE_REFLECT:
19581 rule_buf[rule_pos] = rule_cmd;
19582 break;
19583
19584 case RULE_OP_MANGLE_ROTATE_LEFT:
19585 rule_buf[rule_pos] = rule_cmd;
19586 break;
19587
19588 case RULE_OP_MANGLE_ROTATE_RIGHT:
19589 rule_buf[rule_pos] = rule_cmd;
19590 break;
19591
19592 case RULE_OP_MANGLE_APPEND:
19593 rule_buf[rule_pos] = rule_cmd;
19594 GET_P0 (rule);
19595 break;
19596
19597 case RULE_OP_MANGLE_PREPEND:
19598 rule_buf[rule_pos] = rule_cmd;
19599 GET_P0 (rule);
19600 break;
19601
19602 case RULE_OP_MANGLE_DELETE_FIRST:
19603 rule_buf[rule_pos] = rule_cmd;
19604 break;
19605
19606 case RULE_OP_MANGLE_DELETE_LAST:
19607 rule_buf[rule_pos] = rule_cmd;
19608 break;
19609
19610 case RULE_OP_MANGLE_DELETE_AT:
19611 rule_buf[rule_pos] = rule_cmd;
19612 GET_P0_CONV (rule);
19613 break;
19614
19615 case RULE_OP_MANGLE_EXTRACT:
19616 rule_buf[rule_pos] = rule_cmd;
19617 GET_P0_CONV (rule);
19618 GET_P1_CONV (rule);
19619 break;
19620
19621 case RULE_OP_MANGLE_OMIT:
19622 rule_buf[rule_pos] = rule_cmd;
19623 GET_P0_CONV (rule);
19624 GET_P1_CONV (rule);
19625 break;
19626
19627 case RULE_OP_MANGLE_INSERT:
19628 rule_buf[rule_pos] = rule_cmd;
19629 GET_P0_CONV (rule);
19630 GET_P1 (rule);
19631 break;
19632
19633 case RULE_OP_MANGLE_OVERSTRIKE:
19634 rule_buf[rule_pos] = rule_cmd;
19635 GET_P0_CONV (rule);
19636 GET_P1 (rule);
19637 break;
19638
19639 case RULE_OP_MANGLE_TRUNCATE_AT:
19640 rule_buf[rule_pos] = rule_cmd;
19641 GET_P0_CONV (rule);
19642 break;
19643
19644 case RULE_OP_MANGLE_REPLACE:
19645 rule_buf[rule_pos] = rule_cmd;
19646 GET_P0 (rule);
19647 GET_P1 (rule);
19648 break;
19649
19650 case RULE_OP_MANGLE_PURGECHAR:
19651 return (-1);
19652 break;
19653
19654 case RULE_OP_MANGLE_TOGGLECASE_REC:
19655 return (-1);
19656 break;
19657
19658 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19659 rule_buf[rule_pos] = rule_cmd;
19660 GET_P0_CONV (rule);
19661 break;
19662
19663 case RULE_OP_MANGLE_DUPECHAR_LAST:
19664 rule_buf[rule_pos] = rule_cmd;
19665 GET_P0_CONV (rule);
19666 break;
19667
19668 case RULE_OP_MANGLE_DUPECHAR_ALL:
19669 rule_buf[rule_pos] = rule_cmd;
19670 break;
19671
19672 case RULE_OP_MANGLE_SWITCH_FIRST:
19673 rule_buf[rule_pos] = rule_cmd;
19674 break;
19675
19676 case RULE_OP_MANGLE_SWITCH_LAST:
19677 rule_buf[rule_pos] = rule_cmd;
19678 break;
19679
19680 case RULE_OP_MANGLE_SWITCH_AT:
19681 rule_buf[rule_pos] = rule_cmd;
19682 GET_P0_CONV (rule);
19683 GET_P1_CONV (rule);
19684 break;
19685
19686 case RULE_OP_MANGLE_CHR_SHIFTL:
19687 rule_buf[rule_pos] = rule_cmd;
19688 GET_P0_CONV (rule);
19689 break;
19690
19691 case RULE_OP_MANGLE_CHR_SHIFTR:
19692 rule_buf[rule_pos] = rule_cmd;
19693 GET_P0_CONV (rule);
19694 break;
19695
19696 case RULE_OP_MANGLE_CHR_INCR:
19697 rule_buf[rule_pos] = rule_cmd;
19698 GET_P0_CONV (rule);
19699 break;
19700
19701 case RULE_OP_MANGLE_CHR_DECR:
19702 rule_buf[rule_pos] = rule_cmd;
19703 GET_P0_CONV (rule);
19704 break;
19705
19706 case RULE_OP_MANGLE_REPLACE_NP1:
19707 rule_buf[rule_pos] = rule_cmd;
19708 GET_P0_CONV (rule);
19709 break;
19710
19711 case RULE_OP_MANGLE_REPLACE_NM1:
19712 rule_buf[rule_pos] = rule_cmd;
19713 GET_P0_CONV (rule);
19714 break;
19715
19716 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19717 rule_buf[rule_pos] = rule_cmd;
19718 GET_P0_CONV (rule);
19719 break;
19720
19721 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19722 rule_buf[rule_pos] = rule_cmd;
19723 GET_P0_CONV (rule);
19724 break;
19725
19726 case RULE_OP_MANGLE_TITLE:
19727 rule_buf[rule_pos] = rule_cmd;
19728 break;
19729
19730 case 0:
19731 return rule_pos - 1;
19732 break;
19733
19734 default:
19735 return (-1);
19736 break;
19737 }
19738 }
19739
19740 if (rule_cnt > 0)
19741 {
19742 return rule_pos;
19743 }
19744
19745 return (-1);
19746 }
19747
19748 /**
19749 * CPU rules : this is from hashcat sources, cpu based rules
19750 */
19751
19752 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19753 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19754
19755 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19756 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19757 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19758
19759 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19760 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19761 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19762
19763 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19764 {
19765 int pos;
19766
19767 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19768
19769 return (arr_len);
19770 }
19771
19772 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19773 {
19774 int pos;
19775
19776 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19777
19778 return (arr_len);
19779 }
19780
19781 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19782 {
19783 int pos;
19784
19785 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19786
19787 return (arr_len);
19788 }
19789
19790 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19791 {
19792 int l;
19793 int r;
19794
19795 for (l = 0; l < arr_len; l++)
19796 {
19797 r = arr_len - 1 - l;
19798
19799 if (l >= r) break;
19800
19801 MANGLE_SWITCH (arr, l, r);
19802 }
19803
19804 return (arr_len);
19805 }
19806
19807 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19808 {
19809 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19810
19811 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19812
19813 return (arr_len * 2);
19814 }
19815
19816 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19817 {
19818 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19819
19820 int orig_len = arr_len;
19821
19822 int i;
19823
19824 for (i = 0; i < times; i++)
19825 {
19826 memcpy (&arr[arr_len], arr, orig_len);
19827
19828 arr_len += orig_len;
19829 }
19830
19831 return (arr_len);
19832 }
19833
19834 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19835 {
19836 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19837
19838 mangle_double (arr, arr_len);
19839
19840 mangle_reverse (arr + arr_len, arr_len);
19841
19842 return (arr_len * 2);
19843 }
19844
19845 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19846 {
19847 int l;
19848 int r;
19849
19850 for (l = 0, r = arr_len - 1; r > 0; r--)
19851 {
19852 MANGLE_SWITCH (arr, l, r);
19853 }
19854
19855 return (arr_len);
19856 }
19857
19858 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19859 {
19860 int l;
19861 int r;
19862
19863 for (l = 0, r = arr_len - 1; l < r; l++)
19864 {
19865 MANGLE_SWITCH (arr, l, r);
19866 }
19867
19868 return (arr_len);
19869 }
19870
19871 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19872 {
19873 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19874
19875 arr[arr_len] = c;
19876
19877 return (arr_len + 1);
19878 }
19879
19880 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19881 {
19882 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19883
19884 int arr_pos;
19885
19886 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19887 {
19888 arr[arr_pos + 1] = arr[arr_pos];
19889 }
19890
19891 arr[0] = c;
19892
19893 return (arr_len + 1);
19894 }
19895
19896 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19897 {
19898 if (upos >= arr_len) return (arr_len);
19899
19900 int arr_pos;
19901
19902 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19903 {
19904 arr[arr_pos] = arr[arr_pos + 1];
19905 }
19906
19907 return (arr_len - 1);
19908 }
19909
19910 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19911 {
19912 if (upos >= arr_len) return (arr_len);
19913
19914 if ((upos + ulen) > arr_len) return (arr_len);
19915
19916 int arr_pos;
19917
19918 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19919 {
19920 arr[arr_pos] = arr[upos + arr_pos];
19921 }
19922
19923 return (ulen);
19924 }
19925
19926 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19927 {
19928 if (upos >= arr_len) return (arr_len);
19929
19930 if ((upos + ulen) >= arr_len) return (arr_len);
19931
19932 int arr_pos;
19933
19934 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19935 {
19936 arr[arr_pos] = arr[arr_pos + ulen];
19937 }
19938
19939 return (arr_len - ulen);
19940 }
19941
19942 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19943 {
19944 if (upos >= arr_len) return (arr_len);
19945
19946 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19947
19948 int arr_pos;
19949
19950 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19951 {
19952 arr[arr_pos + 1] = arr[arr_pos];
19953 }
19954
19955 arr[upos] = c;
19956
19957 return (arr_len + 1);
19958 }
19959
19960 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)
19961 {
19962 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19963
19964 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19965
19966 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19967
19968 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19969
19970 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19971
19972 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19973
19974 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19975
19976 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19977
19978 return (arr_len + arr2_cpy);
19979 }
19980
19981 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19982 {
19983 if (upos >= arr_len) return (arr_len);
19984
19985 arr[upos] = c;
19986
19987 return (arr_len);
19988 }
19989
19990 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19991 {
19992 if (upos >= arr_len) return (arr_len);
19993
19994 memset (arr + upos, 0, arr_len - upos);
19995
19996 return (upos);
19997 }
19998
19999 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
20000 {
20001 int arr_pos;
20002
20003 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
20004 {
20005 if (arr[arr_pos] != oldc) continue;
20006
20007 arr[arr_pos] = newc;
20008 }
20009
20010 return (arr_len);
20011 }
20012
20013 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
20014 {
20015 int arr_pos;
20016
20017 int ret_len;
20018
20019 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
20020 {
20021 if (arr[arr_pos] == c) continue;
20022
20023 arr[ret_len] = arr[arr_pos];
20024
20025 ret_len++;
20026 }
20027
20028 return (ret_len);
20029 }
20030
20031 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
20032 {
20033 if (ulen > arr_len) return (arr_len);
20034
20035 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20036
20037 char cs[100] = { 0 };
20038
20039 memcpy (cs, arr, ulen);
20040
20041 int i;
20042
20043 for (i = 0; i < ulen; i++)
20044 {
20045 char c = cs[i];
20046
20047 arr_len = mangle_insert (arr, arr_len, i, c);
20048 }
20049
20050 return (arr_len);
20051 }
20052
20053 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20054 {
20055 if (ulen > arr_len) return (arr_len);
20056
20057 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20058
20059 int upos = arr_len - ulen;
20060
20061 int i;
20062
20063 for (i = 0; i < ulen; i++)
20064 {
20065 char c = arr[upos + i];
20066
20067 arr_len = mangle_append (arr, arr_len, c);
20068 }
20069
20070 return (arr_len);
20071 }
20072
20073 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20074 {
20075 if ( arr_len == 0) return (arr_len);
20076 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20077
20078 char c = arr[upos];
20079
20080 int i;
20081
20082 for (i = 0; i < ulen; i++)
20083 {
20084 arr_len = mangle_insert (arr, arr_len, upos, c);
20085 }
20086
20087 return (arr_len);
20088 }
20089
20090 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20091 {
20092 if ( arr_len == 0) return (arr_len);
20093 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20094
20095 int arr_pos;
20096
20097 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20098 {
20099 int new_pos = arr_pos * 2;
20100
20101 arr[new_pos] = arr[arr_pos];
20102
20103 arr[new_pos + 1] = arr[arr_pos];
20104 }
20105
20106 return (arr_len * 2);
20107 }
20108
20109 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20110 {
20111 if (upos >= arr_len) return (arr_len);
20112 if (upos2 >= arr_len) return (arr_len);
20113
20114 MANGLE_SWITCH (arr, upos, upos2);
20115
20116 return (arr_len);
20117 }
20118
20119 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20120 {
20121 MANGLE_SWITCH (arr, upos, upos2);
20122
20123 return (arr_len);
20124 }
20125
20126 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20127 {
20128 if (upos >= arr_len) return (arr_len);
20129
20130 arr[upos] <<= 1;
20131
20132 return (arr_len);
20133 }
20134
20135 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20136 {
20137 if (upos >= arr_len) return (arr_len);
20138
20139 arr[upos] >>= 1;
20140
20141 return (arr_len);
20142 }
20143
20144 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20145 {
20146 if (upos >= arr_len) return (arr_len);
20147
20148 arr[upos] += 1;
20149
20150 return (arr_len);
20151 }
20152
20153 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20154 {
20155 if (upos >= arr_len) return (arr_len);
20156
20157 arr[upos] -= 1;
20158
20159 return (arr_len);
20160 }
20161
20162 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20163 {
20164 int upper_next = 1;
20165
20166 int pos;
20167
20168 for (pos = 0; pos < arr_len; pos++)
20169 {
20170 if (arr[pos] == ' ')
20171 {
20172 upper_next = 1;
20173
20174 continue;
20175 }
20176
20177 if (upper_next)
20178 {
20179 upper_next = 0;
20180
20181 MANGLE_UPPER_AT (arr, pos);
20182 }
20183 else
20184 {
20185 MANGLE_LOWER_AT (arr, pos);
20186 }
20187 }
20188
20189 return (arr_len);
20190 }
20191
20192 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20193 {
20194 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20195
20196 u32 j;
20197
20198 u32 rule_pos = 0;
20199
20200 for (j = 0; j < rp_gen_num; j++)
20201 {
20202 u32 r = 0;
20203 u32 p1 = 0;
20204 u32 p2 = 0;
20205 u32 p3 = 0;
20206
20207 switch ((char) get_random_num (0, 9))
20208 {
20209 case 0:
20210 r = get_random_num (0, sizeof (grp_op_nop));
20211 rule_buf[rule_pos++] = grp_op_nop[r];
20212 break;
20213
20214 case 1:
20215 r = get_random_num (0, sizeof (grp_op_pos_p0));
20216 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20217 p1 = get_random_num (0, sizeof (grp_pos));
20218 rule_buf[rule_pos++] = grp_pos[p1];
20219 break;
20220
20221 case 2:
20222 r = get_random_num (0, sizeof (grp_op_pos_p1));
20223 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20224 p1 = get_random_num (1, 6);
20225 rule_buf[rule_pos++] = grp_pos[p1];
20226 break;
20227
20228 case 3:
20229 r = get_random_num (0, sizeof (grp_op_chr));
20230 rule_buf[rule_pos++] = grp_op_chr[r];
20231 p1 = get_random_num (0x20, 0x7e);
20232 rule_buf[rule_pos++] = (char) p1;
20233 break;
20234
20235 case 4:
20236 r = get_random_num (0, sizeof (grp_op_chr_chr));
20237 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20238 p1 = get_random_num (0x20, 0x7e);
20239 rule_buf[rule_pos++] = (char) p1;
20240 p2 = get_random_num (0x20, 0x7e);
20241 while (p1 == p2)
20242 p2 = get_random_num (0x20, 0x7e);
20243 rule_buf[rule_pos++] = (char) p2;
20244 break;
20245
20246 case 5:
20247 r = get_random_num (0, sizeof (grp_op_pos_chr));
20248 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20249 p1 = get_random_num (0, sizeof (grp_pos));
20250 rule_buf[rule_pos++] = grp_pos[p1];
20251 p2 = get_random_num (0x20, 0x7e);
20252 rule_buf[rule_pos++] = (char) p2;
20253 break;
20254
20255 case 6:
20256 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20257 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20258 p1 = get_random_num (0, sizeof (grp_pos));
20259 rule_buf[rule_pos++] = grp_pos[p1];
20260 p2 = get_random_num (0, sizeof (grp_pos));
20261 while (p1 == p2)
20262 p2 = get_random_num (0, sizeof (grp_pos));
20263 rule_buf[rule_pos++] = grp_pos[p2];
20264 break;
20265
20266 case 7:
20267 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20268 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20269 p1 = get_random_num (0, sizeof (grp_pos));
20270 rule_buf[rule_pos++] = grp_pos[p1];
20271 p2 = get_random_num (1, sizeof (grp_pos));
20272 while (p1 == p2)
20273 p2 = get_random_num (1, sizeof (grp_pos));
20274 rule_buf[rule_pos++] = grp_pos[p2];
20275 break;
20276
20277 case 8:
20278 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20279 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20280 p1 = get_random_num (0, sizeof (grp_pos));
20281 rule_buf[rule_pos++] = grp_pos[p1];
20282 p2 = get_random_num (1, sizeof (grp_pos));
20283 rule_buf[rule_pos++] = grp_pos[p1];
20284 p3 = get_random_num (0, sizeof (grp_pos));
20285 rule_buf[rule_pos++] = grp_pos[p3];
20286 break;
20287 }
20288 }
20289
20290 return (rule_pos);
20291 }
20292
20293 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20294 {
20295 char mem[BLOCK_SIZE] = { 0 };
20296
20297 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20298
20299 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20300
20301 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20302
20303 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20304
20305 int out_len = in_len;
20306 int mem_len = in_len;
20307
20308 memcpy (out, in, out_len);
20309
20310 int rule_pos;
20311
20312 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20313 {
20314 int upos, upos2;
20315 int ulen;
20316
20317 switch (rule[rule_pos])
20318 {
20319 case ' ':
20320 break;
20321
20322 case RULE_OP_MANGLE_NOOP:
20323 break;
20324
20325 case RULE_OP_MANGLE_LREST:
20326 out_len = mangle_lrest (out, out_len);
20327 break;
20328
20329 case RULE_OP_MANGLE_UREST:
20330 out_len = mangle_urest (out, out_len);
20331 break;
20332
20333 case RULE_OP_MANGLE_LREST_UFIRST:
20334 out_len = mangle_lrest (out, out_len);
20335 if (out_len) MANGLE_UPPER_AT (out, 0);
20336 break;
20337
20338 case RULE_OP_MANGLE_UREST_LFIRST:
20339 out_len = mangle_urest (out, out_len);
20340 if (out_len) MANGLE_LOWER_AT (out, 0);
20341 break;
20342
20343 case RULE_OP_MANGLE_TREST:
20344 out_len = mangle_trest (out, out_len);
20345 break;
20346
20347 case RULE_OP_MANGLE_TOGGLE_AT:
20348 NEXT_RULEPOS (rule_pos);
20349 NEXT_RPTOI (rule, rule_pos, upos);
20350 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20351 break;
20352
20353 case RULE_OP_MANGLE_REVERSE:
20354 out_len = mangle_reverse (out, out_len);
20355 break;
20356
20357 case RULE_OP_MANGLE_DUPEWORD:
20358 out_len = mangle_double (out, out_len);
20359 break;
20360
20361 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20362 NEXT_RULEPOS (rule_pos);
20363 NEXT_RPTOI (rule, rule_pos, ulen);
20364 out_len = mangle_double_times (out, out_len, ulen);
20365 break;
20366
20367 case RULE_OP_MANGLE_REFLECT:
20368 out_len = mangle_reflect (out, out_len);
20369 break;
20370
20371 case RULE_OP_MANGLE_ROTATE_LEFT:
20372 mangle_rotate_left (out, out_len);
20373 break;
20374
20375 case RULE_OP_MANGLE_ROTATE_RIGHT:
20376 mangle_rotate_right (out, out_len);
20377 break;
20378
20379 case RULE_OP_MANGLE_APPEND:
20380 NEXT_RULEPOS (rule_pos);
20381 out_len = mangle_append (out, out_len, rule[rule_pos]);
20382 break;
20383
20384 case RULE_OP_MANGLE_PREPEND:
20385 NEXT_RULEPOS (rule_pos);
20386 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20387 break;
20388
20389 case RULE_OP_MANGLE_DELETE_FIRST:
20390 out_len = mangle_delete_at (out, out_len, 0);
20391 break;
20392
20393 case RULE_OP_MANGLE_DELETE_LAST:
20394 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20395 break;
20396
20397 case RULE_OP_MANGLE_DELETE_AT:
20398 NEXT_RULEPOS (rule_pos);
20399 NEXT_RPTOI (rule, rule_pos, upos);
20400 out_len = mangle_delete_at (out, out_len, upos);
20401 break;
20402
20403 case RULE_OP_MANGLE_EXTRACT:
20404 NEXT_RULEPOS (rule_pos);
20405 NEXT_RPTOI (rule, rule_pos, upos);
20406 NEXT_RULEPOS (rule_pos);
20407 NEXT_RPTOI (rule, rule_pos, ulen);
20408 out_len = mangle_extract (out, out_len, upos, ulen);
20409 break;
20410
20411 case RULE_OP_MANGLE_OMIT:
20412 NEXT_RULEPOS (rule_pos);
20413 NEXT_RPTOI (rule, rule_pos, upos);
20414 NEXT_RULEPOS (rule_pos);
20415 NEXT_RPTOI (rule, rule_pos, ulen);
20416 out_len = mangle_omit (out, out_len, upos, ulen);
20417 break;
20418
20419 case RULE_OP_MANGLE_INSERT:
20420 NEXT_RULEPOS (rule_pos);
20421 NEXT_RPTOI (rule, rule_pos, upos);
20422 NEXT_RULEPOS (rule_pos);
20423 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20424 break;
20425
20426 case RULE_OP_MANGLE_OVERSTRIKE:
20427 NEXT_RULEPOS (rule_pos);
20428 NEXT_RPTOI (rule, rule_pos, upos);
20429 NEXT_RULEPOS (rule_pos);
20430 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20431 break;
20432
20433 case RULE_OP_MANGLE_TRUNCATE_AT:
20434 NEXT_RULEPOS (rule_pos);
20435 NEXT_RPTOI (rule, rule_pos, upos);
20436 out_len = mangle_truncate_at (out, out_len, upos);
20437 break;
20438
20439 case RULE_OP_MANGLE_REPLACE:
20440 NEXT_RULEPOS (rule_pos);
20441 NEXT_RULEPOS (rule_pos);
20442 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20443 break;
20444
20445 case RULE_OP_MANGLE_PURGECHAR:
20446 NEXT_RULEPOS (rule_pos);
20447 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20448 break;
20449
20450 case RULE_OP_MANGLE_TOGGLECASE_REC:
20451 /* todo */
20452 break;
20453
20454 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20455 NEXT_RULEPOS (rule_pos);
20456 NEXT_RPTOI (rule, rule_pos, ulen);
20457 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20458 break;
20459
20460 case RULE_OP_MANGLE_DUPECHAR_LAST:
20461 NEXT_RULEPOS (rule_pos);
20462 NEXT_RPTOI (rule, rule_pos, ulen);
20463 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20464 break;
20465
20466 case RULE_OP_MANGLE_DUPECHAR_ALL:
20467 out_len = mangle_dupechar (out, out_len);
20468 break;
20469
20470 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20471 NEXT_RULEPOS (rule_pos);
20472 NEXT_RPTOI (rule, rule_pos, ulen);
20473 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20474 break;
20475
20476 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20477 NEXT_RULEPOS (rule_pos);
20478 NEXT_RPTOI (rule, rule_pos, ulen);
20479 out_len = mangle_dupeblock_append (out, out_len, ulen);
20480 break;
20481
20482 case RULE_OP_MANGLE_SWITCH_FIRST:
20483 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20484 break;
20485
20486 case RULE_OP_MANGLE_SWITCH_LAST:
20487 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20488 break;
20489
20490 case RULE_OP_MANGLE_SWITCH_AT:
20491 NEXT_RULEPOS (rule_pos);
20492 NEXT_RPTOI (rule, rule_pos, upos);
20493 NEXT_RULEPOS (rule_pos);
20494 NEXT_RPTOI (rule, rule_pos, upos2);
20495 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20496 break;
20497
20498 case RULE_OP_MANGLE_CHR_SHIFTL:
20499 NEXT_RULEPOS (rule_pos);
20500 NEXT_RPTOI (rule, rule_pos, upos);
20501 mangle_chr_shiftl (out, out_len, upos);
20502 break;
20503
20504 case RULE_OP_MANGLE_CHR_SHIFTR:
20505 NEXT_RULEPOS (rule_pos);
20506 NEXT_RPTOI (rule, rule_pos, upos);
20507 mangle_chr_shiftr (out, out_len, upos);
20508 break;
20509
20510 case RULE_OP_MANGLE_CHR_INCR:
20511 NEXT_RULEPOS (rule_pos);
20512 NEXT_RPTOI (rule, rule_pos, upos);
20513 mangle_chr_incr (out, out_len, upos);
20514 break;
20515
20516 case RULE_OP_MANGLE_CHR_DECR:
20517 NEXT_RULEPOS (rule_pos);
20518 NEXT_RPTOI (rule, rule_pos, upos);
20519 mangle_chr_decr (out, out_len, upos);
20520 break;
20521
20522 case RULE_OP_MANGLE_REPLACE_NP1:
20523 NEXT_RULEPOS (rule_pos);
20524 NEXT_RPTOI (rule, rule_pos, upos);
20525 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20526 break;
20527
20528 case RULE_OP_MANGLE_REPLACE_NM1:
20529 NEXT_RULEPOS (rule_pos);
20530 NEXT_RPTOI (rule, rule_pos, upos);
20531 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20532 break;
20533
20534 case RULE_OP_MANGLE_TITLE:
20535 out_len = mangle_title (out, out_len);
20536 break;
20537
20538 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20539 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20540 NEXT_RULEPOS (rule_pos);
20541 NEXT_RPTOI (rule, rule_pos, upos);
20542 NEXT_RULEPOS (rule_pos);
20543 NEXT_RPTOI (rule, rule_pos, ulen);
20544 NEXT_RULEPOS (rule_pos);
20545 NEXT_RPTOI (rule, rule_pos, upos2);
20546 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20547 break;
20548
20549 case RULE_OP_MANGLE_APPEND_MEMORY:
20550 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20551 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20552 memcpy (out + out_len, mem, mem_len);
20553 out_len += mem_len;
20554 break;
20555
20556 case RULE_OP_MANGLE_PREPEND_MEMORY:
20557 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20558 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20559 memcpy (mem + mem_len, out, out_len);
20560 out_len += mem_len;
20561 memcpy (out, mem, out_len);
20562 break;
20563
20564 case RULE_OP_MEMORIZE_WORD:
20565 memcpy (mem, out, out_len);
20566 mem_len = out_len;
20567 break;
20568
20569 case RULE_OP_REJECT_LESS:
20570 NEXT_RULEPOS (rule_pos);
20571 NEXT_RPTOI (rule, rule_pos, upos);
20572 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20573 break;
20574
20575 case RULE_OP_REJECT_GREATER:
20576 NEXT_RULEPOS (rule_pos);
20577 NEXT_RPTOI (rule, rule_pos, upos);
20578 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20579 break;
20580
20581 case RULE_OP_REJECT_CONTAIN:
20582 NEXT_RULEPOS (rule_pos);
20583 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20584 break;
20585
20586 case RULE_OP_REJECT_NOT_CONTAIN:
20587 NEXT_RULEPOS (rule_pos);
20588 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20589 break;
20590
20591 case RULE_OP_REJECT_EQUAL_FIRST:
20592 NEXT_RULEPOS (rule_pos);
20593 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20594 break;
20595
20596 case RULE_OP_REJECT_EQUAL_LAST:
20597 NEXT_RULEPOS (rule_pos);
20598 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20599 break;
20600
20601 case RULE_OP_REJECT_EQUAL_AT:
20602 NEXT_RULEPOS (rule_pos);
20603 NEXT_RPTOI (rule, rule_pos, upos);
20604 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20605 NEXT_RULEPOS (rule_pos);
20606 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20607 break;
20608
20609 case RULE_OP_REJECT_CONTAINS:
20610 NEXT_RULEPOS (rule_pos);
20611 NEXT_RPTOI (rule, rule_pos, upos);
20612 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20613 NEXT_RULEPOS (rule_pos);
20614 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20615 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20616 break;
20617
20618 case RULE_OP_REJECT_MEMORY:
20619 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20620 break;
20621
20622 default:
20623 return (RULE_RC_SYNTAX_ERROR);
20624 break;
20625 }
20626 }
20627
20628 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20629
20630 return (out_len);
20631 }