Merge pull request #171 from gm4tr1x/master
[hashcat.git] / src / shared.c
1 /**
2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
4 *
5 * License.....: MIT
6 */
7
8 #ifdef OSX
9 #include <stdio.h>
10 #endif
11
12 #include <shared.h>
13 #include <limits.h>
14
15 /**
16 * tuning tools
17 */
18
19 #define GET_ACCEL(x) KERNEL_ACCEL_ ## x
20 #define GET_LOOPS(x) KERNEL_LOOPS_ ## x
21
22 /**
23 * basic bit handling
24 */
25
26 u32 rotl32 (const u32 a, const u32 n)
27 {
28 return ((a << n) | (a >> (32 - n)));
29 }
30
31 u32 rotr32 (const u32 a, const u32 n)
32 {
33 return ((a >> n) | (a << (32 - n)));
34 }
35
36 u64 rotl64 (const u64 a, const u64 n)
37 {
38 return ((a << n) | (a >> (64 - n)));
39 }
40
41 u64 rotr64 (const u64 a, const u64 n)
42 {
43 return ((a >> n) | (a << (64 - n)));
44 }
45
46 u32 byte_swap_32 (const u32 n)
47 {
48 return (n & 0xff000000) >> 24
49 | (n & 0x00ff0000) >> 8
50 | (n & 0x0000ff00) << 8
51 | (n & 0x000000ff) << 24;
52 }
53
54 u64 byte_swap_64 (const u64 n)
55 {
56 return (n & 0xff00000000000000ULL) >> 56
57 | (n & 0x00ff000000000000ULL) >> 40
58 | (n & 0x0000ff0000000000ULL) >> 24
59 | (n & 0x000000ff00000000ULL) >> 8
60 | (n & 0x00000000ff000000ULL) << 8
61 | (n & 0x0000000000ff0000ULL) << 24
62 | (n & 0x000000000000ff00ULL) << 40
63 | (n & 0x00000000000000ffULL) << 56;
64 }
65
66 /**
67 * ciphers for use on cpu
68 */
69
70 #include "cpu-des.c"
71 #include "cpu-aes.c"
72
73 /**
74 * hashes for use on cpu
75 */
76
77 #include "cpu-md5.c"
78 #include "cpu-sha256.c"
79
80 /**
81 * logging
82 */
83
84 int last_len = 0;
85
86 void log_final (FILE *fp, const char *fmt, va_list ap)
87 {
88 if (last_len)
89 {
90 fputc ('\r', fp);
91
92 for (int i = 0; i < last_len; i++)
93 {
94 fputc (' ', fp);
95 }
96
97 fputc ('\r', fp);
98 }
99
100 char s[4096] = { 0 };
101
102 int max_len = (int) sizeof (s);
103
104 int len = vsnprintf (s, max_len, fmt, ap);
105
106 if (len > max_len) len = max_len;
107
108 fwrite (s, len, 1, fp);
109
110 fflush (fp);
111
112 last_len = len;
113 }
114
115 void log_out_nn (FILE *fp, const char *fmt, ...)
116 {
117 if (SUPPRESS_OUTPUT) return;
118
119 va_list ap;
120
121 va_start (ap, fmt);
122
123 log_final (fp, fmt, ap);
124
125 va_end (ap);
126 }
127
128 void log_info_nn (const char *fmt, ...)
129 {
130 if (SUPPRESS_OUTPUT) return;
131
132 va_list ap;
133
134 va_start (ap, fmt);
135
136 log_final (stdout, fmt, ap);
137
138 va_end (ap);
139 }
140
141 void log_error_nn (const char *fmt, ...)
142 {
143 if (SUPPRESS_OUTPUT) return;
144
145 va_list ap;
146
147 va_start (ap, fmt);
148
149 log_final (stderr, fmt, ap);
150
151 va_end (ap);
152 }
153
154 void log_out (FILE *fp, const char *fmt, ...)
155 {
156 if (SUPPRESS_OUTPUT) return;
157
158 va_list ap;
159
160 va_start (ap, fmt);
161
162 log_final (fp, fmt, ap);
163
164 va_end (ap);
165
166 fputc ('\n', fp);
167
168 last_len = 0;
169 }
170
171 void log_info (const char *fmt, ...)
172 {
173 if (SUPPRESS_OUTPUT) return;
174
175 va_list ap;
176
177 va_start (ap, fmt);
178
179 log_final (stdout, fmt, ap);
180
181 va_end (ap);
182
183 fputc ('\n', stdout);
184
185 last_len = 0;
186 }
187
188 void log_error (const char *fmt, ...)
189 {
190 if (SUPPRESS_OUTPUT) return;
191
192 fputc ('\n', stderr);
193 fputc ('\n', stderr);
194
195 va_list ap;
196
197 va_start (ap, fmt);
198
199 log_final (stderr, fmt, ap);
200
201 va_end (ap);
202
203 fputc ('\n', stderr);
204 fputc ('\n', stderr);
205
206 last_len = 0;
207 }
208
209 /**
210 * converter
211 */
212
213 u8 int_to_base32 (const u8 c)
214 {
215 static const u8 tbl[0x20] =
216 {
217 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
218 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
219 };
220
221 return tbl[c];
222 }
223
224 u8 base32_to_int (const u8 c)
225 {
226 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
227 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
228
229 return 0;
230 }
231
232 u8 int_to_itoa32 (const u8 c)
233 {
234 static const u8 tbl[0x20] =
235 {
236 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
237 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
238 };
239
240 return tbl[c];
241 }
242
243 u8 itoa32_to_int (const u8 c)
244 {
245 if ((c >= '0') && (c <= '9')) return c - '0';
246 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
247
248 return 0;
249 }
250
251 u8 int_to_itoa64 (const u8 c)
252 {
253 static const u8 tbl[0x40] =
254 {
255 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
256 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
257 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
258 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
259 };
260
261 return tbl[c];
262 }
263
264 u8 itoa64_to_int (const u8 c)
265 {
266 static const u8 tbl[0x100] =
267 {
268 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
269 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
270 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
271 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
272 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
273 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
274 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
275 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
276 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
277 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
278 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
279 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
280 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
281 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
282 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
283 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
284 };
285
286 return tbl[c];
287 }
288
289 u8 int_to_base64 (const u8 c)
290 {
291 static const u8 tbl[0x40] =
292 {
293 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
294 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
295 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
296 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
297 };
298
299 return tbl[c];
300 }
301
302 u8 base64_to_int (const u8 c)
303 {
304 static const u8 tbl[0x100] =
305 {
306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
309 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
311 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
313 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 };
323
324 return tbl[c];
325 }
326
327 u8 int_to_bf64 (const u8 c)
328 {
329 static const u8 tbl[0x40] =
330 {
331 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
332 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
333 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
334 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
335 };
336
337 return tbl[c];
338 }
339
340 u8 bf64_to_int (const u8 c)
341 {
342 static const u8 tbl[0x100] =
343 {
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
347 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
349 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
351 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 };
361
362 return tbl[c];
363 }
364
365 u8 int_to_lotus64 (const u8 c)
366 {
367 if (c < 10) return '0' + c;
368 else if (c < 36) return 'A' + c - 10;
369 else if (c < 62) return 'a' + c - 36;
370 else if (c == 62) return '+';
371 else if (c == 63) return '/';
372
373 return 0;
374 }
375
376 u8 lotus64_to_int (const u8 c)
377 {
378 if ((c >= '0') && (c <= '9')) return c - '0';
379 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
380 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
381 else if (c == '+') return 62;
382 else if (c == '/') return 63;
383 else
384
385 return 0;
386 }
387
388 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
389 {
390 const u8 *in_ptr = in_buf;
391
392 u8 *out_ptr = out_buf;
393
394 for (int i = 0; i < in_len; i += 8)
395 {
396 const u8 out_val0 = f (in_ptr[0] & 0x7f);
397 const u8 out_val1 = f (in_ptr[1] & 0x7f);
398 const u8 out_val2 = f (in_ptr[2] & 0x7f);
399 const u8 out_val3 = f (in_ptr[3] & 0x7f);
400 const u8 out_val4 = f (in_ptr[4] & 0x7f);
401 const u8 out_val5 = f (in_ptr[5] & 0x7f);
402 const u8 out_val6 = f (in_ptr[6] & 0x7f);
403 const u8 out_val7 = f (in_ptr[7] & 0x7f);
404
405 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
406 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
407 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
408 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
409 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
410
411 in_ptr += 8;
412 out_ptr += 5;
413 }
414
415 for (int i = 0; i < in_len; i++)
416 {
417 if (in_buf[i] != '=') continue;
418
419 in_len = i;
420 }
421
422 int out_len = (in_len * 5) / 8;
423
424 return out_len;
425 }
426
427 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
428 {
429 const u8 *in_ptr = in_buf;
430
431 u8 *out_ptr = out_buf;
432
433 for (int i = 0; i < in_len; i += 5)
434 {
435 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
436 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
437 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
438 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
439 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
440 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
441 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
442 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
443
444 out_ptr[0] = out_val0 & 0x7f;
445 out_ptr[1] = out_val1 & 0x7f;
446 out_ptr[2] = out_val2 & 0x7f;
447 out_ptr[3] = out_val3 & 0x7f;
448 out_ptr[4] = out_val4 & 0x7f;
449 out_ptr[5] = out_val5 & 0x7f;
450 out_ptr[6] = out_val6 & 0x7f;
451 out_ptr[7] = out_val7 & 0x7f;
452
453 in_ptr += 5;
454 out_ptr += 8;
455 }
456
457 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
458
459 while (out_len % 8)
460 {
461 out_buf[out_len] = '=';
462
463 out_len++;
464 }
465
466 return out_len;
467 }
468
469 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
470 {
471 const u8 *in_ptr = in_buf;
472
473 u8 *out_ptr = out_buf;
474
475 for (int i = 0; i < in_len; i += 4)
476 {
477 const u8 out_val0 = f (in_ptr[0] & 0x7f);
478 const u8 out_val1 = f (in_ptr[1] & 0x7f);
479 const u8 out_val2 = f (in_ptr[2] & 0x7f);
480 const u8 out_val3 = f (in_ptr[3] & 0x7f);
481
482 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
483 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
484 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
485
486 in_ptr += 4;
487 out_ptr += 3;
488 }
489
490 for (int i = 0; i < in_len; i++)
491 {
492 if (in_buf[i] != '=') continue;
493
494 in_len = i;
495 }
496
497 int out_len = (in_len * 6) / 8;
498
499 return out_len;
500 }
501
502 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
503 {
504 const u8 *in_ptr = in_buf;
505
506 u8 *out_ptr = out_buf;
507
508 for (int i = 0; i < in_len; i += 3)
509 {
510 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
511 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
512 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
513 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
514
515 out_ptr[0] = out_val0 & 0x7f;
516 out_ptr[1] = out_val1 & 0x7f;
517 out_ptr[2] = out_val2 & 0x7f;
518 out_ptr[3] = out_val3 & 0x7f;
519
520 in_ptr += 3;
521 out_ptr += 4;
522 }
523
524 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
525
526 while (out_len % 4)
527 {
528 out_buf[out_len] = '=';
529
530 out_len++;
531 }
532
533 return out_len;
534 }
535
536 int is_valid_hex_char (const u8 c)
537 {
538 if ((c >= '0') && (c <= '9')) return 1;
539 if ((c >= 'A') && (c <= 'F')) return 1;
540 if ((c >= 'a') && (c <= 'f')) return 1;
541
542 return 0;
543 }
544
545 u8 hex_convert (const u8 c)
546 {
547 return (c & 15) + (c >> 6) * 9;
548 }
549
550 u8 hex_to_u8 (const u8 hex[2])
551 {
552 u8 v = 0;
553
554 v |= (hex_convert (hex[1]) << 0);
555 v |= (hex_convert (hex[0]) << 4);
556
557 return (v);
558 }
559
560 u32 hex_to_u32 (const u8 hex[8])
561 {
562 u32 v = 0;
563
564 v |= ((u32) hex_convert (hex[7])) << 0;
565 v |= ((u32) hex_convert (hex[6])) << 4;
566 v |= ((u32) hex_convert (hex[5])) << 8;
567 v |= ((u32) hex_convert (hex[4])) << 12;
568 v |= ((u32) hex_convert (hex[3])) << 16;
569 v |= ((u32) hex_convert (hex[2])) << 20;
570 v |= ((u32) hex_convert (hex[1])) << 24;
571 v |= ((u32) hex_convert (hex[0])) << 28;
572
573 return (v);
574 }
575
576 u64 hex_to_u64 (const u8 hex[16])
577 {
578 u64 v = 0;
579
580 v |= ((u64) hex_convert (hex[15]) << 0);
581 v |= ((u64) hex_convert (hex[14]) << 4);
582 v |= ((u64) hex_convert (hex[13]) << 8);
583 v |= ((u64) hex_convert (hex[12]) << 12);
584 v |= ((u64) hex_convert (hex[11]) << 16);
585 v |= ((u64) hex_convert (hex[10]) << 20);
586 v |= ((u64) hex_convert (hex[ 9]) << 24);
587 v |= ((u64) hex_convert (hex[ 8]) << 28);
588 v |= ((u64) hex_convert (hex[ 7]) << 32);
589 v |= ((u64) hex_convert (hex[ 6]) << 36);
590 v |= ((u64) hex_convert (hex[ 5]) << 40);
591 v |= ((u64) hex_convert (hex[ 4]) << 44);
592 v |= ((u64) hex_convert (hex[ 3]) << 48);
593 v |= ((u64) hex_convert (hex[ 2]) << 52);
594 v |= ((u64) hex_convert (hex[ 1]) << 56);
595 v |= ((u64) hex_convert (hex[ 0]) << 60);
596
597 return (v);
598 }
599
600 void bin_to_hex_lower (const u32 v, u8 hex[8])
601 {
602 hex[0] = v >> 28 & 15;
603 hex[1] = v >> 24 & 15;
604 hex[2] = v >> 20 & 15;
605 hex[3] = v >> 16 & 15;
606 hex[4] = v >> 12 & 15;
607 hex[5] = v >> 8 & 15;
608 hex[6] = v >> 4 & 15;
609 hex[7] = v >> 0 & 15;
610
611 u32 add;
612
613 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
614 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
615 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
616 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
617 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
618 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
619 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
620 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
621 }
622
623 /**
624 * decoder
625 */
626
627 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
628 {
629 AES_KEY skey;
630
631 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
632
633 u32 _iv[4] = { 0 };
634
635 _iv[0] = iv[0];
636 _iv[1] = iv[1];
637 _iv[2] = iv[2];
638 _iv[3] = iv[3];
639
640 for (int i = 0; i < 16; i += 4)
641 {
642 u32 _in[4] = { 0 };
643 u32 _out[4] = { 0 };
644
645 _in[0] = in[i + 0];
646 _in[1] = in[i + 1];
647 _in[2] = in[i + 2];
648 _in[3] = in[i + 3];
649
650 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
651
652 _out[0] ^= _iv[0];
653 _out[1] ^= _iv[1];
654 _out[2] ^= _iv[2];
655 _out[3] ^= _iv[3];
656
657 out[i + 0] = _out[0];
658 out[i + 1] = _out[1];
659 out[i + 2] = _out[2];
660 out[i + 3] = _out[3];
661
662 _iv[0] = _in[0];
663 _iv[1] = _in[1];
664 _iv[2] = _in[2];
665 _iv[3] = _in[3];
666 }
667 }
668
669 static void juniper_decrypt_hash (char *in, char *out)
670 {
671 // base64 decode
672
673 u8 base64_buf[100] = { 0 };
674
675 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
676
677 // iv stuff
678
679 u32 juniper_iv[4] = { 0 };
680
681 memcpy (juniper_iv, base64_buf, 12);
682
683 memcpy (out, juniper_iv, 12);
684
685 // reversed key
686
687 u32 juniper_key[4] = { 0 };
688
689 juniper_key[0] = byte_swap_32 (0xa6707a7e);
690 juniper_key[1] = byte_swap_32 (0x8df91059);
691 juniper_key[2] = byte_swap_32 (0xdea70ae5);
692 juniper_key[3] = byte_swap_32 (0x2f9c2442);
693
694 // AES decrypt
695
696 u32 *in_ptr = (u32 *) (base64_buf + 12);
697 u32 *out_ptr = (u32 *) (out + 12);
698
699 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
700 }
701
702 void phpass_decode (u8 digest[16], u8 buf[22])
703 {
704 int l;
705
706 l = itoa64_to_int (buf[ 0]) << 0;
707 l |= itoa64_to_int (buf[ 1]) << 6;
708 l |= itoa64_to_int (buf[ 2]) << 12;
709 l |= itoa64_to_int (buf[ 3]) << 18;
710
711 digest[ 0] = (l >> 0) & 0xff;
712 digest[ 1] = (l >> 8) & 0xff;
713 digest[ 2] = (l >> 16) & 0xff;
714
715 l = itoa64_to_int (buf[ 4]) << 0;
716 l |= itoa64_to_int (buf[ 5]) << 6;
717 l |= itoa64_to_int (buf[ 6]) << 12;
718 l |= itoa64_to_int (buf[ 7]) << 18;
719
720 digest[ 3] = (l >> 0) & 0xff;
721 digest[ 4] = (l >> 8) & 0xff;
722 digest[ 5] = (l >> 16) & 0xff;
723
724 l = itoa64_to_int (buf[ 8]) << 0;
725 l |= itoa64_to_int (buf[ 9]) << 6;
726 l |= itoa64_to_int (buf[10]) << 12;
727 l |= itoa64_to_int (buf[11]) << 18;
728
729 digest[ 6] = (l >> 0) & 0xff;
730 digest[ 7] = (l >> 8) & 0xff;
731 digest[ 8] = (l >> 16) & 0xff;
732
733 l = itoa64_to_int (buf[12]) << 0;
734 l |= itoa64_to_int (buf[13]) << 6;
735 l |= itoa64_to_int (buf[14]) << 12;
736 l |= itoa64_to_int (buf[15]) << 18;
737
738 digest[ 9] = (l >> 0) & 0xff;
739 digest[10] = (l >> 8) & 0xff;
740 digest[11] = (l >> 16) & 0xff;
741
742 l = itoa64_to_int (buf[16]) << 0;
743 l |= itoa64_to_int (buf[17]) << 6;
744 l |= itoa64_to_int (buf[18]) << 12;
745 l |= itoa64_to_int (buf[19]) << 18;
746
747 digest[12] = (l >> 0) & 0xff;
748 digest[13] = (l >> 8) & 0xff;
749 digest[14] = (l >> 16) & 0xff;
750
751 l = itoa64_to_int (buf[20]) << 0;
752 l |= itoa64_to_int (buf[21]) << 6;
753
754 digest[15] = (l >> 0) & 0xff;
755 }
756
757 void phpass_encode (u8 digest[16], u8 buf[22])
758 {
759 int l;
760
761 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
762
763 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
764 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
765 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
766 buf[ 3] = int_to_itoa64 (l & 0x3f);
767
768 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
769
770 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
771 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
772 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
773 buf[ 7] = int_to_itoa64 (l & 0x3f);
774
775 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
776
777 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
778 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
779 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[11] = int_to_itoa64 (l & 0x3f);
781
782 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
783
784 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
785 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
786 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[15] = int_to_itoa64 (l & 0x3f);
788
789 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
790
791 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
792 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
793 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
794 buf[19] = int_to_itoa64 (l & 0x3f);
795
796 l = (digest[15] << 0);
797
798 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
799 buf[21] = int_to_itoa64 (l & 0x3f);
800 }
801
802 void md5crypt_decode (u8 digest[16], u8 buf[22])
803 {
804 int l;
805
806 l = itoa64_to_int (buf[ 0]) << 0;
807 l |= itoa64_to_int (buf[ 1]) << 6;
808 l |= itoa64_to_int (buf[ 2]) << 12;
809 l |= itoa64_to_int (buf[ 3]) << 18;
810
811 digest[ 0] = (l >> 16) & 0xff;
812 digest[ 6] = (l >> 8) & 0xff;
813 digest[12] = (l >> 0) & 0xff;
814
815 l = itoa64_to_int (buf[ 4]) << 0;
816 l |= itoa64_to_int (buf[ 5]) << 6;
817 l |= itoa64_to_int (buf[ 6]) << 12;
818 l |= itoa64_to_int (buf[ 7]) << 18;
819
820 digest[ 1] = (l >> 16) & 0xff;
821 digest[ 7] = (l >> 8) & 0xff;
822 digest[13] = (l >> 0) & 0xff;
823
824 l = itoa64_to_int (buf[ 8]) << 0;
825 l |= itoa64_to_int (buf[ 9]) << 6;
826 l |= itoa64_to_int (buf[10]) << 12;
827 l |= itoa64_to_int (buf[11]) << 18;
828
829 digest[ 2] = (l >> 16) & 0xff;
830 digest[ 8] = (l >> 8) & 0xff;
831 digest[14] = (l >> 0) & 0xff;
832
833 l = itoa64_to_int (buf[12]) << 0;
834 l |= itoa64_to_int (buf[13]) << 6;
835 l |= itoa64_to_int (buf[14]) << 12;
836 l |= itoa64_to_int (buf[15]) << 18;
837
838 digest[ 3] = (l >> 16) & 0xff;
839 digest[ 9] = (l >> 8) & 0xff;
840 digest[15] = (l >> 0) & 0xff;
841
842 l = itoa64_to_int (buf[16]) << 0;
843 l |= itoa64_to_int (buf[17]) << 6;
844 l |= itoa64_to_int (buf[18]) << 12;
845 l |= itoa64_to_int (buf[19]) << 18;
846
847 digest[ 4] = (l >> 16) & 0xff;
848 digest[10] = (l >> 8) & 0xff;
849 digest[ 5] = (l >> 0) & 0xff;
850
851 l = itoa64_to_int (buf[20]) << 0;
852 l |= itoa64_to_int (buf[21]) << 6;
853
854 digest[11] = (l >> 0) & 0xff;
855 }
856
857 void md5crypt_encode (u8 digest[16], u8 buf[22])
858 {
859 int l;
860
861 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
862
863 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
864 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
865 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
866 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
867
868 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
869
870 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
871 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
872 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
873 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
874
875 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
876
877 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
878 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
879 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
881
882 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
883
884 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
885 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
886 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
888
889 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
890
891 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
892 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
893 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
894 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
895
896 l = (digest[11] << 0);
897
898 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
899 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
900 }
901
902 void sha512crypt_decode (u8 digest[64], u8 buf[86])
903 {
904 int l;
905
906 l = itoa64_to_int (buf[ 0]) << 0;
907 l |= itoa64_to_int (buf[ 1]) << 6;
908 l |= itoa64_to_int (buf[ 2]) << 12;
909 l |= itoa64_to_int (buf[ 3]) << 18;
910
911 digest[ 0] = (l >> 16) & 0xff;
912 digest[21] = (l >> 8) & 0xff;
913 digest[42] = (l >> 0) & 0xff;
914
915 l = itoa64_to_int (buf[ 4]) << 0;
916 l |= itoa64_to_int (buf[ 5]) << 6;
917 l |= itoa64_to_int (buf[ 6]) << 12;
918 l |= itoa64_to_int (buf[ 7]) << 18;
919
920 digest[22] = (l >> 16) & 0xff;
921 digest[43] = (l >> 8) & 0xff;
922 digest[ 1] = (l >> 0) & 0xff;
923
924 l = itoa64_to_int (buf[ 8]) << 0;
925 l |= itoa64_to_int (buf[ 9]) << 6;
926 l |= itoa64_to_int (buf[10]) << 12;
927 l |= itoa64_to_int (buf[11]) << 18;
928
929 digest[44] = (l >> 16) & 0xff;
930 digest[ 2] = (l >> 8) & 0xff;
931 digest[23] = (l >> 0) & 0xff;
932
933 l = itoa64_to_int (buf[12]) << 0;
934 l |= itoa64_to_int (buf[13]) << 6;
935 l |= itoa64_to_int (buf[14]) << 12;
936 l |= itoa64_to_int (buf[15]) << 18;
937
938 digest[ 3] = (l >> 16) & 0xff;
939 digest[24] = (l >> 8) & 0xff;
940 digest[45] = (l >> 0) & 0xff;
941
942 l = itoa64_to_int (buf[16]) << 0;
943 l |= itoa64_to_int (buf[17]) << 6;
944 l |= itoa64_to_int (buf[18]) << 12;
945 l |= itoa64_to_int (buf[19]) << 18;
946
947 digest[25] = (l >> 16) & 0xff;
948 digest[46] = (l >> 8) & 0xff;
949 digest[ 4] = (l >> 0) & 0xff;
950
951 l = itoa64_to_int (buf[20]) << 0;
952 l |= itoa64_to_int (buf[21]) << 6;
953 l |= itoa64_to_int (buf[22]) << 12;
954 l |= itoa64_to_int (buf[23]) << 18;
955
956 digest[47] = (l >> 16) & 0xff;
957 digest[ 5] = (l >> 8) & 0xff;
958 digest[26] = (l >> 0) & 0xff;
959
960 l = itoa64_to_int (buf[24]) << 0;
961 l |= itoa64_to_int (buf[25]) << 6;
962 l |= itoa64_to_int (buf[26]) << 12;
963 l |= itoa64_to_int (buf[27]) << 18;
964
965 digest[ 6] = (l >> 16) & 0xff;
966 digest[27] = (l >> 8) & 0xff;
967 digest[48] = (l >> 0) & 0xff;
968
969 l = itoa64_to_int (buf[28]) << 0;
970 l |= itoa64_to_int (buf[29]) << 6;
971 l |= itoa64_to_int (buf[30]) << 12;
972 l |= itoa64_to_int (buf[31]) << 18;
973
974 digest[28] = (l >> 16) & 0xff;
975 digest[49] = (l >> 8) & 0xff;
976 digest[ 7] = (l >> 0) & 0xff;
977
978 l = itoa64_to_int (buf[32]) << 0;
979 l |= itoa64_to_int (buf[33]) << 6;
980 l |= itoa64_to_int (buf[34]) << 12;
981 l |= itoa64_to_int (buf[35]) << 18;
982
983 digest[50] = (l >> 16) & 0xff;
984 digest[ 8] = (l >> 8) & 0xff;
985 digest[29] = (l >> 0) & 0xff;
986
987 l = itoa64_to_int (buf[36]) << 0;
988 l |= itoa64_to_int (buf[37]) << 6;
989 l |= itoa64_to_int (buf[38]) << 12;
990 l |= itoa64_to_int (buf[39]) << 18;
991
992 digest[ 9] = (l >> 16) & 0xff;
993 digest[30] = (l >> 8) & 0xff;
994 digest[51] = (l >> 0) & 0xff;
995
996 l = itoa64_to_int (buf[40]) << 0;
997 l |= itoa64_to_int (buf[41]) << 6;
998 l |= itoa64_to_int (buf[42]) << 12;
999 l |= itoa64_to_int (buf[43]) << 18;
1000
1001 digest[31] = (l >> 16) & 0xff;
1002 digest[52] = (l >> 8) & 0xff;
1003 digest[10] = (l >> 0) & 0xff;
1004
1005 l = itoa64_to_int (buf[44]) << 0;
1006 l |= itoa64_to_int (buf[45]) << 6;
1007 l |= itoa64_to_int (buf[46]) << 12;
1008 l |= itoa64_to_int (buf[47]) << 18;
1009
1010 digest[53] = (l >> 16) & 0xff;
1011 digest[11] = (l >> 8) & 0xff;
1012 digest[32] = (l >> 0) & 0xff;
1013
1014 l = itoa64_to_int (buf[48]) << 0;
1015 l |= itoa64_to_int (buf[49]) << 6;
1016 l |= itoa64_to_int (buf[50]) << 12;
1017 l |= itoa64_to_int (buf[51]) << 18;
1018
1019 digest[12] = (l >> 16) & 0xff;
1020 digest[33] = (l >> 8) & 0xff;
1021 digest[54] = (l >> 0) & 0xff;
1022
1023 l = itoa64_to_int (buf[52]) << 0;
1024 l |= itoa64_to_int (buf[53]) << 6;
1025 l |= itoa64_to_int (buf[54]) << 12;
1026 l |= itoa64_to_int (buf[55]) << 18;
1027
1028 digest[34] = (l >> 16) & 0xff;
1029 digest[55] = (l >> 8) & 0xff;
1030 digest[13] = (l >> 0) & 0xff;
1031
1032 l = itoa64_to_int (buf[56]) << 0;
1033 l |= itoa64_to_int (buf[57]) << 6;
1034 l |= itoa64_to_int (buf[58]) << 12;
1035 l |= itoa64_to_int (buf[59]) << 18;
1036
1037 digest[56] = (l >> 16) & 0xff;
1038 digest[14] = (l >> 8) & 0xff;
1039 digest[35] = (l >> 0) & 0xff;
1040
1041 l = itoa64_to_int (buf[60]) << 0;
1042 l |= itoa64_to_int (buf[61]) << 6;
1043 l |= itoa64_to_int (buf[62]) << 12;
1044 l |= itoa64_to_int (buf[63]) << 18;
1045
1046 digest[15] = (l >> 16) & 0xff;
1047 digest[36] = (l >> 8) & 0xff;
1048 digest[57] = (l >> 0) & 0xff;
1049
1050 l = itoa64_to_int (buf[64]) << 0;
1051 l |= itoa64_to_int (buf[65]) << 6;
1052 l |= itoa64_to_int (buf[66]) << 12;
1053 l |= itoa64_to_int (buf[67]) << 18;
1054
1055 digest[37] = (l >> 16) & 0xff;
1056 digest[58] = (l >> 8) & 0xff;
1057 digest[16] = (l >> 0) & 0xff;
1058
1059 l = itoa64_to_int (buf[68]) << 0;
1060 l |= itoa64_to_int (buf[69]) << 6;
1061 l |= itoa64_to_int (buf[70]) << 12;
1062 l |= itoa64_to_int (buf[71]) << 18;
1063
1064 digest[59] = (l >> 16) & 0xff;
1065 digest[17] = (l >> 8) & 0xff;
1066 digest[38] = (l >> 0) & 0xff;
1067
1068 l = itoa64_to_int (buf[72]) << 0;
1069 l |= itoa64_to_int (buf[73]) << 6;
1070 l |= itoa64_to_int (buf[74]) << 12;
1071 l |= itoa64_to_int (buf[75]) << 18;
1072
1073 digest[18] = (l >> 16) & 0xff;
1074 digest[39] = (l >> 8) & 0xff;
1075 digest[60] = (l >> 0) & 0xff;
1076
1077 l = itoa64_to_int (buf[76]) << 0;
1078 l |= itoa64_to_int (buf[77]) << 6;
1079 l |= itoa64_to_int (buf[78]) << 12;
1080 l |= itoa64_to_int (buf[79]) << 18;
1081
1082 digest[40] = (l >> 16) & 0xff;
1083 digest[61] = (l >> 8) & 0xff;
1084 digest[19] = (l >> 0) & 0xff;
1085
1086 l = itoa64_to_int (buf[80]) << 0;
1087 l |= itoa64_to_int (buf[81]) << 6;
1088 l |= itoa64_to_int (buf[82]) << 12;
1089 l |= itoa64_to_int (buf[83]) << 18;
1090
1091 digest[62] = (l >> 16) & 0xff;
1092 digest[20] = (l >> 8) & 0xff;
1093 digest[41] = (l >> 0) & 0xff;
1094
1095 l = itoa64_to_int (buf[84]) << 0;
1096 l |= itoa64_to_int (buf[85]) << 6;
1097
1098 digest[63] = (l >> 0) & 0xff;
1099 }
1100
1101 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1102 {
1103 int l;
1104
1105 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1106
1107 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1108 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1109 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111
1112 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1113
1114 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1115 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1116 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118
1119 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1120
1121 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1122 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1123 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125
1126 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1127
1128 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1129 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1130 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132
1133 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1134
1135 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1136 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1137 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139
1140 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1141
1142 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1143 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1144 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146
1147 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1148
1149 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1150 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1151 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153
1154 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1155
1156 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1157 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1158 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160
1161 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1162
1163 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1164 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1165 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167
1168 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1169
1170 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1171 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1172 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174
1175 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1176
1177 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1178 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1179 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181
1182 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1183
1184 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1185 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1186 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188
1189 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1190
1191 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1192 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1193 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195
1196 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1197
1198 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1199 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1200 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202
1203 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1204
1205 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1206 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1207 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209
1210 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1211
1212 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1213 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1214 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216
1217 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1218
1219 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1220 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1221 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223
1224 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1225
1226 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1227 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1228 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230
1231 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1232
1233 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1234 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1235 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237
1238 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1239
1240 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1241 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1242 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244
1245 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1246
1247 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1248 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1249 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1250 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251
1252 l = 0 | 0 | (digest[63] << 0);
1253
1254 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1255 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1256 }
1257
1258 void sha1aix_decode (u8 digest[20], u8 buf[27])
1259 {
1260 int l;
1261
1262 l = itoa64_to_int (buf[ 0]) << 0;
1263 l |= itoa64_to_int (buf[ 1]) << 6;
1264 l |= itoa64_to_int (buf[ 2]) << 12;
1265 l |= itoa64_to_int (buf[ 3]) << 18;
1266
1267 digest[ 2] = (l >> 0) & 0xff;
1268 digest[ 1] = (l >> 8) & 0xff;
1269 digest[ 0] = (l >> 16) & 0xff;
1270
1271 l = itoa64_to_int (buf[ 4]) << 0;
1272 l |= itoa64_to_int (buf[ 5]) << 6;
1273 l |= itoa64_to_int (buf[ 6]) << 12;
1274 l |= itoa64_to_int (buf[ 7]) << 18;
1275
1276 digest[ 5] = (l >> 0) & 0xff;
1277 digest[ 4] = (l >> 8) & 0xff;
1278 digest[ 3] = (l >> 16) & 0xff;
1279
1280 l = itoa64_to_int (buf[ 8]) << 0;
1281 l |= itoa64_to_int (buf[ 9]) << 6;
1282 l |= itoa64_to_int (buf[10]) << 12;
1283 l |= itoa64_to_int (buf[11]) << 18;
1284
1285 digest[ 8] = (l >> 0) & 0xff;
1286 digest[ 7] = (l >> 8) & 0xff;
1287 digest[ 6] = (l >> 16) & 0xff;
1288
1289 l = itoa64_to_int (buf[12]) << 0;
1290 l |= itoa64_to_int (buf[13]) << 6;
1291 l |= itoa64_to_int (buf[14]) << 12;
1292 l |= itoa64_to_int (buf[15]) << 18;
1293
1294 digest[11] = (l >> 0) & 0xff;
1295 digest[10] = (l >> 8) & 0xff;
1296 digest[ 9] = (l >> 16) & 0xff;
1297
1298 l = itoa64_to_int (buf[16]) << 0;
1299 l |= itoa64_to_int (buf[17]) << 6;
1300 l |= itoa64_to_int (buf[18]) << 12;
1301 l |= itoa64_to_int (buf[19]) << 18;
1302
1303 digest[14] = (l >> 0) & 0xff;
1304 digest[13] = (l >> 8) & 0xff;
1305 digest[12] = (l >> 16) & 0xff;
1306
1307 l = itoa64_to_int (buf[20]) << 0;
1308 l |= itoa64_to_int (buf[21]) << 6;
1309 l |= itoa64_to_int (buf[22]) << 12;
1310 l |= itoa64_to_int (buf[23]) << 18;
1311
1312 digest[17] = (l >> 0) & 0xff;
1313 digest[16] = (l >> 8) & 0xff;
1314 digest[15] = (l >> 16) & 0xff;
1315
1316 l = itoa64_to_int (buf[24]) << 0;
1317 l |= itoa64_to_int (buf[25]) << 6;
1318 l |= itoa64_to_int (buf[26]) << 12;
1319
1320 digest[19] = (l >> 8) & 0xff;
1321 digest[18] = (l >> 16) & 0xff;
1322 }
1323
1324 void sha1aix_encode (u8 digest[20], u8 buf[27])
1325 {
1326 int l;
1327
1328 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1329
1330 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1331 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1332 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1333 buf[ 3] = int_to_itoa64 (l & 0x3f);
1334
1335 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1336
1337 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1338 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1339 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1340 buf[ 7] = int_to_itoa64 (l & 0x3f);
1341
1342 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1343
1344 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1345 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1346 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[11] = int_to_itoa64 (l & 0x3f);
1348
1349 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1350
1351 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1352 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1353 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[15] = int_to_itoa64 (l & 0x3f);
1355
1356 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1357
1358 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1359 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1360 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[19] = int_to_itoa64 (l & 0x3f);
1362
1363 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1364
1365 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1366 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1367 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1368 buf[23] = int_to_itoa64 (l & 0x3f);
1369
1370 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1371
1372 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1373 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1374 buf[26] = int_to_itoa64 (l & 0x3f);
1375 }
1376
1377 void sha256aix_decode (u8 digest[32], u8 buf[43])
1378 {
1379 int l;
1380
1381 l = itoa64_to_int (buf[ 0]) << 0;
1382 l |= itoa64_to_int (buf[ 1]) << 6;
1383 l |= itoa64_to_int (buf[ 2]) << 12;
1384 l |= itoa64_to_int (buf[ 3]) << 18;
1385
1386 digest[ 2] = (l >> 0) & 0xff;
1387 digest[ 1] = (l >> 8) & 0xff;
1388 digest[ 0] = (l >> 16) & 0xff;
1389
1390 l = itoa64_to_int (buf[ 4]) << 0;
1391 l |= itoa64_to_int (buf[ 5]) << 6;
1392 l |= itoa64_to_int (buf[ 6]) << 12;
1393 l |= itoa64_to_int (buf[ 7]) << 18;
1394
1395 digest[ 5] = (l >> 0) & 0xff;
1396 digest[ 4] = (l >> 8) & 0xff;
1397 digest[ 3] = (l >> 16) & 0xff;
1398
1399 l = itoa64_to_int (buf[ 8]) << 0;
1400 l |= itoa64_to_int (buf[ 9]) << 6;
1401 l |= itoa64_to_int (buf[10]) << 12;
1402 l |= itoa64_to_int (buf[11]) << 18;
1403
1404 digest[ 8] = (l >> 0) & 0xff;
1405 digest[ 7] = (l >> 8) & 0xff;
1406 digest[ 6] = (l >> 16) & 0xff;
1407
1408 l = itoa64_to_int (buf[12]) << 0;
1409 l |= itoa64_to_int (buf[13]) << 6;
1410 l |= itoa64_to_int (buf[14]) << 12;
1411 l |= itoa64_to_int (buf[15]) << 18;
1412
1413 digest[11] = (l >> 0) & 0xff;
1414 digest[10] = (l >> 8) & 0xff;
1415 digest[ 9] = (l >> 16) & 0xff;
1416
1417 l = itoa64_to_int (buf[16]) << 0;
1418 l |= itoa64_to_int (buf[17]) << 6;
1419 l |= itoa64_to_int (buf[18]) << 12;
1420 l |= itoa64_to_int (buf[19]) << 18;
1421
1422 digest[14] = (l >> 0) & 0xff;
1423 digest[13] = (l >> 8) & 0xff;
1424 digest[12] = (l >> 16) & 0xff;
1425
1426 l = itoa64_to_int (buf[20]) << 0;
1427 l |= itoa64_to_int (buf[21]) << 6;
1428 l |= itoa64_to_int (buf[22]) << 12;
1429 l |= itoa64_to_int (buf[23]) << 18;
1430
1431 digest[17] = (l >> 0) & 0xff;
1432 digest[16] = (l >> 8) & 0xff;
1433 digest[15] = (l >> 16) & 0xff;
1434
1435 l = itoa64_to_int (buf[24]) << 0;
1436 l |= itoa64_to_int (buf[25]) << 6;
1437 l |= itoa64_to_int (buf[26]) << 12;
1438 l |= itoa64_to_int (buf[27]) << 18;
1439
1440 digest[20] = (l >> 0) & 0xff;
1441 digest[19] = (l >> 8) & 0xff;
1442 digest[18] = (l >> 16) & 0xff;
1443
1444 l = itoa64_to_int (buf[28]) << 0;
1445 l |= itoa64_to_int (buf[29]) << 6;
1446 l |= itoa64_to_int (buf[30]) << 12;
1447 l |= itoa64_to_int (buf[31]) << 18;
1448
1449 digest[23] = (l >> 0) & 0xff;
1450 digest[22] = (l >> 8) & 0xff;
1451 digest[21] = (l >> 16) & 0xff;
1452
1453 l = itoa64_to_int (buf[32]) << 0;
1454 l |= itoa64_to_int (buf[33]) << 6;
1455 l |= itoa64_to_int (buf[34]) << 12;
1456 l |= itoa64_to_int (buf[35]) << 18;
1457
1458 digest[26] = (l >> 0) & 0xff;
1459 digest[25] = (l >> 8) & 0xff;
1460 digest[24] = (l >> 16) & 0xff;
1461
1462 l = itoa64_to_int (buf[36]) << 0;
1463 l |= itoa64_to_int (buf[37]) << 6;
1464 l |= itoa64_to_int (buf[38]) << 12;
1465 l |= itoa64_to_int (buf[39]) << 18;
1466
1467 digest[29] = (l >> 0) & 0xff;
1468 digest[28] = (l >> 8) & 0xff;
1469 digest[27] = (l >> 16) & 0xff;
1470
1471 l = itoa64_to_int (buf[40]) << 0;
1472 l |= itoa64_to_int (buf[41]) << 6;
1473 l |= itoa64_to_int (buf[42]) << 12;
1474
1475 //digest[32] = (l >> 0) & 0xff;
1476 digest[31] = (l >> 8) & 0xff;
1477 digest[30] = (l >> 16) & 0xff;
1478 }
1479
1480 void sha256aix_encode (u8 digest[32], u8 buf[43])
1481 {
1482 int l;
1483
1484 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1485
1486 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1487 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1488 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1489 buf[ 3] = int_to_itoa64 (l & 0x3f);
1490
1491 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1492
1493 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1494 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1495 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1496 buf[ 7] = int_to_itoa64 (l & 0x3f);
1497
1498 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1499
1500 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1501 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1502 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[11] = int_to_itoa64 (l & 0x3f);
1504
1505 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1506
1507 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1508 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1509 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[15] = int_to_itoa64 (l & 0x3f);
1511
1512 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1513
1514 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1515 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1516 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[19] = int_to_itoa64 (l & 0x3f);
1518
1519 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1520
1521 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1522 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1523 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[23] = int_to_itoa64 (l & 0x3f);
1525
1526 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1527
1528 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1529 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1530 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[27] = int_to_itoa64 (l & 0x3f);
1532
1533 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1534
1535 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1536 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1537 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[31] = int_to_itoa64 (l & 0x3f);
1539
1540 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1541
1542 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1543 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1544 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[35] = int_to_itoa64 (l & 0x3f);
1546
1547 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1548
1549 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1550 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1551 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1552 buf[39] = int_to_itoa64 (l & 0x3f);
1553
1554 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1555
1556 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1557 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1558 buf[42] = int_to_itoa64 (l & 0x3f);
1559 }
1560
1561 void sha512aix_decode (u8 digest[64], u8 buf[86])
1562 {
1563 int l;
1564
1565 l = itoa64_to_int (buf[ 0]) << 0;
1566 l |= itoa64_to_int (buf[ 1]) << 6;
1567 l |= itoa64_to_int (buf[ 2]) << 12;
1568 l |= itoa64_to_int (buf[ 3]) << 18;
1569
1570 digest[ 2] = (l >> 0) & 0xff;
1571 digest[ 1] = (l >> 8) & 0xff;
1572 digest[ 0] = (l >> 16) & 0xff;
1573
1574 l = itoa64_to_int (buf[ 4]) << 0;
1575 l |= itoa64_to_int (buf[ 5]) << 6;
1576 l |= itoa64_to_int (buf[ 6]) << 12;
1577 l |= itoa64_to_int (buf[ 7]) << 18;
1578
1579 digest[ 5] = (l >> 0) & 0xff;
1580 digest[ 4] = (l >> 8) & 0xff;
1581 digest[ 3] = (l >> 16) & 0xff;
1582
1583 l = itoa64_to_int (buf[ 8]) << 0;
1584 l |= itoa64_to_int (buf[ 9]) << 6;
1585 l |= itoa64_to_int (buf[10]) << 12;
1586 l |= itoa64_to_int (buf[11]) << 18;
1587
1588 digest[ 8] = (l >> 0) & 0xff;
1589 digest[ 7] = (l >> 8) & 0xff;
1590 digest[ 6] = (l >> 16) & 0xff;
1591
1592 l = itoa64_to_int (buf[12]) << 0;
1593 l |= itoa64_to_int (buf[13]) << 6;
1594 l |= itoa64_to_int (buf[14]) << 12;
1595 l |= itoa64_to_int (buf[15]) << 18;
1596
1597 digest[11] = (l >> 0) & 0xff;
1598 digest[10] = (l >> 8) & 0xff;
1599 digest[ 9] = (l >> 16) & 0xff;
1600
1601 l = itoa64_to_int (buf[16]) << 0;
1602 l |= itoa64_to_int (buf[17]) << 6;
1603 l |= itoa64_to_int (buf[18]) << 12;
1604 l |= itoa64_to_int (buf[19]) << 18;
1605
1606 digest[14] = (l >> 0) & 0xff;
1607 digest[13] = (l >> 8) & 0xff;
1608 digest[12] = (l >> 16) & 0xff;
1609
1610 l = itoa64_to_int (buf[20]) << 0;
1611 l |= itoa64_to_int (buf[21]) << 6;
1612 l |= itoa64_to_int (buf[22]) << 12;
1613 l |= itoa64_to_int (buf[23]) << 18;
1614
1615 digest[17] = (l >> 0) & 0xff;
1616 digest[16] = (l >> 8) & 0xff;
1617 digest[15] = (l >> 16) & 0xff;
1618
1619 l = itoa64_to_int (buf[24]) << 0;
1620 l |= itoa64_to_int (buf[25]) << 6;
1621 l |= itoa64_to_int (buf[26]) << 12;
1622 l |= itoa64_to_int (buf[27]) << 18;
1623
1624 digest[20] = (l >> 0) & 0xff;
1625 digest[19] = (l >> 8) & 0xff;
1626 digest[18] = (l >> 16) & 0xff;
1627
1628 l = itoa64_to_int (buf[28]) << 0;
1629 l |= itoa64_to_int (buf[29]) << 6;
1630 l |= itoa64_to_int (buf[30]) << 12;
1631 l |= itoa64_to_int (buf[31]) << 18;
1632
1633 digest[23] = (l >> 0) & 0xff;
1634 digest[22] = (l >> 8) & 0xff;
1635 digest[21] = (l >> 16) & 0xff;
1636
1637 l = itoa64_to_int (buf[32]) << 0;
1638 l |= itoa64_to_int (buf[33]) << 6;
1639 l |= itoa64_to_int (buf[34]) << 12;
1640 l |= itoa64_to_int (buf[35]) << 18;
1641
1642 digest[26] = (l >> 0) & 0xff;
1643 digest[25] = (l >> 8) & 0xff;
1644 digest[24] = (l >> 16) & 0xff;
1645
1646 l = itoa64_to_int (buf[36]) << 0;
1647 l |= itoa64_to_int (buf[37]) << 6;
1648 l |= itoa64_to_int (buf[38]) << 12;
1649 l |= itoa64_to_int (buf[39]) << 18;
1650
1651 digest[29] = (l >> 0) & 0xff;
1652 digest[28] = (l >> 8) & 0xff;
1653 digest[27] = (l >> 16) & 0xff;
1654
1655 l = itoa64_to_int (buf[40]) << 0;
1656 l |= itoa64_to_int (buf[41]) << 6;
1657 l |= itoa64_to_int (buf[42]) << 12;
1658 l |= itoa64_to_int (buf[43]) << 18;
1659
1660 digest[32] = (l >> 0) & 0xff;
1661 digest[31] = (l >> 8) & 0xff;
1662 digest[30] = (l >> 16) & 0xff;
1663
1664 l = itoa64_to_int (buf[44]) << 0;
1665 l |= itoa64_to_int (buf[45]) << 6;
1666 l |= itoa64_to_int (buf[46]) << 12;
1667 l |= itoa64_to_int (buf[47]) << 18;
1668
1669 digest[35] = (l >> 0) & 0xff;
1670 digest[34] = (l >> 8) & 0xff;
1671 digest[33] = (l >> 16) & 0xff;
1672
1673 l = itoa64_to_int (buf[48]) << 0;
1674 l |= itoa64_to_int (buf[49]) << 6;
1675 l |= itoa64_to_int (buf[50]) << 12;
1676 l |= itoa64_to_int (buf[51]) << 18;
1677
1678 digest[38] = (l >> 0) & 0xff;
1679 digest[37] = (l >> 8) & 0xff;
1680 digest[36] = (l >> 16) & 0xff;
1681
1682 l = itoa64_to_int (buf[52]) << 0;
1683 l |= itoa64_to_int (buf[53]) << 6;
1684 l |= itoa64_to_int (buf[54]) << 12;
1685 l |= itoa64_to_int (buf[55]) << 18;
1686
1687 digest[41] = (l >> 0) & 0xff;
1688 digest[40] = (l >> 8) & 0xff;
1689 digest[39] = (l >> 16) & 0xff;
1690
1691 l = itoa64_to_int (buf[56]) << 0;
1692 l |= itoa64_to_int (buf[57]) << 6;
1693 l |= itoa64_to_int (buf[58]) << 12;
1694 l |= itoa64_to_int (buf[59]) << 18;
1695
1696 digest[44] = (l >> 0) & 0xff;
1697 digest[43] = (l >> 8) & 0xff;
1698 digest[42] = (l >> 16) & 0xff;
1699
1700 l = itoa64_to_int (buf[60]) << 0;
1701 l |= itoa64_to_int (buf[61]) << 6;
1702 l |= itoa64_to_int (buf[62]) << 12;
1703 l |= itoa64_to_int (buf[63]) << 18;
1704
1705 digest[47] = (l >> 0) & 0xff;
1706 digest[46] = (l >> 8) & 0xff;
1707 digest[45] = (l >> 16) & 0xff;
1708
1709 l = itoa64_to_int (buf[64]) << 0;
1710 l |= itoa64_to_int (buf[65]) << 6;
1711 l |= itoa64_to_int (buf[66]) << 12;
1712 l |= itoa64_to_int (buf[67]) << 18;
1713
1714 digest[50] = (l >> 0) & 0xff;
1715 digest[49] = (l >> 8) & 0xff;
1716 digest[48] = (l >> 16) & 0xff;
1717
1718 l = itoa64_to_int (buf[68]) << 0;
1719 l |= itoa64_to_int (buf[69]) << 6;
1720 l |= itoa64_to_int (buf[70]) << 12;
1721 l |= itoa64_to_int (buf[71]) << 18;
1722
1723 digest[53] = (l >> 0) & 0xff;
1724 digest[52] = (l >> 8) & 0xff;
1725 digest[51] = (l >> 16) & 0xff;
1726
1727 l = itoa64_to_int (buf[72]) << 0;
1728 l |= itoa64_to_int (buf[73]) << 6;
1729 l |= itoa64_to_int (buf[74]) << 12;
1730 l |= itoa64_to_int (buf[75]) << 18;
1731
1732 digest[56] = (l >> 0) & 0xff;
1733 digest[55] = (l >> 8) & 0xff;
1734 digest[54] = (l >> 16) & 0xff;
1735
1736 l = itoa64_to_int (buf[76]) << 0;
1737 l |= itoa64_to_int (buf[77]) << 6;
1738 l |= itoa64_to_int (buf[78]) << 12;
1739 l |= itoa64_to_int (buf[79]) << 18;
1740
1741 digest[59] = (l >> 0) & 0xff;
1742 digest[58] = (l >> 8) & 0xff;
1743 digest[57] = (l >> 16) & 0xff;
1744
1745 l = itoa64_to_int (buf[80]) << 0;
1746 l |= itoa64_to_int (buf[81]) << 6;
1747 l |= itoa64_to_int (buf[82]) << 12;
1748 l |= itoa64_to_int (buf[83]) << 18;
1749
1750 digest[62] = (l >> 0) & 0xff;
1751 digest[61] = (l >> 8) & 0xff;
1752 digest[60] = (l >> 16) & 0xff;
1753
1754 l = itoa64_to_int (buf[84]) << 0;
1755 l |= itoa64_to_int (buf[85]) << 6;
1756
1757 digest[63] = (l >> 16) & 0xff;
1758 }
1759
1760 void sha512aix_encode (u8 digest[64], u8 buf[86])
1761 {
1762 int l;
1763
1764 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1765
1766 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1767 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1768 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1769 buf[ 3] = int_to_itoa64 (l & 0x3f);
1770
1771 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1772
1773 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1774 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1775 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1776 buf[ 7] = int_to_itoa64 (l & 0x3f);
1777
1778 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1779
1780 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1781 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1782 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[11] = int_to_itoa64 (l & 0x3f);
1784
1785 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1786
1787 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1788 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1789 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[15] = int_to_itoa64 (l & 0x3f);
1791
1792 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1793
1794 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1795 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1796 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[19] = int_to_itoa64 (l & 0x3f);
1798
1799 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1800
1801 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1802 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1803 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[23] = int_to_itoa64 (l & 0x3f);
1805
1806 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1807
1808 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1809 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1810 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[27] = int_to_itoa64 (l & 0x3f);
1812
1813 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1814
1815 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1816 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1817 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[31] = int_to_itoa64 (l & 0x3f);
1819
1820 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1821
1822 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1823 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1824 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[35] = int_to_itoa64 (l & 0x3f);
1826
1827 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1828
1829 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1830 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1831 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[39] = int_to_itoa64 (l & 0x3f);
1833
1834 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1835
1836 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1837 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1838 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[43] = int_to_itoa64 (l & 0x3f);
1840
1841 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1842
1843 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1844 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1845 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[47] = int_to_itoa64 (l & 0x3f);
1847
1848 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1849
1850 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1851 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1852 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[51] = int_to_itoa64 (l & 0x3f);
1854
1855 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1856
1857 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1858 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1859 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[55] = int_to_itoa64 (l & 0x3f);
1861
1862 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1863
1864 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1865 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1866 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[59] = int_to_itoa64 (l & 0x3f);
1868
1869 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1870
1871 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1872 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1873 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[63] = int_to_itoa64 (l & 0x3f);
1875
1876 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1877
1878 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1879 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1880 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[67] = int_to_itoa64 (l & 0x3f);
1882
1883 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1884
1885 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1886 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1887 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[71] = int_to_itoa64 (l & 0x3f);
1889
1890 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1891
1892 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1893 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1894 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[75] = int_to_itoa64 (l & 0x3f);
1896
1897 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1898
1899 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1900 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1901 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[79] = int_to_itoa64 (l & 0x3f);
1903
1904 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1905
1906 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1907 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1908 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1909 buf[83] = int_to_itoa64 (l & 0x3f);
1910
1911 l = 0 | 0 | (digest[63] << 16);
1912
1913 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1914 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1915 }
1916
1917 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1918 {
1919 int l;
1920
1921 l = itoa64_to_int (buf[ 0]) << 0;
1922 l |= itoa64_to_int (buf[ 1]) << 6;
1923 l |= itoa64_to_int (buf[ 2]) << 12;
1924 l |= itoa64_to_int (buf[ 3]) << 18;
1925
1926 digest[ 0] = (l >> 16) & 0xff;
1927 digest[10] = (l >> 8) & 0xff;
1928 digest[20] = (l >> 0) & 0xff;
1929
1930 l = itoa64_to_int (buf[ 4]) << 0;
1931 l |= itoa64_to_int (buf[ 5]) << 6;
1932 l |= itoa64_to_int (buf[ 6]) << 12;
1933 l |= itoa64_to_int (buf[ 7]) << 18;
1934
1935 digest[21] = (l >> 16) & 0xff;
1936 digest[ 1] = (l >> 8) & 0xff;
1937 digest[11] = (l >> 0) & 0xff;
1938
1939 l = itoa64_to_int (buf[ 8]) << 0;
1940 l |= itoa64_to_int (buf[ 9]) << 6;
1941 l |= itoa64_to_int (buf[10]) << 12;
1942 l |= itoa64_to_int (buf[11]) << 18;
1943
1944 digest[12] = (l >> 16) & 0xff;
1945 digest[22] = (l >> 8) & 0xff;
1946 digest[ 2] = (l >> 0) & 0xff;
1947
1948 l = itoa64_to_int (buf[12]) << 0;
1949 l |= itoa64_to_int (buf[13]) << 6;
1950 l |= itoa64_to_int (buf[14]) << 12;
1951 l |= itoa64_to_int (buf[15]) << 18;
1952
1953 digest[ 3] = (l >> 16) & 0xff;
1954 digest[13] = (l >> 8) & 0xff;
1955 digest[23] = (l >> 0) & 0xff;
1956
1957 l = itoa64_to_int (buf[16]) << 0;
1958 l |= itoa64_to_int (buf[17]) << 6;
1959 l |= itoa64_to_int (buf[18]) << 12;
1960 l |= itoa64_to_int (buf[19]) << 18;
1961
1962 digest[24] = (l >> 16) & 0xff;
1963 digest[ 4] = (l >> 8) & 0xff;
1964 digest[14] = (l >> 0) & 0xff;
1965
1966 l = itoa64_to_int (buf[20]) << 0;
1967 l |= itoa64_to_int (buf[21]) << 6;
1968 l |= itoa64_to_int (buf[22]) << 12;
1969 l |= itoa64_to_int (buf[23]) << 18;
1970
1971 digest[15] = (l >> 16) & 0xff;
1972 digest[25] = (l >> 8) & 0xff;
1973 digest[ 5] = (l >> 0) & 0xff;
1974
1975 l = itoa64_to_int (buf[24]) << 0;
1976 l |= itoa64_to_int (buf[25]) << 6;
1977 l |= itoa64_to_int (buf[26]) << 12;
1978 l |= itoa64_to_int (buf[27]) << 18;
1979
1980 digest[ 6] = (l >> 16) & 0xff;
1981 digest[16] = (l >> 8) & 0xff;
1982 digest[26] = (l >> 0) & 0xff;
1983
1984 l = itoa64_to_int (buf[28]) << 0;
1985 l |= itoa64_to_int (buf[29]) << 6;
1986 l |= itoa64_to_int (buf[30]) << 12;
1987 l |= itoa64_to_int (buf[31]) << 18;
1988
1989 digest[27] = (l >> 16) & 0xff;
1990 digest[ 7] = (l >> 8) & 0xff;
1991 digest[17] = (l >> 0) & 0xff;
1992
1993 l = itoa64_to_int (buf[32]) << 0;
1994 l |= itoa64_to_int (buf[33]) << 6;
1995 l |= itoa64_to_int (buf[34]) << 12;
1996 l |= itoa64_to_int (buf[35]) << 18;
1997
1998 digest[18] = (l >> 16) & 0xff;
1999 digest[28] = (l >> 8) & 0xff;
2000 digest[ 8] = (l >> 0) & 0xff;
2001
2002 l = itoa64_to_int (buf[36]) << 0;
2003 l |= itoa64_to_int (buf[37]) << 6;
2004 l |= itoa64_to_int (buf[38]) << 12;
2005 l |= itoa64_to_int (buf[39]) << 18;
2006
2007 digest[ 9] = (l >> 16) & 0xff;
2008 digest[19] = (l >> 8) & 0xff;
2009 digest[29] = (l >> 0) & 0xff;
2010
2011 l = itoa64_to_int (buf[40]) << 0;
2012 l |= itoa64_to_int (buf[41]) << 6;
2013 l |= itoa64_to_int (buf[42]) << 12;
2014
2015 digest[31] = (l >> 8) & 0xff;
2016 digest[30] = (l >> 0) & 0xff;
2017 }
2018
2019 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2020 {
2021 int l;
2022
2023 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2024
2025 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2026 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2027 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029
2030 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2031
2032 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2033 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2034 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036
2037 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2038
2039 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2040 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2041 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043
2044 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2045
2046 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2047 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2048 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050
2051 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2052
2053 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2054 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2055 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057
2058 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2059
2060 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2061 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2062 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064
2065 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2066
2067 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2068 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2069 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071
2072 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2073
2074 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2075 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2076 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078
2079 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2080
2081 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2082 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2083 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085
2086 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2087
2088 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2089 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2090 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2091 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092
2093 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2094
2095 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2096 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2097 buf[42] = int_to_itoa64 (l & 0x3f);
2098 }
2099
2100 void drupal7_decode (u8 digest[64], u8 buf[44])
2101 {
2102 int l;
2103
2104 l = itoa64_to_int (buf[ 0]) << 0;
2105 l |= itoa64_to_int (buf[ 1]) << 6;
2106 l |= itoa64_to_int (buf[ 2]) << 12;
2107 l |= itoa64_to_int (buf[ 3]) << 18;
2108
2109 digest[ 0] = (l >> 0) & 0xff;
2110 digest[ 1] = (l >> 8) & 0xff;
2111 digest[ 2] = (l >> 16) & 0xff;
2112
2113 l = itoa64_to_int (buf[ 4]) << 0;
2114 l |= itoa64_to_int (buf[ 5]) << 6;
2115 l |= itoa64_to_int (buf[ 6]) << 12;
2116 l |= itoa64_to_int (buf[ 7]) << 18;
2117
2118 digest[ 3] = (l >> 0) & 0xff;
2119 digest[ 4] = (l >> 8) & 0xff;
2120 digest[ 5] = (l >> 16) & 0xff;
2121
2122 l = itoa64_to_int (buf[ 8]) << 0;
2123 l |= itoa64_to_int (buf[ 9]) << 6;
2124 l |= itoa64_to_int (buf[10]) << 12;
2125 l |= itoa64_to_int (buf[11]) << 18;
2126
2127 digest[ 6] = (l >> 0) & 0xff;
2128 digest[ 7] = (l >> 8) & 0xff;
2129 digest[ 8] = (l >> 16) & 0xff;
2130
2131 l = itoa64_to_int (buf[12]) << 0;
2132 l |= itoa64_to_int (buf[13]) << 6;
2133 l |= itoa64_to_int (buf[14]) << 12;
2134 l |= itoa64_to_int (buf[15]) << 18;
2135
2136 digest[ 9] = (l >> 0) & 0xff;
2137 digest[10] = (l >> 8) & 0xff;
2138 digest[11] = (l >> 16) & 0xff;
2139
2140 l = itoa64_to_int (buf[16]) << 0;
2141 l |= itoa64_to_int (buf[17]) << 6;
2142 l |= itoa64_to_int (buf[18]) << 12;
2143 l |= itoa64_to_int (buf[19]) << 18;
2144
2145 digest[12] = (l >> 0) & 0xff;
2146 digest[13] = (l >> 8) & 0xff;
2147 digest[14] = (l >> 16) & 0xff;
2148
2149 l = itoa64_to_int (buf[20]) << 0;
2150 l |= itoa64_to_int (buf[21]) << 6;
2151 l |= itoa64_to_int (buf[22]) << 12;
2152 l |= itoa64_to_int (buf[23]) << 18;
2153
2154 digest[15] = (l >> 0) & 0xff;
2155 digest[16] = (l >> 8) & 0xff;
2156 digest[17] = (l >> 16) & 0xff;
2157
2158 l = itoa64_to_int (buf[24]) << 0;
2159 l |= itoa64_to_int (buf[25]) << 6;
2160 l |= itoa64_to_int (buf[26]) << 12;
2161 l |= itoa64_to_int (buf[27]) << 18;
2162
2163 digest[18] = (l >> 0) & 0xff;
2164 digest[19] = (l >> 8) & 0xff;
2165 digest[20] = (l >> 16) & 0xff;
2166
2167 l = itoa64_to_int (buf[28]) << 0;
2168 l |= itoa64_to_int (buf[29]) << 6;
2169 l |= itoa64_to_int (buf[30]) << 12;
2170 l |= itoa64_to_int (buf[31]) << 18;
2171
2172 digest[21] = (l >> 0) & 0xff;
2173 digest[22] = (l >> 8) & 0xff;
2174 digest[23] = (l >> 16) & 0xff;
2175
2176 l = itoa64_to_int (buf[32]) << 0;
2177 l |= itoa64_to_int (buf[33]) << 6;
2178 l |= itoa64_to_int (buf[34]) << 12;
2179 l |= itoa64_to_int (buf[35]) << 18;
2180
2181 digest[24] = (l >> 0) & 0xff;
2182 digest[25] = (l >> 8) & 0xff;
2183 digest[26] = (l >> 16) & 0xff;
2184
2185 l = itoa64_to_int (buf[36]) << 0;
2186 l |= itoa64_to_int (buf[37]) << 6;
2187 l |= itoa64_to_int (buf[38]) << 12;
2188 l |= itoa64_to_int (buf[39]) << 18;
2189
2190 digest[27] = (l >> 0) & 0xff;
2191 digest[28] = (l >> 8) & 0xff;
2192 digest[29] = (l >> 16) & 0xff;
2193
2194 l = itoa64_to_int (buf[40]) << 0;
2195 l |= itoa64_to_int (buf[41]) << 6;
2196 l |= itoa64_to_int (buf[42]) << 12;
2197 l |= itoa64_to_int (buf[43]) << 18;
2198
2199 digest[30] = (l >> 0) & 0xff;
2200 digest[31] = (l >> 8) & 0xff;
2201 digest[32] = (l >> 16) & 0xff;
2202
2203 digest[33] = 0;
2204 digest[34] = 0;
2205 digest[35] = 0;
2206 digest[36] = 0;
2207 digest[37] = 0;
2208 digest[38] = 0;
2209 digest[39] = 0;
2210 digest[40] = 0;
2211 digest[41] = 0;
2212 digest[42] = 0;
2213 digest[43] = 0;
2214 digest[44] = 0;
2215 digest[45] = 0;
2216 digest[46] = 0;
2217 digest[47] = 0;
2218 digest[48] = 0;
2219 digest[49] = 0;
2220 digest[50] = 0;
2221 digest[51] = 0;
2222 digest[52] = 0;
2223 digest[53] = 0;
2224 digest[54] = 0;
2225 digest[55] = 0;
2226 digest[56] = 0;
2227 digest[57] = 0;
2228 digest[58] = 0;
2229 digest[59] = 0;
2230 digest[60] = 0;
2231 digest[61] = 0;
2232 digest[62] = 0;
2233 digest[63] = 0;
2234 }
2235
2236 void drupal7_encode (u8 digest[64], u8 buf[43])
2237 {
2238 int l;
2239
2240 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2241
2242 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2243 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2244 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2245 buf[ 3] = int_to_itoa64 (l & 0x3f);
2246
2247 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2248
2249 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2250 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2251 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2252 buf[ 7] = int_to_itoa64 (l & 0x3f);
2253
2254 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2255
2256 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2257 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2258 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[11] = int_to_itoa64 (l & 0x3f);
2260
2261 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2262
2263 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2264 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2265 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[15] = int_to_itoa64 (l & 0x3f);
2267
2268 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2269
2270 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2271 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2272 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[19] = int_to_itoa64 (l & 0x3f);
2274
2275 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2276
2277 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2278 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2279 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[23] = int_to_itoa64 (l & 0x3f);
2281
2282 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2283
2284 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2285 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2286 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[27] = int_to_itoa64 (l & 0x3f);
2288
2289 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2290
2291 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2292 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2293 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[31] = int_to_itoa64 (l & 0x3f);
2295
2296 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2297
2298 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2299 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2300 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[35] = int_to_itoa64 (l & 0x3f);
2302
2303 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2304
2305 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2306 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2307 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 buf[39] = int_to_itoa64 (l & 0x3f);
2309
2310 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2311
2312 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2313 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2314 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2315 //buf[43] = int_to_itoa64 (l & 0x3f);
2316 }
2317
2318 /**
2319 * tty
2320 */
2321
2322 #ifdef LINUX
2323 static struct termio savemodes;
2324 static int havemodes = 0;
2325
2326 int tty_break()
2327 {
2328 struct termio modmodes;
2329
2330 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2331
2332 havemodes = 1;
2333
2334 modmodes = savemodes;
2335 modmodes.c_lflag &= ~ICANON;
2336 modmodes.c_cc[VMIN] = 1;
2337 modmodes.c_cc[VTIME] = 0;
2338
2339 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2340 }
2341
2342 int tty_getchar()
2343 {
2344 fd_set rfds;
2345
2346 FD_ZERO (&rfds);
2347
2348 FD_SET (fileno (stdin), &rfds);
2349
2350 struct timeval tv;
2351
2352 tv.tv_sec = 1;
2353 tv.tv_usec = 0;
2354
2355 int retval = select (1, &rfds, NULL, NULL, &tv);
2356
2357 if (retval == 0) return 0;
2358 if (retval == -1) return -1;
2359
2360 return getchar();
2361 }
2362
2363 int tty_fix()
2364 {
2365 if (!havemodes) return 0;
2366
2367 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2368 }
2369 #endif
2370
2371 #ifdef OSX
2372 static struct termios savemodes;
2373 static int havemodes = 0;
2374
2375 int tty_break()
2376 {
2377 struct termios modmodes;
2378
2379 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2380
2381 havemodes = 1;
2382
2383 modmodes = savemodes;
2384 modmodes.c_lflag &= ~ICANON;
2385 modmodes.c_cc[VMIN] = 1;
2386 modmodes.c_cc[VTIME] = 0;
2387
2388 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2389 }
2390
2391 int tty_getchar()
2392 {
2393 fd_set rfds;
2394
2395 FD_ZERO (&rfds);
2396
2397 FD_SET (fileno (stdin), &rfds);
2398
2399 struct timeval tv;
2400
2401 tv.tv_sec = 1;
2402 tv.tv_usec = 0;
2403
2404 int retval = select (1, &rfds, NULL, NULL, &tv);
2405
2406 if (retval == 0) return 0;
2407 if (retval == -1) return -1;
2408
2409 return getchar();
2410 }
2411
2412 int tty_fix()
2413 {
2414 if (!havemodes) return 0;
2415
2416 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2417 }
2418 #endif
2419
2420 #ifdef WIN
2421 static DWORD saveMode = 0;
2422
2423 int tty_break()
2424 {
2425 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2426
2427 GetConsoleMode (stdinHandle, &saveMode);
2428 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2429
2430 return 0;
2431 }
2432
2433 int tty_getchar()
2434 {
2435 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2436
2437 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2438
2439 if (rc == WAIT_TIMEOUT) return 0;
2440 if (rc == WAIT_ABANDONED) return -1;
2441 if (rc == WAIT_FAILED) return -1;
2442
2443 // The whole ReadConsoleInput () part is a workaround.
2444 // For some unknown reason, maybe a mingw bug, a random signal
2445 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2446 // Then it wants to read with getche () a keyboard input
2447 // which has never been made.
2448
2449 INPUT_RECORD buf[100];
2450
2451 DWORD num = 0;
2452
2453 memset (buf, 0, sizeof (buf));
2454
2455 ReadConsoleInput (stdinHandle, buf, 100, &num);
2456
2457 FlushConsoleInputBuffer (stdinHandle);
2458
2459 for (uint i = 0; i < num; i++)
2460 {
2461 if (buf[i].EventType != KEY_EVENT) continue;
2462
2463 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2464
2465 if (KeyEvent.bKeyDown != TRUE) continue;
2466
2467 return KeyEvent.uChar.AsciiChar;
2468 }
2469
2470 return 0;
2471 }
2472
2473 int tty_fix()
2474 {
2475 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2476
2477 SetConsoleMode (stdinHandle, saveMode);
2478
2479 return 0;
2480 }
2481 #endif
2482
2483 /**
2484 * mem alloc
2485 */
2486
2487 #define MSG_ENOMEM "Insufficient memory available"
2488
2489 void *mycalloc (size_t nmemb, size_t size)
2490 {
2491 void *p = calloc (nmemb, size);
2492
2493 if (p == NULL)
2494 {
2495 log_error ("ERROR: %s", MSG_ENOMEM);
2496
2497 exit (-1);
2498 }
2499
2500 return (p);
2501 }
2502
2503 void *mymalloc (size_t size)
2504 {
2505 void *p = malloc (size);
2506
2507 if (p == NULL)
2508 {
2509 log_error ("ERROR: %s", MSG_ENOMEM);
2510
2511 exit (-1);
2512 }
2513
2514 memset (p, 0, size);
2515
2516 return (p);
2517 }
2518
2519 void myfree (void *ptr)
2520 {
2521 if (ptr == NULL) return;
2522
2523 free (ptr);
2524 }
2525
2526 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2527 {
2528 void *p = realloc (ptr, oldsz + add);
2529
2530 if (p == NULL)
2531 {
2532 log_error ("ERROR: %s", MSG_ENOMEM);
2533
2534 exit (-1);
2535 }
2536
2537 memset ((char *) p + oldsz, 0, add);
2538
2539 return (p);
2540 }
2541
2542 char *mystrdup (const char *s)
2543 {
2544 const size_t len = strlen (s);
2545
2546 char *b = (char *) mymalloc (len + 1);
2547
2548 memcpy (b, s, len);
2549
2550 return (b);
2551 }
2552
2553 FILE *logfile_open (char *logfile)
2554 {
2555 FILE *fp = fopen (logfile, "ab");
2556
2557 if (fp == NULL)
2558 {
2559 fp = stdout;
2560 }
2561
2562 return fp;
2563 }
2564
2565 void logfile_close (FILE *fp)
2566 {
2567 if (fp == stdout) return;
2568
2569 fclose (fp);
2570 }
2571
2572 void logfile_append (const char *fmt, ...)
2573 {
2574 if (data.logfile_disable == 1) return;
2575
2576 FILE *fp = logfile_open (data.logfile);
2577
2578 va_list ap;
2579
2580 va_start (ap, fmt);
2581
2582 vfprintf (fp, fmt, ap);
2583
2584 va_end (ap);
2585
2586 fputc ('\n', fp);
2587
2588 fflush (fp);
2589
2590 logfile_close (fp);
2591 }
2592
2593 int logfile_generate_id ()
2594 {
2595 const int n = rand ();
2596
2597 time_t t;
2598
2599 time (&t);
2600
2601 return t + n;
2602 }
2603
2604 char *logfile_generate_topid ()
2605 {
2606 const int id = logfile_generate_id ();
2607
2608 char *topid = (char *) mymalloc (1 + 16 + 1);
2609
2610 snprintf (topid, 1 + 16, "TOP%08x", id);
2611
2612 return topid;
2613 }
2614
2615 char *logfile_generate_subid ()
2616 {
2617 const int id = logfile_generate_id ();
2618
2619 char *subid = (char *) mymalloc (1 + 16 + 1);
2620
2621 snprintf (subid, 1 + 16, "SUB%08x", id);
2622
2623 return subid;
2624 }
2625
2626 /**
2627 * system
2628 */
2629
2630 #ifdef _WIN
2631 void fsync (int fd)
2632 {
2633 HANDLE h = (HANDLE) _get_osfhandle (fd);
2634
2635 FlushFileBuffers (h);
2636 }
2637 #endif
2638
2639 /**
2640 * thermal
2641 */
2642
2643 #ifdef HAVE_HWMON
2644 #if defined(_WIN) && defined(HAVE_NVAPI)
2645 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2646 {
2647 NvU32 pGpuCount;
2648
2649 if (hc_NvAPI_EnumPhysicalGPUs (nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2650
2651 if (pGpuCount == 0)
2652 {
2653 log_info ("WARN: No NvAPI adapters found");
2654
2655 return (0);
2656 }
2657
2658 return (pGpuCount);
2659 }
2660 #endif // _WIN && HAVE_NVAPI
2661
2662 #if defined(LINUX) && defined(HAVE_NVML)
2663 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2664 {
2665 int pGpuCount = 0;
2666
2667 for (uint i = 0; i < DEVICES_MAX; i++)
2668 {
2669 if (hc_NVML_nvmlDeviceGetHandleByIndex (data.hm_dll_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2670
2671 // can be used to determine if the device by index matches the cuda device by index
2672 // char name[100]; memset (name, 0, sizeof (name));
2673 // hc_NVML_nvmlDeviceGetName (data.hm_dll_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2674
2675 pGpuCount++;
2676 }
2677
2678 if (pGpuCount == 0)
2679 {
2680 log_info ("WARN: No NVML adapters found");
2681
2682 return (0);
2683 }
2684
2685 return (pGpuCount);
2686 }
2687 #endif // LINUX && HAVE_NVML
2688
2689 #if defined(HAVE_ADL) || defined(HAVE_NVML)
2690 void hm_close (HM_LIB hm_dll)
2691 {
2692 #ifdef _POSIX
2693 dlclose (hm_dll);
2694
2695 #elif _WIN
2696 FreeLibrary (hm_dll);
2697
2698 #endif
2699 }
2700
2701 HM_LIB hm_init (const cl_uint vendor_id)
2702 {
2703 HM_LIB hm_dll = NULL;
2704
2705 #ifdef HAVE_ADL
2706 if (vendor_id == VENDOR_ID_AMD)
2707 {
2708 #ifdef _POSIX
2709 hm_dll = dlopen ("libatiadlxx.so", RTLD_LAZY | RTLD_GLOBAL);
2710
2711 #elif _WIN
2712 hm_dll = LoadLibrary ("atiadlxx.dll");
2713
2714 if (hm_dll == NULL)
2715 {
2716 hm_dll = LoadLibrary ("atiadlxy.dll");
2717 }
2718
2719 #endif
2720 }
2721 #endif
2722
2723 #if defined(LINUX) && defined(HAVE_NVML)
2724 if (vendor_id == VENDOR_ID_NV)
2725 {
2726 hm_dll = dlopen ("libnvidia-ml.so", RTLD_LAZY | RTLD_GLOBAL);
2727 }
2728 #endif
2729
2730 return hm_dll;
2731 }
2732 #endif // HAVE_ADL || HAVE_NVML
2733
2734 #ifdef HAVE_ADL
2735 int get_adapters_num_amd (HM_LIB hm_dll_amd, int *iNumberAdapters)
2736 {
2737 if (hc_ADL_Adapter_NumberOfAdapters_Get (hm_dll_amd, iNumberAdapters) != ADL_OK) return -1;
2738
2739 if (iNumberAdapters == 0)
2740 {
2741 log_info ("WARN: No ADL adapters found.");
2742
2743 return -1;
2744 }
2745
2746 return 0;
2747 }
2748
2749 /*
2750 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2751 {
2752 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2753 ADLODParameters lpOdParameters;
2754
2755 lpOdParameters.iSize = sizeof (ADLODParameters);
2756 size_t plevels_size = 0;
2757
2758 if (hc_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2759
2760 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2761 __func__, iAdapterIndex,
2762 lpOdParameters.iNumberOfPerformanceLevels,
2763 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2764 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2765
2766 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2767
2768 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2769
2770 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2771
2772 if (hc_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2773
2774 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2775 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2776 __func__, iAdapterIndex, j,
2777 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2778
2779 myfree (lpOdPerformanceLevels);
2780
2781 return 0;
2782 }
2783 */
2784
2785 LPAdapterInfo hm_get_adapter_info_amd (HM_LIB hm_dll_amd, int iNumberAdapters)
2786 {
2787 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2788
2789 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2790
2791 if (hc_ADL_Adapter_AdapterInfo_Get (hm_dll_amd, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2792
2793 return lpAdapterInfo;
2794 }
2795
2796 /*
2797 //
2798 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2799 //
2800
2801 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2802 {
2803 u32 idx = -1;
2804
2805 for (uint i = 0; i < num_adl_adapters; i++)
2806 {
2807 int opencl_bus_num = hm_device[i].busid;
2808 int opencl_dev_num = hm_device[i].devid;
2809
2810 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2811 {
2812 idx = i;
2813
2814 break;
2815 }
2816 }
2817
2818 if (idx >= DEVICES_MAX) return -1;
2819
2820 return idx;
2821 }
2822
2823 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2824 {
2825 for (uint i = 0; i < opencl_num_devices; i++)
2826 {
2827 cl_device_topology_amd device_topology;
2828
2829 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2830
2831 hm_device[i].busid = device_topology.pcie.bus;
2832 hm_device[i].devid = device_topology.pcie.device;
2833 }
2834 }
2835 */
2836
2837 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2838 {
2839 // basically bubble sort
2840
2841 for (int i = 0; i < num_adl_adapters; i++)
2842 {
2843 for (int j = 0; j < num_adl_adapters - 1; j++)
2844 {
2845 // get info of adapter [x]
2846
2847 u32 adapter_index_x = valid_adl_device_list[j];
2848 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2849
2850 u32 bus_num_x = info_x.iBusNumber;
2851 u32 dev_num_x = info_x.iDeviceNumber;
2852
2853 // get info of adapter [y]
2854
2855 u32 adapter_index_y = valid_adl_device_list[j + 1];
2856 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2857
2858 u32 bus_num_y = info_y.iBusNumber;
2859 u32 dev_num_y = info_y.iDeviceNumber;
2860
2861 uint need_swap = 0;
2862
2863 if (bus_num_y < bus_num_x)
2864 {
2865 need_swap = 1;
2866 }
2867 else if (bus_num_y == bus_num_x)
2868 {
2869 if (dev_num_y < dev_num_x)
2870 {
2871 need_swap = 1;
2872 }
2873 }
2874
2875 if (need_swap == 1)
2876 {
2877 u32 temp = valid_adl_device_list[j + 1];
2878
2879 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2880 valid_adl_device_list[j + 0] = temp;
2881 }
2882 }
2883 }
2884 }
2885
2886 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2887 {
2888 *num_adl_adapters = 0;
2889
2890 u32 *adl_adapters = NULL;
2891
2892 int *bus_numbers = NULL;
2893 int *device_numbers = NULL;
2894
2895 for (int i = 0; i < iNumberAdapters; i++)
2896 {
2897 AdapterInfo info = lpAdapterInfo[i];
2898
2899 if (strlen (info.strUDID) < 1) continue;
2900
2901 #ifdef WIN
2902 if (info.iVendorID != 1002) continue;
2903 #else
2904 if (info.iVendorID != 0x1002) continue;
2905 #endif
2906
2907 if (info.iBusNumber < 0) continue;
2908 if (info.iDeviceNumber < 0) continue;
2909
2910 int found = 0;
2911
2912 for (int pos = 0; pos < *num_adl_adapters; pos++)
2913 {
2914 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2915 {
2916 found = 1;
2917 break;
2918 }
2919 }
2920
2921 if (found) continue;
2922
2923 // add it to the list
2924
2925 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2926
2927 adl_adapters[*num_adl_adapters] = i;
2928
2929 // rest is just bookkeeping
2930
2931 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2932 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2933
2934 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2935 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2936
2937 (*num_adl_adapters)++;
2938 }
2939
2940 myfree (bus_numbers);
2941 myfree (device_numbers);
2942
2943 // sort the list by increasing bus id, device id number
2944
2945 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2946
2947 return adl_adapters;
2948 }
2949
2950 int hm_check_fanspeed_control (HM_LIB hm_dll_amd, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2951 {
2952 // loop through all valid devices
2953
2954 for (int i = 0; i < num_adl_adapters; i++)
2955 {
2956 u32 adapter_index = valid_adl_device_list[i];
2957
2958 // get AdapterInfo
2959
2960 AdapterInfo info = lpAdapterInfo[adapter_index];
2961
2962 // unfortunately this doesn't work since bus id and dev id are not unique
2963 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2964 // if (opencl_device_index == -1) continue;
2965
2966 int opencl_device_index = i;
2967
2968 // if (hm_show_performance_level (hm_dll_amd, info.iAdapterIndex) != 0) return -1;
2969
2970 // get fanspeed info
2971
2972 if (hm_device[opencl_device_index].od_version == 5)
2973 {
2974 ADLFanSpeedInfo FanSpeedInfo;
2975
2976 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2977
2978 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2979
2980 if (hc_ADL_Overdrive5_FanSpeedInfo_Get (hm_dll_amd, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2981
2982 // check read and write capability in fanspeedinfo
2983
2984 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2985 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2986 {
2987 hm_device[opencl_device_index].fan_supported = 1;
2988 }
2989 else
2990 {
2991 hm_device[opencl_device_index].fan_supported = 0;
2992 }
2993 }
2994 else // od_version == 6
2995 {
2996 ADLOD6FanSpeedInfo faninfo;
2997
2998 memset (&faninfo, 0, sizeof (faninfo));
2999
3000 if (hc_ADL_Overdrive6_FanSpeed_Get (hm_dll_amd, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
3001
3002 // check read capability in fanspeedinfo
3003
3004 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
3005 {
3006 hm_device[opencl_device_index].fan_supported = 1;
3007 }
3008 else
3009 {
3010 hm_device[opencl_device_index].fan_supported = 0;
3011 }
3012 }
3013 }
3014
3015 return 0;
3016 }
3017
3018 int hm_get_overdrive_version (HM_LIB hm_dll_amd, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3019 {
3020 for (int i = 0; i < num_adl_adapters; i++)
3021 {
3022 u32 adapter_index = valid_adl_device_list[i];
3023
3024 // get AdapterInfo
3025
3026 AdapterInfo info = lpAdapterInfo[adapter_index];
3027
3028 // get overdrive version
3029
3030 int od_supported = 0;
3031 int od_enabled = 0;
3032 int od_version = 0;
3033
3034 if (hc_ADL_Overdrive_Caps (hm_dll_amd, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3035
3036 // store the overdrive version in hm_device
3037
3038 // unfortunately this doesn't work since bus id and dev id are not unique
3039 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3040 // if (opencl_device_index == -1) continue;
3041
3042 int opencl_device_index = i;
3043
3044 hm_device[opencl_device_index].od_version = od_version;
3045 }
3046
3047 return 0;
3048 }
3049
3050 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3051 {
3052 for (int i = 0; i < num_adl_adapters; i++)
3053 {
3054 u32 adapter_index = valid_adl_device_list[i];
3055
3056 // get AdapterInfo
3057
3058 AdapterInfo info = lpAdapterInfo[adapter_index];
3059
3060 // store the iAdapterIndex in hm_device
3061
3062 // unfortunately this doesn't work since bus id and dev id are not unique
3063 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3064 // if (opencl_device_index == -1) continue;
3065
3066 int opencl_device_index = i;
3067
3068 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3069 }
3070
3071 return num_adl_adapters;
3072 }
3073 #endif // HAVE_ADL
3074
3075 int hm_get_temperature_with_device_id (const uint device_id)
3076 {
3077 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3078
3079 #ifdef HAVE_ADL
3080 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3081 {
3082 if (data.hm_dll_amd)
3083 {
3084 if (data.hm_device[device_id].od_version == 5)
3085 {
3086 ADLTemperature Temperature;
3087
3088 Temperature.iSize = sizeof (ADLTemperature);
3089
3090 if (hc_ADL_Overdrive5_Temperature_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3091
3092 return Temperature.iTemperature / 1000;
3093 }
3094 else if (data.hm_device[device_id].od_version == 6)
3095 {
3096 int Temperature = 0;
3097
3098 if (hc_ADL_Overdrive6_Temperature_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3099
3100 return Temperature / 1000;
3101 }
3102 }
3103 }
3104 #endif
3105
3106 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3107 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3108 {
3109 #if defined(LINUX) && defined(HAVE_NVML)
3110 int temperature = 0;
3111
3112 hc_NVML_nvmlDeviceGetTemperature (data.hm_dll_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3113
3114 return temperature;
3115 #endif
3116
3117 #if defined(WIN) && defined(HAVE_NVAPI)
3118 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3119
3120 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3121 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3122 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3123 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3124
3125 if (hc_NvAPI_GPU_GetThermalSettings (data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3126
3127 return pThermalSettings.sensor[0].currentTemp;
3128 #endif // WIN && HAVE_NVAPI
3129 }
3130 #endif // HAVE_NVML || HAVE_NVAPI
3131
3132 return -1;
3133 }
3134
3135 int hm_get_fanspeed_with_device_id (const uint device_id)
3136 {
3137 // we shouldn't really need this extra CL_DEVICE_TYPE_GPU check, because fan_supported should not be set w/ CPUs
3138 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3139
3140 if (data.hm_device[device_id].fan_supported == 1)
3141 {
3142 #ifdef HAVE_ADL
3143 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3144 {
3145 if (data.hm_dll_amd)
3146 {
3147 if (data.hm_device[device_id].od_version == 5)
3148 {
3149 ADLFanSpeedValue lpFanSpeedValue;
3150
3151 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3152
3153 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3154 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3155 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3156
3157 if (hc_ADL_Overdrive5_FanSpeed_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3158
3159 return lpFanSpeedValue.iFanSpeed;
3160 }
3161 else // od_version == 6
3162 {
3163 ADLOD6FanSpeedInfo faninfo;
3164
3165 memset (&faninfo, 0, sizeof (faninfo));
3166
3167 if (hc_ADL_Overdrive6_FanSpeed_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3168
3169 return faninfo.iFanSpeedPercent;
3170 }
3171 }
3172 }
3173 #endif // HAVE_ADL
3174
3175 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3176 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3177 {
3178 #if defined(LINUX) && defined(HAVE_NVML)
3179 int speed = 0;
3180
3181 hc_NVML_nvmlDeviceGetFanSpeed (data.hm_dll_nv, 1, data.hm_device[device_id].adapter_index.nv, (unsigned int *) &speed);
3182
3183 return speed;
3184 #endif
3185
3186 #if defined(WIN) && defined(HAVE_NVAPI)
3187 NvU32 speed = 0;
3188
3189 hc_NvAPI_GPU_GetTachReading (data.hm_device[device_id].adapter_index.nv, &speed);
3190
3191 return speed;
3192 #endif
3193 }
3194 #endif // HAVE_NVML || HAVE_NVAPI
3195 }
3196
3197 return -1;
3198 }
3199
3200 int hm_get_utilization_with_device_id (const uint device_id)
3201 {
3202 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3203
3204 #ifdef HAVE_ADL
3205 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3206 {
3207 if (data.hm_dll_amd)
3208 {
3209 ADLPMActivity PMActivity;
3210
3211 PMActivity.iSize = sizeof (ADLPMActivity);
3212
3213 if (hc_ADL_Overdrive_CurrentActivity_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3214
3215 return PMActivity.iActivityPercent;
3216 }
3217 }
3218 #endif // HAVE_ADL
3219
3220 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3221 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3222 {
3223 #if defined(LINUX) && defined(HAVE_NVML)
3224 nvmlUtilization_t utilization;
3225
3226 hc_NVML_nvmlDeviceGetUtilizationRates (data.hm_dll_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3227
3228 return utilization.gpu;
3229 #endif
3230
3231 #if defined(WIN) && defined(HAVE_NVAPI)
3232 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3233
3234 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3235
3236 if (hc_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3237
3238 return pDynamicPstatesInfoEx.utilization[0].percentage;
3239 #endif
3240 }
3241 #endif // HAVE_NVML || HAVE_NVAPI
3242
3243 return -1;
3244 }
3245
3246 #ifdef HAVE_ADL
3247 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3248 {
3249 if (data.hm_device[device_id].fan_supported == 1)
3250 {
3251 if (data.hm_dll_amd)
3252 {
3253 if (data.hm_device[device_id].od_version == 5)
3254 {
3255 ADLFanSpeedValue lpFanSpeedValue;
3256
3257 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3258
3259 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3260 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3261 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3262 lpFanSpeedValue.iFanSpeed = fanspeed;
3263
3264 if (hc_ADL_Overdrive5_FanSpeed_Set (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3265
3266 return 0;
3267 }
3268 else // od_version == 6
3269 {
3270 ADLOD6FanSpeedValue fan_speed_value;
3271
3272 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3273
3274 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3275 fan_speed_value.iFanSpeed = fanspeed;
3276
3277 if (hc_ADL_Overdrive6_FanSpeed_Set (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3278
3279 return 0;
3280 }
3281 }
3282 }
3283
3284 return -1;
3285 }
3286 #endif
3287
3288 // helper function for status display
3289
3290 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3291 {
3292 #define VALUE_NOT_AVAILABLE "N/A"
3293
3294 if (value == -1)
3295 {
3296 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3297 }
3298 else
3299 {
3300 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3301 }
3302 }
3303 #endif // HAVE_HWMON
3304
3305 /**
3306 * maskprocessor
3307 */
3308
3309 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3310 {
3311 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3312
3313 if (css_cnt > SP_PW_MAX)
3314 {
3315 log_error ("ERROR: mask length is too long");
3316
3317 exit (-1);
3318 }
3319
3320 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3321 {
3322 uint *uniq_tbl = uniq_tbls[css_pos];
3323
3324 uint *cs_buf = css[css_pos].cs_buf;
3325 uint cs_len = css[css_pos].cs_len;
3326
3327 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3328 {
3329 uint c = cs_buf[cs_pos] & 0xff;
3330
3331 uniq_tbl[c] = 1;
3332 }
3333 }
3334 }
3335
3336 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3337 {
3338 cs_t *cs = &css[css_cnt];
3339
3340 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3341
3342 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3343
3344 size_t i;
3345
3346 for (i = 0; i < cs->cs_len; i++)
3347 {
3348 const uint u = cs->cs_buf[i];
3349
3350 css_uniq[u] = 1;
3351 }
3352
3353 for (i = 0; i < in_len; i++)
3354 {
3355 uint u = in_buf[i] & 0xff;
3356
3357 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3358
3359 if (css_uniq[u] == 1) continue;
3360
3361 css_uniq[u] = 1;
3362
3363 cs->cs_buf[cs->cs_len] = u;
3364
3365 cs->cs_len++;
3366 }
3367
3368 myfree (css_uniq);
3369 }
3370
3371 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3372 {
3373 size_t in_pos;
3374
3375 for (in_pos = 0; in_pos < in_len; in_pos++)
3376 {
3377 uint p0 = in_buf[in_pos] & 0xff;
3378
3379 if (interpret == 1 && p0 == '?')
3380 {
3381 in_pos++;
3382
3383 if (in_pos == in_len) break;
3384
3385 uint p1 = in_buf[in_pos] & 0xff;
3386
3387 switch (p1)
3388 {
3389 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3390 break;
3391 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3392 break;
3393 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3394 break;
3395 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3396 break;
3397 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3398 break;
3399 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3400 break;
3401 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3402 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3403 break;
3404 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3405 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3406 break;
3407 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3408 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3409 break;
3410 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3411 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3412 break;
3413 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3414 break;
3415 default: log_error ("Syntax error: %s", in_buf);
3416 exit (-1);
3417 }
3418 }
3419 else
3420 {
3421 if (data.hex_charset)
3422 {
3423 in_pos++;
3424
3425 if (in_pos == in_len)
3426 {
3427 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3428
3429 exit (-1);
3430 }
3431
3432 uint p1 = in_buf[in_pos] & 0xff;
3433
3434 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3435 {
3436 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3437
3438 exit (-1);
3439 }
3440
3441 uint chr = 0;
3442
3443 chr = hex_convert (p1) << 0;
3444 chr |= hex_convert (p0) << 4;
3445
3446 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3447 }
3448 else
3449 {
3450 uint chr = p0;
3451
3452 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3453 }
3454 }
3455 }
3456 }
3457
3458 u64 mp_get_sum (uint css_cnt, cs_t *css)
3459 {
3460 u64 sum = 1;
3461
3462 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3463 {
3464 sum *= css[css_pos].cs_len;
3465 }
3466
3467 return (sum);
3468 }
3469
3470 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3471 {
3472 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3473
3474 uint mask_pos;
3475 uint css_pos;
3476
3477 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3478 {
3479 char p0 = mask_buf[mask_pos];
3480
3481 if (p0 == '?')
3482 {
3483 mask_pos++;
3484
3485 if (mask_pos == mask_len) break;
3486
3487 char p1 = mask_buf[mask_pos];
3488
3489 uint chr = p1;
3490
3491 switch (p1)
3492 {
3493 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3494 break;
3495 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3496 break;
3497 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3498 break;
3499 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3500 break;
3501 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3502 break;
3503 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3504 break;
3505 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3506 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3507 break;
3508 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3509 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3510 break;
3511 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3512 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3513 break;
3514 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3515 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3516 break;
3517 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3518 break;
3519 default: log_error ("ERROR: syntax error: %s", mask_buf);
3520 exit (-1);
3521 }
3522 }
3523 else
3524 {
3525 if (data.hex_charset)
3526 {
3527 mask_pos++;
3528
3529 // if there is no 2nd hex character, show an error:
3530
3531 if (mask_pos == mask_len)
3532 {
3533 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3534
3535 exit (-1);
3536 }
3537
3538 char p1 = mask_buf[mask_pos];
3539
3540 // if they are not valid hex character, show an error:
3541
3542 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3543 {
3544 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3545
3546 exit (-1);
3547 }
3548
3549 uint chr = 0;
3550
3551 chr |= hex_convert (p1) << 0;
3552 chr |= hex_convert (p0) << 4;
3553
3554 mp_add_cs_buf (&chr, 1, css, css_pos);
3555 }
3556 else
3557 {
3558 uint chr = p0;
3559
3560 mp_add_cs_buf (&chr, 1, css, css_pos);
3561 }
3562 }
3563 }
3564
3565 if (css_pos == 0)
3566 {
3567 log_error ("ERROR: invalid mask length (0)");
3568
3569 exit (-1);
3570 }
3571
3572 *css_cnt = css_pos;
3573
3574 return (css);
3575 }
3576
3577 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3578 {
3579 for (int i = 0; i < css_cnt; i++)
3580 {
3581 uint len = css[i].cs_len;
3582 u64 next = val / len;
3583 uint pos = val % len;
3584 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3585 val = next;
3586 }
3587 }
3588
3589 void mp_cut_at (char *mask, uint max)
3590 {
3591 uint i;
3592 uint j;
3593 uint mask_len = strlen (mask);
3594
3595 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3596 {
3597 if (mask[i] == '?') i++;
3598 }
3599
3600 mask[i] = 0;
3601 }
3602
3603 void mp_setup_sys (cs_t *mp_sys)
3604 {
3605 uint pos;
3606 uint chr;
3607 uint donec[CHARSIZ] = { 0 };
3608
3609 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3610 mp_sys[0].cs_buf[pos++] = chr;
3611 mp_sys[0].cs_len = pos; }
3612
3613 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3614 mp_sys[1].cs_buf[pos++] = chr;
3615 mp_sys[1].cs_len = pos; }
3616
3617 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3618 mp_sys[2].cs_buf[pos++] = chr;
3619 mp_sys[2].cs_len = pos; }
3620
3621 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3622 mp_sys[3].cs_buf[pos++] = chr;
3623 mp_sys[3].cs_len = pos; }
3624
3625 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3626 mp_sys[4].cs_len = pos; }
3627
3628 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3629 mp_sys[5].cs_len = pos; }
3630 }
3631
3632 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3633 {
3634 FILE *fp = fopen (buf, "rb");
3635
3636 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3637 {
3638 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3639 }
3640 else
3641 {
3642 char mp_file[1024] = { 0 };
3643
3644 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3645
3646 fclose (fp);
3647
3648 len = in_superchop (mp_file);
3649
3650 if (len == 0)
3651 {
3652 log_info ("WARNING: charset file corrupted");
3653
3654 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3655 }
3656 else
3657 {
3658 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3659 }
3660 }
3661 }
3662
3663 void mp_reset_usr (cs_t *mp_usr, uint index)
3664 {
3665 mp_usr[index].cs_len = 0;
3666
3667 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3668 }
3669
3670 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3671 {
3672 char *new_mask_buf = (char *) mymalloc (256);
3673
3674 uint mask_pos;
3675
3676 uint css_pos;
3677
3678 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3679 {
3680 if (css_pos == len) break;
3681
3682 char p0 = mask_buf[mask_pos];
3683
3684 new_mask_buf[mask_pos] = p0;
3685
3686 if (p0 == '?')
3687 {
3688 mask_pos++;
3689
3690 if (mask_pos == mask_len) break;
3691
3692 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3693 }
3694 else
3695 {
3696 if (data.hex_charset)
3697 {
3698 mask_pos++;
3699
3700 if (mask_pos == mask_len)
3701 {
3702 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3703
3704 exit (-1);
3705 }
3706
3707 char p1 = mask_buf[mask_pos];
3708
3709 // if they are not valid hex character, show an error:
3710
3711 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3712 {
3713 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3714
3715 exit (-1);
3716 }
3717
3718 new_mask_buf[mask_pos] = p1;
3719 }
3720 }
3721 }
3722
3723 if (css_pos == len) return (new_mask_buf);
3724
3725 myfree (new_mask_buf);
3726
3727 return (NULL);
3728 }
3729
3730 /**
3731 * statprocessor
3732 */
3733
3734 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3735 {
3736 u64 sum = 1;
3737
3738 uint i;
3739
3740 for (i = start; i < stop; i++)
3741 {
3742 sum *= root_css_buf[i].cs_len;
3743 }
3744
3745 return (sum);
3746 }
3747
3748 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3749 {
3750 u64 v = ctx;
3751
3752 cs_t *cs = &root_css_buf[start];
3753
3754 uint i;
3755
3756 for (i = start; i < stop; i++)
3757 {
3758 const u64 m = v % cs->cs_len;
3759 const u64 d = v / cs->cs_len;
3760
3761 v = d;
3762
3763 const uint k = cs->cs_buf[m];
3764
3765 pw_buf[i - start] = (char) k;
3766
3767 cs = &markov_css_buf[(i * CHARSIZ) + k];
3768 }
3769 }
3770
3771 int sp_comp_val (const void *p1, const void *p2)
3772 {
3773 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3774 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3775
3776 return b2->val - b1->val;
3777 }
3778
3779 void sp_setup_tbl (const char *shared_dir, char *hcstat, uint disable, uint classic, hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf)
3780 {
3781 uint i;
3782 uint j;
3783 uint k;
3784
3785 /**
3786 * Initialize hcstats
3787 */
3788
3789 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3790
3791 u64 *root_stats_ptr = root_stats_buf;
3792
3793 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3794
3795 for (i = 0; i < SP_PW_MAX; i++)
3796 {
3797 root_stats_buf_by_pos[i] = root_stats_ptr;
3798
3799 root_stats_ptr += CHARSIZ;
3800 }
3801
3802 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3803
3804 u64 *markov_stats_ptr = markov_stats_buf;
3805
3806 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3807
3808 for (i = 0; i < SP_PW_MAX; i++)
3809 {
3810 for (j = 0; j < CHARSIZ; j++)
3811 {
3812 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3813
3814 markov_stats_ptr += CHARSIZ;
3815 }
3816 }
3817
3818 /**
3819 * Load hcstats File
3820 */
3821
3822 if (hcstat == NULL)
3823 {
3824 char hcstat_tmp[256] = { 0 };
3825
3826 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3827
3828 hcstat = hcstat_tmp;
3829 }
3830
3831 FILE *fd = fopen (hcstat, "rb");
3832
3833 if (fd == NULL)
3834 {
3835 log_error ("%s: %s", hcstat, strerror (errno));
3836
3837 exit (-1);
3838 }
3839
3840 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3841 {
3842 log_error ("%s: Could not load data", hcstat);
3843
3844 fclose (fd);
3845
3846 exit (-1);
3847 }
3848
3849 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3850 {
3851 log_error ("%s: Could not load data", hcstat);
3852
3853 fclose (fd);
3854
3855 exit (-1);
3856 }
3857
3858 fclose (fd);
3859
3860 /**
3861 * Markov modifier of hcstat_table on user request
3862 */
3863
3864 if (disable)
3865 {
3866 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3867 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3868 }
3869
3870 if (classic)
3871 {
3872 /* Add all stats to first position */
3873
3874 for (i = 1; i < SP_PW_MAX; i++)
3875 {
3876 u64 *out = root_stats_buf_by_pos[0];
3877 u64 *in = root_stats_buf_by_pos[i];
3878
3879 for (j = 0; j < CHARSIZ; j++)
3880 {
3881 *out++ += *in++;
3882 }
3883 }
3884
3885 for (i = 1; i < SP_PW_MAX; i++)
3886 {
3887 u64 *out = markov_stats_buf_by_key[0][0];
3888 u64 *in = markov_stats_buf_by_key[i][0];
3889
3890 for (j = 0; j < CHARSIZ; j++)
3891 {
3892 for (k = 0; k < CHARSIZ; k++)
3893 {
3894 *out++ += *in++;
3895 }
3896 }
3897 }
3898
3899 /* copy them to all pw_positions */
3900
3901 for (i = 1; i < SP_PW_MAX; i++)
3902 {
3903 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
3904 }
3905
3906 for (i = 1; i < SP_PW_MAX; i++)
3907 {
3908 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
3909 }
3910 }
3911
3912 /**
3913 * Initialize tables
3914 */
3915
3916 hcstat_table_t *root_table_ptr = root_table_buf;
3917
3918 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3919
3920 for (i = 0; i < SP_PW_MAX; i++)
3921 {
3922 root_table_buf_by_pos[i] = root_table_ptr;
3923
3924 root_table_ptr += CHARSIZ;
3925 }
3926
3927 hcstat_table_t *markov_table_ptr = markov_table_buf;
3928
3929 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3930
3931 for (i = 0; i < SP_PW_MAX; i++)
3932 {
3933 for (j = 0; j < CHARSIZ; j++)
3934 {
3935 markov_table_buf_by_key[i][j] = markov_table_ptr;
3936
3937 markov_table_ptr += CHARSIZ;
3938 }
3939 }
3940
3941 /**
3942 * Convert hcstat to tables
3943 */
3944
3945 for (i = 0; i < SP_ROOT_CNT; i++)
3946 {
3947 uint key = i % CHARSIZ;
3948
3949 root_table_buf[i].key = key;
3950 root_table_buf[i].val = root_stats_buf[i];
3951 }
3952
3953 for (i = 0; i < SP_MARKOV_CNT; i++)
3954 {
3955 uint key = i % CHARSIZ;
3956
3957 markov_table_buf[i].key = key;
3958 markov_table_buf[i].val = markov_stats_buf[i];
3959 }
3960
3961 myfree (root_stats_buf);
3962 myfree (markov_stats_buf);
3963
3964 /**
3965 * Finally sort them
3966 */
3967
3968 for (i = 0; i < SP_PW_MAX; i++)
3969 {
3970 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3971 }
3972
3973 for (i = 0; i < SP_PW_MAX; i++)
3974 {
3975 for (j = 0; j < CHARSIZ; j++)
3976 {
3977 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3978 }
3979 }
3980 }
3981
3982 void sp_tbl_to_css (hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint threshold, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3983 {
3984 /**
3985 * Convert tables to css
3986 */
3987
3988 for (uint i = 0; i < SP_ROOT_CNT; i++)
3989 {
3990 uint pw_pos = i / CHARSIZ;
3991
3992 cs_t *cs = &root_css_buf[pw_pos];
3993
3994 if (cs->cs_len == threshold) continue;
3995
3996 uint key = root_table_buf[i].key;
3997
3998 if (uniq_tbls[pw_pos][key] == 0) continue;
3999
4000 cs->cs_buf[cs->cs_len] = key;
4001
4002 cs->cs_len++;
4003 }
4004
4005 /**
4006 * Convert table to css
4007 */
4008
4009 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4010 {
4011 uint c = i / CHARSIZ;
4012
4013 cs_t *cs = &markov_css_buf[c];
4014
4015 if (cs->cs_len == threshold) continue;
4016
4017 uint pw_pos = c / CHARSIZ;
4018
4019 uint key = markov_table_buf[i].key;
4020
4021 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4022
4023 cs->cs_buf[cs->cs_len] = key;
4024
4025 cs->cs_len++;
4026 }
4027
4028 /*
4029 for (uint i = 0; i < 8; i++)
4030 {
4031 for (uint j = 0x20; j < 0x80; j++)
4032 {
4033 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4034
4035 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4036
4037 for (uint k = 0; k < 10; k++)
4038 {
4039 printf (" %u\n", ptr->cs_buf[k]);
4040 }
4041 }
4042 }
4043 */
4044 }
4045
4046 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4047 {
4048 for (uint i = 0; i < SP_PW_MAX; i += 2)
4049 {
4050 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4051
4052 out += CHARSIZ;
4053 in += CHARSIZ;
4054
4055 out->key = 0;
4056 out->val = 1;
4057
4058 out++;
4059
4060 for (uint j = 1; j < CHARSIZ; j++)
4061 {
4062 out->key = j;
4063 out->val = 0;
4064
4065 out++;
4066 }
4067 }
4068 }
4069
4070 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4071 {
4072 for (uint i = 0; i < SP_PW_MAX; i += 2)
4073 {
4074 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4075
4076 out += CHARSIZ * CHARSIZ;
4077 in += CHARSIZ * CHARSIZ;
4078
4079 for (uint j = 0; j < CHARSIZ; j++)
4080 {
4081 out->key = 0;
4082 out->val = 1;
4083
4084 out++;
4085
4086 for (uint k = 1; k < CHARSIZ; k++)
4087 {
4088 out->key = k;
4089 out->val = 0;
4090
4091 out++;
4092 }
4093 }
4094 }
4095 }
4096
4097 /**
4098 * mixed shared functions
4099 */
4100
4101 void dump_hex (const u8 *s, const int sz)
4102 {
4103 for (int i = 0; i < sz; i++)
4104 {
4105 log_info_nn ("%02x ", s[i]);
4106 }
4107
4108 log_info ("");
4109 }
4110
4111 void usage_mini_print (const char *progname)
4112 {
4113 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4114 }
4115
4116 void usage_big_print (const char *progname)
4117 {
4118 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4119 }
4120
4121 char *get_exec_path ()
4122 {
4123 int exec_path_len = 1024;
4124
4125 char *exec_path = (char *) mymalloc (exec_path_len);
4126
4127 #ifdef LINUX
4128
4129 char tmp[32] = { 0 };
4130
4131 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4132
4133 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4134
4135 #elif WIN
4136
4137 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4138
4139 #elif OSX
4140
4141 uint size = exec_path_len;
4142
4143 if (_NSGetExecutablePath (exec_path, &size) != 0)
4144 {
4145 log_error("! executable path buffer too small\n");
4146
4147 exit (-1);
4148 }
4149
4150 const int len = strlen (exec_path);
4151
4152 #else
4153 #error Your Operating System is not supported or detected
4154 #endif
4155
4156 exec_path[len] = 0;
4157
4158 return exec_path;
4159 }
4160
4161 char *get_install_dir (const char *progname)
4162 {
4163 char *install_dir = mystrdup (progname);
4164 char *last_slash = NULL;
4165
4166 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4167 {
4168 *last_slash = 0;
4169 }
4170 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4171 {
4172 *last_slash = 0;
4173 }
4174 else
4175 {
4176 install_dir[0] = '.';
4177 install_dir[1] = 0;
4178 }
4179
4180 return (install_dir);
4181 }
4182
4183 char *get_profile_dir (const char *homedir)
4184 {
4185 #define DOT_HASHCAT ".hashcat"
4186
4187 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4188
4189 char *profile_dir = (char *) mymalloc (len + 1);
4190
4191 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4192
4193 return profile_dir;
4194 }
4195
4196 char *get_session_dir (const char *profile_dir)
4197 {
4198 #define SESSIONS_FOLDER "sessions"
4199
4200 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4201
4202 char *session_dir = (char *) mymalloc (len + 1);
4203
4204 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4205
4206 return session_dir;
4207 }
4208
4209 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4210 {
4211 uint crc = ~0;
4212
4213 FILE *fd = fopen (filename, "rb");
4214
4215 if (fd == NULL)
4216 {
4217 log_error ("%s: %s", filename, strerror (errno));
4218
4219 exit (-1);
4220 }
4221
4222 #define MAX_KEY_SIZE (1024 * 1024)
4223
4224 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4225
4226 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4227
4228 fclose (fd);
4229
4230 int kpos = 0;
4231
4232 for (int fpos = 0; fpos < nread; fpos++)
4233 {
4234 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4235
4236 keytab[kpos++] += (crc >> 24) & 0xff;
4237 keytab[kpos++] += (crc >> 16) & 0xff;
4238 keytab[kpos++] += (crc >> 8) & 0xff;
4239 keytab[kpos++] += (crc >> 0) & 0xff;
4240
4241 if (kpos >= 64) kpos = 0;
4242 }
4243
4244 myfree (buf);
4245 }
4246
4247 void set_cpu_affinity (char *cpu_affinity)
4248 {
4249 #ifdef WIN
4250 DWORD_PTR aff_mask = 0;
4251 #elif LINUX
4252 cpu_set_t cpuset;
4253 CPU_ZERO (&cpuset);
4254 #endif
4255
4256 if (cpu_affinity)
4257 {
4258 char *devices = strdup (cpu_affinity);
4259
4260 char *next = strtok (devices, ",");
4261
4262 do
4263 {
4264 uint cpu_id = atoi (next);
4265
4266 if (cpu_id == 0)
4267 {
4268 #ifdef WIN
4269 aff_mask = 0;
4270 #elif LINUX
4271 CPU_ZERO (&cpuset);
4272 #endif
4273
4274 break;
4275 }
4276
4277 if (cpu_id > 32)
4278 {
4279 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4280
4281 exit (-1);
4282 }
4283
4284 #ifdef WIN
4285 aff_mask |= 1 << (cpu_id - 1);
4286 #elif LINUX
4287 CPU_SET ((cpu_id - 1), &cpuset);
4288 #endif
4289
4290 } while ((next = strtok (NULL, ",")) != NULL);
4291
4292 free (devices);
4293 }
4294
4295 #ifdef WIN
4296 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4297 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4298 #elif LINUX
4299 pthread_t thread = pthread_self ();
4300 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4301 #endif
4302 }
4303
4304 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4305 {
4306 char *element, *end;
4307
4308 end = (char *) base + nmemb * size;
4309
4310 for (element = (char *) base; element < end; element += size)
4311 if (!compar (element, key))
4312 return element;
4313
4314 return NULL;
4315 }
4316
4317 int sort_by_salt (const void *v1, const void *v2)
4318 {
4319 const salt_t *s1 = (const salt_t *) v1;
4320 const salt_t *s2 = (const salt_t *) v2;
4321
4322 const int res1 = s1->salt_len - s2->salt_len;
4323
4324 if (res1 != 0) return (res1);
4325
4326 const int res2 = s1->salt_iter - s2->salt_iter;
4327
4328 if (res2 != 0) return (res2);
4329
4330 uint n;
4331
4332 n = 12;
4333
4334 while (n--)
4335 {
4336 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4337 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4338 }
4339
4340 n = 8;
4341
4342 while (n--)
4343 {
4344 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4345 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4346 }
4347
4348 return (0);
4349 }
4350
4351 int sort_by_salt_buf (const void *v1, const void *v2)
4352 {
4353 const pot_t *p1 = (const pot_t *) v1;
4354 const pot_t *p2 = (const pot_t *) v2;
4355
4356 const hash_t *h1 = &p1->hash;
4357 const hash_t *h2 = &p2->hash;
4358
4359 const salt_t *s1 = h1->salt;
4360 const salt_t *s2 = h2->salt;
4361
4362 uint n = 12;
4363
4364 while (n--)
4365 {
4366 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4367 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4368 }
4369
4370 return 0;
4371 }
4372
4373 int sort_by_hash_t_salt (const void *v1, const void *v2)
4374 {
4375 const hash_t *h1 = (const hash_t *) v1;
4376 const hash_t *h2 = (const hash_t *) v2;
4377
4378 const salt_t *s1 = h1->salt;
4379 const salt_t *s2 = h2->salt;
4380
4381 // testphase: this should work
4382 uint n = 12;
4383
4384 while (n--)
4385 {
4386 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4387 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4388 }
4389
4390 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4391 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4392 if (s1->salt_len > s2->salt_len) return ( 1);
4393 if (s1->salt_len < s2->salt_len) return (-1);
4394
4395 uint n = s1->salt_len;
4396
4397 while (n--)
4398 {
4399 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4400 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4401 }
4402 */
4403
4404 return 0;
4405 }
4406
4407 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4408 {
4409 const hash_t *h1 = (const hash_t *) v1;
4410 const hash_t *h2 = (const hash_t *) v2;
4411
4412 const salt_t *s1 = h1->salt;
4413 const salt_t *s2 = h2->salt;
4414
4415 // 12 - 2 (since last 2 uints contain the digest)
4416 uint n = 10;
4417
4418 while (n--)
4419 {
4420 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4421 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4422 }
4423
4424 return 0;
4425 }
4426
4427 int sort_by_hash_no_salt (const void *v1, const void *v2)
4428 {
4429 const hash_t *h1 = (const hash_t *) v1;
4430 const hash_t *h2 = (const hash_t *) v2;
4431
4432 const void *d1 = h1->digest;
4433 const void *d2 = h2->digest;
4434
4435 return data.sort_by_digest (d1, d2);
4436 }
4437
4438 int sort_by_hash (const void *v1, const void *v2)
4439 {
4440 const hash_t *h1 = (const hash_t *) v1;
4441 const hash_t *h2 = (const hash_t *) v2;
4442
4443 if (data.isSalted)
4444 {
4445 const salt_t *s1 = h1->salt;
4446 const salt_t *s2 = h2->salt;
4447
4448 int res = sort_by_salt (s1, s2);
4449
4450 if (res != 0) return (res);
4451 }
4452
4453 const void *d1 = h1->digest;
4454 const void *d2 = h2->digest;
4455
4456 return data.sort_by_digest (d1, d2);
4457 }
4458
4459 int sort_by_pot (const void *v1, const void *v2)
4460 {
4461 const pot_t *p1 = (const pot_t *) v1;
4462 const pot_t *p2 = (const pot_t *) v2;
4463
4464 const hash_t *h1 = &p1->hash;
4465 const hash_t *h2 = &p2->hash;
4466
4467 return sort_by_hash (h1, h2);
4468 }
4469
4470 int sort_by_mtime (const void *p1, const void *p2)
4471 {
4472 const char **f1 = (const char **) p1;
4473 const char **f2 = (const char **) p2;
4474
4475 struct stat s1; stat (*f1, &s1);
4476 struct stat s2; stat (*f2, &s2);
4477
4478 return s2.st_mtime - s1.st_mtime;
4479 }
4480
4481 int sort_by_cpu_rule (const void *p1, const void *p2)
4482 {
4483 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4484 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4485
4486 return memcmp (r1, r2, sizeof (cpu_rule_t));
4487 }
4488
4489 int sort_by_kernel_rule (const void *p1, const void *p2)
4490 {
4491 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4492 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4493
4494 return memcmp (r1, r2, sizeof (kernel_rule_t));
4495 }
4496
4497 int sort_by_stringptr (const void *p1, const void *p2)
4498 {
4499 const char **s1 = (const char **) p1;
4500 const char **s2 = (const char **) p2;
4501
4502 return strcmp (*s1, *s2);
4503 }
4504
4505 int sort_by_dictstat (const void *s1, const void *s2)
4506 {
4507 dictstat_t *d1 = (dictstat_t *) s1;
4508 dictstat_t *d2 = (dictstat_t *) s2;
4509
4510 #ifdef LINUX
4511 d2->stat.st_atim = d1->stat.st_atim;
4512 #else
4513 d2->stat.st_atime = d1->stat.st_atime;
4514 #endif
4515
4516 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4517 }
4518
4519 int sort_by_bitmap (const void *p1, const void *p2)
4520 {
4521 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4522 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4523
4524 return b1->collisions - b2->collisions;
4525 }
4526
4527 int sort_by_digest_4_2 (const void *v1, const void *v2)
4528 {
4529 const u32 *d1 = (const u32 *) v1;
4530 const u32 *d2 = (const u32 *) v2;
4531
4532 uint n = 2;
4533
4534 while (n--)
4535 {
4536 if (d1[n] > d2[n]) return ( 1);
4537 if (d1[n] < d2[n]) return (-1);
4538 }
4539
4540 return (0);
4541 }
4542
4543 int sort_by_digest_4_4 (const void *v1, const void *v2)
4544 {
4545 const u32 *d1 = (const u32 *) v1;
4546 const u32 *d2 = (const u32 *) v2;
4547
4548 uint n = 4;
4549
4550 while (n--)
4551 {
4552 if (d1[n] > d2[n]) return ( 1);
4553 if (d1[n] < d2[n]) return (-1);
4554 }
4555
4556 return (0);
4557 }
4558
4559 int sort_by_digest_4_5 (const void *v1, const void *v2)
4560 {
4561 const u32 *d1 = (const u32 *) v1;
4562 const u32 *d2 = (const u32 *) v2;
4563
4564 uint n = 5;
4565
4566 while (n--)
4567 {
4568 if (d1[n] > d2[n]) return ( 1);
4569 if (d1[n] < d2[n]) return (-1);
4570 }
4571
4572 return (0);
4573 }
4574
4575 int sort_by_digest_4_6 (const void *v1, const void *v2)
4576 {
4577 const u32 *d1 = (const u32 *) v1;
4578 const u32 *d2 = (const u32 *) v2;
4579
4580 uint n = 6;
4581
4582 while (n--)
4583 {
4584 if (d1[n] > d2[n]) return ( 1);
4585 if (d1[n] < d2[n]) return (-1);
4586 }
4587
4588 return (0);
4589 }
4590
4591 int sort_by_digest_4_8 (const void *v1, const void *v2)
4592 {
4593 const u32 *d1 = (const u32 *) v1;
4594 const u32 *d2 = (const u32 *) v2;
4595
4596 uint n = 8;
4597
4598 while (n--)
4599 {
4600 if (d1[n] > d2[n]) return ( 1);
4601 if (d1[n] < d2[n]) return (-1);
4602 }
4603
4604 return (0);
4605 }
4606
4607 int sort_by_digest_4_16 (const void *v1, const void *v2)
4608 {
4609 const u32 *d1 = (const u32 *) v1;
4610 const u32 *d2 = (const u32 *) v2;
4611
4612 uint n = 16;
4613
4614 while (n--)
4615 {
4616 if (d1[n] > d2[n]) return ( 1);
4617 if (d1[n] < d2[n]) return (-1);
4618 }
4619
4620 return (0);
4621 }
4622
4623 int sort_by_digest_4_32 (const void *v1, const void *v2)
4624 {
4625 const u32 *d1 = (const u32 *) v1;
4626 const u32 *d2 = (const u32 *) v2;
4627
4628 uint n = 32;
4629
4630 while (n--)
4631 {
4632 if (d1[n] > d2[n]) return ( 1);
4633 if (d1[n] < d2[n]) return (-1);
4634 }
4635
4636 return (0);
4637 }
4638
4639 int sort_by_digest_4_64 (const void *v1, const void *v2)
4640 {
4641 const u32 *d1 = (const u32 *) v1;
4642 const u32 *d2 = (const u32 *) v2;
4643
4644 uint n = 64;
4645
4646 while (n--)
4647 {
4648 if (d1[n] > d2[n]) return ( 1);
4649 if (d1[n] < d2[n]) return (-1);
4650 }
4651
4652 return (0);
4653 }
4654
4655 int sort_by_digest_8_8 (const void *v1, const void *v2)
4656 {
4657 const u64 *d1 = (const u64 *) v1;
4658 const u64 *d2 = (const u64 *) v2;
4659
4660 uint n = 8;
4661
4662 while (n--)
4663 {
4664 if (d1[n] > d2[n]) return ( 1);
4665 if (d1[n] < d2[n]) return (-1);
4666 }
4667
4668 return (0);
4669 }
4670
4671 int sort_by_digest_8_16 (const void *v1, const void *v2)
4672 {
4673 const u64 *d1 = (const u64 *) v1;
4674 const u64 *d2 = (const u64 *) v2;
4675
4676 uint n = 16;
4677
4678 while (n--)
4679 {
4680 if (d1[n] > d2[n]) return ( 1);
4681 if (d1[n] < d2[n]) return (-1);
4682 }
4683
4684 return (0);
4685 }
4686
4687 int sort_by_digest_8_25 (const void *v1, const void *v2)
4688 {
4689 const u64 *d1 = (const u64 *) v1;
4690 const u64 *d2 = (const u64 *) v2;
4691
4692 uint n = 25;
4693
4694 while (n--)
4695 {
4696 if (d1[n] > d2[n]) return ( 1);
4697 if (d1[n] < d2[n]) return (-1);
4698 }
4699
4700 return (0);
4701 }
4702
4703 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4704 {
4705 const u32 *d1 = (const u32 *) v1;
4706 const u32 *d2 = (const u32 *) v2;
4707
4708 const uint dgst_pos0 = data.dgst_pos0;
4709 const uint dgst_pos1 = data.dgst_pos1;
4710 const uint dgst_pos2 = data.dgst_pos2;
4711 const uint dgst_pos3 = data.dgst_pos3;
4712
4713 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4714 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4715 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4716 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4717 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4718 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4719 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4720 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4721
4722 return (0);
4723 }
4724
4725 void format_debug (char *debug_file, uint debug_mode, unsigned char *orig_plain_ptr, uint orig_plain_len, unsigned char *mod_plain_ptr, uint mod_plain_len, char *rule_buf, int rule_len)
4726 {
4727 uint outfile_autohex = data.outfile_autohex;
4728
4729 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4730
4731 FILE *debug_fp = NULL;
4732
4733 if (debug_file != NULL)
4734 {
4735 debug_fp = fopen (debug_file, "ab");
4736 }
4737 else
4738 {
4739 debug_fp = stderr;
4740 }
4741
4742 if (debug_fp == NULL)
4743 {
4744 log_info ("WARNING: Could not open debug-file for writing");
4745 }
4746 else
4747 {
4748 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4749 {
4750 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4751
4752 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4753 }
4754
4755 fwrite (rule_ptr, rule_len, 1, debug_fp);
4756
4757 if (debug_mode == 4)
4758 {
4759 fputc (':', debug_fp);
4760
4761 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4762 }
4763
4764 fputc ('\n', debug_fp);
4765
4766 if (debug_file != NULL) fclose (debug_fp);
4767 }
4768 }
4769
4770 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4771 {
4772 int needs_hexify = 0;
4773
4774 if (outfile_autohex == 1)
4775 {
4776 for (uint i = 0; i < plain_len; i++)
4777 {
4778 if (plain_ptr[i] < 0x20)
4779 {
4780 needs_hexify = 1;
4781
4782 break;
4783 }
4784
4785 if (plain_ptr[i] > 0x7f)
4786 {
4787 needs_hexify = 1;
4788
4789 break;
4790 }
4791 }
4792 }
4793
4794 if (needs_hexify == 1)
4795 {
4796 fprintf (fp, "$HEX[");
4797
4798 for (uint i = 0; i < plain_len; i++)
4799 {
4800 fprintf (fp, "%02x", plain_ptr[i]);
4801 }
4802
4803 fprintf (fp, "]");
4804 }
4805 else
4806 {
4807 fwrite (plain_ptr, plain_len, 1, fp);
4808 }
4809 }
4810
4811 void format_output (FILE *out_fp, char *out_buf, unsigned char *plain_ptr, const uint plain_len, const u64 crackpos, unsigned char *username, const uint user_len)
4812 {
4813 uint outfile_format = data.outfile_format;
4814
4815 char separator = data.separator;
4816
4817 if (outfile_format & OUTFILE_FMT_HASH)
4818 {
4819 fprintf (out_fp, "%s", out_buf);
4820
4821 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4822 {
4823 fputc (separator, out_fp);
4824 }
4825 }
4826 else if (data.username)
4827 {
4828 if (username != NULL)
4829 {
4830 for (uint i = 0; i < user_len; i++)
4831 {
4832 fprintf (out_fp, "%c", username[i]);
4833 }
4834
4835 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4836 {
4837 fputc (separator, out_fp);
4838 }
4839 }
4840 }
4841
4842 if (outfile_format & OUTFILE_FMT_PLAIN)
4843 {
4844 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4845
4846 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4847 {
4848 fputc (separator, out_fp);
4849 }
4850 }
4851
4852 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4853 {
4854 for (uint i = 0; i < plain_len; i++)
4855 {
4856 fprintf (out_fp, "%02x", plain_ptr[i]);
4857 }
4858
4859 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4860 {
4861 fputc (separator, out_fp);
4862 }
4863 }
4864
4865 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4866 {
4867 #ifdef _WIN
4868 __mingw_fprintf (out_fp, "%llu", crackpos);
4869 #endif
4870
4871 #ifdef _POSIX
4872 #ifdef __x86_64__
4873 fprintf (out_fp, "%lu", (unsigned long) crackpos);
4874 #else
4875 fprintf (out_fp, "%llu", crackpos);
4876 #endif
4877 #endif
4878 }
4879
4880 fputc ('\n', out_fp);
4881 }
4882
4883 void handle_show_request (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hashes_buf, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
4884 {
4885 pot_t pot_key;
4886
4887 pot_key.hash.salt = hashes_buf->salt;
4888 pot_key.hash.digest = hashes_buf->digest;
4889
4890 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4891
4892 if (pot_ptr)
4893 {
4894 log_info_nn ("");
4895
4896 input_buf[input_len] = 0;
4897
4898 // user
4899 unsigned char *username = NULL;
4900 uint user_len = 0;
4901
4902 if (data.username)
4903 {
4904 user_t *user = hashes_buf->hash_info->user;
4905
4906 if (user)
4907 {
4908 username = (unsigned char *) (user->user_name);
4909
4910 user_len = user->user_len;
4911 }
4912 }
4913
4914 // do output the line
4915 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4916 }
4917 }
4918
4919 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4920 #define LM_MASKED_PLAIN "[notfound]"
4921
4922 void handle_show_request_lm (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hash_left, hash_t *hash_right, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
4923 {
4924 // left
4925
4926 pot_t pot_left_key;
4927
4928 pot_left_key.hash.salt = hash_left->salt;
4929 pot_left_key.hash.digest = hash_left->digest;
4930
4931 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4932
4933 // right
4934
4935 uint weak_hash_found = 0;
4936
4937 pot_t pot_right_key;
4938
4939 pot_right_key.hash.salt = hash_right->salt;
4940 pot_right_key.hash.digest = hash_right->digest;
4941
4942 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4943
4944 if (pot_right_ptr == NULL)
4945 {
4946 // special case, if "weak hash"
4947
4948 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4949 {
4950 weak_hash_found = 1;
4951
4952 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4953
4954 // in theory this is not needed, but we are paranoia:
4955
4956 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4957 pot_right_ptr->plain_len = 0;
4958 }
4959 }
4960
4961 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4962 {
4963 if (weak_hash_found == 1) myfree (pot_right_ptr); // this shouldn't happen at all: if weak_hash_found == 1, than pot_right_ptr is not NULL for sure
4964
4965 return;
4966 }
4967
4968 // at least one half was found:
4969
4970 log_info_nn ("");
4971
4972 input_buf[input_len] = 0;
4973
4974 // user
4975
4976 unsigned char *username = NULL;
4977 uint user_len = 0;
4978
4979 if (data.username)
4980 {
4981 user_t *user = hash_left->hash_info->user;
4982
4983 if (user)
4984 {
4985 username = (unsigned char *) (user->user_name);
4986
4987 user_len = user->user_len;
4988 }
4989 }
4990
4991 // mask the part which was not found
4992
4993 uint left_part_masked = 0;
4994 uint right_part_masked = 0;
4995
4996 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
4997
4998 if (pot_left_ptr == NULL)
4999 {
5000 left_part_masked = 1;
5001
5002 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5003
5004 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5005
5006 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5007 pot_left_ptr->plain_len = mask_plain_len;
5008 }
5009
5010 if (pot_right_ptr == NULL)
5011 {
5012 right_part_masked = 1;
5013
5014 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5015
5016 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5017
5018 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5019 pot_right_ptr->plain_len = mask_plain_len;
5020 }
5021
5022 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5023
5024 pot_t pot_ptr;
5025
5026 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5027
5028 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5029
5030 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5031
5032 // do output the line
5033
5034 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5035
5036 if (weak_hash_found == 1) myfree (pot_right_ptr);
5037
5038 if (left_part_masked == 1) myfree (pot_left_ptr);
5039 if (right_part_masked == 1) myfree (pot_right_ptr);
5040 }
5041
5042 void handle_left_request (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hashes_buf, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
5043 {
5044 pot_t pot_key;
5045
5046 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5047
5048 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5049
5050 if (pot_ptr == NULL)
5051 {
5052 log_info_nn ("");
5053
5054 input_buf[input_len] = 0;
5055
5056 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5057 }
5058 }
5059
5060 void handle_left_request_lm (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hash_left, hash_t *hash_right, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
5061 {
5062 // left
5063
5064 pot_t pot_left_key;
5065
5066 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5067
5068 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5069
5070 // right
5071
5072 pot_t pot_right_key;
5073
5074 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5075
5076 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5077
5078 uint weak_hash_found = 0;
5079
5080 if (pot_right_ptr == NULL)
5081 {
5082 // special case, if "weak hash"
5083
5084 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5085 {
5086 weak_hash_found = 1;
5087
5088 // we just need that pot_right_ptr is not a NULL pointer
5089
5090 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5091 }
5092 }
5093
5094 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5095 {
5096 if (weak_hash_found == 1) myfree (pot_right_ptr);
5097
5098 return;
5099 }
5100
5101 // ... at least one part was not cracked
5102
5103 log_info_nn ("");
5104
5105 input_buf[input_len] = 0;
5106
5107 // only show the hash part which is still not cracked
5108
5109 uint user_len = input_len - 32;
5110
5111 char *hash_output = (char *) mymalloc (33);
5112
5113 memcpy (hash_output, input_buf, input_len);
5114
5115 if (pot_left_ptr != NULL)
5116 {
5117 // only show right part (because left part was already found)
5118
5119 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5120
5121 hash_output[user_len + 16] = 0;
5122 }
5123
5124 if (pot_right_ptr != NULL)
5125 {
5126 // only show left part (because right part was already found)
5127
5128 memcpy (hash_output + user_len, input_buf + user_len, 16);
5129
5130 hash_output[user_len + 16] = 0;
5131 }
5132
5133 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5134
5135 myfree (hash_output);
5136
5137 if (weak_hash_found == 1) myfree (pot_right_ptr);
5138 }
5139
5140 uint setup_opencl_platforms_filter (char *opencl_platforms)
5141 {
5142 uint opencl_platforms_filter = 0;
5143
5144 if (opencl_platforms)
5145 {
5146 char *platforms = strdup (opencl_platforms);
5147
5148 char *next = strtok (platforms, ",");
5149
5150 do
5151 {
5152 int platform = atoi (next);
5153
5154 if (platform < 1 || platform > 32)
5155 {
5156 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5157
5158 exit (-1);
5159 }
5160
5161 opencl_platforms_filter |= 1 << (platform - 1);
5162
5163 } while ((next = strtok (NULL, ",")) != NULL);
5164
5165 free (platforms);
5166 }
5167 else
5168 {
5169 opencl_platforms_filter = -1;
5170 }
5171
5172 return opencl_platforms_filter;
5173 }
5174
5175 u32 setup_devices_filter (char *opencl_devices)
5176 {
5177 u32 devices_filter = 0;
5178
5179 if (opencl_devices)
5180 {
5181 char *devices = strdup (opencl_devices);
5182
5183 char *next = strtok (devices, ",");
5184
5185 do
5186 {
5187 int device_id = atoi (next);
5188
5189 if (device_id < 1 || device_id > 32)
5190 {
5191 log_error ("ERROR: invalid device_id %u specified", device_id);
5192
5193 exit (-1);
5194 }
5195
5196 devices_filter |= 1 << (device_id - 1);
5197
5198 } while ((next = strtok (NULL, ",")) != NULL);
5199
5200 free (devices);
5201 }
5202 else
5203 {
5204 devices_filter = -1;
5205 }
5206
5207 return devices_filter;
5208 }
5209
5210 cl_device_type setup_device_types_filter (char *opencl_device_types)
5211 {
5212 cl_device_type device_types_filter = 0;
5213
5214 if (opencl_device_types)
5215 {
5216 char *device_types = strdup (opencl_device_types);
5217
5218 char *next = strtok (device_types, ",");
5219
5220 do
5221 {
5222 int device_type = atoi (next);
5223
5224 if (device_type < 1 || device_type > 3)
5225 {
5226 log_error ("ERROR: invalid device_type %u specified", device_type);
5227
5228 exit (-1);
5229 }
5230
5231 device_types_filter |= 1 << device_type;
5232
5233 } while ((next = strtok (NULL, ",")) != NULL);
5234
5235 free (device_types);
5236 }
5237 else
5238 {
5239 // Do not use CPU by default, this often reduces GPU performance because
5240 // the CPU is too busy to handle GPU synchronization
5241
5242 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5243 }
5244
5245 return device_types_filter;
5246 }
5247
5248 u32 get_random_num (const u32 min, const u32 max)
5249 {
5250 if (min == max) return (min);
5251
5252 return ((rand () % (max - min)) + min);
5253 }
5254
5255 u32 mydivc32 (const u32 dividend, const u32 divisor)
5256 {
5257 u32 quotient = dividend / divisor;
5258
5259 if (dividend % divisor) quotient++;
5260
5261 return quotient;
5262 }
5263
5264 u64 mydivc64 (const u64 dividend, const u64 divisor)
5265 {
5266 u64 quotient = dividend / divisor;
5267
5268 if (dividend % divisor) quotient++;
5269
5270 return quotient;
5271 }
5272
5273 void format_timer_display (struct tm *tm, char *buf, size_t len)
5274 {
5275 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5276 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5277
5278 if (tm->tm_year - 70)
5279 {
5280 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5281 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5282
5283 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5284 }
5285 else if (tm->tm_yday)
5286 {
5287 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5288 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5289
5290 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5291 }
5292 else if (tm->tm_hour)
5293 {
5294 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5295 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5296
5297 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5298 }
5299 else if (tm->tm_min)
5300 {
5301 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5302 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5303
5304 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5305 }
5306 else
5307 {
5308 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5309
5310 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5311 }
5312 }
5313
5314 void format_speed_display (float val, char *buf, size_t len)
5315 {
5316 if (val <= 0)
5317 {
5318 buf[0] = '0';
5319 buf[1] = ' ';
5320 buf[2] = 0;
5321
5322 return;
5323 }
5324
5325 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5326
5327 uint level = 0;
5328
5329 while (val > 99999)
5330 {
5331 val /= 1000;
5332
5333 level++;
5334 }
5335
5336 /* generate output */
5337
5338 if (level == 0)
5339 {
5340 snprintf (buf, len - 1, "%.0f ", val);
5341 }
5342 else
5343 {
5344 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5345 }
5346 }
5347
5348 void lowercase (u8 *buf, int len)
5349 {
5350 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5351 }
5352
5353 void uppercase (u8 *buf, int len)
5354 {
5355 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5356 }
5357
5358 int fgetl (FILE *fp, char *line_buf)
5359 {
5360 int line_len = 0;
5361
5362 while (!feof (fp))
5363 {
5364 const int c = fgetc (fp);
5365
5366 if (c == EOF) break;
5367
5368 line_buf[line_len] = (char) c;
5369
5370 line_len++;
5371
5372 if (line_len == BUFSIZ) line_len--;
5373
5374 if (c == '\n') break;
5375 }
5376
5377 if (line_len == 0) return 0;
5378
5379 if (line_buf[line_len - 1] == '\n')
5380 {
5381 line_len--;
5382
5383 line_buf[line_len] = 0;
5384 }
5385
5386 if (line_len == 0) return 0;
5387
5388 if (line_buf[line_len - 1] == '\r')
5389 {
5390 line_len--;
5391
5392 line_buf[line_len] = 0;
5393 }
5394
5395 return (line_len);
5396 }
5397
5398 int in_superchop (char *buf)
5399 {
5400 int len = strlen (buf);
5401
5402 while (len)
5403 {
5404 if (buf[len - 1] == '\n')
5405 {
5406 len--;
5407
5408 continue;
5409 }
5410
5411 if (buf[len - 1] == '\r')
5412 {
5413 len--;
5414
5415 continue;
5416 }
5417
5418 break;
5419 }
5420
5421 buf[len] = 0;
5422
5423 return len;
5424 }
5425
5426 char **scan_directory (const char *path)
5427 {
5428 char *tmp_path = mystrdup (path);
5429
5430 size_t tmp_path_len = strlen (tmp_path);
5431
5432 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5433 {
5434 tmp_path[tmp_path_len - 1] = 0;
5435
5436 tmp_path_len = strlen (tmp_path);
5437 }
5438
5439 char **files = NULL;
5440
5441 int num_files = 0;
5442
5443 DIR *d = NULL;
5444
5445 if ((d = opendir (tmp_path)) != NULL)
5446 {
5447 #ifdef OSX
5448 struct dirent e;
5449
5450 for (;;) {
5451 memset (&e, 0, sizeof (e));
5452 struct dirent *de = NULL;
5453
5454 if (readdir_r (d, &e, &de) != 0)
5455 {
5456 log_error ("ERROR: readdir_r() failed");
5457
5458 break;
5459 }
5460
5461 if (de == NULL) break;
5462 #else
5463 struct dirent *de;
5464
5465 while ((de = readdir (d)) != NULL)
5466 {
5467 #endif
5468 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5469
5470 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5471
5472 char *path_file = (char *) mymalloc (path_size + 1);
5473
5474 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5475
5476 path_file[path_size] = 0;
5477
5478 DIR *d_test;
5479
5480 if ((d_test = opendir (path_file)) != NULL)
5481 {
5482 closedir (d_test);
5483
5484 myfree (path_file);
5485 }
5486 else
5487 {
5488 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5489
5490 num_files++;
5491
5492 files[num_files - 1] = path_file;
5493 }
5494 }
5495
5496 closedir (d);
5497 }
5498 else if (errno == ENOTDIR)
5499 {
5500 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5501
5502 num_files++;
5503
5504 files[num_files - 1] = mystrdup (path);
5505 }
5506
5507 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5508
5509 num_files++;
5510
5511 files[num_files - 1] = NULL;
5512
5513 myfree (tmp_path);
5514
5515 return (files);
5516 }
5517
5518 int count_dictionaries (char **dictionary_files)
5519 {
5520 if (dictionary_files == NULL) return 0;
5521
5522 int cnt = 0;
5523
5524 for (int d = 0; dictionary_files[d] != NULL; d++)
5525 {
5526 cnt++;
5527 }
5528
5529 return (cnt);
5530 }
5531
5532 char *stroptitype (const uint opti_type)
5533 {
5534 switch (opti_type)
5535 {
5536 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5537 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5538 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5539 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5540 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5541 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5542 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5543 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5544 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5545 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5546 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5547 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5548 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5549 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5550 }
5551
5552 return (NULL);
5553 }
5554
5555 char *strparser (const uint parser_status)
5556 {
5557 switch (parser_status)
5558 {
5559 case PARSER_OK: return ((char *) PA_000); break;
5560 case PARSER_COMMENT: return ((char *) PA_001); break;
5561 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5562 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5563 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5564 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5565 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5566 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5567 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5568 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5569 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5570 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5571 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5572 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5573 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5574 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5575 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5576 }
5577
5578 return ((char *) PA_255);
5579 }
5580
5581 char *strhashtype (const uint hash_mode)
5582 {
5583 switch (hash_mode)
5584 {
5585 case 0: return ((char *) HT_00000); break;
5586 case 10: return ((char *) HT_00010); break;
5587 case 11: return ((char *) HT_00011); break;
5588 case 12: return ((char *) HT_00012); break;
5589 case 20: return ((char *) HT_00020); break;
5590 case 21: return ((char *) HT_00021); break;
5591 case 22: return ((char *) HT_00022); break;
5592 case 23: return ((char *) HT_00023); break;
5593 case 30: return ((char *) HT_00030); break;
5594 case 40: return ((char *) HT_00040); break;
5595 case 50: return ((char *) HT_00050); break;
5596 case 60: return ((char *) HT_00060); break;
5597 case 100: return ((char *) HT_00100); break;
5598 case 101: return ((char *) HT_00101); break;
5599 case 110: return ((char *) HT_00110); break;
5600 case 111: return ((char *) HT_00111); break;
5601 case 112: return ((char *) HT_00112); break;
5602 case 120: return ((char *) HT_00120); break;
5603 case 121: return ((char *) HT_00121); break;
5604 case 122: return ((char *) HT_00122); break;
5605 case 124: return ((char *) HT_00124); break;
5606 case 130: return ((char *) HT_00130); break;
5607 case 131: return ((char *) HT_00131); break;
5608 case 132: return ((char *) HT_00132); break;
5609 case 133: return ((char *) HT_00133); break;
5610 case 140: return ((char *) HT_00140); break;
5611 case 141: return ((char *) HT_00141); break;
5612 case 150: return ((char *) HT_00150); break;
5613 case 160: return ((char *) HT_00160); break;
5614 case 190: return ((char *) HT_00190); break;
5615 case 200: return ((char *) HT_00200); break;
5616 case 300: return ((char *) HT_00300); break;
5617 case 400: return ((char *) HT_00400); break;
5618 case 500: return ((char *) HT_00500); break;
5619 case 501: return ((char *) HT_00501); break;
5620 case 900: return ((char *) HT_00900); break;
5621 case 910: return ((char *) HT_00910); break;
5622 case 1000: return ((char *) HT_01000); break;
5623 case 1100: return ((char *) HT_01100); break;
5624 case 1400: return ((char *) HT_01400); break;
5625 case 1410: return ((char *) HT_01410); break;
5626 case 1420: return ((char *) HT_01420); break;
5627 case 1421: return ((char *) HT_01421); break;
5628 case 1430: return ((char *) HT_01430); break;
5629 case 1440: return ((char *) HT_01440); break;
5630 case 1441: return ((char *) HT_01441); break;
5631 case 1450: return ((char *) HT_01450); break;
5632 case 1460: return ((char *) HT_01460); break;
5633 case 1500: return ((char *) HT_01500); break;
5634 case 1600: return ((char *) HT_01600); break;
5635 case 1700: return ((char *) HT_01700); break;
5636 case 1710: return ((char *) HT_01710); break;
5637 case 1711: return ((char *) HT_01711); break;
5638 case 1720: return ((char *) HT_01720); break;
5639 case 1722: return ((char *) HT_01722); break;
5640 case 1730: return ((char *) HT_01730); break;
5641 case 1731: return ((char *) HT_01731); break;
5642 case 1740: return ((char *) HT_01740); break;
5643 case 1750: return ((char *) HT_01750); break;
5644 case 1760: return ((char *) HT_01760); break;
5645 case 1800: return ((char *) HT_01800); break;
5646 case 2100: return ((char *) HT_02100); break;
5647 case 2400: return ((char *) HT_02400); break;
5648 case 2410: return ((char *) HT_02410); break;
5649 case 2500: return ((char *) HT_02500); break;
5650 case 2600: return ((char *) HT_02600); break;
5651 case 2611: return ((char *) HT_02611); break;
5652 case 2612: return ((char *) HT_02612); break;
5653 case 2711: return ((char *) HT_02711); break;
5654 case 2811: return ((char *) HT_02811); break;
5655 case 3000: return ((char *) HT_03000); break;
5656 case 3100: return ((char *) HT_03100); break;
5657 case 3200: return ((char *) HT_03200); break;
5658 case 3710: return ((char *) HT_03710); break;
5659 case 3711: return ((char *) HT_03711); break;
5660 case 3800: return ((char *) HT_03800); break;
5661 case 4300: return ((char *) HT_04300); break;
5662 case 4400: return ((char *) HT_04400); break;
5663 case 4500: return ((char *) HT_04500); break;
5664 case 4700: return ((char *) HT_04700); break;
5665 case 4800: return ((char *) HT_04800); break;
5666 case 4900: return ((char *) HT_04900); break;
5667 case 5000: return ((char *) HT_05000); break;
5668 case 5100: return ((char *) HT_05100); break;
5669 case 5200: return ((char *) HT_05200); break;
5670 case 5300: return ((char *) HT_05300); break;
5671 case 5400: return ((char *) HT_05400); break;
5672 case 5500: return ((char *) HT_05500); break;
5673 case 5600: return ((char *) HT_05600); break;
5674 case 5700: return ((char *) HT_05700); break;
5675 case 5800: return ((char *) HT_05800); break;
5676 case 6000: return ((char *) HT_06000); break;
5677 case 6100: return ((char *) HT_06100); break;
5678 case 6211: return ((char *) HT_06211); break;
5679 case 6212: return ((char *) HT_06212); break;
5680 case 6213: return ((char *) HT_06213); break;
5681 case 6221: return ((char *) HT_06221); break;
5682 case 6222: return ((char *) HT_06222); break;
5683 case 6223: return ((char *) HT_06223); break;
5684 case 6231: return ((char *) HT_06231); break;
5685 case 6232: return ((char *) HT_06232); break;
5686 case 6233: return ((char *) HT_06233); break;
5687 case 6241: return ((char *) HT_06241); break;
5688 case 6242: return ((char *) HT_06242); break;
5689 case 6243: return ((char *) HT_06243); break;
5690 case 6300: return ((char *) HT_06300); break;
5691 case 6400: return ((char *) HT_06400); break;
5692 case 6500: return ((char *) HT_06500); break;
5693 case 6600: return ((char *) HT_06600); break;
5694 case 6700: return ((char *) HT_06700); break;
5695 case 6800: return ((char *) HT_06800); break;
5696 case 6900: return ((char *) HT_06900); break;
5697 case 7100: return ((char *) HT_07100); break;
5698 case 7200: return ((char *) HT_07200); break;
5699 case 7300: return ((char *) HT_07300); break;
5700 case 7400: return ((char *) HT_07400); break;
5701 case 7500: return ((char *) HT_07500); break;
5702 case 7600: return ((char *) HT_07600); break;
5703 case 7700: return ((char *) HT_07700); break;
5704 case 7800: return ((char *) HT_07800); break;
5705 case 7900: return ((char *) HT_07900); break;
5706 case 8000: return ((char *) HT_08000); break;
5707 case 8100: return ((char *) HT_08100); break;
5708 case 8200: return ((char *) HT_08200); break;
5709 case 8300: return ((char *) HT_08300); break;
5710 case 8400: return ((char *) HT_08400); break;
5711 case 8500: return ((char *) HT_08500); break;
5712 case 8600: return ((char *) HT_08600); break;
5713 case 8700: return ((char *) HT_08700); break;
5714 case 8800: return ((char *) HT_08800); break;
5715 case 8900: return ((char *) HT_08900); break;
5716 case 9000: return ((char *) HT_09000); break;
5717 case 9100: return ((char *) HT_09100); break;
5718 case 9200: return ((char *) HT_09200); break;
5719 case 9300: return ((char *) HT_09300); break;
5720 case 9400: return ((char *) HT_09400); break;
5721 case 9500: return ((char *) HT_09500); break;
5722 case 9600: return ((char *) HT_09600); break;
5723 case 9700: return ((char *) HT_09700); break;
5724 case 9710: return ((char *) HT_09710); break;
5725 case 9720: return ((char *) HT_09720); break;
5726 case 9800: return ((char *) HT_09800); break;
5727 case 9810: return ((char *) HT_09810); break;
5728 case 9820: return ((char *) HT_09820); break;
5729 case 9900: return ((char *) HT_09900); break;
5730 case 10000: return ((char *) HT_10000); break;
5731 case 10100: return ((char *) HT_10100); break;
5732 case 10200: return ((char *) HT_10200); break;
5733 case 10300: return ((char *) HT_10300); break;
5734 case 10400: return ((char *) HT_10400); break;
5735 case 10410: return ((char *) HT_10410); break;
5736 case 10420: return ((char *) HT_10420); break;
5737 case 10500: return ((char *) HT_10500); break;
5738 case 10600: return ((char *) HT_10600); break;
5739 case 10700: return ((char *) HT_10700); break;
5740 case 10800: return ((char *) HT_10800); break;
5741 case 10900: return ((char *) HT_10900); break;
5742 case 11000: return ((char *) HT_11000); break;
5743 case 11100: return ((char *) HT_11100); break;
5744 case 11200: return ((char *) HT_11200); break;
5745 case 11300: return ((char *) HT_11300); break;
5746 case 11400: return ((char *) HT_11400); break;
5747 case 11500: return ((char *) HT_11500); break;
5748 case 11600: return ((char *) HT_11600); break;
5749 case 11700: return ((char *) HT_11700); break;
5750 case 11800: return ((char *) HT_11800); break;
5751 case 11900: return ((char *) HT_11900); break;
5752 case 12000: return ((char *) HT_12000); break;
5753 case 12100: return ((char *) HT_12100); break;
5754 case 12200: return ((char *) HT_12200); break;
5755 case 12300: return ((char *) HT_12300); break;
5756 case 12400: return ((char *) HT_12400); break;
5757 case 12500: return ((char *) HT_12500); break;
5758 case 12600: return ((char *) HT_12600); break;
5759 case 12700: return ((char *) HT_12700); break;
5760 case 12800: return ((char *) HT_12800); break;
5761 case 12900: return ((char *) HT_12900); break;
5762 case 13000: return ((char *) HT_13000); break;
5763 }
5764
5765 return ((char *) "Unknown");
5766 }
5767
5768 char *strstatus (const uint devices_status)
5769 {
5770 switch (devices_status)
5771 {
5772 case STATUS_INIT: return ((char *) ST_0000); break;
5773 case STATUS_STARTING: return ((char *) ST_0001); break;
5774 case STATUS_RUNNING: return ((char *) ST_0002); break;
5775 case STATUS_PAUSED: return ((char *) ST_0003); break;
5776 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5777 case STATUS_CRACKED: return ((char *) ST_0005); break;
5778 case STATUS_ABORTED: return ((char *) ST_0006); break;
5779 case STATUS_QUIT: return ((char *) ST_0007); break;
5780 case STATUS_BYPASS: return ((char *) ST_0008); break;
5781 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5782 }
5783
5784 return ((char *) "Unknown");
5785 }
5786
5787 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5788 {
5789 uint hash_type = data.hash_type;
5790 uint hash_mode = data.hash_mode;
5791 uint salt_type = data.salt_type;
5792 uint opts_type = data.opts_type;
5793 uint opti_type = data.opti_type;
5794 uint dgst_size = data.dgst_size;
5795
5796 char *hashfile = data.hashfile;
5797
5798 uint len = 4096;
5799
5800 uint digest_buf[64] = { 0 };
5801
5802 u64 *digest_buf64 = (u64 *) digest_buf;
5803
5804 char *digests_buf_ptr = (char *) data.digests_buf;
5805
5806 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5807
5808 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5809 {
5810 uint tt;
5811
5812 switch (hash_type)
5813 {
5814 case HASH_TYPE_DESCRYPT:
5815 FP (digest_buf[1], digest_buf[0], tt);
5816 break;
5817
5818 case HASH_TYPE_DESRACF:
5819 digest_buf[0] = rotl32 (digest_buf[0], 29);
5820 digest_buf[1] = rotl32 (digest_buf[1], 29);
5821
5822 FP (digest_buf[1], digest_buf[0], tt);
5823 break;
5824
5825 case HASH_TYPE_LM:
5826 FP (digest_buf[1], digest_buf[0], tt);
5827 break;
5828
5829 case HASH_TYPE_NETNTLM:
5830 digest_buf[0] = rotl32 (digest_buf[0], 29);
5831 digest_buf[1] = rotl32 (digest_buf[1], 29);
5832 digest_buf[2] = rotl32 (digest_buf[2], 29);
5833 digest_buf[3] = rotl32 (digest_buf[3], 29);
5834
5835 FP (digest_buf[1], digest_buf[0], tt);
5836 FP (digest_buf[3], digest_buf[2], tt);
5837 break;
5838
5839 case HASH_TYPE_BSDICRYPT:
5840 digest_buf[0] = rotl32 (digest_buf[0], 31);
5841 digest_buf[1] = rotl32 (digest_buf[1], 31);
5842
5843 FP (digest_buf[1], digest_buf[0], tt);
5844 break;
5845 }
5846 }
5847
5848 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5849 {
5850 switch (hash_type)
5851 {
5852 case HASH_TYPE_MD4:
5853 digest_buf[0] += MD4M_A;
5854 digest_buf[1] += MD4M_B;
5855 digest_buf[2] += MD4M_C;
5856 digest_buf[3] += MD4M_D;
5857 break;
5858
5859 case HASH_TYPE_MD5:
5860 digest_buf[0] += MD5M_A;
5861 digest_buf[1] += MD5M_B;
5862 digest_buf[2] += MD5M_C;
5863 digest_buf[3] += MD5M_D;
5864 break;
5865
5866 case HASH_TYPE_SHA1:
5867 digest_buf[0] += SHA1M_A;
5868 digest_buf[1] += SHA1M_B;
5869 digest_buf[2] += SHA1M_C;
5870 digest_buf[3] += SHA1M_D;
5871 digest_buf[4] += SHA1M_E;
5872 break;
5873
5874 case HASH_TYPE_SHA256:
5875 digest_buf[0] += SHA256M_A;
5876 digest_buf[1] += SHA256M_B;
5877 digest_buf[2] += SHA256M_C;
5878 digest_buf[3] += SHA256M_D;
5879 digest_buf[4] += SHA256M_E;
5880 digest_buf[5] += SHA256M_F;
5881 digest_buf[6] += SHA256M_G;
5882 digest_buf[7] += SHA256M_H;
5883 break;
5884
5885 case HASH_TYPE_SHA384:
5886 digest_buf64[0] += SHA384M_A;
5887 digest_buf64[1] += SHA384M_B;
5888 digest_buf64[2] += SHA384M_C;
5889 digest_buf64[3] += SHA384M_D;
5890 digest_buf64[4] += SHA384M_E;
5891 digest_buf64[5] += SHA384M_F;
5892 digest_buf64[6] += 0;
5893 digest_buf64[7] += 0;
5894 break;
5895
5896 case HASH_TYPE_SHA512:
5897 digest_buf64[0] += SHA512M_A;
5898 digest_buf64[1] += SHA512M_B;
5899 digest_buf64[2] += SHA512M_C;
5900 digest_buf64[3] += SHA512M_D;
5901 digest_buf64[4] += SHA512M_E;
5902 digest_buf64[5] += SHA512M_F;
5903 digest_buf64[6] += SHA512M_G;
5904 digest_buf64[7] += SHA512M_H;
5905 break;
5906 }
5907 }
5908
5909 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5910 {
5911 if (dgst_size == DGST_SIZE_4_2)
5912 {
5913 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5914 }
5915 else if (dgst_size == DGST_SIZE_4_4)
5916 {
5917 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5918 }
5919 else if (dgst_size == DGST_SIZE_4_5)
5920 {
5921 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5922 }
5923 else if (dgst_size == DGST_SIZE_4_6)
5924 {
5925 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5926 }
5927 else if (dgst_size == DGST_SIZE_4_8)
5928 {
5929 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5930 }
5931 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5932 {
5933 if (hash_type == HASH_TYPE_WHIRLPOOL)
5934 {
5935 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5936 }
5937 else if (hash_type == HASH_TYPE_SHA384)
5938 {
5939 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5940 }
5941 else if (hash_type == HASH_TYPE_SHA512)
5942 {
5943 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5944 }
5945 else if (hash_type == HASH_TYPE_GOST)
5946 {
5947 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5948 }
5949 }
5950 else if (dgst_size == DGST_SIZE_4_64)
5951 {
5952 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5953 }
5954 else if (dgst_size == DGST_SIZE_8_25)
5955 {
5956 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5957 }
5958 }
5959
5960 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5961 | (data.salt_type == SALT_TYPE_EXTERN)
5962 | (data.salt_type == SALT_TYPE_EMBEDDED));
5963
5964 salt_t salt;
5965
5966 if (isSalted)
5967 {
5968 memset (&salt, 0, sizeof (salt_t));
5969
5970 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5971
5972 char *ptr = (char *) salt.salt_buf;
5973
5974 uint len = salt.salt_len;
5975
5976 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5977 {
5978 uint tt;
5979
5980 switch (hash_type)
5981 {
5982 case HASH_TYPE_NETNTLM:
5983
5984 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
5985 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
5986
5987 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
5988
5989 break;
5990 }
5991 }
5992
5993 if (opts_type & OPTS_TYPE_ST_UNICODE)
5994 {
5995 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5996 {
5997 ptr[i] = ptr[j];
5998 }
5999
6000 len = len / 2;
6001 }
6002
6003 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6004 {
6005 uint max = salt.salt_len / 4;
6006
6007 if (len % 4) max++;
6008
6009 for (uint i = 0; i < max; i++)
6010 {
6011 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6012 }
6013 }
6014
6015 if (opts_type & OPTS_TYPE_ST_HEX)
6016 {
6017 char tmp[64] = { 0 };
6018
6019 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6020 {
6021 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6022 }
6023
6024 len = len * 2;
6025
6026 memcpy (ptr, tmp, len);
6027 }
6028
6029 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6030
6031 memset (ptr + len, 0, memset_size);
6032
6033 salt.salt_len = len;
6034 }
6035
6036 //
6037 // some modes require special encoding
6038 //
6039
6040 uint out_buf_plain[256] = { 0 };
6041 uint out_buf_salt[256] = { 0 };
6042
6043 char tmp_buf[1024] = { 0 };
6044
6045 char *ptr_plain = (char *) out_buf_plain;
6046 char *ptr_salt = (char *) out_buf_salt;
6047
6048 if (hash_mode == 22)
6049 {
6050 char username[30] = { 0 };
6051
6052 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6053
6054 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6055
6056 u16 *ptr = (u16 *) digest_buf;
6057
6058 tmp_buf[ 0] = sig[0];
6059 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6060 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6061 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6062 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6063 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6064 tmp_buf[ 6] = sig[1];
6065 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6066 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6067 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6068 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6069 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6070 tmp_buf[12] = sig[2];
6071 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6072 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6073 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6074 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6075 tmp_buf[17] = sig[3];
6076 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6077 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6078 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6079 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6080 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6081 tmp_buf[23] = sig[4];
6082 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6083 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6084 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6085 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6086 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6087 tmp_buf[29] = sig[5];
6088
6089 snprintf (out_buf, len-1, "%s:%s",
6090 tmp_buf,
6091 username);
6092 }
6093 else if (hash_mode == 23)
6094 {
6095 // do not show the \nskyper\n part in output
6096
6097 char *salt_buf_ptr = (char *) salt.salt_buf;
6098
6099 salt_buf_ptr[salt.salt_len - 8] = 0;
6100
6101 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6102 digest_buf[0],
6103 digest_buf[1],
6104 digest_buf[2],
6105 digest_buf[3],
6106 salt_buf_ptr);
6107 }
6108 else if (hash_mode == 101)
6109 {
6110 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6111
6112 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6113 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6114 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6115 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6116 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6117
6118 memcpy (tmp_buf, digest_buf, 20);
6119
6120 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6121
6122 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6123 }
6124 else if (hash_mode == 111)
6125 {
6126 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6127
6128 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6129 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6130 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6131 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6132 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6133
6134 memcpy (tmp_buf, digest_buf, 20);
6135 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6136
6137 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6138
6139 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6140 }
6141 else if (hash_mode == 122)
6142 {
6143 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6144 (char *) salt.salt_buf,
6145 digest_buf[0],
6146 digest_buf[1],
6147 digest_buf[2],
6148 digest_buf[3],
6149 digest_buf[4]);
6150 }
6151 else if (hash_mode == 124)
6152 {
6153 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6154 (char *) salt.salt_buf,
6155 digest_buf[0],
6156 digest_buf[1],
6157 digest_buf[2],
6158 digest_buf[3],
6159 digest_buf[4]);
6160 }
6161 else if (hash_mode == 131)
6162 {
6163 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6164 (char *) salt.salt_buf,
6165 0, 0, 0, 0, 0,
6166 digest_buf[0],
6167 digest_buf[1],
6168 digest_buf[2],
6169 digest_buf[3],
6170 digest_buf[4]);
6171 }
6172 else if (hash_mode == 132)
6173 {
6174 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6175 (char *) salt.salt_buf,
6176 digest_buf[0],
6177 digest_buf[1],
6178 digest_buf[2],
6179 digest_buf[3],
6180 digest_buf[4]);
6181 }
6182 else if (hash_mode == 133)
6183 {
6184 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6185
6186 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6187 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6188 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6189 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6190 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6191
6192 memcpy (tmp_buf, digest_buf, 20);
6193
6194 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6195
6196 snprintf (out_buf, len-1, "%s", ptr_plain);
6197 }
6198 else if (hash_mode == 141)
6199 {
6200 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6201
6202 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6203
6204 memset (tmp_buf, 0, sizeof (tmp_buf));
6205
6206 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6207
6208 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6209 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6210 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6211 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6212 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6213
6214 memcpy (tmp_buf, digest_buf, 20);
6215
6216 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6217
6218 ptr_plain[27] = 0;
6219
6220 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6221 }
6222 else if (hash_mode == 400)
6223 {
6224 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6225
6226 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6227 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6228 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6229 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6230
6231 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6232
6233 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6234 }
6235 else if (hash_mode == 500)
6236 {
6237 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6238
6239 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6240 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6241 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6242 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6243
6244 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6245
6246 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6247 {
6248 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6249 }
6250 else
6251 {
6252 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6253 }
6254 }
6255 else if (hash_mode == 501)
6256 {
6257 uint digest_idx = salt.digests_offset + digest_pos;
6258
6259 hashinfo_t **hashinfo_ptr = data.hash_info;
6260 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6261
6262 snprintf (out_buf, len-1, "%s", hash_buf);
6263 }
6264 else if (hash_mode == 1421)
6265 {
6266 u8 *salt_ptr = (u8 *) salt.salt_buf;
6267
6268 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6269 salt_ptr[0],
6270 salt_ptr[1],
6271 salt_ptr[2],
6272 salt_ptr[3],
6273 salt_ptr[4],
6274 salt_ptr[5],
6275 digest_buf[0],
6276 digest_buf[1],
6277 digest_buf[2],
6278 digest_buf[3],
6279 digest_buf[4],
6280 digest_buf[5],
6281 digest_buf[6],
6282 digest_buf[7]);
6283 }
6284 else if (hash_mode == 1441)
6285 {
6286 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6287
6288 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6289
6290 memset (tmp_buf, 0, sizeof (tmp_buf));
6291
6292 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6293
6294 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6295 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6296 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6297 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6298 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6299 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6300 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6301 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6302
6303 memcpy (tmp_buf, digest_buf, 32);
6304
6305 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6306
6307 ptr_plain[43] = 0;
6308
6309 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6310 }
6311 else if (hash_mode == 1500)
6312 {
6313 out_buf[0] = salt.salt_sign[0] & 0xff;
6314 out_buf[1] = salt.salt_sign[1] & 0xff;
6315 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6316 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6317 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6318
6319 memset (tmp_buf, 0, sizeof (tmp_buf));
6320
6321 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6322
6323 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6324 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6325
6326 memcpy (tmp_buf, digest_buf, 8);
6327
6328 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6329
6330 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6331
6332 out_buf[13] = 0;
6333 }
6334 else if (hash_mode == 1600)
6335 {
6336 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6337
6338 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6339 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6340 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6341 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6342
6343 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6344
6345 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6346 {
6347 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6348 }
6349 else
6350 {
6351 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6352 }
6353 }
6354 else if (hash_mode == 1711)
6355 {
6356 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6357
6358 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6359 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6360 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6361 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6362 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6363 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6364 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6365 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6366
6367 memcpy (tmp_buf, digest_buf, 64);
6368 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6369
6370 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6371
6372 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6373 }
6374 else if (hash_mode == 1722)
6375 {
6376 uint *ptr = digest_buf;
6377
6378 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6379 (unsigned char *) salt.salt_buf,
6380 ptr[ 1], ptr[ 0],
6381 ptr[ 3], ptr[ 2],
6382 ptr[ 5], ptr[ 4],
6383 ptr[ 7], ptr[ 6],
6384 ptr[ 9], ptr[ 8],
6385 ptr[11], ptr[10],
6386 ptr[13], ptr[12],
6387 ptr[15], ptr[14]);
6388 }
6389 else if (hash_mode == 1731)
6390 {
6391 uint *ptr = digest_buf;
6392
6393 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6394 (unsigned char *) salt.salt_buf,
6395 ptr[ 1], ptr[ 0],
6396 ptr[ 3], ptr[ 2],
6397 ptr[ 5], ptr[ 4],
6398 ptr[ 7], ptr[ 6],
6399 ptr[ 9], ptr[ 8],
6400 ptr[11], ptr[10],
6401 ptr[13], ptr[12],
6402 ptr[15], ptr[14]);
6403 }
6404 else if (hash_mode == 1800)
6405 {
6406 // temp workaround
6407
6408 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6409 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6410 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6411 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6412 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6413 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6414 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6415 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6416
6417 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6418
6419 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6420 {
6421 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6422 }
6423 else
6424 {
6425 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6426 }
6427 }
6428 else if (hash_mode == 2100)
6429 {
6430 uint pos = 0;
6431
6432 snprintf (out_buf + pos, len-1, "%s%i#",
6433 SIGNATURE_DCC2,
6434 salt.salt_iter + 1);
6435
6436 uint signature_len = strlen (out_buf);
6437
6438 pos += signature_len;
6439 len -= signature_len;
6440
6441 char *salt_ptr = (char *) salt.salt_buf;
6442
6443 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6444
6445 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6446 byte_swap_32 (digest_buf[0]),
6447 byte_swap_32 (digest_buf[1]),
6448 byte_swap_32 (digest_buf[2]),
6449 byte_swap_32 (digest_buf[3]));
6450 }
6451 else if ((hash_mode == 2400) || (hash_mode == 2410))
6452 {
6453 memcpy (tmp_buf, digest_buf, 16);
6454
6455 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6456
6457 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6458 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6459 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6460 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6461
6462 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6463 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6464 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6465 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6466
6467 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6468 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6469 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6470 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6471
6472 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6473 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6474 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6475 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6476
6477 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6478 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6479 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6480 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6481
6482 out_buf[16] = 0;
6483 }
6484 else if (hash_mode == 2500)
6485 {
6486 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6487
6488 wpa_t *wpa = &wpas[salt_pos];
6489
6490 uint pke[25] = { 0 };
6491
6492 char *pke_ptr = (char *) pke;
6493
6494 for (uint i = 0; i < 25; i++)
6495 {
6496 pke[i] = byte_swap_32 (wpa->pke[i]);
6497 }
6498
6499 unsigned char mac1[6] = { 0 };
6500 unsigned char mac2[6] = { 0 };
6501
6502 memcpy (mac1, pke_ptr + 23, 6);
6503 memcpy (mac2, pke_ptr + 29, 6);
6504
6505 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6506 (char *) salt.salt_buf,
6507 mac1[0],
6508 mac1[1],
6509 mac1[2],
6510 mac1[3],
6511 mac1[4],
6512 mac1[5],
6513 mac2[0],
6514 mac2[1],
6515 mac2[2],
6516 mac2[3],
6517 mac2[4],
6518 mac2[5]);
6519 }
6520 else if (hash_mode == 4400)
6521 {
6522 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6523 byte_swap_32 (digest_buf[0]),
6524 byte_swap_32 (digest_buf[1]),
6525 byte_swap_32 (digest_buf[2]),
6526 byte_swap_32 (digest_buf[3]));
6527 }
6528 else if (hash_mode == 4700)
6529 {
6530 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6531 byte_swap_32 (digest_buf[0]),
6532 byte_swap_32 (digest_buf[1]),
6533 byte_swap_32 (digest_buf[2]),
6534 byte_swap_32 (digest_buf[3]),
6535 byte_swap_32 (digest_buf[4]));
6536 }
6537 else if (hash_mode == 4800)
6538 {
6539 u8 chap_id_byte = (u8) salt.salt_buf[4];
6540
6541 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6542 digest_buf[0],
6543 digest_buf[1],
6544 digest_buf[2],
6545 digest_buf[3],
6546 byte_swap_32 (salt.salt_buf[0]),
6547 byte_swap_32 (salt.salt_buf[1]),
6548 byte_swap_32 (salt.salt_buf[2]),
6549 byte_swap_32 (salt.salt_buf[3]),
6550 chap_id_byte);
6551 }
6552 else if (hash_mode == 4900)
6553 {
6554 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6555 byte_swap_32 (digest_buf[0]),
6556 byte_swap_32 (digest_buf[1]),
6557 byte_swap_32 (digest_buf[2]),
6558 byte_swap_32 (digest_buf[3]),
6559 byte_swap_32 (digest_buf[4]));
6560 }
6561 else if (hash_mode == 5100)
6562 {
6563 snprintf (out_buf, len-1, "%08x%08x",
6564 digest_buf[0],
6565 digest_buf[1]);
6566 }
6567 else if (hash_mode == 5200)
6568 {
6569 snprintf (out_buf, len-1, "%s", hashfile);
6570 }
6571 else if (hash_mode == 5300)
6572 {
6573 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6574
6575 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6576
6577 int buf_len = len -1;
6578
6579 // msg_buf
6580
6581 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6582
6583 for (uint i = 0; i < ikepsk_msg_len; i++)
6584 {
6585 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6586 {
6587 snprintf (out_buf, buf_len, ":");
6588
6589 buf_len--;
6590 out_buf++;
6591 }
6592
6593 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6594
6595 buf_len -= 8;
6596 out_buf += 8;
6597 }
6598
6599 // nr_buf
6600
6601 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6602
6603 for (uint i = 0; i < ikepsk_nr_len; i++)
6604 {
6605 if ((i == 0) || (i == 5))
6606 {
6607 snprintf (out_buf, buf_len, ":");
6608
6609 buf_len--;
6610 out_buf++;
6611 }
6612
6613 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6614
6615 buf_len -= 8;
6616 out_buf += 8;
6617 }
6618
6619 // digest_buf
6620
6621 for (uint i = 0; i < 4; i++)
6622 {
6623 if (i == 0)
6624 {
6625 snprintf (out_buf, buf_len, ":");
6626
6627 buf_len--;
6628 out_buf++;
6629 }
6630
6631 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6632
6633 buf_len -= 8;
6634 out_buf += 8;
6635 }
6636 }
6637 else if (hash_mode == 5400)
6638 {
6639 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6640
6641 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6642
6643 int buf_len = len -1;
6644
6645 // msg_buf
6646
6647 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6648
6649 for (uint i = 0; i < ikepsk_msg_len; i++)
6650 {
6651 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6652 {
6653 snprintf (out_buf, buf_len, ":");
6654
6655 buf_len--;
6656 out_buf++;
6657 }
6658
6659 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6660
6661 buf_len -= 8;
6662 out_buf += 8;
6663 }
6664
6665 // nr_buf
6666
6667 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6668
6669 for (uint i = 0; i < ikepsk_nr_len; i++)
6670 {
6671 if ((i == 0) || (i == 5))
6672 {
6673 snprintf (out_buf, buf_len, ":");
6674
6675 buf_len--;
6676 out_buf++;
6677 }
6678
6679 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6680
6681 buf_len -= 8;
6682 out_buf += 8;
6683 }
6684
6685 // digest_buf
6686
6687 for (uint i = 0; i < 5; i++)
6688 {
6689 if (i == 0)
6690 {
6691 snprintf (out_buf, buf_len, ":");
6692
6693 buf_len--;
6694 out_buf++;
6695 }
6696
6697 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6698
6699 buf_len -= 8;
6700 out_buf += 8;
6701 }
6702 }
6703 else if (hash_mode == 5500)
6704 {
6705 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6706
6707 netntlm_t *netntlm = &netntlms[salt_pos];
6708
6709 char user_buf[64] = { 0 };
6710 char domain_buf[64] = { 0 };
6711 char srvchall_buf[1024] = { 0 };
6712 char clichall_buf[1024] = { 0 };
6713
6714 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6715 {
6716 char *ptr = (char *) netntlm->userdomain_buf;
6717
6718 user_buf[i] = ptr[j];
6719 }
6720
6721 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6722 {
6723 char *ptr = (char *) netntlm->userdomain_buf;
6724
6725 domain_buf[i] = ptr[netntlm->user_len + j];
6726 }
6727
6728 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6729 {
6730 u8 *ptr = (u8 *) netntlm->chall_buf;
6731
6732 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6733 }
6734
6735 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6736 {
6737 u8 *ptr = (u8 *) netntlm->chall_buf;
6738
6739 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6740 }
6741
6742 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6743 user_buf,
6744 domain_buf,
6745 srvchall_buf,
6746 digest_buf[0],
6747 digest_buf[1],
6748 digest_buf[2],
6749 digest_buf[3],
6750 byte_swap_32 (salt.salt_buf_pc[0]),
6751 byte_swap_32 (salt.salt_buf_pc[1]),
6752 clichall_buf);
6753 }
6754 else if (hash_mode == 5600)
6755 {
6756 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6757
6758 netntlm_t *netntlm = &netntlms[salt_pos];
6759
6760 char user_buf[64] = { 0 };
6761 char domain_buf[64] = { 0 };
6762 char srvchall_buf[1024] = { 0 };
6763 char clichall_buf[1024] = { 0 };
6764
6765 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6766 {
6767 char *ptr = (char *) netntlm->userdomain_buf;
6768
6769 user_buf[i] = ptr[j];
6770 }
6771
6772 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6773 {
6774 char *ptr = (char *) netntlm->userdomain_buf;
6775
6776 domain_buf[i] = ptr[netntlm->user_len + j];
6777 }
6778
6779 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6780 {
6781 u8 *ptr = (u8 *) netntlm->chall_buf;
6782
6783 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6784 }
6785
6786 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6787 {
6788 u8 *ptr = (u8 *) netntlm->chall_buf;
6789
6790 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6791 }
6792
6793 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6794 user_buf,
6795 domain_buf,
6796 srvchall_buf,
6797 digest_buf[0],
6798 digest_buf[1],
6799 digest_buf[2],
6800 digest_buf[3],
6801 clichall_buf);
6802 }
6803 else if (hash_mode == 5700)
6804 {
6805 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6806
6807 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6808 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6809 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6810 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6811 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6812 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6813 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6814 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6815
6816 memcpy (tmp_buf, digest_buf, 32);
6817
6818 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6819
6820 ptr_plain[43] = 0;
6821
6822 snprintf (out_buf, len-1, "%s", ptr_plain);
6823 }
6824 else if (hash_mode == 5800)
6825 {
6826 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6827 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6828 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6829 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6830 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6831
6832 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6833 digest_buf[0],
6834 digest_buf[1],
6835 digest_buf[2],
6836 digest_buf[3],
6837 digest_buf[4]);
6838 }
6839 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6840 {
6841 snprintf (out_buf, len-1, "%s", hashfile);
6842 }
6843 else if (hash_mode == 6300)
6844 {
6845 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6846
6847 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6848 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6849 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6850 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6851
6852 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6853
6854 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6855 }
6856 else if (hash_mode == 6400)
6857 {
6858 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6859
6860 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6861 }
6862 else if (hash_mode == 6500)
6863 {
6864 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6865
6866 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6867 }
6868 else if (hash_mode == 6600)
6869 {
6870 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6871
6872 agilekey_t *agilekey = &agilekeys[salt_pos];
6873
6874 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6875 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6876
6877 uint buf_len = len - 1;
6878
6879 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6880 buf_len -= 22;
6881
6882 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6883 {
6884 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6885
6886 buf_len -= 2;
6887 }
6888 }
6889 else if (hash_mode == 6700)
6890 {
6891 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6892
6893 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6894 }
6895 else if (hash_mode == 6800)
6896 {
6897 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6898 }
6899 else if (hash_mode == 7100)
6900 {
6901 uint *ptr = digest_buf;
6902
6903 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6904
6905 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6906
6907 uint esalt[8] = { 0 };
6908
6909 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6910 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6911 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6912 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6913 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6914 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6915 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6916 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6917
6918 snprintf (out_buf, len-1, "%s%i$%08x%08x%08x%08x%08x%08x%08x%08x$%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6919 SIGNATURE_SHA512OSX,
6920 salt.salt_iter + 1,
6921 esalt[ 0], esalt[ 1],
6922 esalt[ 2], esalt[ 3],
6923 esalt[ 4], esalt[ 5],
6924 esalt[ 6], esalt[ 7],
6925 ptr [ 1], ptr [ 0],
6926 ptr [ 3], ptr [ 2],
6927 ptr [ 5], ptr [ 4],
6928 ptr [ 7], ptr [ 6],
6929 ptr [ 9], ptr [ 8],
6930 ptr [11], ptr [10],
6931 ptr [13], ptr [12],
6932 ptr [15], ptr [14]);
6933 }
6934 else if (hash_mode == 7200)
6935 {
6936 uint *ptr = digest_buf;
6937
6938 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6939
6940 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6941
6942 uint len_used = 0;
6943
6944 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6945
6946 len_used = strlen (out_buf);
6947
6948 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6949
6950 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6951 {
6952 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6953 }
6954
6955 snprintf (out_buf + len_used, len - len_used - 1, ".%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6956 ptr [ 1], ptr [ 0],
6957 ptr [ 3], ptr [ 2],
6958 ptr [ 5], ptr [ 4],
6959 ptr [ 7], ptr [ 6],
6960 ptr [ 9], ptr [ 8],
6961 ptr [11], ptr [10],
6962 ptr [13], ptr [12],
6963 ptr [15], ptr [14]);
6964 }
6965 else if (hash_mode == 7300)
6966 {
6967 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6968
6969 rakp_t *rakp = &rakps[salt_pos];
6970
6971 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6972 {
6973 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6974 }
6975
6976 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6977 digest_buf[0],
6978 digest_buf[1],
6979 digest_buf[2],
6980 digest_buf[3],
6981 digest_buf[4]);
6982 }
6983 else if (hash_mode == 7400)
6984 {
6985 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6986
6987 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6988 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6989 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6990 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6991 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6992 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6993 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6994 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6995
6996 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6997
6998 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
6999 {
7000 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7001 }
7002 else
7003 {
7004 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7005 }
7006 }
7007 else if (hash_mode == 7500)
7008 {
7009 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7010
7011 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7012
7013 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7014 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7015
7016 char data[128] = { 0 };
7017
7018 char *ptr_data = data;
7019
7020 for (uint i = 0; i < 36; i++, ptr_data += 2)
7021 {
7022 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7023 }
7024
7025 for (uint i = 0; i < 16; i++, ptr_data += 2)
7026 {
7027 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7028 }
7029
7030 *ptr_data = 0;
7031
7032 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7033 SIGNATURE_KRB5PA,
7034 (char *) krb5pa->user,
7035 (char *) krb5pa->realm,
7036 (char *) krb5pa->salt,
7037 data);
7038 }
7039 else if (hash_mode == 7700)
7040 {
7041 snprintf (out_buf, len-1, "%s$%08X%08X",
7042 (char *) salt.salt_buf,
7043 digest_buf[0],
7044 digest_buf[1]);
7045 }
7046 else if (hash_mode == 7800)
7047 {
7048 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7049 (char *) salt.salt_buf,
7050 digest_buf[0],
7051 digest_buf[1],
7052 digest_buf[2],
7053 digest_buf[3],
7054 digest_buf[4]);
7055 }
7056 else if (hash_mode == 7900)
7057 {
7058 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7059
7060 // ugly hack start
7061
7062 char *tmp = (char *) salt.salt_buf_pc;
7063
7064 ptr_plain[42] = tmp[0];
7065
7066 // ugly hack end
7067
7068 ptr_plain[43] = 0;
7069
7070 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7071 }
7072 else if (hash_mode == 8000)
7073 {
7074 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7075 (unsigned char *) salt.salt_buf,
7076 digest_buf[0],
7077 digest_buf[1],
7078 digest_buf[2],
7079 digest_buf[3],
7080 digest_buf[4],
7081 digest_buf[5],
7082 digest_buf[6],
7083 digest_buf[7]);
7084 }
7085 else if (hash_mode == 8100)
7086 {
7087 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7088 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7089
7090 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7091 (unsigned char *) salt.salt_buf,
7092 digest_buf[0],
7093 digest_buf[1],
7094 digest_buf[2],
7095 digest_buf[3],
7096 digest_buf[4]);
7097 }
7098 else if (hash_mode == 8200)
7099 {
7100 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7101
7102 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7103
7104 char data_buf[4096] = { 0 };
7105
7106 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7107 {
7108 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7109 }
7110
7111 data_buf[cloudkey->data_len * 2] = 0;
7112
7113 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7114 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7115 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7116 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7117 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7118 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7119 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7120 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7121
7122 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7123 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7124 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7125 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7126
7127 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7128 digest_buf[0],
7129 digest_buf[1],
7130 digest_buf[2],
7131 digest_buf[3],
7132 digest_buf[4],
7133 digest_buf[5],
7134 digest_buf[6],
7135 digest_buf[7],
7136 salt.salt_buf[0],
7137 salt.salt_buf[1],
7138 salt.salt_buf[2],
7139 salt.salt_buf[3],
7140 salt.salt_iter + 1,
7141 data_buf);
7142 }
7143 else if (hash_mode == 8300)
7144 {
7145 char digest_buf_c[34] = { 0 };
7146
7147 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7148
7149 digest_buf_c[32] = 0;
7150
7151 // domain
7152
7153 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7154
7155 char domain_buf_c[33] = { 0 };
7156
7157 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7158
7159 for (uint i = 0; i < salt_pc_len; i++)
7160 {
7161 const char next = domain_buf_c[i];
7162
7163 domain_buf_c[i] = '.';
7164
7165 i += next;
7166 }
7167
7168 domain_buf_c[salt_pc_len] = 0;
7169
7170 // final
7171
7172 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7173 }
7174 else if (hash_mode == 8500)
7175 {
7176 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7177 }
7178 else if (hash_mode == 2612)
7179 {
7180 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7181 SIGNATURE_PHPS,
7182 (char *) salt.salt_buf,
7183 digest_buf[0],
7184 digest_buf[1],
7185 digest_buf[2],
7186 digest_buf[3]);
7187 }
7188 else if (hash_mode == 3711)
7189 {
7190 char *salt_ptr = (char *) salt.salt_buf;
7191
7192 salt_ptr[salt.salt_len - 1] = 0;
7193
7194 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7195 SIGNATURE_MEDIAWIKI_B,
7196 salt_ptr,
7197 digest_buf[0],
7198 digest_buf[1],
7199 digest_buf[2],
7200 digest_buf[3]);
7201 }
7202 else if (hash_mode == 8800)
7203 {
7204 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7205
7206 androidfde_t *androidfde = &androidfdes[salt_pos];
7207
7208 char tmp[3073] = { 0 };
7209
7210 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7211 {
7212 sprintf (tmp + j, "%08x", androidfde->data[i]);
7213 }
7214
7215 tmp[3072] = 0;
7216
7217 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7218 SIGNATURE_ANDROIDFDE,
7219 byte_swap_32 (salt.salt_buf[0]),
7220 byte_swap_32 (salt.salt_buf[1]),
7221 byte_swap_32 (salt.salt_buf[2]),
7222 byte_swap_32 (salt.salt_buf[3]),
7223 byte_swap_32 (digest_buf[0]),
7224 byte_swap_32 (digest_buf[1]),
7225 byte_swap_32 (digest_buf[2]),
7226 byte_swap_32 (digest_buf[3]),
7227 tmp);
7228 }
7229 else if (hash_mode == 8900)
7230 {
7231 uint N = salt.scrypt_N;
7232 uint r = salt.scrypt_r;
7233 uint p = salt.scrypt_p;
7234
7235 char base64_salt[32] = { 0 };
7236
7237 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7238
7239 memset (tmp_buf, 0, 46);
7240
7241 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7242 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7243 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7244 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7245 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7246 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7247 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7248 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7249 digest_buf[8] = 0; // needed for base64_encode ()
7250
7251 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7252
7253 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7254 SIGNATURE_SCRYPT,
7255 N,
7256 r,
7257 p,
7258 base64_salt,
7259 tmp_buf);
7260 }
7261 else if (hash_mode == 9000)
7262 {
7263 snprintf (out_buf, len-1, "%s", hashfile);
7264 }
7265 else if (hash_mode == 9200)
7266 {
7267 // salt
7268
7269 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7270
7271 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7272
7273 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7274
7275 // hash
7276
7277 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7278 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7279 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7280 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7281 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7282 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7283 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7284 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7285 digest_buf[8] = 0; // needed for base64_encode ()
7286
7287 char tmp_buf[64] = { 0 };
7288
7289 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7290 tmp_buf[43] = 0; // cut it here
7291
7292 // output
7293
7294 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7295 }
7296 else if (hash_mode == 9300)
7297 {
7298 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7299 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7300 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7301 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7302 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7303 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7304 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7305 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7306 digest_buf[8] = 0; // needed for base64_encode ()
7307
7308 char tmp_buf[64] = { 0 };
7309
7310 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7311 tmp_buf[43] = 0; // cut it here
7312
7313 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7314
7315 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7316 }
7317 else if (hash_mode == 9400)
7318 {
7319 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7320
7321 office2007_t *office2007 = &office2007s[salt_pos];
7322
7323 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7324 SIGNATURE_OFFICE2007,
7325 2007,
7326 20,
7327 office2007->keySize,
7328 16,
7329 salt.salt_buf[0],
7330 salt.salt_buf[1],
7331 salt.salt_buf[2],
7332 salt.salt_buf[3],
7333 office2007->encryptedVerifier[0],
7334 office2007->encryptedVerifier[1],
7335 office2007->encryptedVerifier[2],
7336 office2007->encryptedVerifier[3],
7337 office2007->encryptedVerifierHash[0],
7338 office2007->encryptedVerifierHash[1],
7339 office2007->encryptedVerifierHash[2],
7340 office2007->encryptedVerifierHash[3],
7341 office2007->encryptedVerifierHash[4]);
7342 }
7343 else if (hash_mode == 9500)
7344 {
7345 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7346
7347 office2010_t *office2010 = &office2010s[salt_pos];
7348
7349 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_OFFICE2010, 2010, 100000, 128, 16,
7350
7351 salt.salt_buf[0],
7352 salt.salt_buf[1],
7353 salt.salt_buf[2],
7354 salt.salt_buf[3],
7355 office2010->encryptedVerifier[0],
7356 office2010->encryptedVerifier[1],
7357 office2010->encryptedVerifier[2],
7358 office2010->encryptedVerifier[3],
7359 office2010->encryptedVerifierHash[0],
7360 office2010->encryptedVerifierHash[1],
7361 office2010->encryptedVerifierHash[2],
7362 office2010->encryptedVerifierHash[3],
7363 office2010->encryptedVerifierHash[4],
7364 office2010->encryptedVerifierHash[5],
7365 office2010->encryptedVerifierHash[6],
7366 office2010->encryptedVerifierHash[7]);
7367 }
7368 else if (hash_mode == 9600)
7369 {
7370 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7371
7372 office2013_t *office2013 = &office2013s[salt_pos];
7373
7374 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_OFFICE2013, 2013, 100000, 256, 16,
7375
7376 salt.salt_buf[0],
7377 salt.salt_buf[1],
7378 salt.salt_buf[2],
7379 salt.salt_buf[3],
7380 office2013->encryptedVerifier[0],
7381 office2013->encryptedVerifier[1],
7382 office2013->encryptedVerifier[2],
7383 office2013->encryptedVerifier[3],
7384 office2013->encryptedVerifierHash[0],
7385 office2013->encryptedVerifierHash[1],
7386 office2013->encryptedVerifierHash[2],
7387 office2013->encryptedVerifierHash[3],
7388 office2013->encryptedVerifierHash[4],
7389 office2013->encryptedVerifierHash[5],
7390 office2013->encryptedVerifierHash[6],
7391 office2013->encryptedVerifierHash[7]);
7392 }
7393 else if (hash_mode == 9700)
7394 {
7395 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7396
7397 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7398
7399 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7400 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7401 byte_swap_32 (salt.salt_buf[0]),
7402 byte_swap_32 (salt.salt_buf[1]),
7403 byte_swap_32 (salt.salt_buf[2]),
7404 byte_swap_32 (salt.salt_buf[3]),
7405 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7406 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7407 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7408 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7409 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7410 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7411 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7412 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7413 }
7414 else if (hash_mode == 9710)
7415 {
7416 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7417
7418 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7419
7420 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7421 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7422 byte_swap_32 (salt.salt_buf[0]),
7423 byte_swap_32 (salt.salt_buf[1]),
7424 byte_swap_32 (salt.salt_buf[2]),
7425 byte_swap_32 (salt.salt_buf[3]),
7426 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7427 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7428 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7429 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7430 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7431 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7432 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7433 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7434 }
7435 else if (hash_mode == 9720)
7436 {
7437 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7438
7439 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7440
7441 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7442
7443 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7444 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7445 byte_swap_32 (salt.salt_buf[0]),
7446 byte_swap_32 (salt.salt_buf[1]),
7447 byte_swap_32 (salt.salt_buf[2]),
7448 byte_swap_32 (salt.salt_buf[3]),
7449 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7450 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7451 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7452 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7453 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7454 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7455 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7456 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7457 rc4key[0],
7458 rc4key[1],
7459 rc4key[2],
7460 rc4key[3],
7461 rc4key[4]);
7462 }
7463 else if (hash_mode == 9800)
7464 {
7465 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7466
7467 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7468
7469 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7470 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7471 salt.salt_buf[0],
7472 salt.salt_buf[1],
7473 salt.salt_buf[2],
7474 salt.salt_buf[3],
7475 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7476 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7477 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7478 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7479 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7480 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7481 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7482 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7483 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7484 }
7485 else if (hash_mode == 9810)
7486 {
7487 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7488
7489 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7490
7491 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7492 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7493 salt.salt_buf[0],
7494 salt.salt_buf[1],
7495 salt.salt_buf[2],
7496 salt.salt_buf[3],
7497 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7498 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7499 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7500 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7501 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7502 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7503 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7504 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7505 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7506 }
7507 else if (hash_mode == 9820)
7508 {
7509 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7510
7511 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7512
7513 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7514
7515 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7516 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7517 salt.salt_buf[0],
7518 salt.salt_buf[1],
7519 salt.salt_buf[2],
7520 salt.salt_buf[3],
7521 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7522 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7523 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7524 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7525 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7526 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7527 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7528 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7529 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7530 rc4key[0],
7531 rc4key[1],
7532 rc4key[2],
7533 rc4key[3],
7534 rc4key[4]);
7535 }
7536 else if (hash_mode == 10000)
7537 {
7538 // salt
7539
7540 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7541
7542 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7543
7544 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7545
7546 // hash
7547
7548 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7549 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7550 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7551 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7552 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7553 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7554 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7555 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7556 digest_buf[8] = 0; // needed for base64_encode ()
7557
7558 char tmp_buf[64] = { 0 };
7559
7560 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7561
7562 // output
7563
7564 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7565 }
7566 else if (hash_mode == 10100)
7567 {
7568 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7569 digest_buf[0],
7570 digest_buf[1],
7571 2,
7572 4,
7573 byte_swap_32 (salt.salt_buf[0]),
7574 byte_swap_32 (salt.salt_buf[1]),
7575 byte_swap_32 (salt.salt_buf[2]),
7576 byte_swap_32 (salt.salt_buf[3]));
7577 }
7578 else if (hash_mode == 10200)
7579 {
7580 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7581
7582 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7583
7584 // challenge
7585
7586 char challenge[100] = { 0 };
7587
7588 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7589
7590 // response
7591
7592 char tmp_buf[100] = { 0 };
7593
7594 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7595 (char *) cram_md5->user,
7596 digest_buf[0],
7597 digest_buf[1],
7598 digest_buf[2],
7599 digest_buf[3]);
7600
7601 char response[100] = { 0 };
7602
7603 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7604
7605 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7606 }
7607 else if (hash_mode == 10300)
7608 {
7609 char tmp_buf[100] = { 0 };
7610
7611 memcpy (tmp_buf + 0, digest_buf, 20);
7612 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7613
7614 uint tmp_len = 20 + salt.salt_len;
7615
7616 // base64 encode it
7617
7618 char base64_encoded[100] = { 0 };
7619
7620 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7621
7622 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7623 }
7624 else if (hash_mode == 10400)
7625 {
7626 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7627
7628 pdf_t *pdf = &pdfs[salt_pos];
7629
7630 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x",
7631
7632 pdf->V,
7633 pdf->R,
7634 40,
7635 pdf->P,
7636 pdf->enc_md,
7637 pdf->id_len,
7638 byte_swap_32 (pdf->id_buf[0]),
7639 byte_swap_32 (pdf->id_buf[1]),
7640 byte_swap_32 (pdf->id_buf[2]),
7641 byte_swap_32 (pdf->id_buf[3]),
7642 pdf->u_len,
7643 byte_swap_32 (pdf->u_buf[0]),
7644 byte_swap_32 (pdf->u_buf[1]),
7645 byte_swap_32 (pdf->u_buf[2]),
7646 byte_swap_32 (pdf->u_buf[3]),
7647 byte_swap_32 (pdf->u_buf[4]),
7648 byte_swap_32 (pdf->u_buf[5]),
7649 byte_swap_32 (pdf->u_buf[6]),
7650 byte_swap_32 (pdf->u_buf[7]),
7651 pdf->o_len,
7652 byte_swap_32 (pdf->o_buf[0]),
7653 byte_swap_32 (pdf->o_buf[1]),
7654 byte_swap_32 (pdf->o_buf[2]),
7655 byte_swap_32 (pdf->o_buf[3]),
7656 byte_swap_32 (pdf->o_buf[4]),
7657 byte_swap_32 (pdf->o_buf[5]),
7658 byte_swap_32 (pdf->o_buf[6]),
7659 byte_swap_32 (pdf->o_buf[7])
7660 );
7661 }
7662 else if (hash_mode == 10410)
7663 {
7664 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7665
7666 pdf_t *pdf = &pdfs[salt_pos];
7667
7668 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x",
7669
7670 pdf->V,
7671 pdf->R,
7672 40,
7673 pdf->P,
7674 pdf->enc_md,
7675 pdf->id_len,
7676 byte_swap_32 (pdf->id_buf[0]),
7677 byte_swap_32 (pdf->id_buf[1]),
7678 byte_swap_32 (pdf->id_buf[2]),
7679 byte_swap_32 (pdf->id_buf[3]),
7680 pdf->u_len,
7681 byte_swap_32 (pdf->u_buf[0]),
7682 byte_swap_32 (pdf->u_buf[1]),
7683 byte_swap_32 (pdf->u_buf[2]),
7684 byte_swap_32 (pdf->u_buf[3]),
7685 byte_swap_32 (pdf->u_buf[4]),
7686 byte_swap_32 (pdf->u_buf[5]),
7687 byte_swap_32 (pdf->u_buf[6]),
7688 byte_swap_32 (pdf->u_buf[7]),
7689 pdf->o_len,
7690 byte_swap_32 (pdf->o_buf[0]),
7691 byte_swap_32 (pdf->o_buf[1]),
7692 byte_swap_32 (pdf->o_buf[2]),
7693 byte_swap_32 (pdf->o_buf[3]),
7694 byte_swap_32 (pdf->o_buf[4]),
7695 byte_swap_32 (pdf->o_buf[5]),
7696 byte_swap_32 (pdf->o_buf[6]),
7697 byte_swap_32 (pdf->o_buf[7])
7698 );
7699 }
7700 else if (hash_mode == 10420)
7701 {
7702 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7703
7704 pdf_t *pdf = &pdfs[salt_pos];
7705
7706 u8 *rc4key = (u8 *) pdf->rc4key;
7707
7708 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7709
7710 pdf->V,
7711 pdf->R,
7712 40,
7713 pdf->P,
7714 pdf->enc_md,
7715 pdf->id_len,
7716 byte_swap_32 (pdf->id_buf[0]),
7717 byte_swap_32 (pdf->id_buf[1]),
7718 byte_swap_32 (pdf->id_buf[2]),
7719 byte_swap_32 (pdf->id_buf[3]),
7720 pdf->u_len,
7721 byte_swap_32 (pdf->u_buf[0]),
7722 byte_swap_32 (pdf->u_buf[1]),
7723 byte_swap_32 (pdf->u_buf[2]),
7724 byte_swap_32 (pdf->u_buf[3]),
7725 byte_swap_32 (pdf->u_buf[4]),
7726 byte_swap_32 (pdf->u_buf[5]),
7727 byte_swap_32 (pdf->u_buf[6]),
7728 byte_swap_32 (pdf->u_buf[7]),
7729 pdf->o_len,
7730 byte_swap_32 (pdf->o_buf[0]),
7731 byte_swap_32 (pdf->o_buf[1]),
7732 byte_swap_32 (pdf->o_buf[2]),
7733 byte_swap_32 (pdf->o_buf[3]),
7734 byte_swap_32 (pdf->o_buf[4]),
7735 byte_swap_32 (pdf->o_buf[5]),
7736 byte_swap_32 (pdf->o_buf[6]),
7737 byte_swap_32 (pdf->o_buf[7]),
7738 rc4key[0],
7739 rc4key[1],
7740 rc4key[2],
7741 rc4key[3],
7742 rc4key[4]
7743 );
7744 }
7745 else if (hash_mode == 10500)
7746 {
7747 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7748
7749 pdf_t *pdf = &pdfs[salt_pos];
7750
7751 if (pdf->id_len == 32)
7752 {
7753 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x",
7754
7755 pdf->V,
7756 pdf->R,
7757 128,
7758 pdf->P,
7759 pdf->enc_md,
7760 pdf->id_len,
7761 byte_swap_32 (pdf->id_buf[0]),
7762 byte_swap_32 (pdf->id_buf[1]),
7763 byte_swap_32 (pdf->id_buf[2]),
7764 byte_swap_32 (pdf->id_buf[3]),
7765 byte_swap_32 (pdf->id_buf[4]),
7766 byte_swap_32 (pdf->id_buf[5]),
7767 byte_swap_32 (pdf->id_buf[6]),
7768 byte_swap_32 (pdf->id_buf[7]),
7769 pdf->u_len,
7770 byte_swap_32 (pdf->u_buf[0]),
7771 byte_swap_32 (pdf->u_buf[1]),
7772 byte_swap_32 (pdf->u_buf[2]),
7773 byte_swap_32 (pdf->u_buf[3]),
7774 byte_swap_32 (pdf->u_buf[4]),
7775 byte_swap_32 (pdf->u_buf[5]),
7776 byte_swap_32 (pdf->u_buf[6]),
7777 byte_swap_32 (pdf->u_buf[7]),
7778 pdf->o_len,
7779 byte_swap_32 (pdf->o_buf[0]),
7780 byte_swap_32 (pdf->o_buf[1]),
7781 byte_swap_32 (pdf->o_buf[2]),
7782 byte_swap_32 (pdf->o_buf[3]),
7783 byte_swap_32 (pdf->o_buf[4]),
7784 byte_swap_32 (pdf->o_buf[5]),
7785 byte_swap_32 (pdf->o_buf[6]),
7786 byte_swap_32 (pdf->o_buf[7])
7787 );
7788 }
7789 else
7790 {
7791 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x",
7792
7793 pdf->V,
7794 pdf->R,
7795 128,
7796 pdf->P,
7797 pdf->enc_md,
7798 pdf->id_len,
7799 byte_swap_32 (pdf->id_buf[0]),
7800 byte_swap_32 (pdf->id_buf[1]),
7801 byte_swap_32 (pdf->id_buf[2]),
7802 byte_swap_32 (pdf->id_buf[3]),
7803 pdf->u_len,
7804 byte_swap_32 (pdf->u_buf[0]),
7805 byte_swap_32 (pdf->u_buf[1]),
7806 byte_swap_32 (pdf->u_buf[2]),
7807 byte_swap_32 (pdf->u_buf[3]),
7808 byte_swap_32 (pdf->u_buf[4]),
7809 byte_swap_32 (pdf->u_buf[5]),
7810 byte_swap_32 (pdf->u_buf[6]),
7811 byte_swap_32 (pdf->u_buf[7]),
7812 pdf->o_len,
7813 byte_swap_32 (pdf->o_buf[0]),
7814 byte_swap_32 (pdf->o_buf[1]),
7815 byte_swap_32 (pdf->o_buf[2]),
7816 byte_swap_32 (pdf->o_buf[3]),
7817 byte_swap_32 (pdf->o_buf[4]),
7818 byte_swap_32 (pdf->o_buf[5]),
7819 byte_swap_32 (pdf->o_buf[6]),
7820 byte_swap_32 (pdf->o_buf[7])
7821 );
7822 }
7823 }
7824 else if (hash_mode == 10600)
7825 {
7826 uint digest_idx = salt.digests_offset + digest_pos;
7827
7828 hashinfo_t **hashinfo_ptr = data.hash_info;
7829 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7830
7831 snprintf (out_buf, len-1, "%s", hash_buf);
7832 }
7833 else if (hash_mode == 10700)
7834 {
7835 uint digest_idx = salt.digests_offset + digest_pos;
7836
7837 hashinfo_t **hashinfo_ptr = data.hash_info;
7838 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7839
7840 snprintf (out_buf, len-1, "%s", hash_buf);
7841 }
7842 else if (hash_mode == 10900)
7843 {
7844 uint digest_idx = salt.digests_offset + digest_pos;
7845
7846 hashinfo_t **hashinfo_ptr = data.hash_info;
7847 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7848
7849 snprintf (out_buf, len-1, "%s", hash_buf);
7850 }
7851 else if (hash_mode == 11100)
7852 {
7853 u32 salt_challenge = salt.salt_buf[0];
7854
7855 salt_challenge = byte_swap_32 (salt_challenge);
7856
7857 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7858
7859 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7860 SIGNATURE_POSTGRESQL_AUTH,
7861 user_name,
7862 salt_challenge,
7863 digest_buf[0],
7864 digest_buf[1],
7865 digest_buf[2],
7866 digest_buf[3]);
7867 }
7868 else if (hash_mode == 11200)
7869 {
7870 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7871 SIGNATURE_MYSQL_AUTH,
7872 (unsigned char *) salt.salt_buf,
7873 digest_buf[0],
7874 digest_buf[1],
7875 digest_buf[2],
7876 digest_buf[3],
7877 digest_buf[4]);
7878 }
7879 else if (hash_mode == 11300)
7880 {
7881 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7882
7883 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7884
7885 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7886 const uint ckey_len = bitcoin_wallet->ckey_len;
7887 const uint public_key_len = bitcoin_wallet->public_key_len;
7888
7889 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7890 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7891 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7892
7893 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7894 {
7895 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7896
7897 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7898 }
7899
7900 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7901 {
7902 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7903
7904 sprintf (ckey_buf + j, "%02x", ptr[i]);
7905 }
7906
7907 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7908 {
7909 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
7910
7911 sprintf (public_key_buf + j, "%02x", ptr[i]);
7912 }
7913
7914 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7915 SIGNATURE_BITCOIN_WALLET,
7916 cry_master_len * 2,
7917 cry_master_buf,
7918 salt.salt_len,
7919 (unsigned char *) salt.salt_buf,
7920 salt.salt_iter + 1,
7921 ckey_len * 2,
7922 ckey_buf,
7923 public_key_len * 2,
7924 public_key_buf
7925 );
7926
7927 free (cry_master_buf);
7928 free (ckey_buf);
7929 free (public_key_buf);
7930 }
7931 else if (hash_mode == 11400)
7932 {
7933 uint digest_idx = salt.digests_offset + digest_pos;
7934
7935 hashinfo_t **hashinfo_ptr = data.hash_info;
7936 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7937
7938 snprintf (out_buf, len-1, "%s", hash_buf);
7939 }
7940 else if (hash_mode == 11600)
7941 {
7942 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7943
7944 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7945
7946 const uint data_len = seven_zip->data_len;
7947
7948 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7949
7950 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7951 {
7952 const u8 *ptr = (const u8 *) seven_zip->data_buf;
7953
7954 sprintf (data_buf + j, "%02x", ptr[i]);
7955 }
7956
7957 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7958 SIGNATURE_SEVEN_ZIP,
7959 0,
7960 salt.salt_sign[0],
7961 0,
7962 (char *) seven_zip->salt_buf,
7963 seven_zip->iv_len,
7964 seven_zip->iv_buf[0],
7965 seven_zip->iv_buf[1],
7966 seven_zip->iv_buf[2],
7967 seven_zip->iv_buf[3],
7968 seven_zip->crc,
7969 seven_zip->data_len,
7970 seven_zip->unpack_size,
7971 data_buf);
7972
7973 free (data_buf);
7974 }
7975 else if (hash_mode == 11700)
7976 {
7977 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7978 digest_buf[0],
7979 digest_buf[1],
7980 digest_buf[2],
7981 digest_buf[3],
7982 digest_buf[4],
7983 digest_buf[5],
7984 digest_buf[6],
7985 digest_buf[7]);
7986 }
7987 else if (hash_mode == 11800)
7988 {
7989 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
7990 digest_buf[ 0],
7991 digest_buf[ 1],
7992 digest_buf[ 2],
7993 digest_buf[ 3],
7994 digest_buf[ 4],
7995 digest_buf[ 5],
7996 digest_buf[ 6],
7997 digest_buf[ 7],
7998 digest_buf[ 8],
7999 digest_buf[ 9],
8000 digest_buf[10],
8001 digest_buf[11],
8002 digest_buf[12],
8003 digest_buf[13],
8004 digest_buf[14],
8005 digest_buf[15]);
8006 }
8007 else if (hash_mode == 11900)
8008 {
8009 uint digest_idx = salt.digests_offset + digest_pos;
8010
8011 hashinfo_t **hashinfo_ptr = data.hash_info;
8012 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8013
8014 snprintf (out_buf, len-1, "%s", hash_buf);
8015 }
8016 else if (hash_mode == 12000)
8017 {
8018 uint digest_idx = salt.digests_offset + digest_pos;
8019
8020 hashinfo_t **hashinfo_ptr = data.hash_info;
8021 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8022
8023 snprintf (out_buf, len-1, "%s", hash_buf);
8024 }
8025 else if (hash_mode == 12100)
8026 {
8027 uint digest_idx = salt.digests_offset + digest_pos;
8028
8029 hashinfo_t **hashinfo_ptr = data.hash_info;
8030 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8031
8032 snprintf (out_buf, len-1, "%s", hash_buf);
8033 }
8034 else if (hash_mode == 12200)
8035 {
8036 uint *ptr_digest = digest_buf;
8037 uint *ptr_salt = salt.salt_buf;
8038
8039 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8040 SIGNATURE_ECRYPTFS,
8041 ptr_salt[0],
8042 ptr_salt[1],
8043 ptr_digest[0],
8044 ptr_digest[1]);
8045 }
8046 else if (hash_mode == 12300)
8047 {
8048 uint *ptr_digest = digest_buf;
8049 uint *ptr_salt = salt.salt_buf;
8050
8051 snprintf (out_buf, len-1, "%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X",
8052 ptr_digest[ 0], ptr_digest[ 1],
8053 ptr_digest[ 2], ptr_digest[ 3],
8054 ptr_digest[ 4], ptr_digest[ 5],
8055 ptr_digest[ 6], ptr_digest[ 7],
8056 ptr_digest[ 8], ptr_digest[ 9],
8057 ptr_digest[10], ptr_digest[11],
8058 ptr_digest[12], ptr_digest[13],
8059 ptr_digest[14], ptr_digest[15],
8060 ptr_salt[0],
8061 ptr_salt[1],
8062 ptr_salt[2],
8063 ptr_salt[3]);
8064 }
8065 else if (hash_mode == 12400)
8066 {
8067 // encode iteration count
8068
8069 char salt_iter[5] = { 0 };
8070
8071 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8072 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8073 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8074 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8075 salt_iter[4] = 0;
8076
8077 // encode salt
8078
8079 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8080 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8081 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8082 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8083 ptr_salt[4] = 0;
8084
8085 // encode digest
8086
8087 memset (tmp_buf, 0, sizeof (tmp_buf));
8088
8089 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8090 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8091
8092 memcpy (tmp_buf, digest_buf, 8);
8093
8094 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8095
8096 ptr_plain[11] = 0;
8097
8098 // fill the resulting buffer
8099
8100 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8101 }
8102 else if (hash_mode == 12500)
8103 {
8104 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8105 SIGNATURE_RAR3,
8106 byte_swap_32 (salt.salt_buf[0]),
8107 byte_swap_32 (salt.salt_buf[1]),
8108 salt.salt_buf[2],
8109 salt.salt_buf[3],
8110 salt.salt_buf[4],
8111 salt.salt_buf[5]);
8112 }
8113 else if (hash_mode == 12600)
8114 {
8115 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8116 digest_buf[0] + salt.salt_buf_pc[0],
8117 digest_buf[1] + salt.salt_buf_pc[1],
8118 digest_buf[2] + salt.salt_buf_pc[2],
8119 digest_buf[3] + salt.salt_buf_pc[3],
8120 digest_buf[4] + salt.salt_buf_pc[4],
8121 digest_buf[5] + salt.salt_buf_pc[5],
8122 digest_buf[6] + salt.salt_buf_pc[6],
8123 digest_buf[7] + salt.salt_buf_pc[7]);
8124 }
8125 else if (hash_mode == 12700)
8126 {
8127 uint digest_idx = salt.digests_offset + digest_pos;
8128
8129 hashinfo_t **hashinfo_ptr = data.hash_info;
8130 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8131
8132 snprintf (out_buf, len-1, "%s", hash_buf);
8133 }
8134 else if (hash_mode == 12800)
8135 {
8136 const u8 *ptr = (const u8 *) salt.salt_buf;
8137
8138 snprintf (out_buf, len-1, "%s,%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x,%d,%08x%08x%08x%08x%08x%08x%08x%08x",
8139 SIGNATURE_MS_DRSR,
8140 ptr[0],
8141 ptr[1],
8142 ptr[2],
8143 ptr[3],
8144 ptr[4],
8145 ptr[5],
8146 ptr[6],
8147 ptr[7],
8148 ptr[8],
8149 ptr[9],
8150 salt.salt_iter + 1,
8151 byte_swap_32 (digest_buf[0]),
8152 byte_swap_32 (digest_buf[1]),
8153 byte_swap_32 (digest_buf[2]),
8154 byte_swap_32 (digest_buf[3]),
8155 byte_swap_32 (digest_buf[4]),
8156 byte_swap_32 (digest_buf[5]),
8157 byte_swap_32 (digest_buf[6]),
8158 byte_swap_32 (digest_buf[7])
8159 );
8160 }
8161 else if (hash_mode == 12900)
8162 {
8163 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8164 salt.salt_buf[ 4],
8165 salt.salt_buf[ 5],
8166 salt.salt_buf[ 6],
8167 salt.salt_buf[ 7],
8168 salt.salt_buf[ 8],
8169 salt.salt_buf[ 9],
8170 salt.salt_buf[10],
8171 salt.salt_buf[11],
8172 byte_swap_32 (digest_buf[0]),
8173 byte_swap_32 (digest_buf[1]),
8174 byte_swap_32 (digest_buf[2]),
8175 byte_swap_32 (digest_buf[3]),
8176 byte_swap_32 (digest_buf[4]),
8177 byte_swap_32 (digest_buf[5]),
8178 byte_swap_32 (digest_buf[6]),
8179 byte_swap_32 (digest_buf[7]),
8180 salt.salt_buf[ 0],
8181 salt.salt_buf[ 1],
8182 salt.salt_buf[ 2],
8183 salt.salt_buf[ 3]
8184 );
8185 }
8186 else if (hash_mode == 13000)
8187 {
8188 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8189
8190 rar5_t *rar5 = &rar5s[salt_pos];
8191
8192 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8193 salt.salt_buf[0],
8194 salt.salt_buf[1],
8195 salt.salt_buf[2],
8196 salt.salt_buf[3],
8197 salt.salt_sign[0],
8198 rar5->iv[0],
8199 rar5->iv[1],
8200 rar5->iv[2],
8201 rar5->iv[3],
8202 byte_swap_32 (digest_buf[0]),
8203 byte_swap_32 (digest_buf[1])
8204 );
8205 }
8206 else
8207 {
8208 if (hash_type == HASH_TYPE_MD4)
8209 {
8210 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8211 digest_buf[0],
8212 digest_buf[1],
8213 digest_buf[2],
8214 digest_buf[3]);
8215 }
8216 else if (hash_type == HASH_TYPE_MD5)
8217 {
8218 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8219 digest_buf[0],
8220 digest_buf[1],
8221 digest_buf[2],
8222 digest_buf[3]);
8223 }
8224 else if (hash_type == HASH_TYPE_SHA1)
8225 {
8226 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8227 digest_buf[0],
8228 digest_buf[1],
8229 digest_buf[2],
8230 digest_buf[3],
8231 digest_buf[4]);
8232 }
8233 else if (hash_type == HASH_TYPE_SHA256)
8234 {
8235 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8236 digest_buf[0],
8237 digest_buf[1],
8238 digest_buf[2],
8239 digest_buf[3],
8240 digest_buf[4],
8241 digest_buf[5],
8242 digest_buf[6],
8243 digest_buf[7]);
8244 }
8245 else if (hash_type == HASH_TYPE_SHA384)
8246 {
8247 uint *ptr = digest_buf;
8248
8249 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8250 ptr[ 1], ptr[ 0],
8251 ptr[ 3], ptr[ 2],
8252 ptr[ 5], ptr[ 4],
8253 ptr[ 7], ptr[ 6],
8254 ptr[ 9], ptr[ 8],
8255 ptr[11], ptr[10]);
8256 }
8257 else if (hash_type == HASH_TYPE_SHA512)
8258 {
8259 uint *ptr = digest_buf;
8260
8261 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8262 ptr[ 1], ptr[ 0],
8263 ptr[ 3], ptr[ 2],
8264 ptr[ 5], ptr[ 4],
8265 ptr[ 7], ptr[ 6],
8266 ptr[ 9], ptr[ 8],
8267 ptr[11], ptr[10],
8268 ptr[13], ptr[12],
8269 ptr[15], ptr[14]);
8270 }
8271 else if (hash_type == HASH_TYPE_LM)
8272 {
8273 snprintf (out_buf, len-1, "%08x%08x",
8274 digest_buf[0],
8275 digest_buf[1]);
8276 }
8277 else if (hash_type == HASH_TYPE_ORACLEH)
8278 {
8279 snprintf (out_buf, len-1, "%08X%08X",
8280 digest_buf[0],
8281 digest_buf[1]);
8282 }
8283 else if (hash_type == HASH_TYPE_BCRYPT)
8284 {
8285 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8286 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8287
8288 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8289
8290 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8291 }
8292 else if (hash_type == HASH_TYPE_KECCAK)
8293 {
8294 uint *ptr = digest_buf;
8295
8296 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8297 ptr[ 1], ptr[ 0],
8298 ptr[ 3], ptr[ 2],
8299 ptr[ 5], ptr[ 4],
8300 ptr[ 7], ptr[ 6],
8301 ptr[ 9], ptr[ 8],
8302 ptr[11], ptr[10],
8303 ptr[13], ptr[12],
8304 ptr[15], ptr[14],
8305 ptr[17], ptr[16],
8306 ptr[19], ptr[18],
8307 ptr[21], ptr[20],
8308 ptr[23], ptr[22],
8309 ptr[25], ptr[24],
8310 ptr[27], ptr[26],
8311 ptr[29], ptr[28],
8312 ptr[31], ptr[30],
8313 ptr[33], ptr[32],
8314 ptr[35], ptr[34],
8315 ptr[37], ptr[36],
8316 ptr[39], ptr[38],
8317 ptr[41], ptr[30],
8318 ptr[43], ptr[42],
8319 ptr[45], ptr[44],
8320 ptr[47], ptr[46],
8321 ptr[49], ptr[48]
8322 );
8323
8324 out_buf[salt.keccak_mdlen * 2] = 0;
8325 }
8326 else if (hash_type == HASH_TYPE_RIPEMD160)
8327 {
8328 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8329 digest_buf[0],
8330 digest_buf[1],
8331 digest_buf[2],
8332 digest_buf[3],
8333 digest_buf[4]);
8334 }
8335 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8336 {
8337 digest_buf[ 0] = digest_buf[ 0];
8338 digest_buf[ 1] = digest_buf[ 1];
8339 digest_buf[ 2] = digest_buf[ 2];
8340 digest_buf[ 3] = digest_buf[ 3];
8341 digest_buf[ 4] = digest_buf[ 4];
8342 digest_buf[ 5] = digest_buf[ 5];
8343 digest_buf[ 6] = digest_buf[ 6];
8344 digest_buf[ 7] = digest_buf[ 7];
8345 digest_buf[ 8] = digest_buf[ 8];
8346 digest_buf[ 9] = digest_buf[ 9];
8347 digest_buf[10] = digest_buf[10];
8348 digest_buf[11] = digest_buf[11];
8349 digest_buf[12] = digest_buf[12];
8350 digest_buf[13] = digest_buf[13];
8351 digest_buf[14] = digest_buf[14];
8352 digest_buf[15] = digest_buf[15];
8353
8354 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8355 digest_buf[ 0],
8356 digest_buf[ 1],
8357 digest_buf[ 2],
8358 digest_buf[ 3],
8359 digest_buf[ 4],
8360 digest_buf[ 5],
8361 digest_buf[ 6],
8362 digest_buf[ 7],
8363 digest_buf[ 8],
8364 digest_buf[ 9],
8365 digest_buf[10],
8366 digest_buf[11],
8367 digest_buf[12],
8368 digest_buf[13],
8369 digest_buf[14],
8370 digest_buf[15]);
8371 }
8372 else if (hash_type == HASH_TYPE_GOST)
8373 {
8374 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8375 digest_buf[0],
8376 digest_buf[1],
8377 digest_buf[2],
8378 digest_buf[3],
8379 digest_buf[4],
8380 digest_buf[5],
8381 digest_buf[6],
8382 digest_buf[7]);
8383 }
8384 else if (hash_type == HASH_TYPE_MYSQL)
8385 {
8386 snprintf (out_buf, len-1, "%08x%08x",
8387 digest_buf[0],
8388 digest_buf[1]);
8389 }
8390 else if (hash_type == HASH_TYPE_LOTUS5)
8391 {
8392 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8393 digest_buf[0],
8394 digest_buf[1],
8395 digest_buf[2],
8396 digest_buf[3]);
8397 }
8398 else if (hash_type == HASH_TYPE_LOTUS6)
8399 {
8400 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8401 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8402 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8403 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8404
8405 char buf[16] = { 0 };
8406
8407 memcpy (buf + 0, salt.salt_buf, 5);
8408 memcpy (buf + 5, digest_buf, 9);
8409
8410 buf[3] -= -4;
8411
8412 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8413
8414 tmp_buf[18] = salt.salt_buf_pc[7];
8415 tmp_buf[19] = 0;
8416
8417 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8418 }
8419 else if (hash_type == HASH_TYPE_LOTUS8)
8420 {
8421 char buf[52] = { 0 };
8422
8423 // salt
8424
8425 memcpy (buf + 0, salt.salt_buf, 16);
8426
8427 buf[3] -= -4;
8428
8429 // iteration
8430
8431 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8432
8433 // chars
8434
8435 buf[26] = salt.salt_buf_pc[0];
8436 buf[27] = salt.salt_buf_pc[1];
8437
8438 // digest
8439
8440 memcpy (buf + 28, digest_buf, 8);
8441
8442 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8443
8444 tmp_buf[49] = 0;
8445
8446 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8447 }
8448 else if (hash_type == HASH_TYPE_CRC32)
8449 {
8450 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8451 }
8452 }
8453
8454 if (salt_type == SALT_TYPE_INTERN)
8455 {
8456 size_t pos = strlen (out_buf);
8457
8458 out_buf[pos] = data.separator;
8459
8460 char *ptr = (char *) salt.salt_buf;
8461
8462 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8463
8464 out_buf[pos + 1 + salt.salt_len] = 0;
8465 }
8466 }
8467
8468 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8469 {
8470 memset (hccap, 0, sizeof (hccap_t));
8471
8472 salt_t *salt = &data.salts_buf[salt_pos];
8473
8474 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8475
8476 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8477 wpa_t *wpa = &wpas[salt_pos];
8478
8479 hccap->keyver = wpa->keyver;
8480
8481 hccap->eapol_size = wpa->eapol_size;
8482
8483 if (wpa->keyver != 1)
8484 {
8485 uint eapol_tmp[64] = { 0 };
8486
8487 for (uint i = 0; i < 64; i++)
8488 {
8489 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8490 }
8491
8492 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8493 }
8494 else
8495 {
8496 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8497 }
8498
8499 uint pke_tmp[25] = { 0 };
8500
8501 for (int i = 5; i < 25; i++)
8502 {
8503 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8504 }
8505
8506 char *pke_ptr = (char *) pke_tmp;
8507
8508 memcpy (hccap->mac1, pke_ptr + 23, 6);
8509 memcpy (hccap->mac2, pke_ptr + 29, 6);
8510 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8511 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8512
8513 char *digests_buf_ptr = (char *) data.digests_buf;
8514
8515 uint dgst_size = data.dgst_size;
8516
8517 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8518
8519 if (wpa->keyver != 1)
8520 {
8521 uint digest_tmp[4] = { 0 };
8522
8523 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8524 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8525 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8526 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8527
8528 memcpy (hccap->keymic, digest_tmp, 16);
8529 }
8530 else
8531 {
8532 memcpy (hccap->keymic, digest_ptr, 16);
8533 }
8534 }
8535
8536 void SuspendThreads ()
8537 {
8538 if (data.devices_status == STATUS_RUNNING)
8539 {
8540 hc_timer_set (&data.timer_paused);
8541
8542 data.devices_status = STATUS_PAUSED;
8543
8544 log_info ("Paused");
8545 }
8546 }
8547
8548 void ResumeThreads ()
8549 {
8550 if (data.devices_status == STATUS_PAUSED)
8551 {
8552 float ms_paused;
8553
8554 hc_timer_get (data.timer_paused, ms_paused);
8555
8556 data.ms_paused += ms_paused;
8557
8558 data.devices_status = STATUS_RUNNING;
8559
8560 log_info ("Resumed");
8561 }
8562 }
8563
8564 void bypass ()
8565 {
8566 if (data.devices_status != STATUS_RUNNING) return;
8567
8568 data.devices_status = STATUS_BYPASS;
8569
8570 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8571 }
8572
8573 void stop_at_checkpoint ()
8574 {
8575 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8576 {
8577 if (data.devices_status != STATUS_RUNNING) return;
8578 }
8579
8580 // this feature only makes sense if --restore-disable was not specified
8581
8582 if (data.restore_disable == 1)
8583 {
8584 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8585
8586 return;
8587 }
8588
8589 // check if monitoring of Restore Point updates should be enabled or disabled
8590
8591 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8592 {
8593 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8594
8595 // save the current restore point value
8596
8597 data.checkpoint_cur_words = get_lowest_words_done ();
8598
8599 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8600 }
8601 else
8602 {
8603 data.devices_status = STATUS_RUNNING;
8604
8605 // reset the global value for checkpoint checks
8606
8607 data.checkpoint_cur_words = 0;
8608
8609 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8610 }
8611 }
8612
8613 void myabort ()
8614 {
8615 if (data.devices_status == STATUS_INIT) return;
8616 if (data.devices_status == STATUS_STARTING) return;
8617
8618 data.devices_status = STATUS_ABORTED;
8619 }
8620
8621 void myquit ()
8622 {
8623 if (data.devices_status == STATUS_INIT) return;
8624 if (data.devices_status == STATUS_STARTING) return;
8625
8626 data.devices_status = STATUS_QUIT;
8627 }
8628
8629 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8630 {
8631 FILE *fp = fopen (kernel_file, "rb");
8632
8633 if (fp != NULL)
8634 {
8635 struct stat st;
8636
8637 memset (&st, 0, sizeof (st));
8638
8639 stat (kernel_file, &st);
8640
8641 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8642
8643 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8644
8645 if (num_read != (size_t) st.st_size)
8646 {
8647 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8648
8649 exit (-1);
8650 }
8651
8652 fclose (fp);
8653
8654 buf[st.st_size] = 0;
8655
8656 for (int i = 0; i < num_devices; i++)
8657 {
8658 kernel_lengths[i] = (size_t) st.st_size;
8659
8660 kernel_sources[i] = buf;
8661 }
8662 }
8663 else
8664 {
8665 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8666
8667 exit (-1);
8668 }
8669
8670 return;
8671 }
8672
8673 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8674 {
8675 if (binary_size > 0)
8676 {
8677 FILE *fp = fopen (dst, "wb");
8678
8679 fwrite (binary, sizeof (u8), binary_size, fp);
8680
8681 fflush (fp);
8682 fclose (fp);
8683 }
8684 }
8685
8686 /**
8687 * restore
8688 */
8689
8690 restore_data_t *init_restore (int argc, char **argv)
8691 {
8692 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8693
8694 if (data.restore_disable == 0)
8695 {
8696 FILE *fp = fopen (data.eff_restore_file, "rb");
8697
8698 if (fp)
8699 {
8700 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8701
8702 if (nread != 1)
8703 {
8704 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8705
8706 exit (-1);
8707 }
8708
8709 fclose (fp);
8710
8711 if (rd->pid)
8712 {
8713 char pidbin[BUFSIZ] = { 0 };
8714
8715 int pidbin_len = -1;
8716
8717 #ifdef _POSIX
8718 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8719
8720 FILE *fd = fopen (pidbin, "rb");
8721
8722 if (fd)
8723 {
8724 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8725
8726 pidbin[pidbin_len] = 0;
8727
8728 fclose (fd);
8729
8730 char *argv0_r = strrchr (argv[0], '/');
8731
8732 char *pidbin_r = strrchr (pidbin, '/');
8733
8734 if (argv0_r == NULL) argv0_r = argv[0];
8735
8736 if (pidbin_r == NULL) pidbin_r = pidbin;
8737
8738 if (strcmp (argv0_r, pidbin_r) == 0)
8739 {
8740 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8741
8742 exit (-1);
8743 }
8744 }
8745
8746 #elif _WIN
8747 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8748
8749 char pidbin2[BUFSIZ] = { 0 };
8750
8751 int pidbin2_len = -1;
8752
8753 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8754 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8755
8756 pidbin[pidbin_len] = 0;
8757 pidbin2[pidbin2_len] = 0;
8758
8759 if (pidbin2_len)
8760 {
8761 if (strcmp (pidbin, pidbin2) == 0)
8762 {
8763 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8764
8765 exit (-1);
8766 }
8767 }
8768 #endif
8769 }
8770
8771 if (rd->version_bin < RESTORE_MIN)
8772 {
8773 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8774
8775 exit (-1);
8776 }
8777 }
8778 }
8779
8780 memset (rd, 0, sizeof (restore_data_t));
8781
8782 rd->version_bin = VERSION_BIN;
8783
8784 #ifdef _POSIX
8785 rd->pid = getpid ();
8786 #elif _WIN
8787 rd->pid = GetCurrentProcessId ();
8788 #endif
8789
8790 if (getcwd (rd->cwd, 255) == NULL)
8791 {
8792 myfree (rd);
8793
8794 return (NULL);
8795 }
8796
8797 rd->argc = argc;
8798 rd->argv = argv;
8799
8800 return (rd);
8801 }
8802
8803 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8804 {
8805 FILE *fp = fopen (eff_restore_file, "rb");
8806
8807 if (fp == NULL)
8808 {
8809 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8810
8811 exit (-1);
8812 }
8813
8814 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8815 {
8816 log_error ("ERROR: cannot read %s", eff_restore_file);
8817
8818 exit (-1);
8819 }
8820
8821 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8822
8823 for (uint i = 0; i < rd->argc; i++)
8824 {
8825 char buf[BUFSIZ] = { 0 };
8826
8827 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8828 {
8829 log_error ("ERROR: cannot read %s", eff_restore_file);
8830
8831 exit (-1);
8832 }
8833
8834 size_t len = strlen (buf);
8835
8836 if (len) buf[len - 1] = 0;
8837
8838 rd->argv[i] = mystrdup (buf);
8839 }
8840
8841 fclose (fp);
8842
8843 char new_cwd[1024] = { 0 };
8844
8845 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8846
8847 if (nwd == NULL)
8848 {
8849 log_error ("Restore file is corrupted");
8850 }
8851
8852 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8853 {
8854 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8855 {
8856 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8857
8858 exit (-1);
8859 }
8860
8861 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8862 }
8863
8864 if (chdir (rd->cwd))
8865 {
8866 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8867
8868 exit (-1);
8869 }
8870 }
8871
8872 u64 get_lowest_words_done ()
8873 {
8874 u64 words_cur = -1;
8875
8876 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8877 {
8878 hc_device_param_t *device_param = &data.devices_param[device_id];
8879
8880 if (device_param->skipped) continue;
8881
8882 const u64 words_done = device_param->words_done;
8883
8884 if (words_done < words_cur) words_cur = words_done;
8885 }
8886
8887 // It's possible that a device's workload isn't finished right after a restore-case.
8888 // In that case, this function would return 0 and overwrite the real restore point
8889 // There's also data.words_cur which is set to rd->words_cur but it changes while
8890 // the attack is running therefore we should stick to rd->words_cur.
8891 // Note that -s influences rd->words_cur we should keep a close look on that.
8892
8893 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8894
8895 return words_cur;
8896 }
8897
8898 void write_restore (const char *new_restore_file, restore_data_t *rd)
8899 {
8900 u64 words_cur = get_lowest_words_done ();
8901
8902 rd->words_cur = words_cur;
8903
8904 FILE *fp = fopen (new_restore_file, "wb");
8905
8906 if (fp == NULL)
8907 {
8908 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8909
8910 exit (-1);
8911 }
8912
8913 if (setvbuf (fp, NULL, _IONBF, 0))
8914 {
8915 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8916
8917 exit (-1);
8918 }
8919
8920 fwrite (rd, sizeof (restore_data_t), 1, fp);
8921
8922 for (uint i = 0; i < rd->argc; i++)
8923 {
8924 fprintf (fp, "%s", rd->argv[i]);
8925 fputc ('\n', fp);
8926 }
8927
8928 fflush (fp);
8929
8930 fsync (fileno (fp));
8931
8932 fclose (fp);
8933 }
8934
8935 void cycle_restore ()
8936 {
8937 const char *eff_restore_file = data.eff_restore_file;
8938 const char *new_restore_file = data.new_restore_file;
8939
8940 restore_data_t *rd = data.rd;
8941
8942 write_restore (new_restore_file, rd);
8943
8944 struct stat st;
8945
8946 memset (&st, 0, sizeof(st));
8947
8948 if (stat (eff_restore_file, &st) == 0)
8949 {
8950 if (unlink (eff_restore_file))
8951 {
8952 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8953 }
8954 }
8955
8956 if (rename (new_restore_file, eff_restore_file))
8957 {
8958 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8959 }
8960 }
8961
8962 void check_checkpoint ()
8963 {
8964 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8965
8966 u64 words_cur = get_lowest_words_done ();
8967
8968 if (words_cur != data.checkpoint_cur_words)
8969 {
8970 myabort ();
8971 }
8972 }
8973
8974 /**
8975 * adjustments
8976 */
8977
8978 uint set_kernel_accel (uint hash_mode)
8979 {
8980 switch (hash_mode)
8981 {
8982 case 0: return GET_ACCEL (0);
8983 case 10: return GET_ACCEL (10);
8984 case 11: return GET_ACCEL (11);
8985 case 12: return GET_ACCEL (12);
8986 case 20: return GET_ACCEL (20);
8987 case 21: return GET_ACCEL (21);
8988 case 22: return GET_ACCEL (22);
8989 case 23: return GET_ACCEL (23);
8990 case 30: return GET_ACCEL (30);
8991 case 40: return GET_ACCEL (40);
8992 case 50: return GET_ACCEL (50);
8993 case 60: return GET_ACCEL (60);
8994 case 100: return GET_ACCEL (100);
8995 case 101: return GET_ACCEL (101);
8996 case 110: return GET_ACCEL (110);
8997 case 111: return GET_ACCEL (111);
8998 case 112: return GET_ACCEL (112);
8999 case 120: return GET_ACCEL (120);
9000 case 121: return GET_ACCEL (121);
9001 case 122: return GET_ACCEL (122);
9002 case 124: return GET_ACCEL (124);
9003 case 130: return GET_ACCEL (130);
9004 case 131: return GET_ACCEL (131);
9005 case 132: return GET_ACCEL (132);
9006 case 133: return GET_ACCEL (133);
9007 case 140: return GET_ACCEL (140);
9008 case 141: return GET_ACCEL (141);
9009 case 150: return GET_ACCEL (150);
9010 case 160: return GET_ACCEL (160);
9011 case 190: return GET_ACCEL (190);
9012 case 200: return GET_ACCEL (200);
9013 case 300: return GET_ACCEL (300);
9014 case 400: return GET_ACCEL (400);
9015 case 500: return GET_ACCEL (500);
9016 case 501: return GET_ACCEL (501);
9017 case 900: return GET_ACCEL (900);
9018 case 910: return GET_ACCEL (910);
9019 case 1000: return GET_ACCEL (1000);
9020 case 1100: return GET_ACCEL (1100);
9021 case 1400: return GET_ACCEL (1400);
9022 case 1410: return GET_ACCEL (1410);
9023 case 1420: return GET_ACCEL (1420);
9024 case 1421: return GET_ACCEL (1421);
9025 case 1430: return GET_ACCEL (1430);
9026 case 1440: return GET_ACCEL (1440);
9027 case 1441: return GET_ACCEL (1441);
9028 case 1450: return GET_ACCEL (1450);
9029 case 1460: return GET_ACCEL (1460);
9030 case 1500: return GET_ACCEL (1500);
9031 case 1600: return GET_ACCEL (1600);
9032 case 1700: return GET_ACCEL (1700);
9033 case 1710: return GET_ACCEL (1710);
9034 case 1711: return GET_ACCEL (1711);
9035 case 1720: return GET_ACCEL (1720);
9036 case 1722: return GET_ACCEL (1722);
9037 case 1730: return GET_ACCEL (1730);
9038 case 1731: return GET_ACCEL (1731);
9039 case 1740: return GET_ACCEL (1740);
9040 case 1750: return GET_ACCEL (1750);
9041 case 1760: return GET_ACCEL (1760);
9042 case 1800: return GET_ACCEL (1800);
9043 case 2100: return GET_ACCEL (2100);
9044 case 2400: return GET_ACCEL (2400);
9045 case 2410: return GET_ACCEL (2410);
9046 case 2500: return GET_ACCEL (2500);
9047 case 2600: return GET_ACCEL (2600);
9048 case 2611: return GET_ACCEL (2611);
9049 case 2612: return GET_ACCEL (2612);
9050 case 2711: return GET_ACCEL (2711);
9051 case 2811: return GET_ACCEL (2811);
9052 case 3000: return GET_ACCEL (3000);
9053 case 3100: return GET_ACCEL (3100);
9054 case 3200: return GET_ACCEL (3200);
9055 case 3710: return GET_ACCEL (3710);
9056 case 3711: return GET_ACCEL (3711);
9057 case 3800: return GET_ACCEL (3800);
9058 case 4300: return GET_ACCEL (4300);
9059 case 4400: return GET_ACCEL (4400);
9060 case 4500: return GET_ACCEL (4500);
9061 case 4700: return GET_ACCEL (4700);
9062 case 4800: return GET_ACCEL (4800);
9063 case 4900: return GET_ACCEL (4900);
9064 case 5000: return GET_ACCEL (5000);
9065 case 5100: return GET_ACCEL (5100);
9066 case 5200: return GET_ACCEL (5200);
9067 case 5300: return GET_ACCEL (5300);
9068 case 5400: return GET_ACCEL (5400);
9069 case 5500: return GET_ACCEL (5500);
9070 case 5600: return GET_ACCEL (5600);
9071 case 5700: return GET_ACCEL (5700);
9072 case 5800: return GET_ACCEL (5800);
9073 case 6000: return GET_ACCEL (6000);
9074 case 6100: return GET_ACCEL (6100);
9075 case 6211: return GET_ACCEL (6211);
9076 case 6212: return GET_ACCEL (6212);
9077 case 6213: return GET_ACCEL (6213);
9078 case 6221: return GET_ACCEL (6221);
9079 case 6222: return GET_ACCEL (6222);
9080 case 6223: return GET_ACCEL (6223);
9081 case 6231: return GET_ACCEL (6231);
9082 case 6232: return GET_ACCEL (6232);
9083 case 6233: return GET_ACCEL (6233);
9084 case 6241: return GET_ACCEL (6241);
9085 case 6242: return GET_ACCEL (6242);
9086 case 6243: return GET_ACCEL (6243);
9087 case 6300: return GET_ACCEL (6300);
9088 case 6400: return GET_ACCEL (6400);
9089 case 6500: return GET_ACCEL (6500);
9090 case 6600: return GET_ACCEL (6600);
9091 case 6700: return GET_ACCEL (6700);
9092 case 6800: return GET_ACCEL (6800);
9093 case 6900: return GET_ACCEL (6900);
9094 case 7100: return GET_ACCEL (7100);
9095 case 7200: return GET_ACCEL (7200);
9096 case 7300: return GET_ACCEL (7300);
9097 case 7400: return GET_ACCEL (7400);
9098 case 7500: return GET_ACCEL (7500);
9099 case 7600: return GET_ACCEL (7600);
9100 case 7700: return GET_ACCEL (7700);
9101 case 7800: return GET_ACCEL (7800);
9102 case 7900: return GET_ACCEL (7900);
9103 case 8000: return GET_ACCEL (8000);
9104 case 8100: return GET_ACCEL (8100);
9105 case 8200: return GET_ACCEL (8200);
9106 case 8300: return GET_ACCEL (8300);
9107 case 8400: return GET_ACCEL (8400);
9108 case 8500: return GET_ACCEL (8500);
9109 case 8600: return GET_ACCEL (8600);
9110 case 8700: return GET_ACCEL (8700);
9111 case 8800: return GET_ACCEL (8800);
9112 case 8900: return GET_ACCEL (8900);
9113 case 9000: return GET_ACCEL (9000);
9114 case 9100: return GET_ACCEL (9100);
9115 case 9200: return GET_ACCEL (9200);
9116 case 9300: return GET_ACCEL (9300);
9117 case 9400: return GET_ACCEL (9400);
9118 case 9500: return GET_ACCEL (9500);
9119 case 9600: return GET_ACCEL (9600);
9120 case 9700: return GET_ACCEL (9700);
9121 case 9710: return GET_ACCEL (9710);
9122 case 9720: return GET_ACCEL (9720);
9123 case 9800: return GET_ACCEL (9800);
9124 case 9810: return GET_ACCEL (9810);
9125 case 9820: return GET_ACCEL (9820);
9126 case 9900: return GET_ACCEL (9900);
9127 case 10000: return GET_ACCEL (10000);
9128 case 10100: return GET_ACCEL (10100);
9129 case 10200: return GET_ACCEL (10200);
9130 case 10300: return GET_ACCEL (10300);
9131 case 10400: return GET_ACCEL (10400);
9132 case 10410: return GET_ACCEL (10410);
9133 case 10420: return GET_ACCEL (10420);
9134 case 10500: return GET_ACCEL (10500);
9135 case 10600: return GET_ACCEL (10600);
9136 case 10700: return GET_ACCEL (10700);
9137 case 10800: return GET_ACCEL (10800);
9138 case 10900: return GET_ACCEL (10900);
9139 case 11000: return GET_ACCEL (11000);
9140 case 11100: return GET_ACCEL (11100);
9141 case 11200: return GET_ACCEL (11200);
9142 case 11300: return GET_ACCEL (11300);
9143 case 11400: return GET_ACCEL (11400);
9144 case 11500: return GET_ACCEL (11500);
9145 case 11600: return GET_ACCEL (11600);
9146 case 11700: return GET_ACCEL (11700);
9147 case 11800: return GET_ACCEL (11800);
9148 case 11900: return GET_ACCEL (11900);
9149 case 12000: return GET_ACCEL (12000);
9150 case 12100: return GET_ACCEL (12100);
9151 case 12200: return GET_ACCEL (12200);
9152 case 12300: return GET_ACCEL (12300);
9153 case 12400: return GET_ACCEL (12400);
9154 case 12500: return GET_ACCEL (12500);
9155 case 12600: return GET_ACCEL (12600);
9156 case 12700: return GET_ACCEL (12700);
9157 case 12800: return GET_ACCEL (12800);
9158 case 12900: return GET_ACCEL (12900);
9159 case 13000: return GET_ACCEL (13000);
9160 }
9161
9162 return 0;
9163 }
9164
9165 uint set_kernel_loops (uint hash_mode)
9166 {
9167 switch (hash_mode)
9168 {
9169 case 0: return GET_LOOPS (0);
9170 case 10: return GET_LOOPS (10);
9171 case 11: return GET_LOOPS (11);
9172 case 12: return GET_LOOPS (12);
9173 case 20: return GET_LOOPS (20);
9174 case 21: return GET_LOOPS (21);
9175 case 22: return GET_LOOPS (22);
9176 case 23: return GET_LOOPS (23);
9177 case 30: return GET_LOOPS (30);
9178 case 40: return GET_LOOPS (40);
9179 case 50: return GET_LOOPS (50);
9180 case 60: return GET_LOOPS (60);
9181 case 100: return GET_LOOPS (100);
9182 case 101: return GET_LOOPS (101);
9183 case 110: return GET_LOOPS (110);
9184 case 111: return GET_LOOPS (111);
9185 case 112: return GET_LOOPS (112);
9186 case 120: return GET_LOOPS (120);
9187 case 121: return GET_LOOPS (121);
9188 case 122: return GET_LOOPS (122);
9189 case 124: return GET_LOOPS (124);
9190 case 130: return GET_LOOPS (130);
9191 case 131: return GET_LOOPS (131);
9192 case 132: return GET_LOOPS (132);
9193 case 133: return GET_LOOPS (133);
9194 case 140: return GET_LOOPS (140);
9195 case 141: return GET_LOOPS (141);
9196 case 150: return GET_LOOPS (150);
9197 case 160: return GET_LOOPS (160);
9198 case 190: return GET_LOOPS (190);
9199 case 200: return GET_LOOPS (200);
9200 case 300: return GET_LOOPS (300);
9201 case 400: return GET_LOOPS (400);
9202 case 500: return GET_LOOPS (500);
9203 case 501: return GET_LOOPS (501);
9204 case 900: return GET_LOOPS (900);
9205 case 910: return GET_LOOPS (910);
9206 case 1000: return GET_LOOPS (1000);
9207 case 1100: return GET_LOOPS (1100);
9208 case 1400: return GET_LOOPS (1400);
9209 case 1410: return GET_LOOPS (1410);
9210 case 1420: return GET_LOOPS (1420);
9211 case 1421: return GET_LOOPS (1421);
9212 case 1430: return GET_LOOPS (1430);
9213 case 1440: return GET_LOOPS (1440);
9214 case 1441: return GET_LOOPS (1441);
9215 case 1450: return GET_LOOPS (1450);
9216 case 1460: return GET_LOOPS (1460);
9217 case 1500: return GET_LOOPS (1500);
9218 case 1600: return GET_LOOPS (1600);
9219 case 1700: return GET_LOOPS (1700);
9220 case 1710: return GET_LOOPS (1710);
9221 case 1711: return GET_LOOPS (1711);
9222 case 1720: return GET_LOOPS (1720);
9223 case 1722: return GET_LOOPS (1722);
9224 case 1730: return GET_LOOPS (1730);
9225 case 1731: return GET_LOOPS (1731);
9226 case 1740: return GET_LOOPS (1740);
9227 case 1750: return GET_LOOPS (1750);
9228 case 1760: return GET_LOOPS (1760);
9229 case 1800: return GET_LOOPS (1800);
9230 case 2100: return GET_LOOPS (2100);
9231 case 2400: return GET_LOOPS (2400);
9232 case 2410: return GET_LOOPS (2410);
9233 case 2500: return GET_LOOPS (2500);
9234 case 2600: return GET_LOOPS (2600);
9235 case 2611: return GET_LOOPS (2611);
9236 case 2612: return GET_LOOPS (2612);
9237 case 2711: return GET_LOOPS (2711);
9238 case 2811: return GET_LOOPS (2811);
9239 case 3000: return GET_LOOPS (3000);
9240 case 3100: return GET_LOOPS (3100);
9241 case 3200: return GET_LOOPS (3200);
9242 case 3710: return GET_LOOPS (3710);
9243 case 3711: return GET_LOOPS (3711);
9244 case 3800: return GET_LOOPS (3800);
9245 case 4300: return GET_LOOPS (4300);
9246 case 4400: return GET_LOOPS (4400);
9247 case 4500: return GET_LOOPS (4500);
9248 case 4700: return GET_LOOPS (4700);
9249 case 4800: return GET_LOOPS (4800);
9250 case 4900: return GET_LOOPS (4900);
9251 case 5000: return GET_LOOPS (5000);
9252 case 5100: return GET_LOOPS (5100);
9253 case 5200: return GET_LOOPS (5200);
9254 case 5300: return GET_LOOPS (5300);
9255 case 5400: return GET_LOOPS (5400);
9256 case 5500: return GET_LOOPS (5500);
9257 case 5600: return GET_LOOPS (5600);
9258 case 5700: return GET_LOOPS (5700);
9259 case 5800: return GET_LOOPS (5800);
9260 case 6000: return GET_LOOPS (6000);
9261 case 6100: return GET_LOOPS (6100);
9262 case 6211: return GET_LOOPS (6211);
9263 case 6212: return GET_LOOPS (6212);
9264 case 6213: return GET_LOOPS (6213);
9265 case 6221: return GET_LOOPS (6221);
9266 case 6222: return GET_LOOPS (6222);
9267 case 6223: return GET_LOOPS (6223);
9268 case 6231: return GET_LOOPS (6231);
9269 case 6232: return GET_LOOPS (6232);
9270 case 6233: return GET_LOOPS (6233);
9271 case 6241: return GET_LOOPS (6241);
9272 case 6242: return GET_LOOPS (6242);
9273 case 6243: return GET_LOOPS (6243);
9274 case 6300: return GET_LOOPS (6300);
9275 case 6400: return GET_LOOPS (6400);
9276 case 6500: return GET_LOOPS (6500);
9277 case 6600: return GET_LOOPS (6600);
9278 case 6700: return GET_LOOPS (6700);
9279 case 6800: return GET_LOOPS (6800);
9280 case 6900: return GET_LOOPS (6900);
9281 case 7100: return GET_LOOPS (7100);
9282 case 7200: return GET_LOOPS (7200);
9283 case 7300: return GET_LOOPS (7300);
9284 case 7400: return GET_LOOPS (7400);
9285 case 7500: return GET_LOOPS (7500);
9286 case 7600: return GET_LOOPS (7600);
9287 case 7700: return GET_LOOPS (7700);
9288 case 7800: return GET_LOOPS (7800);
9289 case 7900: return GET_LOOPS (7900);
9290 case 8000: return GET_LOOPS (8000);
9291 case 8100: return GET_LOOPS (8100);
9292 case 8200: return GET_LOOPS (8200);
9293 case 8300: return GET_LOOPS (8300);
9294 case 8400: return GET_LOOPS (8400);
9295 case 8500: return GET_LOOPS (8500);
9296 case 8600: return GET_LOOPS (8600);
9297 case 8700: return GET_LOOPS (8700);
9298 case 8800: return GET_LOOPS (8800);
9299 case 8900: return GET_LOOPS (8900);
9300 case 9000: return GET_LOOPS (9000);
9301 case 9100: return GET_LOOPS (9100);
9302 case 9200: return GET_LOOPS (9200);
9303 case 9300: return GET_LOOPS (9300);
9304 case 9400: return GET_LOOPS (9400);
9305 case 9500: return GET_LOOPS (9500);
9306 case 9600: return GET_LOOPS (9600);
9307 case 9700: return GET_LOOPS (9700);
9308 case 9710: return GET_LOOPS (9710);
9309 case 9720: return GET_LOOPS (9720);
9310 case 9800: return GET_LOOPS (9800);
9311 case 9810: return GET_LOOPS (9810);
9312 case 9820: return GET_LOOPS (9820);
9313 case 9900: return GET_LOOPS (9900);
9314 case 10000: return GET_LOOPS (10000);
9315 case 10100: return GET_LOOPS (10100);
9316 case 10200: return GET_LOOPS (10200);
9317 case 10300: return GET_LOOPS (10300);
9318 case 10400: return GET_LOOPS (10400);
9319 case 10410: return GET_LOOPS (10410);
9320 case 10420: return GET_LOOPS (10420);
9321 case 10500: return GET_LOOPS (10500);
9322 case 10600: return GET_LOOPS (10600);
9323 case 10700: return GET_LOOPS (10700);
9324 case 10800: return GET_LOOPS (10800);
9325 case 10900: return GET_LOOPS (10900);
9326 case 11000: return GET_LOOPS (11000);
9327 case 11100: return GET_LOOPS (11100);
9328 case 11200: return GET_LOOPS (11200);
9329 case 11300: return GET_LOOPS (11300);
9330 case 11400: return GET_LOOPS (11400);
9331 case 11500: return GET_LOOPS (11500);
9332 case 11600: return GET_LOOPS (11600);
9333 case 11700: return GET_LOOPS (11700);
9334 case 11800: return GET_LOOPS (11800);
9335 case 11900: return GET_LOOPS (11900);
9336 case 12000: return GET_LOOPS (12000);
9337 case 12100: return GET_LOOPS (12100);
9338 case 12200: return GET_LOOPS (12200);
9339 case 12300: return GET_LOOPS (12300);
9340 case 12400: return GET_LOOPS (12400);
9341 case 12500: return GET_LOOPS (12500);
9342 case 12600: return GET_LOOPS (12600);
9343 case 12700: return GET_LOOPS (12700);
9344 case 12800: return GET_LOOPS (12800);
9345 case 12900: return GET_LOOPS (12900);
9346 case 13000: return GET_LOOPS (13000);
9347 }
9348
9349 return 0;
9350 }
9351
9352 /**
9353 * parser
9354 */
9355
9356 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9357 {
9358 u8 tmp[256] = { 0 };
9359
9360 if (salt_len > sizeof (tmp))
9361 {
9362 return UINT_MAX;
9363 }
9364
9365 memcpy (tmp, in, salt_len);
9366
9367 if (data.opts_type & OPTS_TYPE_ST_HEX)
9368 {
9369 if ((salt_len % 2) == 0)
9370 {
9371 u32 new_salt_len = salt_len / 2;
9372
9373 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9374 {
9375 u8 p0 = tmp[j + 0];
9376 u8 p1 = tmp[j + 1];
9377
9378 tmp[i] = hex_convert (p1) << 0;
9379 tmp[i] |= hex_convert (p0) << 4;
9380 }
9381
9382 salt_len = new_salt_len;
9383 }
9384 else
9385 {
9386 return UINT_MAX;
9387 }
9388 }
9389 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9390 {
9391 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9392 }
9393
9394 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9395
9396 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9397 {
9398 if (salt_len < 20)
9399 {
9400 u32 *tmp_uint = (u32 *) tmp;
9401
9402 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9403 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9404 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9405 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9406 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9407 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9408 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9409 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9410 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9411 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9412
9413 salt_len = salt_len * 2;
9414 }
9415 else
9416 {
9417 return UINT_MAX;
9418 }
9419 }
9420
9421 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9422 {
9423 lowercase (tmp, salt_len);
9424 }
9425
9426 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9427 {
9428 uppercase (tmp, salt_len);
9429 }
9430
9431 u32 len = salt_len;
9432
9433 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9434 {
9435 tmp[len++] = 0x80;
9436 }
9437
9438 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9439 {
9440 tmp[len++] = 0x01;
9441 }
9442
9443 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9444 {
9445 u32 *tmp_uint = (uint *) tmp;
9446
9447 u32 max = len / 4;
9448
9449 if (len % 4) max++;
9450
9451 for (u32 i = 0; i < max; i++)
9452 {
9453 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9454 }
9455
9456 // Important: we may need to increase the length of memcpy since
9457 // we don't want to "loose" some swapped bytes (could happen if
9458 // they do not perfectly fit in the 4-byte blocks)
9459 // Memcpy does always copy the bytes in the BE order, but since
9460 // we swapped them, some important bytes could be in positions
9461 // we normally skip with the original len
9462
9463 if (len % 4) len += 4 - (len % 4);
9464 }
9465
9466 memcpy (out, tmp, len);
9467
9468 return (salt_len);
9469 }
9470
9471 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9472 {
9473 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9474
9475 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9476
9477 u32 *digest = (u32 *) hash_buf->digest;
9478
9479 salt_t *salt = hash_buf->salt;
9480
9481 memcpy ((char *) salt->salt_sign, input_buf, 6);
9482
9483 char *iter_pos = input_buf + 4;
9484
9485 salt->salt_iter = 1 << atoi (iter_pos);
9486
9487 char *salt_pos = strchr (iter_pos, '$');
9488
9489 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9490
9491 salt_pos++;
9492
9493 uint salt_len = 16;
9494
9495 salt->salt_len = salt_len;
9496
9497 u8 tmp_buf[100] = { 0 };
9498
9499 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9500
9501 char *salt_buf_ptr = (char *) salt->salt_buf;
9502
9503 memcpy (salt_buf_ptr, tmp_buf, 16);
9504
9505 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9506 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9507 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9508 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9509
9510 char *hash_pos = salt_pos + 22;
9511
9512 memset (tmp_buf, 0, sizeof (tmp_buf));
9513
9514 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9515
9516 memcpy (digest, tmp_buf, 24);
9517
9518 digest[0] = byte_swap_32 (digest[0]);
9519 digest[1] = byte_swap_32 (digest[1]);
9520 digest[2] = byte_swap_32 (digest[2]);
9521 digest[3] = byte_swap_32 (digest[3]);
9522 digest[4] = byte_swap_32 (digest[4]);
9523 digest[5] = byte_swap_32 (digest[5]);
9524
9525 digest[5] &= ~0xff; // its just 23 not 24 !
9526
9527 return (PARSER_OK);
9528 }
9529
9530 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9531 {
9532 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9533
9534 u32 *digest = (u32 *) hash_buf->digest;
9535
9536 u8 tmp_buf[100] = { 0 };
9537
9538 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9539
9540 memcpy (digest, tmp_buf, 32);
9541
9542 digest[0] = byte_swap_32 (digest[0]);
9543 digest[1] = byte_swap_32 (digest[1]);
9544 digest[2] = byte_swap_32 (digest[2]);
9545 digest[3] = byte_swap_32 (digest[3]);
9546 digest[4] = byte_swap_32 (digest[4]);
9547 digest[5] = byte_swap_32 (digest[5]);
9548 digest[6] = byte_swap_32 (digest[6]);
9549 digest[7] = byte_swap_32 (digest[7]);
9550
9551 digest[0] -= SHA256M_A;
9552 digest[1] -= SHA256M_B;
9553 digest[2] -= SHA256M_C;
9554 digest[3] -= SHA256M_D;
9555 digest[4] -= SHA256M_E;
9556 digest[5] -= SHA256M_F;
9557 digest[6] -= SHA256M_G;
9558 digest[7] -= SHA256M_H;
9559
9560 return (PARSER_OK);
9561 }
9562
9563 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9564 {
9565 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9566
9567 u32 *digest = (u32 *) hash_buf->digest;
9568
9569 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9570 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9571
9572 digest[0] = byte_swap_32 (digest[0]);
9573 digest[1] = byte_swap_32 (digest[1]);
9574
9575 uint tt;
9576
9577 IP (digest[0], digest[1], tt);
9578
9579 digest[0] = digest[0];
9580 digest[1] = digest[1];
9581 digest[2] = 0;
9582 digest[3] = 0;
9583
9584 return (PARSER_OK);
9585 }
9586
9587 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9588 {
9589 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9590
9591 u32 *digest = (u32 *) hash_buf->digest;
9592
9593 salt_t *salt = hash_buf->salt;
9594
9595 char *hash_pos = input_buf + 8;
9596
9597 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9598 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9599 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9600 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9601 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9602
9603 digest[0] -= SHA1M_A;
9604 digest[1] -= SHA1M_B;
9605 digest[2] -= SHA1M_C;
9606 digest[3] -= SHA1M_D;
9607 digest[4] -= SHA1M_E;
9608
9609 uint salt_len = 8;
9610
9611 char *salt_buf_ptr = (char *) salt->salt_buf;
9612
9613 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9614
9615 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9616
9617 salt->salt_len = salt_len;
9618
9619 return (PARSER_OK);
9620 }
9621
9622 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9623 {
9624 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9625
9626 u64 *digest = (u64 *) hash_buf->digest;
9627
9628 salt_t *salt = hash_buf->salt;
9629
9630 char *hash_pos = input_buf + 8;
9631
9632 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9633 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9634 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9635 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9636 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9637 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9638 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9639 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9640
9641 digest[0] -= SHA512M_A;
9642 digest[1] -= SHA512M_B;
9643 digest[2] -= SHA512M_C;
9644 digest[3] -= SHA512M_D;
9645 digest[4] -= SHA512M_E;
9646 digest[5] -= SHA512M_F;
9647 digest[6] -= SHA512M_G;
9648 digest[7] -= SHA512M_H;
9649
9650 uint salt_len = 8;
9651
9652 char *salt_buf_ptr = (char *) salt->salt_buf;
9653
9654 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9655
9656 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9657
9658 salt->salt_len = salt_len;
9659
9660 return (PARSER_OK);
9661 }
9662
9663 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9664 {
9665 if (data.opts_type & OPTS_TYPE_ST_HEX)
9666 {
9667 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9668 }
9669 else
9670 {
9671 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9672 }
9673
9674 u32 *digest = (u32 *) hash_buf->digest;
9675
9676 salt_t *salt = hash_buf->salt;
9677
9678 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9679 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9680 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9681 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9682
9683 digest[0] = byte_swap_32 (digest[0]);
9684 digest[1] = byte_swap_32 (digest[1]);
9685 digest[2] = byte_swap_32 (digest[2]);
9686 digest[3] = byte_swap_32 (digest[3]);
9687
9688 digest[0] -= MD5M_A;
9689 digest[1] -= MD5M_B;
9690 digest[2] -= MD5M_C;
9691 digest[3] -= MD5M_D;
9692
9693 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9694
9695 uint salt_len = input_len - 32 - 1;
9696
9697 char *salt_buf = input_buf + 32 + 1;
9698
9699 char *salt_buf_ptr = (char *) salt->salt_buf;
9700
9701 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9702
9703 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9704
9705 salt->salt_len = salt_len;
9706
9707 return (PARSER_OK);
9708 }
9709
9710 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9711 {
9712 if (data.opts_type & OPTS_TYPE_ST_HEX)
9713 {
9714 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9715 }
9716 else
9717 {
9718 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9719 }
9720
9721 // unscramble
9722
9723 char clean_input_buf[32] = { 0 };
9724
9725 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9726 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9727
9728 for (int i = 0, j = 0, k = 0; i < 30; i++)
9729 {
9730 if (i == pos[j])
9731 {
9732 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9733
9734 j++;
9735 }
9736 else
9737 {
9738 clean_input_buf[k] = input_buf[i];
9739
9740 k++;
9741 }
9742 }
9743
9744 // base64 decode
9745
9746 u32 *digest = (u32 *) hash_buf->digest;
9747
9748 salt_t *salt = hash_buf->salt;
9749
9750 u32 a, b, c, d, e, f;
9751
9752 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9753 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9754 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9755 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9756 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9757 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9758
9759 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9760 | (((d << 12) | (e << 6) | (f)) << 0);
9761
9762 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9763 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9764 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9765 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9766 e = base64_to_int (clean_input_buf[10] & 0x7f);
9767 f = base64_to_int (clean_input_buf[11] & 0x7f);
9768
9769 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9770 | (((d << 12) | (e << 6) | (f)) << 0);
9771
9772 a = base64_to_int (clean_input_buf[12] & 0x7f);
9773 b = base64_to_int (clean_input_buf[13] & 0x7f);
9774 c = base64_to_int (clean_input_buf[14] & 0x7f);
9775 d = base64_to_int (clean_input_buf[15] & 0x7f);
9776 e = base64_to_int (clean_input_buf[16] & 0x7f);
9777 f = base64_to_int (clean_input_buf[17] & 0x7f);
9778
9779 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9780 | (((d << 12) | (e << 6) | (f)) << 0);
9781
9782 a = base64_to_int (clean_input_buf[18] & 0x7f);
9783 b = base64_to_int (clean_input_buf[19] & 0x7f);
9784 c = base64_to_int (clean_input_buf[20] & 0x7f);
9785 d = base64_to_int (clean_input_buf[21] & 0x7f);
9786 e = base64_to_int (clean_input_buf[22] & 0x7f);
9787 f = base64_to_int (clean_input_buf[23] & 0x7f);
9788
9789 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9790 | (((d << 12) | (e << 6) | (f)) << 0);
9791
9792 digest[0] = byte_swap_32 (digest[0]);
9793 digest[1] = byte_swap_32 (digest[1]);
9794 digest[2] = byte_swap_32 (digest[2]);
9795 digest[3] = byte_swap_32 (digest[3]);
9796
9797 digest[0] -= MD5M_A;
9798 digest[1] -= MD5M_B;
9799 digest[2] -= MD5M_C;
9800 digest[3] -= MD5M_D;
9801
9802 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9803
9804 uint salt_len = input_len - 30 - 1;
9805
9806 char *salt_buf = input_buf + 30 + 1;
9807
9808 char *salt_buf_ptr = (char *) salt->salt_buf;
9809
9810 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9811
9812 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9813 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9814
9815 salt->salt_len = salt_len;
9816
9817 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9818
9819 salt->salt_len += 22;
9820
9821 return (PARSER_OK);
9822 }
9823
9824 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9825 {
9826 if (data.opts_type & OPTS_TYPE_ST_HEX)
9827 {
9828 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9829 }
9830 else
9831 {
9832 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9833 }
9834
9835 u32 *digest = (u32 *) hash_buf->digest;
9836
9837 salt_t *salt = hash_buf->salt;
9838
9839 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9840 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9841 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9842 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9843 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
9844
9845 digest[0] -= SHA1M_A;
9846 digest[1] -= SHA1M_B;
9847 digest[2] -= SHA1M_C;
9848 digest[3] -= SHA1M_D;
9849 digest[4] -= SHA1M_E;
9850
9851 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9852
9853 uint salt_len = input_len - 40 - 1;
9854
9855 char *salt_buf = input_buf + 40 + 1;
9856
9857 char *salt_buf_ptr = (char *) salt->salt_buf;
9858
9859 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9860
9861 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9862
9863 salt->salt_len = salt_len;
9864
9865 return (PARSER_OK);
9866 }
9867
9868 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9869 {
9870 if (data.opts_type & OPTS_TYPE_ST_HEX)
9871 {
9872 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9873 }
9874 else
9875 {
9876 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9877 }
9878
9879 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9880
9881 char *iter_pos = input_buf + 6;
9882
9883 salt_t *salt = hash_buf->salt;
9884
9885 uint iter = atoi (iter_pos);
9886
9887 if (iter < 1)
9888 {
9889 iter = ROUNDS_DCC2;
9890 }
9891
9892 salt->salt_iter = iter - 1;
9893
9894 char *salt_pos = strchr (iter_pos, '#');
9895
9896 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9897
9898 salt_pos++;
9899
9900 char *digest_pos = strchr (salt_pos, '#');
9901
9902 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9903
9904 digest_pos++;
9905
9906 uint salt_len = digest_pos - salt_pos - 1;
9907
9908 u32 *digest = (u32 *) hash_buf->digest;
9909
9910 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
9911 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
9912 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
9913 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
9914
9915 char *salt_buf_ptr = (char *) salt->salt_buf;
9916
9917 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9918
9919 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9920
9921 salt->salt_len = salt_len;
9922
9923 return (PARSER_OK);
9924 }
9925
9926 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9927 {
9928 u32 *digest = (u32 *) hash_buf->digest;
9929
9930 salt_t *salt = hash_buf->salt;
9931
9932 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9933
9934 hccap_t in;
9935
9936 memcpy (&in, input_buf, input_len);
9937
9938 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9939
9940 memcpy (digest, in.keymic, 16);
9941
9942 /*
9943 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9944 The phrase "Pairwise key expansion"
9945 Access Point Address (referred to as Authenticator Address AA)
9946 Supplicant Address (referred to as Supplicant Address SA)
9947 Access Point Nonce (referred to as Authenticator Anonce)
9948 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9949 */
9950
9951 uint salt_len = strlen (in.essid);
9952
9953 memcpy (salt->salt_buf, in.essid, salt_len);
9954
9955 salt->salt_len = salt_len;
9956
9957 salt->salt_iter = ROUNDS_WPA2 - 1;
9958
9959 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9960
9961 memcpy (pke_ptr, "Pairwise key expansion", 23);
9962
9963 if (memcmp (in.mac1, in.mac2, 6) < 0)
9964 {
9965 memcpy (pke_ptr + 23, in.mac1, 6);
9966 memcpy (pke_ptr + 29, in.mac2, 6);
9967 }
9968 else
9969 {
9970 memcpy (pke_ptr + 23, in.mac2, 6);
9971 memcpy (pke_ptr + 29, in.mac1, 6);
9972 }
9973
9974 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9975 {
9976 memcpy (pke_ptr + 35, in.nonce1, 32);
9977 memcpy (pke_ptr + 67, in.nonce2, 32);
9978 }
9979 else
9980 {
9981 memcpy (pke_ptr + 35, in.nonce2, 32);
9982 memcpy (pke_ptr + 67, in.nonce1, 32);
9983 }
9984
9985 for (int i = 0; i < 25; i++)
9986 {
9987 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9988 }
9989
9990 wpa->keyver = in.keyver;
9991
9992 if (wpa->keyver > 255)
9993 {
9994 log_info ("ATTENTION!");
9995 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9996 log_info (" This could be due to a recent aircrack-ng bug.");
9997 log_info (" The key version was automatically reset to a reasonable value.");
9998 log_info ("");
9999
10000 wpa->keyver &= 0xff;
10001 }
10002
10003 wpa->eapol_size = in.eapol_size;
10004
10005 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10006
10007 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10008
10009 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10010
10011 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10012
10013 if (wpa->keyver == 1)
10014 {
10015 // nothing to do
10016 }
10017 else
10018 {
10019 digest[0] = byte_swap_32 (digest[0]);
10020 digest[1] = byte_swap_32 (digest[1]);
10021 digest[2] = byte_swap_32 (digest[2]);
10022 digest[3] = byte_swap_32 (digest[3]);
10023
10024 for (int i = 0; i < 64; i++)
10025 {
10026 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10027 }
10028 }
10029
10030 salt->salt_buf[10] = digest[1];
10031 salt->salt_buf[11] = digest[2];
10032
10033 return (PARSER_OK);
10034 }
10035
10036 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10037 {
10038 u32 *digest = (u32 *) hash_buf->digest;
10039
10040 salt_t *salt = hash_buf->salt;
10041
10042 if (input_len == 0)
10043 {
10044 log_error ("Password Safe v2 container not specified");
10045
10046 exit (-1);
10047 }
10048
10049 FILE *fp = fopen (input_buf, "rb");
10050
10051 if (fp == NULL)
10052 {
10053 log_error ("%s: %s", input_buf, strerror (errno));
10054
10055 exit (-1);
10056 }
10057
10058 psafe2_hdr buf;
10059
10060 memset (&buf, 0, sizeof (psafe2_hdr));
10061
10062 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10063
10064 fclose (fp);
10065
10066 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10067
10068 salt->salt_buf[0] = buf.random[0];
10069 salt->salt_buf[1] = buf.random[1];
10070
10071 salt->salt_len = 8;
10072 salt->salt_iter = 1000;
10073
10074 digest[0] = byte_swap_32 (buf.hash[0]);
10075 digest[1] = byte_swap_32 (buf.hash[1]);
10076 digest[2] = byte_swap_32 (buf.hash[2]);
10077 digest[3] = byte_swap_32 (buf.hash[3]);
10078 digest[4] = byte_swap_32 (buf.hash[4]);
10079
10080 return (PARSER_OK);
10081 }
10082
10083 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10084 {
10085 u32 *digest = (u32 *) hash_buf->digest;
10086
10087 salt_t *salt = hash_buf->salt;
10088
10089 if (input_len == 0)
10090 {
10091 log_error (".psafe3 not specified");
10092
10093 exit (-1);
10094 }
10095
10096 FILE *fp = fopen (input_buf, "rb");
10097
10098 if (fp == NULL)
10099 {
10100 log_error ("%s: %s", input_buf, strerror (errno));
10101
10102 exit (-1);
10103 }
10104
10105 psafe3_t in;
10106
10107 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10108
10109 fclose (fp);
10110
10111 data.hashfile = input_buf; // we will need this in case it gets cracked
10112
10113 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10114
10115 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10116
10117 salt->salt_iter = in.iterations + 1;
10118
10119 salt->salt_buf[0] = in.salt_buf[0];
10120 salt->salt_buf[1] = in.salt_buf[1];
10121 salt->salt_buf[2] = in.salt_buf[2];
10122 salt->salt_buf[3] = in.salt_buf[3];
10123 salt->salt_buf[4] = in.salt_buf[4];
10124 salt->salt_buf[5] = in.salt_buf[5];
10125 salt->salt_buf[6] = in.salt_buf[6];
10126 salt->salt_buf[7] = in.salt_buf[7];
10127
10128 salt->salt_len = 32;
10129
10130 digest[0] = in.hash_buf[0];
10131 digest[1] = in.hash_buf[1];
10132 digest[2] = in.hash_buf[2];
10133 digest[3] = in.hash_buf[3];
10134 digest[4] = in.hash_buf[4];
10135 digest[5] = in.hash_buf[5];
10136 digest[6] = in.hash_buf[6];
10137 digest[7] = in.hash_buf[7];
10138
10139 digest[0] = byte_swap_32 (digest[0]);
10140 digest[1] = byte_swap_32 (digest[1]);
10141 digest[2] = byte_swap_32 (digest[2]);
10142 digest[3] = byte_swap_32 (digest[3]);
10143 digest[4] = byte_swap_32 (digest[4]);
10144 digest[5] = byte_swap_32 (digest[5]);
10145 digest[6] = byte_swap_32 (digest[6]);
10146 digest[7] = byte_swap_32 (digest[7]);
10147
10148 return (PARSER_OK);
10149 }
10150
10151 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10152 {
10153 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10154
10155 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10156
10157 u32 *digest = (u32 *) hash_buf->digest;
10158
10159 salt_t *salt = hash_buf->salt;
10160
10161 char *iter_pos = input_buf + 3;
10162
10163 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10164
10165 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10166
10167 memcpy ((char *) salt->salt_sign, input_buf, 4);
10168
10169 salt->salt_iter = salt_iter;
10170
10171 char *salt_pos = iter_pos + 1;
10172
10173 uint salt_len = 8;
10174
10175 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10176
10177 salt->salt_len = salt_len;
10178
10179 char *hash_pos = salt_pos + salt_len;
10180
10181 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10182
10183 return (PARSER_OK);
10184 }
10185
10186 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10187 {
10188 if (memcmp (SIGNATURE_MD5CRYPT, 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 *salt_pos = input_buf + 3;
10195
10196 uint iterations_len = 0;
10197
10198 if (memcmp (salt_pos, "rounds=", 7) == 0)
10199 {
10200 salt_pos += 7;
10201
10202 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10203
10204 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10205 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10206
10207 salt_pos[0] = 0x0;
10208
10209 salt->salt_iter = atoi (salt_pos - iterations_len);
10210
10211 salt_pos += 1;
10212
10213 iterations_len += 8;
10214 }
10215 else
10216 {
10217 salt->salt_iter = ROUNDS_MD5CRYPT;
10218 }
10219
10220 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10221
10222 char *hash_pos = strchr (salt_pos, '$');
10223
10224 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10225
10226 uint salt_len = hash_pos - salt_pos;
10227
10228 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10229
10230 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10231
10232 salt->salt_len = salt_len;
10233
10234 hash_pos++;
10235
10236 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10237
10238 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10239
10240 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10241
10242 return (PARSER_OK);
10243 }
10244
10245 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10246 {
10247 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10248
10249 u32 *digest = (u32 *) hash_buf->digest;
10250
10251 salt_t *salt = hash_buf->salt;
10252
10253 char *salt_pos = input_buf + 6;
10254
10255 uint iterations_len = 0;
10256
10257 if (memcmp (salt_pos, "rounds=", 7) == 0)
10258 {
10259 salt_pos += 7;
10260
10261 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10262
10263 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10264 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10265
10266 salt_pos[0] = 0x0;
10267
10268 salt->salt_iter = atoi (salt_pos - iterations_len);
10269
10270 salt_pos += 1;
10271
10272 iterations_len += 8;
10273 }
10274 else
10275 {
10276 salt->salt_iter = ROUNDS_MD5CRYPT;
10277 }
10278
10279 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10280
10281 char *hash_pos = strchr (salt_pos, '$');
10282
10283 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10284
10285 uint salt_len = hash_pos - salt_pos;
10286
10287 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10288
10289 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10290
10291 salt->salt_len = salt_len;
10292
10293 hash_pos++;
10294
10295 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10296
10297 return (PARSER_OK);
10298 }
10299
10300 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10301 {
10302 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10303
10304 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10305
10306 u32 *digest = (u32 *) hash_buf->digest;
10307
10308 salt_t *salt = hash_buf->salt;
10309
10310 char *salt_pos = input_buf + 14;
10311
10312 char *hash_pos = strchr (salt_pos, '*');
10313
10314 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10315
10316 hash_pos++;
10317
10318 uint salt_len = hash_pos - salt_pos - 1;
10319
10320 char *salt_buf_ptr = (char *) salt->salt_buf;
10321
10322 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10323
10324 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10325
10326 salt->salt_len = salt_len;
10327
10328 u8 tmp_buf[100] = { 0 };
10329
10330 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10331
10332 memcpy (digest, tmp_buf, 20);
10333
10334 digest[0] = byte_swap_32 (digest[0]);
10335 digest[1] = byte_swap_32 (digest[1]);
10336 digest[2] = byte_swap_32 (digest[2]);
10337 digest[3] = byte_swap_32 (digest[3]);
10338 digest[4] = byte_swap_32 (digest[4]);
10339
10340 digest[0] -= SHA1M_A;
10341 digest[1] -= SHA1M_B;
10342 digest[2] -= SHA1M_C;
10343 digest[3] -= SHA1M_D;
10344 digest[4] -= SHA1M_E;
10345
10346 return (PARSER_OK);
10347 }
10348
10349 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10350 {
10351 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10352
10353 unsigned char c12 = itoa64_to_int (input_buf[12]);
10354
10355 if (c12 & 3) return (PARSER_HASH_VALUE);
10356
10357 u32 *digest = (u32 *) hash_buf->digest;
10358
10359 salt_t *salt = hash_buf->salt;
10360
10361 // for ascii_digest
10362 salt->salt_sign[0] = input_buf[0];
10363 salt->salt_sign[1] = input_buf[1];
10364
10365 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10366 | itoa64_to_int (input_buf[1]) << 6;
10367
10368 salt->salt_len = 2;
10369
10370 u8 tmp_buf[100] = { 0 };
10371
10372 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10373
10374 memcpy (digest, tmp_buf, 8);
10375
10376 uint tt;
10377
10378 IP (digest[0], digest[1], tt);
10379
10380 digest[2] = 0;
10381 digest[3] = 0;
10382
10383 return (PARSER_OK);
10384 }
10385
10386 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10387 {
10388 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10389
10390 u32 *digest = (u32 *) hash_buf->digest;
10391
10392 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10393 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10394 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10395 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10396
10397 digest[0] = byte_swap_32 (digest[0]);
10398 digest[1] = byte_swap_32 (digest[1]);
10399 digest[2] = byte_swap_32 (digest[2]);
10400 digest[3] = byte_swap_32 (digest[3]);
10401
10402 digest[0] -= MD4M_A;
10403 digest[1] -= MD4M_B;
10404 digest[2] -= MD4M_C;
10405 digest[3] -= MD4M_D;
10406
10407 return (PARSER_OK);
10408 }
10409
10410 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10411 {
10412 if (data.opts_type & OPTS_TYPE_ST_HEX)
10413 {
10414 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10415 }
10416 else
10417 {
10418 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10419 }
10420
10421 u32 *digest = (u32 *) hash_buf->digest;
10422
10423 salt_t *salt = hash_buf->salt;
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 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10441
10442 uint salt_len = input_len - 32 - 1;
10443
10444 char *salt_buf = input_buf + 32 + 1;
10445
10446 char *salt_buf_ptr = (char *) salt->salt_buf;
10447
10448 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10449
10450 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10451
10452 salt->salt_len = salt_len;
10453
10454 return (PARSER_OK);
10455 }
10456
10457 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10458 {
10459 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10460
10461 u32 *digest = (u32 *) hash_buf->digest;
10462
10463 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10464 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10465 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10466 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10467
10468 digest[0] = byte_swap_32 (digest[0]);
10469 digest[1] = byte_swap_32 (digest[1]);
10470 digest[2] = byte_swap_32 (digest[2]);
10471 digest[3] = byte_swap_32 (digest[3]);
10472
10473 digest[0] -= MD5M_A;
10474 digest[1] -= MD5M_B;
10475 digest[2] -= MD5M_C;
10476 digest[3] -= MD5M_D;
10477
10478 return (PARSER_OK);
10479 }
10480
10481 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10482 {
10483 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10484
10485 u32 *digest = (u32 *) hash_buf->digest;
10486
10487 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10488 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10489 digest[2] = 0;
10490 digest[3] = 0;
10491
10492 digest[0] = byte_swap_32 (digest[0]);
10493 digest[1] = byte_swap_32 (digest[1]);
10494
10495 return (PARSER_OK);
10496 }
10497
10498 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10499 {
10500 if (data.opts_type & OPTS_TYPE_ST_HEX)
10501 {
10502 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10503 }
10504 else
10505 {
10506 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10507 }
10508
10509 u32 *digest = (u32 *) hash_buf->digest;
10510
10511 salt_t *salt = hash_buf->salt;
10512
10513 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10514 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10515 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10516 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10517
10518 digest[0] = byte_swap_32 (digest[0]);
10519 digest[1] = byte_swap_32 (digest[1]);
10520 digest[2] = byte_swap_32 (digest[2]);
10521 digest[3] = byte_swap_32 (digest[3]);
10522
10523 digest[0] -= MD5M_A;
10524 digest[1] -= MD5M_B;
10525 digest[2] -= MD5M_C;
10526 digest[3] -= MD5M_D;
10527
10528 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10529
10530 uint salt_len = input_len - 32 - 1;
10531
10532 char *salt_buf = input_buf + 32 + 1;
10533
10534 char *salt_buf_ptr = (char *) salt->salt_buf;
10535
10536 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10537
10538 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10539
10540 salt->salt_len = salt_len;
10541
10542 return (PARSER_OK);
10543 }
10544
10545 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10546 {
10547 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10548
10549 u32 *digest = (u32 *) hash_buf->digest;
10550
10551 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10552 | itoa64_to_int (input_buf[ 1]) << 6
10553 | itoa64_to_int (input_buf[ 2]) << 12
10554 | itoa64_to_int (input_buf[ 3]) << 18;
10555 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10556 | itoa64_to_int (input_buf[ 5]) << 6
10557 | itoa64_to_int (input_buf[ 6]) << 12
10558 | itoa64_to_int (input_buf[ 7]) << 18;
10559 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10560 | itoa64_to_int (input_buf[ 9]) << 6
10561 | itoa64_to_int (input_buf[10]) << 12
10562 | itoa64_to_int (input_buf[11]) << 18;
10563 digest[3] = itoa64_to_int (input_buf[12]) << 0
10564 | itoa64_to_int (input_buf[13]) << 6
10565 | itoa64_to_int (input_buf[14]) << 12
10566 | itoa64_to_int (input_buf[15]) << 18;
10567
10568 digest[0] -= MD5M_A;
10569 digest[1] -= MD5M_B;
10570 digest[2] -= MD5M_C;
10571 digest[3] -= MD5M_D;
10572
10573 digest[0] &= 0x00ffffff;
10574 digest[1] &= 0x00ffffff;
10575 digest[2] &= 0x00ffffff;
10576 digest[3] &= 0x00ffffff;
10577
10578 return (PARSER_OK);
10579 }
10580
10581 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10582 {
10583 if (data.opts_type & OPTS_TYPE_ST_HEX)
10584 {
10585 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10586 }
10587 else
10588 {
10589 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10590 }
10591
10592 u32 *digest = (u32 *) hash_buf->digest;
10593
10594 salt_t *salt = hash_buf->salt;
10595
10596 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10597 | itoa64_to_int (input_buf[ 1]) << 6
10598 | itoa64_to_int (input_buf[ 2]) << 12
10599 | itoa64_to_int (input_buf[ 3]) << 18;
10600 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10601 | itoa64_to_int (input_buf[ 5]) << 6
10602 | itoa64_to_int (input_buf[ 6]) << 12
10603 | itoa64_to_int (input_buf[ 7]) << 18;
10604 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10605 | itoa64_to_int (input_buf[ 9]) << 6
10606 | itoa64_to_int (input_buf[10]) << 12
10607 | itoa64_to_int (input_buf[11]) << 18;
10608 digest[3] = itoa64_to_int (input_buf[12]) << 0
10609 | itoa64_to_int (input_buf[13]) << 6
10610 | itoa64_to_int (input_buf[14]) << 12
10611 | itoa64_to_int (input_buf[15]) << 18;
10612
10613 digest[0] -= MD5M_A;
10614 digest[1] -= MD5M_B;
10615 digest[2] -= MD5M_C;
10616 digest[3] -= MD5M_D;
10617
10618 digest[0] &= 0x00ffffff;
10619 digest[1] &= 0x00ffffff;
10620 digest[2] &= 0x00ffffff;
10621 digest[3] &= 0x00ffffff;
10622
10623 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10624
10625 uint salt_len = input_len - 16 - 1;
10626
10627 char *salt_buf = input_buf + 16 + 1;
10628
10629 char *salt_buf_ptr = (char *) salt->salt_buf;
10630
10631 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10632
10633 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10634
10635 salt->salt_len = salt_len;
10636
10637 return (PARSER_OK);
10638 }
10639
10640 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10641 {
10642 key[0] = (nthash[0] >> 0);
10643 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10644 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10645 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10646 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10647 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10648 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10649 key[7] = (nthash[6] << 1);
10650
10651 key[0] |= 0x01;
10652 key[1] |= 0x01;
10653 key[2] |= 0x01;
10654 key[3] |= 0x01;
10655 key[4] |= 0x01;
10656 key[5] |= 0x01;
10657 key[6] |= 0x01;
10658 key[7] |= 0x01;
10659 }
10660
10661 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10662 {
10663 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10664
10665 u32 *digest = (u32 *) hash_buf->digest;
10666
10667 salt_t *salt = hash_buf->salt;
10668
10669 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10670
10671 /**
10672 * parse line
10673 */
10674
10675 char *user_pos = input_buf;
10676
10677 char *unused_pos = strchr (user_pos, ':');
10678
10679 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10680
10681 uint user_len = unused_pos - user_pos;
10682
10683 if (user_len > 60) return (PARSER_SALT_LENGTH);
10684
10685 unused_pos++;
10686
10687 char *domain_pos = strchr (unused_pos, ':');
10688
10689 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10690
10691 uint unused_len = domain_pos - unused_pos;
10692
10693 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10694
10695 domain_pos++;
10696
10697 char *srvchall_pos = strchr (domain_pos, ':');
10698
10699 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10700
10701 uint domain_len = srvchall_pos - domain_pos;
10702
10703 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10704
10705 srvchall_pos++;
10706
10707 char *hash_pos = strchr (srvchall_pos, ':');
10708
10709 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10710
10711 uint srvchall_len = hash_pos - srvchall_pos;
10712
10713 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10714
10715 hash_pos++;
10716
10717 char *clichall_pos = strchr (hash_pos, ':');
10718
10719 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10720
10721 uint hash_len = clichall_pos - hash_pos;
10722
10723 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10724
10725 clichall_pos++;
10726
10727 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10728
10729 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10730
10731 /**
10732 * store some data for later use
10733 */
10734
10735 netntlm->user_len = user_len * 2;
10736 netntlm->domain_len = domain_len * 2;
10737 netntlm->srvchall_len = srvchall_len / 2;
10738 netntlm->clichall_len = clichall_len / 2;
10739
10740 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10741 char *chall_ptr = (char *) netntlm->chall_buf;
10742
10743 /**
10744 * handle username and domainname
10745 */
10746
10747 for (uint i = 0; i < user_len; i++)
10748 {
10749 *userdomain_ptr++ = user_pos[i];
10750 *userdomain_ptr++ = 0;
10751 }
10752
10753 for (uint i = 0; i < domain_len; i++)
10754 {
10755 *userdomain_ptr++ = domain_pos[i];
10756 *userdomain_ptr++ = 0;
10757 }
10758
10759 /**
10760 * handle server challenge encoding
10761 */
10762
10763 for (uint i = 0; i < srvchall_len; i += 2)
10764 {
10765 const char p0 = srvchall_pos[i + 0];
10766 const char p1 = srvchall_pos[i + 1];
10767
10768 *chall_ptr++ = hex_convert (p1) << 0
10769 | hex_convert (p0) << 4;
10770 }
10771
10772 /**
10773 * handle client challenge encoding
10774 */
10775
10776 for (uint i = 0; i < clichall_len; i += 2)
10777 {
10778 const char p0 = clichall_pos[i + 0];
10779 const char p1 = clichall_pos[i + 1];
10780
10781 *chall_ptr++ = hex_convert (p1) << 0
10782 | hex_convert (p0) << 4;
10783 }
10784
10785 /**
10786 * store data
10787 */
10788
10789 char *salt_buf_ptr = (char *) salt->salt_buf;
10790
10791 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10792
10793 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10794
10795 salt->salt_len = salt_len;
10796
10797 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10798 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10799 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10800 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10801
10802 digest[0] = byte_swap_32 (digest[0]);
10803 digest[1] = byte_swap_32 (digest[1]);
10804 digest[2] = byte_swap_32 (digest[2]);
10805 digest[3] = byte_swap_32 (digest[3]);
10806
10807 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10808
10809 uint digest_tmp[2] = { 0 };
10810
10811 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10812 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
10813
10814 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10815 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10816
10817 /* special case 2: ESS */
10818
10819 if (srvchall_len == 48)
10820 {
10821 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10822 {
10823 uint w[16] = { 0 };
10824
10825 w[ 0] = netntlm->chall_buf[6];
10826 w[ 1] = netntlm->chall_buf[7];
10827 w[ 2] = netntlm->chall_buf[0];
10828 w[ 3] = netntlm->chall_buf[1];
10829 w[ 4] = 0x80;
10830 w[14] = 16 * 8;
10831
10832 uint dgst[4] = { 0 };
10833
10834 dgst[0] = MAGIC_A;
10835 dgst[1] = MAGIC_B;
10836 dgst[2] = MAGIC_C;
10837 dgst[3] = MAGIC_D;
10838
10839 md5_64 (w, dgst);
10840
10841 salt->salt_buf[0] = dgst[0];
10842 salt->salt_buf[1] = dgst[1];
10843 }
10844 }
10845
10846 /* precompute netntlmv1 exploit start */
10847
10848 for (uint i = 0; i < 0x10000; i++)
10849 {
10850 uint key_md4[2] = { i, 0 };
10851 uint key_des[2] = { 0, 0 };
10852
10853 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
10854
10855 uint Kc[16] = { 0 };
10856 uint Kd[16] = { 0 };
10857
10858 _des_keysetup (key_des, Kc, Kd, c_skb);
10859
10860 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10861
10862 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10863
10864 if (data3[0] != digest_tmp[0]) continue;
10865 if (data3[1] != digest_tmp[1]) continue;
10866
10867 salt->salt_buf[2] = i;
10868
10869 salt->salt_len = 24;
10870
10871 break;
10872 }
10873
10874 salt->salt_buf_pc[0] = digest_tmp[0];
10875 salt->salt_buf_pc[1] = digest_tmp[1];
10876
10877 /* precompute netntlmv1 exploit stop */
10878
10879 u32 tt;
10880
10881 IP (digest[0], digest[1], tt);
10882 IP (digest[2], digest[3], tt);
10883
10884 digest[0] = rotr32 (digest[0], 29);
10885 digest[1] = rotr32 (digest[1], 29);
10886 digest[2] = rotr32 (digest[2], 29);
10887 digest[3] = rotr32 (digest[3], 29);
10888
10889 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10890
10891 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
10892 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
10893
10894 return (PARSER_OK);
10895 }
10896
10897 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10898 {
10899 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10900
10901 u32 *digest = (u32 *) hash_buf->digest;
10902
10903 salt_t *salt = hash_buf->salt;
10904
10905 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10906
10907 /**
10908 * parse line
10909 */
10910
10911 char *user_pos = input_buf;
10912
10913 char *unused_pos = strchr (user_pos, ':');
10914
10915 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10916
10917 uint user_len = unused_pos - user_pos;
10918
10919 if (user_len > 60) return (PARSER_SALT_LENGTH);
10920
10921 unused_pos++;
10922
10923 char *domain_pos = strchr (unused_pos, ':');
10924
10925 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10926
10927 uint unused_len = domain_pos - unused_pos;
10928
10929 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10930
10931 domain_pos++;
10932
10933 char *srvchall_pos = strchr (domain_pos, ':');
10934
10935 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10936
10937 uint domain_len = srvchall_pos - domain_pos;
10938
10939 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10940
10941 srvchall_pos++;
10942
10943 char *hash_pos = strchr (srvchall_pos, ':');
10944
10945 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10946
10947 uint srvchall_len = hash_pos - srvchall_pos;
10948
10949 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10950
10951 hash_pos++;
10952
10953 char *clichall_pos = strchr (hash_pos, ':');
10954
10955 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10956
10957 uint hash_len = clichall_pos - hash_pos;
10958
10959 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10960
10961 clichall_pos++;
10962
10963 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10964
10965 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10966
10967 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10968
10969 /**
10970 * store some data for later use
10971 */
10972
10973 netntlm->user_len = user_len * 2;
10974 netntlm->domain_len = domain_len * 2;
10975 netntlm->srvchall_len = srvchall_len / 2;
10976 netntlm->clichall_len = clichall_len / 2;
10977
10978 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10979 char *chall_ptr = (char *) netntlm->chall_buf;
10980
10981 /**
10982 * handle username and domainname
10983 */
10984
10985 for (uint i = 0; i < user_len; i++)
10986 {
10987 *userdomain_ptr++ = toupper (user_pos[i]);
10988 *userdomain_ptr++ = 0;
10989 }
10990
10991 for (uint i = 0; i < domain_len; i++)
10992 {
10993 *userdomain_ptr++ = domain_pos[i];
10994 *userdomain_ptr++ = 0;
10995 }
10996
10997 *userdomain_ptr++ = 0x80;
10998
10999 /**
11000 * handle server challenge encoding
11001 */
11002
11003 for (uint i = 0; i < srvchall_len; i += 2)
11004 {
11005 const char p0 = srvchall_pos[i + 0];
11006 const char p1 = srvchall_pos[i + 1];
11007
11008 *chall_ptr++ = hex_convert (p1) << 0
11009 | hex_convert (p0) << 4;
11010 }
11011
11012 /**
11013 * handle client challenge encoding
11014 */
11015
11016 for (uint i = 0; i < clichall_len; i += 2)
11017 {
11018 const char p0 = clichall_pos[i + 0];
11019 const char p1 = clichall_pos[i + 1];
11020
11021 *chall_ptr++ = hex_convert (p1) << 0
11022 | hex_convert (p0) << 4;
11023 }
11024
11025 *chall_ptr++ = 0x80;
11026
11027 /**
11028 * handle hash itself
11029 */
11030
11031 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11032 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11033 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11034 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11035
11036 digest[0] = byte_swap_32 (digest[0]);
11037 digest[1] = byte_swap_32 (digest[1]);
11038 digest[2] = byte_swap_32 (digest[2]);
11039 digest[3] = byte_swap_32 (digest[3]);
11040
11041 /**
11042 * reuse challange data as salt_buf, its the buffer that is most likely unique
11043 */
11044
11045 salt->salt_buf[0] = 0;
11046 salt->salt_buf[1] = 0;
11047 salt->salt_buf[2] = 0;
11048 salt->salt_buf[3] = 0;
11049 salt->salt_buf[4] = 0;
11050 salt->salt_buf[5] = 0;
11051 salt->salt_buf[6] = 0;
11052 salt->salt_buf[7] = 0;
11053
11054 uint *uptr;
11055
11056 uptr = (uint *) netntlm->userdomain_buf;
11057
11058 for (uint i = 0; i < 16; i += 16)
11059 {
11060 md5_64 (uptr, salt->salt_buf);
11061 }
11062
11063 uptr = (uint *) netntlm->chall_buf;
11064
11065 for (uint i = 0; i < 256; i += 16)
11066 {
11067 md5_64 (uptr, salt->salt_buf);
11068 }
11069
11070 salt->salt_len = 16;
11071
11072 return (PARSER_OK);
11073 }
11074
11075 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11076 {
11077 if (data.opts_type & OPTS_TYPE_ST_HEX)
11078 {
11079 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11080 }
11081 else
11082 {
11083 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11084 }
11085
11086 u32 *digest = (u32 *) hash_buf->digest;
11087
11088 salt_t *salt = hash_buf->salt;
11089
11090 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11091 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11092 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11093 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11094
11095 digest[0] = byte_swap_32 (digest[0]);
11096 digest[1] = byte_swap_32 (digest[1]);
11097 digest[2] = byte_swap_32 (digest[2]);
11098 digest[3] = byte_swap_32 (digest[3]);
11099
11100 digest[0] -= MD5M_A;
11101 digest[1] -= MD5M_B;
11102 digest[2] -= MD5M_C;
11103 digest[3] -= MD5M_D;
11104
11105 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11106
11107 uint salt_len = input_len - 32 - 1;
11108
11109 char *salt_buf = input_buf + 32 + 1;
11110
11111 char *salt_buf_ptr = (char *) salt->salt_buf;
11112
11113 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11114
11115 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11116
11117 salt->salt_len = salt_len;
11118
11119 return (PARSER_OK);
11120 }
11121
11122 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11123 {
11124 if (data.opts_type & OPTS_TYPE_ST_HEX)
11125 {
11126 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11127 }
11128 else
11129 {
11130 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11131 }
11132
11133 u32 *digest = (u32 *) hash_buf->digest;
11134
11135 salt_t *salt = hash_buf->salt;
11136
11137 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11138 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11139 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11140 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11141
11142 digest[0] = byte_swap_32 (digest[0]);
11143 digest[1] = byte_swap_32 (digest[1]);
11144 digest[2] = byte_swap_32 (digest[2]);
11145 digest[3] = byte_swap_32 (digest[3]);
11146
11147 digest[0] -= MD5M_A;
11148 digest[1] -= MD5M_B;
11149 digest[2] -= MD5M_C;
11150 digest[3] -= MD5M_D;
11151
11152 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11153
11154 uint salt_len = input_len - 32 - 1;
11155
11156 char *salt_buf = input_buf + 32 + 1;
11157
11158 char *salt_buf_ptr = (char *) salt->salt_buf;
11159
11160 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11161
11162 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11163
11164 salt->salt_len = salt_len;
11165
11166 return (PARSER_OK);
11167 }
11168
11169 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11170 {
11171 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11172
11173 u32 *digest = (u32 *) hash_buf->digest;
11174
11175 salt_t *salt = hash_buf->salt;
11176
11177 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11178 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11179 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11180 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11181
11182 digest[0] = byte_swap_32 (digest[0]);
11183 digest[1] = byte_swap_32 (digest[1]);
11184 digest[2] = byte_swap_32 (digest[2]);
11185 digest[3] = byte_swap_32 (digest[3]);
11186
11187 digest[0] -= MD5M_A;
11188 digest[1] -= MD5M_B;
11189 digest[2] -= MD5M_C;
11190 digest[3] -= MD5M_D;
11191
11192 /**
11193 * This is a virtual salt. While the algorithm is basically not salted
11194 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11195 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11196 */
11197
11198 char *salt_buf_ptr = (char *) salt->salt_buf;
11199
11200 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11201
11202 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11203
11204 salt->salt_len = salt_len;
11205
11206 return (PARSER_OK);
11207 }
11208
11209 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11210 {
11211 if (data.opts_type & OPTS_TYPE_ST_HEX)
11212 {
11213 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11214 }
11215 else
11216 {
11217 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11218 }
11219
11220 u32 *digest = (u32 *) hash_buf->digest;
11221
11222 salt_t *salt = hash_buf->salt;
11223
11224 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11225 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11226 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11227 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11228
11229 digest[0] = byte_swap_32 (digest[0]);
11230 digest[1] = byte_swap_32 (digest[1]);
11231 digest[2] = byte_swap_32 (digest[2]);
11232 digest[3] = byte_swap_32 (digest[3]);
11233
11234 digest[0] -= MD5M_A;
11235 digest[1] -= MD5M_B;
11236 digest[2] -= MD5M_C;
11237 digest[3] -= MD5M_D;
11238
11239 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11240
11241 uint salt_len = input_len - 32 - 1;
11242
11243 char *salt_buf = input_buf + 32 + 1;
11244
11245 char *salt_buf_ptr = (char *) salt->salt_buf;
11246
11247 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11248
11249 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11250
11251 salt->salt_len = salt_len;
11252
11253 return (PARSER_OK);
11254 }
11255
11256 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11257 {
11258 if (data.opts_type & OPTS_TYPE_ST_HEX)
11259 {
11260 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11261 }
11262 else
11263 {
11264 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11265 }
11266
11267 u32 *digest = (u32 *) hash_buf->digest;
11268
11269 salt_t *salt = hash_buf->salt;
11270
11271 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11272 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11273 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11274 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11275
11276 digest[0] = byte_swap_32 (digest[0]);
11277 digest[1] = byte_swap_32 (digest[1]);
11278 digest[2] = byte_swap_32 (digest[2]);
11279 digest[3] = byte_swap_32 (digest[3]);
11280
11281 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11282
11283 uint salt_len = input_len - 32 - 1;
11284
11285 char *salt_buf = input_buf + 32 + 1;
11286
11287 char *salt_buf_ptr = (char *) salt->salt_buf;
11288
11289 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11290
11291 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11292
11293 salt->salt_len = salt_len;
11294
11295 return (PARSER_OK);
11296 }
11297
11298 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11299 {
11300 if (data.opts_type & OPTS_TYPE_ST_HEX)
11301 {
11302 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11303 }
11304 else
11305 {
11306 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11307 }
11308
11309 u32 *digest = (u32 *) hash_buf->digest;
11310
11311 salt_t *salt = hash_buf->salt;
11312
11313 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11314 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11315 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11316 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11317
11318 digest[0] = byte_swap_32 (digest[0]);
11319 digest[1] = byte_swap_32 (digest[1]);
11320 digest[2] = byte_swap_32 (digest[2]);
11321 digest[3] = byte_swap_32 (digest[3]);
11322
11323 digest[0] -= MD4M_A;
11324 digest[1] -= MD4M_B;
11325 digest[2] -= MD4M_C;
11326 digest[3] -= MD4M_D;
11327
11328 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11329
11330 uint salt_len = input_len - 32 - 1;
11331
11332 char *salt_buf = input_buf + 32 + 1;
11333
11334 char *salt_buf_ptr = (char *) salt->salt_buf;
11335
11336 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11337
11338 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11339
11340 salt->salt_len = salt_len;
11341
11342 return (PARSER_OK);
11343 }
11344
11345 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11346 {
11347 if (data.opts_type & OPTS_TYPE_ST_HEX)
11348 {
11349 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11350 }
11351 else
11352 {
11353 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11354 }
11355
11356 u32 *digest = (u32 *) hash_buf->digest;
11357
11358 salt_t *salt = hash_buf->salt;
11359
11360 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11361 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11362 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11363 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11364
11365 digest[0] = byte_swap_32 (digest[0]);
11366 digest[1] = byte_swap_32 (digest[1]);
11367 digest[2] = byte_swap_32 (digest[2]);
11368 digest[3] = byte_swap_32 (digest[3]);
11369
11370 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11371
11372 uint salt_len = input_len - 32 - 1;
11373
11374 char *salt_buf = input_buf + 32 + 1;
11375
11376 uint salt_pc_block[16] = { 0 };
11377
11378 char *salt_pc_block_ptr = (char *) salt_pc_block;
11379
11380 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11381
11382 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11383
11384 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11385
11386 salt_pc_block[14] = salt_len * 8;
11387
11388 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11389
11390 md5_64 (salt_pc_block, salt_pc_digest);
11391
11392 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11393 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11394 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11395 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11396
11397 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11398
11399 memcpy (salt_buf_ptr, salt_buf, salt_len);
11400
11401 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11402
11403 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11404 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11405 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11406 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11407
11408 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11409
11410 return (PARSER_OK);
11411 }
11412
11413 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11414 {
11415 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11416
11417 u32 *digest = (u32 *) hash_buf->digest;
11418
11419 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11420 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11421 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11422 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11423 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11424
11425 digest[0] -= SHA1M_A;
11426 digest[1] -= SHA1M_B;
11427 digest[2] -= SHA1M_C;
11428 digest[3] -= SHA1M_D;
11429 digest[4] -= SHA1M_E;
11430
11431 return (PARSER_OK);
11432 }
11433
11434 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11435 {
11436 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11437
11438 u32 *digest = (u32 *) hash_buf->digest;
11439
11440 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11441 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11442 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11443 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11444 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11445
11446 return (PARSER_OK);
11447 }
11448
11449 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11450 {
11451 if (data.opts_type & OPTS_TYPE_ST_HEX)
11452 {
11453 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11454 }
11455 else
11456 {
11457 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11458 }
11459
11460 u32 *digest = (u32 *) hash_buf->digest;
11461
11462 salt_t *salt = hash_buf->salt;
11463
11464 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11465 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11466 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11467 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11468 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11469
11470 digest[0] -= SHA1M_A;
11471 digest[1] -= SHA1M_B;
11472 digest[2] -= SHA1M_C;
11473 digest[3] -= SHA1M_D;
11474 digest[4] -= SHA1M_E;
11475
11476 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11477
11478 uint salt_len = input_len - 40 - 1;
11479
11480 char *salt_buf = input_buf + 40 + 1;
11481
11482 char *salt_buf_ptr = (char *) salt->salt_buf;
11483
11484 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11485
11486 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11487
11488 salt->salt_len = salt_len;
11489
11490 return (PARSER_OK);
11491 }
11492
11493 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11494 {
11495 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11496
11497 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11498
11499 u32 *digest = (u32 *) hash_buf->digest;
11500
11501 u8 tmp_buf[100] = { 0 };
11502
11503 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11504
11505 memcpy (digest, tmp_buf, 20);
11506
11507 digest[0] = byte_swap_32 (digest[0]);
11508 digest[1] = byte_swap_32 (digest[1]);
11509 digest[2] = byte_swap_32 (digest[2]);
11510 digest[3] = byte_swap_32 (digest[3]);
11511 digest[4] = byte_swap_32 (digest[4]);
11512
11513 digest[0] -= SHA1M_A;
11514 digest[1] -= SHA1M_B;
11515 digest[2] -= SHA1M_C;
11516 digest[3] -= SHA1M_D;
11517 digest[4] -= SHA1M_E;
11518
11519 return (PARSER_OK);
11520 }
11521
11522 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11523 {
11524 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11525
11526 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11527
11528 u32 *digest = (u32 *) hash_buf->digest;
11529
11530 salt_t *salt = hash_buf->salt;
11531
11532 u8 tmp_buf[100] = { 0 };
11533
11534 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11535
11536 memcpy (digest, tmp_buf, 20);
11537
11538 salt->salt_len = tmp_len - 20;
11539
11540 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11541
11542 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11543 {
11544 char *ptr = (char *) salt->salt_buf;
11545
11546 ptr[salt->salt_len] = 0x80;
11547 }
11548
11549 digest[0] = byte_swap_32 (digest[0]);
11550 digest[1] = byte_swap_32 (digest[1]);
11551 digest[2] = byte_swap_32 (digest[2]);
11552 digest[3] = byte_swap_32 (digest[3]);
11553 digest[4] = byte_swap_32 (digest[4]);
11554
11555 digest[0] -= SHA1M_A;
11556 digest[1] -= SHA1M_B;
11557 digest[2] -= SHA1M_C;
11558 digest[3] -= SHA1M_D;
11559 digest[4] -= SHA1M_E;
11560
11561 return (PARSER_OK);
11562 }
11563
11564 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11565 {
11566 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11567
11568 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11569
11570 u32 *digest = (u32 *) hash_buf->digest;
11571
11572 salt_t *salt = hash_buf->salt;
11573
11574 char *salt_buf = input_buf + 6;
11575
11576 uint salt_len = 8;
11577
11578 char *salt_buf_ptr = (char *) salt->salt_buf;
11579
11580 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11581
11582 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11583
11584 salt->salt_len = salt_len;
11585
11586 char *hash_pos = input_buf + 6 + 8 + 40;
11587
11588 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11589 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11590 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11591 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11592 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11593
11594 digest[0] -= SHA1M_A;
11595 digest[1] -= SHA1M_B;
11596 digest[2] -= SHA1M_C;
11597 digest[3] -= SHA1M_D;
11598 digest[4] -= SHA1M_E;
11599
11600 return (PARSER_OK);
11601 }
11602
11603 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11604 {
11605 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11606
11607 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11608
11609 u32 *digest = (u32 *) hash_buf->digest;
11610
11611 salt_t *salt = hash_buf->salt;
11612
11613 char *salt_buf = input_buf + 6;
11614
11615 uint salt_len = 8;
11616
11617 char *salt_buf_ptr = (char *) salt->salt_buf;
11618
11619 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11620
11621 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11622
11623 salt->salt_len = salt_len;
11624
11625 char *hash_pos = input_buf + 6 + 8;
11626
11627 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11628 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11629 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11630 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11631 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11632
11633 digest[0] -= SHA1M_A;
11634 digest[1] -= SHA1M_B;
11635 digest[2] -= SHA1M_C;
11636 digest[3] -= SHA1M_D;
11637 digest[4] -= SHA1M_E;
11638
11639 return (PARSER_OK);
11640 }
11641
11642 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11643 {
11644 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11645
11646 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11647
11648 u64 *digest = (u64 *) hash_buf->digest;
11649
11650 salt_t *salt = hash_buf->salt;
11651
11652 char *salt_buf = input_buf + 6;
11653
11654 uint salt_len = 8;
11655
11656 char *salt_buf_ptr = (char *) salt->salt_buf;
11657
11658 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11659
11660 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11661
11662 salt->salt_len = salt_len;
11663
11664 char *hash_pos = input_buf + 6 + 8;
11665
11666 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11667 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11668 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11669 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11670 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11671 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11672 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11673 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11674
11675 digest[0] -= SHA512M_A;
11676 digest[1] -= SHA512M_B;
11677 digest[2] -= SHA512M_C;
11678 digest[3] -= SHA512M_D;
11679 digest[4] -= SHA512M_E;
11680 digest[5] -= SHA512M_F;
11681 digest[6] -= SHA512M_G;
11682 digest[7] -= SHA512M_H;
11683
11684 return (PARSER_OK);
11685 }
11686
11687 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11688 {
11689 if (data.opts_type & OPTS_TYPE_ST_HEX)
11690 {
11691 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11692 }
11693 else
11694 {
11695 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11696 }
11697
11698 u32 *digest = (u32 *) hash_buf->digest;
11699
11700 salt_t *salt = hash_buf->salt;
11701
11702 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11703 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11704 digest[2] = 0;
11705 digest[3] = 0;
11706
11707 digest[0] = byte_swap_32 (digest[0]);
11708 digest[1] = byte_swap_32 (digest[1]);
11709
11710 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11711
11712 uint salt_len = input_len - 16 - 1;
11713
11714 char *salt_buf = input_buf + 16 + 1;
11715
11716 char *salt_buf_ptr = (char *) salt->salt_buf;
11717
11718 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11719
11720 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11721
11722 salt->salt_len = salt_len;
11723
11724 return (PARSER_OK);
11725 }
11726
11727 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11728 {
11729 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
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] = hex_to_u32 ((const u8 *) &input_buf[16]);
11738 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11739 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11740
11741 digest[0] -= SHA1M_A;
11742 digest[1] -= SHA1M_B;
11743 digest[2] -= SHA1M_C;
11744 digest[3] -= SHA1M_D;
11745 digest[4] -= SHA1M_E;
11746
11747 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11748
11749 uint salt_len = input_len - 40 - 1;
11750
11751 char *salt_buf = input_buf + 40 + 1;
11752
11753 char *salt_buf_ptr = (char *) salt->salt_buf;
11754
11755 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11756
11757 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11758
11759 salt->salt_len = salt_len;
11760
11761 return (PARSER_OK);
11762 }
11763
11764 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11765 {
11766 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11767
11768 u32 *digest = (u32 *) hash_buf->digest;
11769
11770 salt_t *salt = hash_buf->salt;
11771
11772 char *hash_pos = input_buf;
11773
11774 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11775 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11776 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11777 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11778 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
11779 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
11780 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
11781 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
11782 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
11783 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
11784 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
11785 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
11786 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
11787 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
11788 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
11789 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
11790
11791 char *salt_pos = input_buf + 128;
11792
11793 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
11794 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
11795 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
11796 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
11797
11798 salt->salt_iter = ROUNDS_ORACLET - 1;
11799 salt->salt_len = 16;
11800
11801 return (PARSER_OK);
11802 }
11803
11804 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11805 {
11806 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11807
11808 u32 *digest = (u32 *) hash_buf->digest;
11809
11810 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11811 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11812 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11813 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11814 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11815 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11816 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11817 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11818
11819 digest[0] -= SHA256M_A;
11820 digest[1] -= SHA256M_B;
11821 digest[2] -= SHA256M_C;
11822 digest[3] -= SHA256M_D;
11823 digest[4] -= SHA256M_E;
11824 digest[5] -= SHA256M_F;
11825 digest[6] -= SHA256M_G;
11826 digest[7] -= SHA256M_H;
11827
11828 return (PARSER_OK);
11829 }
11830
11831 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11832 {
11833 if (data.opts_type & OPTS_TYPE_ST_HEX)
11834 {
11835 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11836 }
11837 else
11838 {
11839 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11840 }
11841
11842 u32 *digest = (u32 *) hash_buf->digest;
11843
11844 salt_t *salt = hash_buf->salt;
11845
11846 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11847 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11848 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11849 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11850 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11851 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11852 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11853 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11854
11855 digest[0] -= SHA256M_A;
11856 digest[1] -= SHA256M_B;
11857 digest[2] -= SHA256M_C;
11858 digest[3] -= SHA256M_D;
11859 digest[4] -= SHA256M_E;
11860 digest[5] -= SHA256M_F;
11861 digest[6] -= SHA256M_G;
11862 digest[7] -= SHA256M_H;
11863
11864 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11865
11866 uint salt_len = input_len - 64 - 1;
11867
11868 char *salt_buf = input_buf + 64 + 1;
11869
11870 char *salt_buf_ptr = (char *) salt->salt_buf;
11871
11872 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11873
11874 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11875
11876 salt->salt_len = salt_len;
11877
11878 return (PARSER_OK);
11879 }
11880
11881 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11882 {
11883 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11884
11885 u64 *digest = (u64 *) hash_buf->digest;
11886
11887 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11888 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11889 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11890 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11891 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11892 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11893 digest[6] = 0;
11894 digest[7] = 0;
11895
11896 digest[0] -= SHA384M_A;
11897 digest[1] -= SHA384M_B;
11898 digest[2] -= SHA384M_C;
11899 digest[3] -= SHA384M_D;
11900 digest[4] -= SHA384M_E;
11901 digest[5] -= SHA384M_F;
11902 digest[6] -= 0;
11903 digest[7] -= 0;
11904
11905 return (PARSER_OK);
11906 }
11907
11908 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11909 {
11910 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11911
11912 u64 *digest = (u64 *) hash_buf->digest;
11913
11914 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11915 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11916 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11917 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11918 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11919 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11920 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11921 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11922
11923 digest[0] -= SHA512M_A;
11924 digest[1] -= SHA512M_B;
11925 digest[2] -= SHA512M_C;
11926 digest[3] -= SHA512M_D;
11927 digest[4] -= SHA512M_E;
11928 digest[5] -= SHA512M_F;
11929 digest[6] -= SHA512M_G;
11930 digest[7] -= SHA512M_H;
11931
11932 return (PARSER_OK);
11933 }
11934
11935 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11936 {
11937 if (data.opts_type & OPTS_TYPE_ST_HEX)
11938 {
11939 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11940 }
11941 else
11942 {
11943 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11944 }
11945
11946 u64 *digest = (u64 *) hash_buf->digest;
11947
11948 salt_t *salt = hash_buf->salt;
11949
11950 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11951 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11952 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11953 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11954 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11955 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11956 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11957 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11958
11959 digest[0] -= SHA512M_A;
11960 digest[1] -= SHA512M_B;
11961 digest[2] -= SHA512M_C;
11962 digest[3] -= SHA512M_D;
11963 digest[4] -= SHA512M_E;
11964 digest[5] -= SHA512M_F;
11965 digest[6] -= SHA512M_G;
11966 digest[7] -= SHA512M_H;
11967
11968 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11969
11970 uint salt_len = input_len - 128 - 1;
11971
11972 char *salt_buf = input_buf + 128 + 1;
11973
11974 char *salt_buf_ptr = (char *) salt->salt_buf;
11975
11976 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11977
11978 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11979
11980 salt->salt_len = salt_len;
11981
11982 return (PARSER_OK);
11983 }
11984
11985 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11986 {
11987 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11988
11989 u64 *digest = (u64 *) hash_buf->digest;
11990
11991 salt_t *salt = hash_buf->salt;
11992
11993 char *salt_pos = input_buf + 3;
11994
11995 uint iterations_len = 0;
11996
11997 if (memcmp (salt_pos, "rounds=", 7) == 0)
11998 {
11999 salt_pos += 7;
12000
12001 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12002
12003 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12004 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12005
12006 salt_pos[0] = 0x0;
12007
12008 salt->salt_iter = atoi (salt_pos - iterations_len);
12009
12010 salt_pos += 1;
12011
12012 iterations_len += 8;
12013 }
12014 else
12015 {
12016 salt->salt_iter = ROUNDS_SHA512CRYPT;
12017 }
12018
12019 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12020
12021 char *hash_pos = strchr (salt_pos, '$');
12022
12023 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12024
12025 uint salt_len = hash_pos - salt_pos;
12026
12027 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12028
12029 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12030
12031 salt->salt_len = salt_len;
12032
12033 hash_pos++;
12034
12035 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12036
12037 return (PARSER_OK);
12038 }
12039
12040 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12041 {
12042 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12043
12044 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12045
12046 u64 *digest = (u64 *) hash_buf->digest;
12047
12048 salt_t *salt = hash_buf->salt;
12049
12050 uint keccak_mdlen = input_len / 2;
12051
12052 for (uint i = 0; i < keccak_mdlen / 8; i++)
12053 {
12054 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12055
12056 digest[i] = byte_swap_64 (digest[i]);
12057 }
12058
12059 salt->keccak_mdlen = keccak_mdlen;
12060
12061 return (PARSER_OK);
12062 }
12063
12064 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12065 {
12066 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12067
12068 u32 *digest = (u32 *) hash_buf->digest;
12069
12070 salt_t *salt = hash_buf->salt;
12071
12072 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12073
12074 /**
12075 * Parse that strange long line
12076 */
12077
12078 char *in_off[9];
12079
12080 size_t in_len[9] = { 0 };
12081
12082 in_off[0] = strtok (input_buf, ":");
12083
12084 in_len[0] = strlen (in_off[0]);
12085
12086 size_t i;
12087
12088 for (i = 1; i < 9; i++)
12089 {
12090 in_off[i] = strtok (NULL, ":");
12091
12092 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12093
12094 in_len[i] = strlen (in_off[i]);
12095 }
12096
12097 char *ptr = (char *) ikepsk->msg_buf;
12098
12099 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12100 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12101 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12102 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12103 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12104 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12105
12106 *ptr = 0x80;
12107
12108 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12109
12110 ptr = (char *) ikepsk->nr_buf;
12111
12112 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12113 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12114
12115 *ptr = 0x80;
12116
12117 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12118
12119 /**
12120 * Store to database
12121 */
12122
12123 ptr = in_off[8];
12124
12125 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12126 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12127 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12128 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12129
12130 digest[0] = byte_swap_32 (digest[0]);
12131 digest[1] = byte_swap_32 (digest[1]);
12132 digest[2] = byte_swap_32 (digest[2]);
12133 digest[3] = byte_swap_32 (digest[3]);
12134
12135 salt->salt_len = 32;
12136
12137 salt->salt_buf[0] = ikepsk->nr_buf[0];
12138 salt->salt_buf[1] = ikepsk->nr_buf[1];
12139 salt->salt_buf[2] = ikepsk->nr_buf[2];
12140 salt->salt_buf[3] = ikepsk->nr_buf[3];
12141 salt->salt_buf[4] = ikepsk->nr_buf[4];
12142 salt->salt_buf[5] = ikepsk->nr_buf[5];
12143 salt->salt_buf[6] = ikepsk->nr_buf[6];
12144 salt->salt_buf[7] = ikepsk->nr_buf[7];
12145
12146 return (PARSER_OK);
12147 }
12148
12149 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12150 {
12151 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12152
12153 u32 *digest = (u32 *) hash_buf->digest;
12154
12155 salt_t *salt = hash_buf->salt;
12156
12157 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12158
12159 /**
12160 * Parse that strange long line
12161 */
12162
12163 char *in_off[9];
12164
12165 size_t in_len[9] = { 0 };
12166
12167 in_off[0] = strtok (input_buf, ":");
12168
12169 in_len[0] = strlen (in_off[0]);
12170
12171 size_t i;
12172
12173 for (i = 1; i < 9; i++)
12174 {
12175 in_off[i] = strtok (NULL, ":");
12176
12177 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12178
12179 in_len[i] = strlen (in_off[i]);
12180 }
12181
12182 char *ptr = (char *) ikepsk->msg_buf;
12183
12184 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12185 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12186 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12187 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12188 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12189 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12190
12191 *ptr = 0x80;
12192
12193 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12194
12195 ptr = (char *) ikepsk->nr_buf;
12196
12197 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12198 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12199
12200 *ptr = 0x80;
12201
12202 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12203
12204 /**
12205 * Store to database
12206 */
12207
12208 ptr = in_off[8];
12209
12210 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12211 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12212 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12213 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12214 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12215
12216 salt->salt_len = 32;
12217
12218 salt->salt_buf[0] = ikepsk->nr_buf[0];
12219 salt->salt_buf[1] = ikepsk->nr_buf[1];
12220 salt->salt_buf[2] = ikepsk->nr_buf[2];
12221 salt->salt_buf[3] = ikepsk->nr_buf[3];
12222 salt->salt_buf[4] = ikepsk->nr_buf[4];
12223 salt->salt_buf[5] = ikepsk->nr_buf[5];
12224 salt->salt_buf[6] = ikepsk->nr_buf[6];
12225 salt->salt_buf[7] = ikepsk->nr_buf[7];
12226
12227 return (PARSER_OK);
12228 }
12229
12230 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12231 {
12232 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12233
12234 u32 *digest = (u32 *) hash_buf->digest;
12235
12236 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12237 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12238 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12239 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12240 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12241
12242 digest[0] = byte_swap_32 (digest[0]);
12243 digest[1] = byte_swap_32 (digest[1]);
12244 digest[2] = byte_swap_32 (digest[2]);
12245 digest[3] = byte_swap_32 (digest[3]);
12246 digest[4] = byte_swap_32 (digest[4]);
12247
12248 return (PARSER_OK);
12249 }
12250
12251 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12252 {
12253 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12254
12255 u32 *digest = (u32 *) hash_buf->digest;
12256
12257 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12258 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12259 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12260 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12261 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12262 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12263 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12264 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12265 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12266 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12267 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12268 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12269 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12270 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12271 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12272 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12273
12274 return (PARSER_OK);
12275 }
12276
12277 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12278 {
12279 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12280
12281 u32 *digest = (u32 *) hash_buf->digest;
12282
12283 salt_t *salt = hash_buf->salt;
12284
12285 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12286 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12287 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12288 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12289 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12290
12291 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12292
12293 uint salt_len = input_len - 40 - 1;
12294
12295 char *salt_buf = input_buf + 40 + 1;
12296
12297 char *salt_buf_ptr = (char *) salt->salt_buf;
12298
12299 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12300
12301 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12302
12303 salt->salt_len = salt_len;
12304
12305 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12306
12307 return (PARSER_OK);
12308 }
12309
12310 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12311 {
12312 u32 *digest = (u32 *) hash_buf->digest;
12313
12314 salt_t *salt = hash_buf->salt;
12315
12316 tc_t *tc = (tc_t *) hash_buf->esalt;
12317
12318 if (input_len == 0)
12319 {
12320 log_error ("TrueCrypt container not specified");
12321
12322 exit (-1);
12323 }
12324
12325 FILE *fp = fopen (input_buf, "rb");
12326
12327 if (fp == NULL)
12328 {
12329 log_error ("%s: %s", input_buf, strerror (errno));
12330
12331 exit (-1);
12332 }
12333
12334 char buf[512] = { 0 };
12335
12336 int n = fread (buf, 1, sizeof (buf), fp);
12337
12338 fclose (fp);
12339
12340 if (n != 512) return (PARSER_TC_FILE_SIZE);
12341
12342 memcpy (tc->salt_buf, buf, 64);
12343
12344 memcpy (tc->data_buf, buf + 64, 512 - 64);
12345
12346 salt->salt_buf[0] = tc->salt_buf[0];
12347
12348 salt->salt_len = 4;
12349
12350 salt->salt_iter = 1000 - 1;
12351
12352 digest[0] = tc->data_buf[0];
12353
12354 return (PARSER_OK);
12355 }
12356
12357 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12358 {
12359 u32 *digest = (u32 *) hash_buf->digest;
12360
12361 salt_t *salt = hash_buf->salt;
12362
12363 tc_t *tc = (tc_t *) hash_buf->esalt;
12364
12365 if (input_len == 0)
12366 {
12367 log_error ("TrueCrypt container not specified");
12368
12369 exit (-1);
12370 }
12371
12372 FILE *fp = fopen (input_buf, "rb");
12373
12374 if (fp == NULL)
12375 {
12376 log_error ("%s: %s", input_buf, strerror (errno));
12377
12378 exit (-1);
12379 }
12380
12381 char buf[512] = { 0 };
12382
12383 int n = fread (buf, 1, sizeof (buf), fp);
12384
12385 fclose (fp);
12386
12387 if (n != 512) return (PARSER_TC_FILE_SIZE);
12388
12389 memcpy (tc->salt_buf, buf, 64);
12390
12391 memcpy (tc->data_buf, buf + 64, 512 - 64);
12392
12393 salt->salt_buf[0] = tc->salt_buf[0];
12394
12395 salt->salt_len = 4;
12396
12397 salt->salt_iter = 2000 - 1;
12398
12399 digest[0] = tc->data_buf[0];
12400
12401 return (PARSER_OK);
12402 }
12403
12404 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12405 {
12406 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12407
12408 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12409
12410 u32 *digest = (u32 *) hash_buf->digest;
12411
12412 salt_t *salt = hash_buf->salt;
12413
12414 char *salt_pos = input_buf + 6;
12415
12416 char *hash_pos = strchr (salt_pos, '$');
12417
12418 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12419
12420 uint salt_len = hash_pos - salt_pos;
12421
12422 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12423
12424 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12425
12426 salt->salt_len = salt_len;
12427
12428 salt->salt_iter = 1000;
12429
12430 hash_pos++;
12431
12432 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12433
12434 return (PARSER_OK);
12435 }
12436
12437 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12438 {
12439 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12440
12441 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12442
12443 u32 *digest = (u32 *) hash_buf->digest;
12444
12445 salt_t *salt = hash_buf->salt;
12446
12447 char *iter_pos = input_buf + 7;
12448
12449 char *salt_pos = strchr (iter_pos, '$');
12450
12451 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12452
12453 salt_pos++;
12454
12455 char *hash_pos = strchr (salt_pos, '$');
12456
12457 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12458
12459 uint salt_len = hash_pos - salt_pos;
12460
12461 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12462
12463 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12464
12465 salt->salt_len = salt_len;
12466
12467 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12468
12469 salt->salt_sign[0] = atoi (salt_iter);
12470
12471 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12472
12473 hash_pos++;
12474
12475 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12476
12477 digest[0] = byte_swap_32 (digest[0]);
12478 digest[1] = byte_swap_32 (digest[1]);
12479 digest[2] = byte_swap_32 (digest[2]);
12480 digest[3] = byte_swap_32 (digest[3]);
12481 digest[4] = byte_swap_32 (digest[4]);
12482
12483 return (PARSER_OK);
12484 }
12485
12486 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12487 {
12488 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12489
12490 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12491
12492 u32 *digest = (u32 *) hash_buf->digest;
12493
12494 salt_t *salt = hash_buf->salt;
12495
12496 char *iter_pos = input_buf + 9;
12497
12498 char *salt_pos = strchr (iter_pos, '$');
12499
12500 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12501
12502 salt_pos++;
12503
12504 char *hash_pos = strchr (salt_pos, '$');
12505
12506 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12507
12508 uint salt_len = hash_pos - salt_pos;
12509
12510 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12511
12512 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12513
12514 salt->salt_len = salt_len;
12515
12516 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12517
12518 salt->salt_sign[0] = atoi (salt_iter);
12519
12520 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12521
12522 hash_pos++;
12523
12524 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12525
12526 digest[0] = byte_swap_32 (digest[0]);
12527 digest[1] = byte_swap_32 (digest[1]);
12528 digest[2] = byte_swap_32 (digest[2]);
12529 digest[3] = byte_swap_32 (digest[3]);
12530 digest[4] = byte_swap_32 (digest[4]);
12531 digest[5] = byte_swap_32 (digest[5]);
12532 digest[6] = byte_swap_32 (digest[6]);
12533 digest[7] = byte_swap_32 (digest[7]);
12534
12535 return (PARSER_OK);
12536 }
12537
12538 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12539 {
12540 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12541
12542 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12543
12544 u64 *digest = (u64 *) hash_buf->digest;
12545
12546 salt_t *salt = hash_buf->salt;
12547
12548 char *iter_pos = input_buf + 9;
12549
12550 char *salt_pos = strchr (iter_pos, '$');
12551
12552 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12553
12554 salt_pos++;
12555
12556 char *hash_pos = strchr (salt_pos, '$');
12557
12558 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12559
12560 uint salt_len = hash_pos - salt_pos;
12561
12562 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12563
12564 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12565
12566 salt->salt_len = salt_len;
12567
12568 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12569
12570 salt->salt_sign[0] = atoi (salt_iter);
12571
12572 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12573
12574 hash_pos++;
12575
12576 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12577
12578 digest[0] = byte_swap_64 (digest[0]);
12579 digest[1] = byte_swap_64 (digest[1]);
12580 digest[2] = byte_swap_64 (digest[2]);
12581 digest[3] = byte_swap_64 (digest[3]);
12582 digest[4] = byte_swap_64 (digest[4]);
12583 digest[5] = byte_swap_64 (digest[5]);
12584 digest[6] = byte_swap_64 (digest[6]);
12585 digest[7] = byte_swap_64 (digest[7]);
12586
12587 return (PARSER_OK);
12588 }
12589
12590 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12591 {
12592 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12593
12594 u32 *digest = (u32 *) hash_buf->digest;
12595
12596 salt_t *salt = hash_buf->salt;
12597
12598 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12599
12600 /**
12601 * parse line
12602 */
12603
12604 char *iterations_pos = input_buf;
12605
12606 char *saltbuf_pos = strchr (iterations_pos, ':');
12607
12608 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12609
12610 uint iterations_len = saltbuf_pos - iterations_pos;
12611
12612 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12613
12614 saltbuf_pos++;
12615
12616 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12617
12618 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12619
12620 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12621
12622 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12623
12624 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12625
12626 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12627
12628 cipherbuf_pos++;
12629
12630 /**
12631 * pbkdf2 iterations
12632 */
12633
12634 salt->salt_iter = atoi (iterations_pos) - 1;
12635
12636 /**
12637 * handle salt encoding
12638 */
12639
12640 char *saltbuf_ptr = (char *) salt->salt_buf;
12641
12642 for (uint i = 0; i < saltbuf_len; i += 2)
12643 {
12644 const char p0 = saltbuf_pos[i + 0];
12645 const char p1 = saltbuf_pos[i + 1];
12646
12647 *saltbuf_ptr++ = hex_convert (p1) << 0
12648 | hex_convert (p0) << 4;
12649 }
12650
12651 salt->salt_len = saltbuf_len / 2;
12652
12653 /**
12654 * handle cipher encoding
12655 */
12656
12657 uint *tmp = (uint *) mymalloc (32);
12658
12659 char *cipherbuf_ptr = (char *) tmp;
12660
12661 for (uint i = 2016; i < cipherbuf_len; i += 2)
12662 {
12663 const char p0 = cipherbuf_pos[i + 0];
12664 const char p1 = cipherbuf_pos[i + 1];
12665
12666 *cipherbuf_ptr++ = hex_convert (p1) << 0
12667 | hex_convert (p0) << 4;
12668 }
12669
12670 // iv is stored at salt_buf 4 (length 16)
12671 // data is stored at salt_buf 8 (length 16)
12672
12673 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12674 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12675 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12676 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12677
12678 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12679 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12680 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12681 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12682
12683 free (tmp);
12684
12685 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12686 {
12687 const char p0 = cipherbuf_pos[j + 0];
12688 const char p1 = cipherbuf_pos[j + 1];
12689
12690 agilekey->cipher[i] = hex_convert (p1) << 0
12691 | hex_convert (p0) << 4;
12692 }
12693
12694 /**
12695 * digest buf
12696 */
12697
12698 digest[0] = 0x10101010;
12699 digest[1] = 0x10101010;
12700 digest[2] = 0x10101010;
12701 digest[3] = 0x10101010;
12702
12703 return (PARSER_OK);
12704 }
12705
12706 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12707 {
12708 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12709
12710 u32 *digest = (u32 *) hash_buf->digest;
12711
12712 salt_t *salt = hash_buf->salt;
12713
12714 char *hashbuf_pos = input_buf;
12715
12716 char *iterations_pos = strchr (hashbuf_pos, ':');
12717
12718 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12719
12720 uint hash_len = iterations_pos - hashbuf_pos;
12721
12722 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12723
12724 iterations_pos++;
12725
12726 char *saltbuf_pos = strchr (iterations_pos, ':');
12727
12728 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12729
12730 uint iterations_len = saltbuf_pos - iterations_pos;
12731
12732 saltbuf_pos++;
12733
12734 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12735
12736 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12737
12738 char *salt_buf_ptr = (char *) salt->salt_buf;
12739
12740 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12741
12742 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12743
12744 salt->salt_len = salt_len;
12745
12746 salt->salt_iter = atoi (iterations_pos) - 1;
12747
12748 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12749 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12750 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12751 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12752
12753 return (PARSER_OK);
12754 }
12755
12756 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12757 {
12758 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12759
12760 u32 *digest = (u32 *) hash_buf->digest;
12761
12762 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12763 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12764 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12765 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12766 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12767 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12768 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12769 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12770
12771 digest[0] = byte_swap_32 (digest[0]);
12772 digest[1] = byte_swap_32 (digest[1]);
12773 digest[2] = byte_swap_32 (digest[2]);
12774 digest[3] = byte_swap_32 (digest[3]);
12775 digest[4] = byte_swap_32 (digest[4]);
12776 digest[5] = byte_swap_32 (digest[5]);
12777 digest[6] = byte_swap_32 (digest[6]);
12778 digest[7] = byte_swap_32 (digest[7]);
12779
12780 return (PARSER_OK);
12781 }
12782
12783 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12784 {
12785 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12786
12787 u32 *digest = (u32 *) hash_buf->digest;
12788
12789 salt_t *salt = hash_buf->salt;
12790
12791 char *salt_pos = input_buf + 3;
12792
12793 uint iterations_len = 0;
12794
12795 if (memcmp (salt_pos, "rounds=", 7) == 0)
12796 {
12797 salt_pos += 7;
12798
12799 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12800
12801 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12802 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12803
12804 salt_pos[0] = 0x0;
12805
12806 salt->salt_iter = atoi (salt_pos - iterations_len);
12807
12808 salt_pos += 1;
12809
12810 iterations_len += 8;
12811 }
12812 else
12813 {
12814 salt->salt_iter = ROUNDS_SHA256CRYPT;
12815 }
12816
12817 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12818
12819 char *hash_pos = strchr (salt_pos, '$');
12820
12821 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12822
12823 uint salt_len = hash_pos - salt_pos;
12824
12825 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12826
12827 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12828
12829 salt->salt_len = salt_len;
12830
12831 hash_pos++;
12832
12833 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12834
12835 return (PARSER_OK);
12836 }
12837
12838 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12839 {
12840 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12841
12842 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12843
12844 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12845
12846 u64 *digest = (u64 *) hash_buf->digest;
12847
12848 salt_t *salt = hash_buf->salt;
12849
12850 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12851
12852 char *iter_pos = input_buf + 4;
12853
12854 char *salt_pos = strchr (iter_pos, '$');
12855
12856 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12857
12858 salt_pos++;
12859
12860 char *hash_pos = strchr (salt_pos, '$');
12861
12862 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12863
12864 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12865
12866 hash_pos++;
12867
12868 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12869 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12870 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12871 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12872 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12873 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12874 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12875 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12876
12877 uint salt_len = hash_pos - salt_pos - 1;
12878
12879 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12880
12881 salt->salt_len = salt_len / 2;
12882
12883 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12884 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12885 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12886 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12887 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
12888 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
12889 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
12890 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
12891
12892 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12893 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12894 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12895 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12896 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12897 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12898 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12899 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12900 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12901 pbkdf2_sha512->salt_buf[9] = 0x80;
12902
12903 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12904
12905 salt->salt_iter = atoi (iter_pos) - 1;
12906
12907 return (PARSER_OK);
12908 }
12909
12910 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12911 {
12912 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12913
12914 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12915
12916 u32 *digest = (u32 *) hash_buf->digest;
12917
12918 salt_t *salt = hash_buf->salt;
12919
12920 char *salt_pos = input_buf + 14;
12921
12922 char *hash_pos = strchr (salt_pos, '*');
12923
12924 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12925
12926 hash_pos++;
12927
12928 uint salt_len = hash_pos - salt_pos - 1;
12929
12930 char *salt_buf_ptr = (char *) salt->salt_buf;
12931
12932 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12933
12934 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12935
12936 salt->salt_len = salt_len;
12937
12938 u8 tmp_buf[100] = { 0 };
12939
12940 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
12941
12942 memcpy (digest, tmp_buf, 32);
12943
12944 digest[0] = byte_swap_32 (digest[0]);
12945 digest[1] = byte_swap_32 (digest[1]);
12946 digest[2] = byte_swap_32 (digest[2]);
12947 digest[3] = byte_swap_32 (digest[3]);
12948 digest[4] = byte_swap_32 (digest[4]);
12949 digest[5] = byte_swap_32 (digest[5]);
12950 digest[6] = byte_swap_32 (digest[6]);
12951 digest[7] = byte_swap_32 (digest[7]);
12952
12953 digest[0] -= SHA256M_A;
12954 digest[1] -= SHA256M_B;
12955 digest[2] -= SHA256M_C;
12956 digest[3] -= SHA256M_D;
12957 digest[4] -= SHA256M_E;
12958 digest[5] -= SHA256M_F;
12959 digest[6] -= SHA256M_G;
12960 digest[7] -= SHA256M_H;
12961
12962 return (PARSER_OK);
12963 }
12964
12965 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12966 {
12967 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12968
12969 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12970
12971 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12972
12973 u64 *digest = (u64 *) hash_buf->digest;
12974
12975 salt_t *salt = hash_buf->salt;
12976
12977 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12978
12979 char *iter_pos = input_buf + 19;
12980
12981 char *salt_pos = strchr (iter_pos, '.');
12982
12983 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12984
12985 salt_pos++;
12986
12987 char *hash_pos = strchr (salt_pos, '.');
12988
12989 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12990
12991 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12992
12993 hash_pos++;
12994
12995 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12996 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12997 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12998 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12999 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13000 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13001 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13002 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13003
13004 uint salt_len = hash_pos - salt_pos - 1;
13005
13006 salt_len /= 2;
13007
13008 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13009
13010 uint i;
13011
13012 for (i = 0; i < salt_len; i++)
13013 {
13014 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13015 }
13016
13017 salt_buf_ptr[salt_len + 3] = 0x01;
13018 salt_buf_ptr[salt_len + 4] = 0x80;
13019
13020 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13021
13022 salt->salt_len = salt_len;
13023
13024 salt->salt_iter = atoi (iter_pos) - 1;
13025
13026 return (PARSER_OK);
13027 }
13028
13029 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13030 {
13031 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13032
13033 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13034
13035 u64 *digest = (u64 *) hash_buf->digest;
13036
13037 salt_t *salt = hash_buf->salt;
13038
13039 u8 tmp_buf[120] = { 0 };
13040
13041 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13042
13043 memcpy (digest, tmp_buf, 64);
13044
13045 digest[0] = byte_swap_64 (digest[0]);
13046 digest[1] = byte_swap_64 (digest[1]);
13047 digest[2] = byte_swap_64 (digest[2]);
13048 digest[3] = byte_swap_64 (digest[3]);
13049 digest[4] = byte_swap_64 (digest[4]);
13050 digest[5] = byte_swap_64 (digest[5]);
13051 digest[6] = byte_swap_64 (digest[6]);
13052 digest[7] = byte_swap_64 (digest[7]);
13053
13054 digest[0] -= SHA512M_A;
13055 digest[1] -= SHA512M_B;
13056 digest[2] -= SHA512M_C;
13057 digest[3] -= SHA512M_D;
13058 digest[4] -= SHA512M_E;
13059 digest[5] -= SHA512M_F;
13060 digest[6] -= SHA512M_G;
13061 digest[7] -= SHA512M_H;
13062
13063 salt->salt_len = tmp_len - 64;
13064
13065 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13066
13067 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13068 {
13069 char *ptr = (char *) salt->salt_buf;
13070
13071 ptr[salt->salt_len] = 0x80;
13072 }
13073
13074 return (PARSER_OK);
13075 }
13076
13077 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13078 {
13079 if (data.opts_type & OPTS_TYPE_ST_HEX)
13080 {
13081 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13082 }
13083 else
13084 {
13085 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13086 }
13087
13088 u32 *digest = (u32 *) hash_buf->digest;
13089
13090 salt_t *salt = hash_buf->salt;
13091
13092 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13093 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13094 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13095 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13096
13097 digest[0] = byte_swap_32 (digest[0]);
13098 digest[1] = byte_swap_32 (digest[1]);
13099 digest[2] = byte_swap_32 (digest[2]);
13100 digest[3] = byte_swap_32 (digest[3]);
13101
13102 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13103
13104 uint salt_len = input_len - 32 - 1;
13105
13106 char *salt_buf = input_buf + 32 + 1;
13107
13108 char *salt_buf_ptr = (char *) salt->salt_buf;
13109
13110 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13111
13112 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13113
13114 salt->salt_len = salt_len;
13115
13116 return (PARSER_OK);
13117 }
13118
13119 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13120 {
13121 if (data.opts_type & OPTS_TYPE_ST_HEX)
13122 {
13123 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13124 }
13125 else
13126 {
13127 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13128 }
13129
13130 u32 *digest = (u32 *) hash_buf->digest;
13131
13132 salt_t *salt = hash_buf->salt;
13133
13134 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13135 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13136 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13137 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13138 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13139
13140 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13141
13142 uint salt_len = input_len - 40 - 1;
13143
13144 char *salt_buf = input_buf + 40 + 1;
13145
13146 char *salt_buf_ptr = (char *) salt->salt_buf;
13147
13148 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13149
13150 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13151
13152 salt->salt_len = salt_len;
13153
13154 return (PARSER_OK);
13155 }
13156
13157 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13158 {
13159 if (data.opts_type & OPTS_TYPE_ST_HEX)
13160 {
13161 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13162 }
13163 else
13164 {
13165 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13166 }
13167
13168 u32 *digest = (u32 *) hash_buf->digest;
13169
13170 salt_t *salt = hash_buf->salt;
13171
13172 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13173 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13174 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13175 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13176 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13177 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13178 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13179 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13180
13181 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13182
13183 uint salt_len = input_len - 64 - 1;
13184
13185 char *salt_buf = input_buf + 64 + 1;
13186
13187 char *salt_buf_ptr = (char *) salt->salt_buf;
13188
13189 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13190
13191 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13192
13193 salt->salt_len = salt_len;
13194
13195 return (PARSER_OK);
13196 }
13197
13198 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13199 {
13200 if (data.opts_type & OPTS_TYPE_ST_HEX)
13201 {
13202 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13203 }
13204 else
13205 {
13206 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13207 }
13208
13209 u64 *digest = (u64 *) hash_buf->digest;
13210
13211 salt_t *salt = hash_buf->salt;
13212
13213 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13214 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13215 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13216 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13217 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13218 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13219 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13220 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13221
13222 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13223
13224 uint salt_len = input_len - 128 - 1;
13225
13226 char *salt_buf = input_buf + 128 + 1;
13227
13228 char *salt_buf_ptr = (char *) salt->salt_buf;
13229
13230 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13231
13232 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13233
13234 salt->salt_len = salt_len;
13235
13236 return (PARSER_OK);
13237 }
13238
13239 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13240 {
13241 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13242
13243 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13244
13245 u32 *digest = (u32 *) hash_buf->digest;
13246
13247 salt_t *salt = hash_buf->salt;
13248
13249 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13250
13251 /**
13252 * parse line
13253 */
13254
13255 char *user_pos = input_buf + 10 + 1;
13256
13257 char *realm_pos = strchr (user_pos, '$');
13258
13259 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13260
13261 uint user_len = realm_pos - user_pos;
13262
13263 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13264
13265 realm_pos++;
13266
13267 char *salt_pos = strchr (realm_pos, '$');
13268
13269 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13270
13271 uint realm_len = salt_pos - realm_pos;
13272
13273 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13274
13275 salt_pos++;
13276
13277 char *data_pos = strchr (salt_pos, '$');
13278
13279 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13280
13281 uint salt_len = data_pos - salt_pos;
13282
13283 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13284
13285 data_pos++;
13286
13287 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13288
13289 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13290
13291 /**
13292 * copy data
13293 */
13294
13295 memcpy (krb5pa->user, user_pos, user_len);
13296 memcpy (krb5pa->realm, realm_pos, realm_len);
13297 memcpy (krb5pa->salt, salt_pos, salt_len);
13298
13299 char *timestamp_ptr = (char *) krb5pa->timestamp;
13300
13301 for (uint i = 0; i < (36 * 2); i += 2)
13302 {
13303 const char p0 = data_pos[i + 0];
13304 const char p1 = data_pos[i + 1];
13305
13306 *timestamp_ptr++ = hex_convert (p1) << 0
13307 | hex_convert (p0) << 4;
13308 }
13309
13310 char *checksum_ptr = (char *) krb5pa->checksum;
13311
13312 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13313 {
13314 const char p0 = data_pos[i + 0];
13315 const char p1 = data_pos[i + 1];
13316
13317 *checksum_ptr++ = hex_convert (p1) << 0
13318 | hex_convert (p0) << 4;
13319 }
13320
13321 /**
13322 * copy some data to generic buffers to make sorting happy
13323 */
13324
13325 salt->salt_buf[0] = krb5pa->timestamp[0];
13326 salt->salt_buf[1] = krb5pa->timestamp[1];
13327 salt->salt_buf[2] = krb5pa->timestamp[2];
13328 salt->salt_buf[3] = krb5pa->timestamp[3];
13329 salt->salt_buf[4] = krb5pa->timestamp[4];
13330 salt->salt_buf[5] = krb5pa->timestamp[5];
13331 salt->salt_buf[6] = krb5pa->timestamp[6];
13332 salt->salt_buf[7] = krb5pa->timestamp[7];
13333 salt->salt_buf[8] = krb5pa->timestamp[8];
13334
13335 salt->salt_len = 36;
13336
13337 digest[0] = krb5pa->checksum[0];
13338 digest[1] = krb5pa->checksum[1];
13339 digest[2] = krb5pa->checksum[2];
13340 digest[3] = krb5pa->checksum[3];
13341
13342 return (PARSER_OK);
13343 }
13344
13345 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13346 {
13347 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13348
13349 u32 *digest = (u32 *) hash_buf->digest;
13350
13351 salt_t *salt = hash_buf->salt;
13352
13353 /**
13354 * parse line
13355 */
13356
13357 char *salt_pos = input_buf;
13358
13359 char *hash_pos = strchr (salt_pos, '$');
13360
13361 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13362
13363 uint salt_len = hash_pos - salt_pos;
13364
13365 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13366
13367 hash_pos++;
13368
13369 uint hash_len = input_len - 1 - salt_len;
13370
13371 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13372
13373 /**
13374 * valid some data
13375 */
13376
13377 uint user_len = 0;
13378
13379 for (uint i = 0; i < salt_len; i++)
13380 {
13381 if (salt_pos[i] == ' ') continue;
13382
13383 user_len++;
13384 }
13385
13386 // SAP user names cannot be longer than 12 characters
13387 if (user_len > 12) return (PARSER_SALT_LENGTH);
13388
13389 // SAP user name cannot start with ! or ?
13390 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13391
13392 /**
13393 * copy data
13394 */
13395
13396 char *salt_buf_ptr = (char *) salt->salt_buf;
13397
13398 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13399
13400 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13401
13402 salt->salt_len = salt_len;
13403
13404 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13405 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13406 digest[2] = 0;
13407 digest[3] = 0;
13408
13409 digest[0] = byte_swap_32 (digest[0]);
13410 digest[1] = byte_swap_32 (digest[1]);
13411
13412 return (PARSER_OK);
13413 }
13414
13415 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13416 {
13417 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13418
13419 u32 *digest = (u32 *) hash_buf->digest;
13420
13421 salt_t *salt = hash_buf->salt;
13422
13423 /**
13424 * parse line
13425 */
13426
13427 char *salt_pos = input_buf;
13428
13429 char *hash_pos = strchr (salt_pos, '$');
13430
13431 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13432
13433 uint salt_len = hash_pos - salt_pos;
13434
13435 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13436
13437 hash_pos++;
13438
13439 uint hash_len = input_len - 1 - salt_len;
13440
13441 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13442
13443 /**
13444 * valid some data
13445 */
13446
13447 uint user_len = 0;
13448
13449 for (uint i = 0; i < salt_len; i++)
13450 {
13451 if (salt_pos[i] == ' ') continue;
13452
13453 user_len++;
13454 }
13455
13456 // SAP user names cannot be longer than 12 characters
13457 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13458 // so far nobody complained so we stay with this because it helps in optimization
13459 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13460
13461 if (user_len > 12) return (PARSER_SALT_LENGTH);
13462
13463 // SAP user name cannot start with ! or ?
13464 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13465
13466 /**
13467 * copy data
13468 */
13469
13470 char *salt_buf_ptr = (char *) salt->salt_buf;
13471
13472 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13473
13474 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13475
13476 salt->salt_len = salt_len;
13477
13478 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13479 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13480 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13481 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13482 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13483
13484 return (PARSER_OK);
13485 }
13486
13487 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13488 {
13489 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13490
13491 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13492
13493 u64 *digest = (u64 *) hash_buf->digest;
13494
13495 salt_t *salt = hash_buf->salt;
13496
13497 char *iter_pos = input_buf + 3;
13498
13499 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13500
13501 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13502
13503 memcpy ((char *) salt->salt_sign, input_buf, 4);
13504
13505 salt->salt_iter = salt_iter;
13506
13507 char *salt_pos = iter_pos + 1;
13508
13509 uint salt_len = 8;
13510
13511 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13512
13513 salt->salt_len = salt_len;
13514
13515 char *hash_pos = salt_pos + salt_len;
13516
13517 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13518
13519 // ugly hack start
13520
13521 char *tmp = (char *) salt->salt_buf_pc;
13522
13523 tmp[0] = hash_pos[42];
13524
13525 // ugly hack end
13526
13527 digest[ 0] = byte_swap_64 (digest[ 0]);
13528 digest[ 1] = byte_swap_64 (digest[ 1]);
13529 digest[ 2] = byte_swap_64 (digest[ 2]);
13530 digest[ 3] = byte_swap_64 (digest[ 3]);
13531 digest[ 4] = 0;
13532 digest[ 5] = 0;
13533 digest[ 6] = 0;
13534 digest[ 7] = 0;
13535
13536 return (PARSER_OK);
13537 }
13538
13539 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13540 {
13541 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13542
13543 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13544
13545 u32 *digest = (u32 *) hash_buf->digest;
13546
13547 salt_t *salt = hash_buf->salt;
13548
13549 char *salt_buf = input_buf + 6;
13550
13551 uint salt_len = 16;
13552
13553 char *salt_buf_ptr = (char *) salt->salt_buf;
13554
13555 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13556
13557 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13558
13559 salt->salt_len = salt_len;
13560
13561 char *hash_pos = input_buf + 6 + 16;
13562
13563 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13564 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13565 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13566 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13567 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13568 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13569 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13570 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13571
13572 return (PARSER_OK);
13573 }
13574
13575 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13576 {
13577 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13578
13579 u32 *digest = (u32 *) hash_buf->digest;
13580
13581 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13582 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13583 digest[2] = 0;
13584 digest[3] = 0;
13585
13586 return (PARSER_OK);
13587 }
13588
13589 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13590 {
13591 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13592
13593 u32 *digest = (u32 *) hash_buf->digest;
13594
13595 salt_t *salt = hash_buf->salt;
13596
13597 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13598
13599 char *saltbuf_pos = input_buf;
13600
13601 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13602
13603 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13604
13605 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13606
13607 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13608 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13609
13610 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13611
13612 hashbuf_pos++;
13613
13614 uint hashbuf_len = input_len - saltbuf_len - 1;
13615
13616 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13617
13618 char *salt_ptr = (char *) saltbuf_pos;
13619 char *rakp_ptr = (char *) rakp->salt_buf;
13620
13621 uint i;
13622 uint j;
13623
13624 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13625 {
13626 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13627 }
13628
13629 rakp_ptr[j] = 0x80;
13630
13631 rakp->salt_len = j;
13632
13633 for (i = 0; i < 64; i++)
13634 {
13635 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13636 }
13637
13638 salt->salt_buf[0] = rakp->salt_buf[0];
13639 salt->salt_buf[1] = rakp->salt_buf[1];
13640 salt->salt_buf[2] = rakp->salt_buf[2];
13641 salt->salt_buf[3] = rakp->salt_buf[3];
13642 salt->salt_buf[4] = rakp->salt_buf[4];
13643 salt->salt_buf[5] = rakp->salt_buf[5];
13644 salt->salt_buf[6] = rakp->salt_buf[6];
13645 salt->salt_buf[7] = rakp->salt_buf[7];
13646
13647 salt->salt_len = 32; // muss min. 32 haben
13648
13649 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13650 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13651 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13652 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13653 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13654
13655 return (PARSER_OK);
13656 }
13657
13658 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13659 {
13660 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13661
13662 u32 *digest = (u32 *) hash_buf->digest;
13663
13664 salt_t *salt = hash_buf->salt;
13665
13666 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13667
13668 char *salt_pos = input_buf + 1;
13669
13670 memcpy (salt->salt_buf, salt_pos, 8);
13671
13672 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13673 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13674
13675 salt->salt_len = 8;
13676
13677 char *hash_pos = salt_pos + 8;
13678
13679 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13680 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13681 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13682 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13683 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13684
13685 digest[0] -= SHA1M_A;
13686 digest[1] -= SHA1M_B;
13687 digest[2] -= SHA1M_C;
13688 digest[3] -= SHA1M_D;
13689 digest[4] -= SHA1M_E;
13690
13691 return (PARSER_OK);
13692 }
13693
13694 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13695 {
13696 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13697
13698 u32 *digest = (u32 *) hash_buf->digest;
13699
13700 salt_t *salt = hash_buf->salt;
13701
13702 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13703 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13704 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13705 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13706
13707 digest[0] = byte_swap_32 (digest[0]);
13708 digest[1] = byte_swap_32 (digest[1]);
13709 digest[2] = byte_swap_32 (digest[2]);
13710 digest[3] = byte_swap_32 (digest[3]);
13711
13712 digest[0] -= MD5M_A;
13713 digest[1] -= MD5M_B;
13714 digest[2] -= MD5M_C;
13715 digest[3] -= MD5M_D;
13716
13717 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13718
13719 char *salt_buf_ptr = input_buf + 32 + 1;
13720
13721 u32 *salt_buf = salt->salt_buf;
13722
13723 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13724 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13725 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13726 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13727
13728 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13729 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13730 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13731 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13732
13733 salt->salt_len = 16 + 1;
13734
13735 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13736
13737 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13738
13739 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13740
13741 return (PARSER_OK);
13742 }
13743
13744 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13745 {
13746 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13747
13748 u32 *digest = (u32 *) hash_buf->digest;
13749
13750 salt_t *salt = hash_buf->salt;
13751
13752 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13753
13754 /**
13755 * parse line
13756 */
13757
13758 char *hashbuf_pos = input_buf;
13759
13760 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13761
13762 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13763
13764 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13765
13766 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13767
13768 saltbuf_pos++;
13769
13770 char *iteration_pos = strchr (saltbuf_pos, ':');
13771
13772 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13773
13774 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13775
13776 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13777
13778 iteration_pos++;
13779
13780 char *databuf_pos = strchr (iteration_pos, ':');
13781
13782 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13783
13784 const uint iteration_len = databuf_pos - iteration_pos;
13785
13786 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13787 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13788
13789 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13790
13791 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13792 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13793
13794 databuf_pos++;
13795
13796 // digest
13797
13798 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13799 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13800 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13801 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13802 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13803 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
13804 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
13805 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
13806
13807 // salt
13808
13809 char *saltbuf_ptr = (char *) salt->salt_buf;
13810
13811 for (uint i = 0; i < saltbuf_len; i += 2)
13812 {
13813 const char p0 = saltbuf_pos[i + 0];
13814 const char p1 = saltbuf_pos[i + 1];
13815
13816 *saltbuf_ptr++ = hex_convert (p1) << 0
13817 | hex_convert (p0) << 4;
13818 }
13819
13820 salt->salt_buf[4] = 0x01000000;
13821 salt->salt_buf[5] = 0x80;
13822
13823 salt->salt_len = saltbuf_len / 2;
13824
13825 // iteration
13826
13827 salt->salt_iter = atoi (iteration_pos) - 1;
13828
13829 // data
13830
13831 char *databuf_ptr = (char *) cloudkey->data_buf;
13832
13833 for (uint i = 0; i < databuf_len; i += 2)
13834 {
13835 const char p0 = databuf_pos[i + 0];
13836 const char p1 = databuf_pos[i + 1];
13837
13838 *databuf_ptr++ = hex_convert (p1) << 0
13839 | hex_convert (p0) << 4;
13840 }
13841
13842 *databuf_ptr++ = 0x80;
13843
13844 for (uint i = 0; i < 512; i++)
13845 {
13846 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13847 }
13848
13849 cloudkey->data_len = databuf_len / 2;
13850
13851 return (PARSER_OK);
13852 }
13853
13854 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13855 {
13856 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13857
13858 u32 *digest = (u32 *) hash_buf->digest;
13859
13860 salt_t *salt = hash_buf->salt;
13861
13862 /**
13863 * parse line
13864 */
13865
13866 char *hashbuf_pos = input_buf;
13867
13868 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13869
13870 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13871
13872 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13873
13874 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13875
13876 domainbuf_pos++;
13877
13878 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13879
13880 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13881
13882 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13883
13884 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13885
13886 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13887
13888 saltbuf_pos++;
13889
13890 char *iteration_pos = strchr (saltbuf_pos, ':');
13891
13892 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13893
13894 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13895
13896 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13897
13898 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13899
13900 iteration_pos++;
13901
13902 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13903
13904 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13905 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13906
13907 // ok, the plan for this algorithm is the following:
13908 // we have 2 salts here, the domain-name and a random salt
13909 // while both are used in the initial transformation,
13910 // only the random salt is used in the following iterations
13911 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13912 // and one that includes only the real salt (stored into salt_buf[]).
13913 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13914
13915 u8 tmp_buf[100] = { 0 };
13916
13917 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
13918
13919 memcpy (digest, tmp_buf, 20);
13920
13921 digest[0] = byte_swap_32 (digest[0]);
13922 digest[1] = byte_swap_32 (digest[1]);
13923 digest[2] = byte_swap_32 (digest[2]);
13924 digest[3] = byte_swap_32 (digest[3]);
13925 digest[4] = byte_swap_32 (digest[4]);
13926
13927 // domain
13928
13929 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13930
13931 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13932
13933 char *len_ptr = NULL;
13934
13935 for (uint i = 0; i < domainbuf_len; i++)
13936 {
13937 if (salt_buf_pc_ptr[i] == '.')
13938 {
13939 len_ptr = &salt_buf_pc_ptr[i];
13940
13941 *len_ptr = 0;
13942 }
13943 else
13944 {
13945 *len_ptr += 1;
13946 }
13947 }
13948
13949 salt->salt_buf_pc[7] = domainbuf_len;
13950
13951 // "real" salt
13952
13953 char *salt_buf_ptr = (char *) salt->salt_buf;
13954
13955 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13956
13957 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13958
13959 salt->salt_len = salt_len;
13960
13961 // iteration
13962
13963 salt->salt_iter = atoi (iteration_pos);
13964
13965 return (PARSER_OK);
13966 }
13967
13968 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13969 {
13970 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13971
13972 u32 *digest = (u32 *) hash_buf->digest;
13973
13974 salt_t *salt = hash_buf->salt;
13975
13976 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13977 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13978 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13979 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13980 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13981
13982 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13983
13984 uint salt_len = input_len - 40 - 1;
13985
13986 char *salt_buf = input_buf + 40 + 1;
13987
13988 char *salt_buf_ptr = (char *) salt->salt_buf;
13989
13990 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13991
13992 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13993
13994 salt->salt_len = salt_len;
13995
13996 return (PARSER_OK);
13997 }
13998
13999 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14000 {
14001 const u8 ascii_to_ebcdic[] =
14002 {
14003 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14004 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14005 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14006 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14007 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14008 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14009 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14010 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14011 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14012 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14013 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14014 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14015 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14016 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14017 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14018 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14019 };
14020
14021 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14022
14023 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14024
14025 u32 *digest = (u32 *) hash_buf->digest;
14026
14027 salt_t *salt = hash_buf->salt;
14028
14029 char *salt_pos = input_buf + 6 + 1;
14030
14031 char *digest_pos = strchr (salt_pos, '*');
14032
14033 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14034
14035 uint salt_len = digest_pos - salt_pos;
14036
14037 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14038
14039 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14040
14041 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14042
14043 digest_pos++;
14044
14045 char *salt_buf_ptr = (char *) salt->salt_buf;
14046 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14047
14048 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14049
14050 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14051
14052 salt->salt_len = salt_len;
14053
14054 for (uint i = 0; i < salt_len; i++)
14055 {
14056 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14057 }
14058 for (uint i = salt_len; i < 8; i++)
14059 {
14060 salt_buf_pc_ptr[i] = 0x40;
14061 }
14062
14063 uint tt;
14064
14065 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14066
14067 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14068 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14069
14070 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14071 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14072
14073 digest[0] = byte_swap_32 (digest[0]);
14074 digest[1] = byte_swap_32 (digest[1]);
14075
14076 IP (digest[0], digest[1], tt);
14077
14078 digest[0] = rotr32 (digest[0], 29);
14079 digest[1] = rotr32 (digest[1], 29);
14080 digest[2] = 0;
14081 digest[3] = 0;
14082
14083 return (PARSER_OK);
14084 }
14085
14086 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14087 {
14088 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14089
14090 u32 *digest = (u32 *) hash_buf->digest;
14091
14092 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14093 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14094 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14095 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14096
14097 digest[0] = byte_swap_32 (digest[0]);
14098 digest[1] = byte_swap_32 (digest[1]);
14099 digest[2] = byte_swap_32 (digest[2]);
14100 digest[3] = byte_swap_32 (digest[3]);
14101
14102 return (PARSER_OK);
14103 }
14104
14105 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14106 {
14107 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14108
14109 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14110
14111 u32 *digest = (u32 *) hash_buf->digest;
14112
14113 salt_t *salt = hash_buf->salt;
14114
14115 u8 tmp_buf[120] = { 0 };
14116
14117 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14118
14119 tmp_buf[3] += -4; // dont ask!
14120
14121 memcpy (salt->salt_buf, tmp_buf, 5);
14122
14123 salt->salt_len = 5;
14124
14125 memcpy (digest, tmp_buf + 5, 9);
14126
14127 // yes, only 9 byte are needed to crack, but 10 to display
14128
14129 salt->salt_buf_pc[7] = input_buf[20];
14130
14131 return (PARSER_OK);
14132 }
14133
14134 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14135 {
14136 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14137
14138 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14139
14140 u32 *digest = (u32 *) hash_buf->digest;
14141
14142 salt_t *salt = hash_buf->salt;
14143
14144 u8 tmp_buf[120] = { 0 };
14145
14146 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14147
14148 tmp_buf[3] += -4; // dont ask!
14149
14150 // salt
14151
14152 memcpy (salt->salt_buf, tmp_buf, 16);
14153
14154 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)
14155
14156 // iteration
14157
14158 char tmp_iter_buf[11] = { 0 };
14159
14160 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14161
14162 tmp_iter_buf[10] = 0;
14163
14164 salt->salt_iter = atoi (tmp_iter_buf);
14165
14166 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14167 {
14168 return (PARSER_SALT_ITERATION);
14169 }
14170
14171 salt->salt_iter--; // first round in init
14172
14173 // 2 additional bytes for display only
14174
14175 salt->salt_buf_pc[0] = tmp_buf[26];
14176 salt->salt_buf_pc[1] = tmp_buf[27];
14177
14178 // digest
14179
14180 memcpy (digest, tmp_buf + 28, 8);
14181
14182 digest[0] = byte_swap_32 (digest[0]);
14183 digest[1] = byte_swap_32 (digest[1]);
14184 digest[2] = 0;
14185 digest[3] = 0;
14186
14187 return (PARSER_OK);
14188 }
14189
14190 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14191 {
14192 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14193
14194 u32 *digest = (u32 *) hash_buf->digest;
14195
14196 salt_t *salt = hash_buf->salt;
14197
14198 char *salt_buf_pos = input_buf;
14199
14200 char *hash_buf_pos = salt_buf_pos + 6;
14201
14202 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14203 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14204 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14205 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14206 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14207 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14208 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14209 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14210
14211 digest[0] -= SHA256M_A;
14212 digest[1] -= SHA256M_B;
14213 digest[2] -= SHA256M_C;
14214 digest[3] -= SHA256M_D;
14215 digest[4] -= SHA256M_E;
14216 digest[5] -= SHA256M_F;
14217 digest[6] -= SHA256M_G;
14218 digest[7] -= SHA256M_H;
14219
14220 char *salt_buf_ptr = (char *) salt->salt_buf;
14221
14222 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14223
14224 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14225
14226 salt->salt_len = salt_len;
14227
14228 return (PARSER_OK);
14229 }
14230
14231 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14232 {
14233 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14234
14235 u32 *digest = (u32 *) hash_buf->digest;
14236
14237 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14238
14239 salt_t *salt = hash_buf->salt;
14240
14241 char *salt_buf = input_buf + 6;
14242
14243 char *digest_buf = strchr (salt_buf, '$');
14244
14245 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14246
14247 uint salt_len = digest_buf - salt_buf;
14248
14249 digest_buf++; // skip the '$' symbol
14250
14251 char *salt_buf_ptr = (char *) salt->salt_buf;
14252
14253 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14254
14255 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14256
14257 salt->salt_len = salt_len;
14258
14259 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14260 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14261 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14262 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14263
14264 digest[0] = byte_swap_32 (digest[0]);
14265 digest[1] = byte_swap_32 (digest[1]);
14266 digest[2] = byte_swap_32 (digest[2]);
14267 digest[3] = byte_swap_32 (digest[3]);
14268
14269 digest[0] -= MD5M_A;
14270 digest[1] -= MD5M_B;
14271 digest[2] -= MD5M_C;
14272 digest[3] -= MD5M_D;
14273
14274 return (PARSER_OK);
14275 }
14276
14277 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14278 {
14279 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14280
14281 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14282
14283 u32 *digest = (u32 *) hash_buf->digest;
14284
14285 salt_t *salt = hash_buf->salt;
14286
14287 char *salt_buf = input_buf + 3;
14288
14289 char *digest_buf = strchr (salt_buf, '$');
14290
14291 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14292
14293 uint salt_len = digest_buf - salt_buf;
14294
14295 digest_buf++; // skip the '$' symbol
14296
14297 char *salt_buf_ptr = (char *) salt->salt_buf;
14298
14299 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14300
14301 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14302
14303 salt_buf_ptr[salt_len] = 0x2d;
14304
14305 salt->salt_len = salt_len + 1;
14306
14307 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14308 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14309 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14310 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14311
14312 digest[0] = byte_swap_32 (digest[0]);
14313 digest[1] = byte_swap_32 (digest[1]);
14314 digest[2] = byte_swap_32 (digest[2]);
14315 digest[3] = byte_swap_32 (digest[3]);
14316
14317 digest[0] -= MD5M_A;
14318 digest[1] -= MD5M_B;
14319 digest[2] -= MD5M_C;
14320 digest[3] -= MD5M_D;
14321
14322 return (PARSER_OK);
14323 }
14324
14325 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14326 {
14327 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14328
14329 u32 *digest = (u32 *) hash_buf->digest;
14330
14331 u8 tmp_buf[100] = { 0 };
14332
14333 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14334
14335 memcpy (digest, tmp_buf, 20);
14336
14337 digest[0] = byte_swap_32 (digest[0]);
14338 digest[1] = byte_swap_32 (digest[1]);
14339 digest[2] = byte_swap_32 (digest[2]);
14340 digest[3] = byte_swap_32 (digest[3]);
14341 digest[4] = byte_swap_32 (digest[4]);
14342
14343 digest[0] -= SHA1M_A;
14344 digest[1] -= SHA1M_B;
14345 digest[2] -= SHA1M_C;
14346 digest[3] -= SHA1M_D;
14347 digest[4] -= SHA1M_E;
14348
14349 return (PARSER_OK);
14350 }
14351
14352 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14353 {
14354 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14355
14356 u32 *digest = (u32 *) hash_buf->digest;
14357
14358 salt_t *salt = hash_buf->salt;
14359
14360 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14361 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14362 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14363 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14364
14365 digest[0] = byte_swap_32 (digest[0]);
14366 digest[1] = byte_swap_32 (digest[1]);
14367 digest[2] = byte_swap_32 (digest[2]);
14368 digest[3] = byte_swap_32 (digest[3]);
14369
14370 digest[0] -= MD5M_A;
14371 digest[1] -= MD5M_B;
14372 digest[2] -= MD5M_C;
14373 digest[3] -= MD5M_D;
14374
14375 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14376
14377 uint salt_len = input_len - 32 - 1;
14378
14379 char *salt_buf = input_buf + 32 + 1;
14380
14381 char *salt_buf_ptr = (char *) salt->salt_buf;
14382
14383 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14384
14385 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14386
14387 /*
14388 * add static "salt" part
14389 */
14390
14391 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14392
14393 salt_len += 8;
14394
14395 salt->salt_len = salt_len;
14396
14397 return (PARSER_OK);
14398 }
14399
14400 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14401 {
14402 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14403
14404 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14405
14406 u32 *digest = (u32 *) hash_buf->digest;
14407
14408 salt_t *salt = hash_buf->salt;
14409
14410 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14411
14412 /**
14413 * parse line
14414 */
14415
14416 char *saltlen_pos = input_buf + 1 + 3 + 1;
14417
14418 char *saltbuf_pos = strchr (saltlen_pos, '$');
14419
14420 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14421
14422 uint saltlen_len = saltbuf_pos - saltlen_pos;
14423
14424 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14425
14426 saltbuf_pos++;
14427
14428 char *keylen_pos = strchr (saltbuf_pos, '$');
14429
14430 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14431
14432 uint saltbuf_len = keylen_pos - saltbuf_pos;
14433
14434 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14435
14436 keylen_pos++;
14437
14438 char *keybuf_pos = strchr (keylen_pos, '$');
14439
14440 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14441
14442 uint keylen_len = keybuf_pos - keylen_pos;
14443
14444 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14445
14446 keybuf_pos++;
14447
14448 char *databuf_pos = strchr (keybuf_pos, '$');
14449
14450 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14451
14452 uint keybuf_len = databuf_pos - keybuf_pos;
14453
14454 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14455
14456 databuf_pos++;
14457
14458 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14459
14460 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14461
14462 /**
14463 * copy data
14464 */
14465
14466 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14467 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14468 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14469 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14470
14471 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14472 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14473 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14474 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14475
14476 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14477 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14478 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14479 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14480
14481 salt->salt_len = 16;
14482 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14483
14484 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14485 {
14486 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14487 }
14488
14489 return (PARSER_OK);
14490 }
14491
14492 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14493 {
14494 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14495
14496 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14497
14498 u32 *digest = (u32 *) hash_buf->digest;
14499
14500 salt_t *salt = hash_buf->salt;
14501
14502 /**
14503 * parse line
14504 */
14505
14506 // first is the N salt parameter
14507
14508 char *N_pos = input_buf + 6;
14509
14510 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14511
14512 N_pos++;
14513
14514 salt->scrypt_N = atoi (N_pos);
14515
14516 // r
14517
14518 char *r_pos = strchr (N_pos, ':');
14519
14520 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14521
14522 r_pos++;
14523
14524 salt->scrypt_r = atoi (r_pos);
14525
14526 // p
14527
14528 char *p_pos = strchr (r_pos, ':');
14529
14530 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14531
14532 p_pos++;
14533
14534 salt->scrypt_p = atoi (p_pos);
14535
14536 // salt
14537
14538 char *saltbuf_pos = strchr (p_pos, ':');
14539
14540 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14541
14542 saltbuf_pos++;
14543
14544 char *hash_pos = strchr (saltbuf_pos, ':');
14545
14546 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14547
14548 hash_pos++;
14549
14550 // base64 decode
14551
14552 u8 tmp_buf[33] = { 0 };
14553
14554 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14555
14556 char *salt_buf_ptr = (char *) salt->salt_buf;
14557
14558 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14559
14560 salt->salt_len = tmp_len;
14561 salt->salt_iter = 1;
14562
14563 // digest - base64 decode
14564
14565 memset (tmp_buf, 0, sizeof (tmp_buf));
14566
14567 tmp_len = input_len - (hash_pos - input_buf);
14568
14569 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14570
14571 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14572
14573 memcpy (digest, tmp_buf, 32);
14574
14575 return (PARSER_OK);
14576 }
14577
14578 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14579 {
14580 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14581
14582 u32 *digest = (u32 *) hash_buf->digest;
14583
14584 salt_t *salt = hash_buf->salt;
14585
14586 /**
14587 * parse line
14588 */
14589
14590 char decrypted[76] = { 0 }; // iv + hash
14591
14592 juniper_decrypt_hash (input_buf, decrypted);
14593
14594 char *md5crypt_hash = decrypted + 12;
14595
14596 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14597
14598 salt->salt_iter = ROUNDS_MD5CRYPT;
14599
14600 char *salt_pos = md5crypt_hash + 3;
14601
14602 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14603
14604 salt->salt_len = hash_pos - salt_pos; // should be 8
14605
14606 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14607
14608 hash_pos++;
14609
14610 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14611
14612 return (PARSER_OK);
14613 }
14614
14615 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14616 {
14617 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14618
14619 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14620
14621 u32 *digest = (u32 *) hash_buf->digest;
14622
14623 salt_t *salt = hash_buf->salt;
14624
14625 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14626
14627 /**
14628 * parse line
14629 */
14630
14631 // first is *raw* salt
14632
14633 char *salt_pos = input_buf + 3;
14634
14635 char *hash_pos = strchr (salt_pos, '$');
14636
14637 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14638
14639 uint salt_len = hash_pos - salt_pos;
14640
14641 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14642
14643 hash_pos++;
14644
14645 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14646
14647 memcpy (salt_buf_ptr, salt_pos, 14);
14648
14649 salt_buf_ptr[17] = 0x01;
14650 salt_buf_ptr[18] = 0x80;
14651
14652 // add some stuff to normal salt to make sorted happy
14653
14654 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14655 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14656 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14657 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14658
14659 salt->salt_len = salt_len;
14660 salt->salt_iter = ROUNDS_CISCO8 - 1;
14661
14662 // base64 decode hash
14663
14664 u8 tmp_buf[100] = { 0 };
14665
14666 uint hash_len = input_len - 3 - salt_len - 1;
14667
14668 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14669
14670 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14671
14672 memcpy (digest, tmp_buf, 32);
14673
14674 digest[0] = byte_swap_32 (digest[0]);
14675 digest[1] = byte_swap_32 (digest[1]);
14676 digest[2] = byte_swap_32 (digest[2]);
14677 digest[3] = byte_swap_32 (digest[3]);
14678 digest[4] = byte_swap_32 (digest[4]);
14679 digest[5] = byte_swap_32 (digest[5]);
14680 digest[6] = byte_swap_32 (digest[6]);
14681 digest[7] = byte_swap_32 (digest[7]);
14682
14683 return (PARSER_OK);
14684 }
14685
14686 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14687 {
14688 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14689
14690 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14691
14692 u32 *digest = (u32 *) hash_buf->digest;
14693
14694 salt_t *salt = hash_buf->salt;
14695
14696 /**
14697 * parse line
14698 */
14699
14700 // first is *raw* salt
14701
14702 char *salt_pos = input_buf + 3;
14703
14704 char *hash_pos = strchr (salt_pos, '$');
14705
14706 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14707
14708 uint salt_len = hash_pos - salt_pos;
14709
14710 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14711
14712 salt->salt_len = salt_len;
14713 hash_pos++;
14714
14715 char *salt_buf_ptr = (char *) salt->salt_buf;
14716
14717 memcpy (salt_buf_ptr, salt_pos, salt_len);
14718 salt_buf_ptr[salt_len] = 0;
14719
14720 // base64 decode hash
14721
14722 u8 tmp_buf[100] = { 0 };
14723
14724 uint hash_len = input_len - 3 - salt_len - 1;
14725
14726 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14727
14728 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14729
14730 memcpy (digest, tmp_buf, 32);
14731
14732 // fixed:
14733 salt->scrypt_N = 16384;
14734 salt->scrypt_r = 1;
14735 salt->scrypt_p = 1;
14736 salt->salt_iter = 1;
14737
14738 return (PARSER_OK);
14739 }
14740
14741 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14742 {
14743 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14744
14745 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14746
14747 u32 *digest = (u32 *) hash_buf->digest;
14748
14749 salt_t *salt = hash_buf->salt;
14750
14751 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14752
14753 /**
14754 * parse line
14755 */
14756
14757 char *version_pos = input_buf + 8 + 1;
14758
14759 char *verifierHashSize_pos = strchr (version_pos, '*');
14760
14761 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14762
14763 u32 version_len = verifierHashSize_pos - version_pos;
14764
14765 if (version_len != 4) return (PARSER_SALT_LENGTH);
14766
14767 verifierHashSize_pos++;
14768
14769 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14770
14771 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14772
14773 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14774
14775 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14776
14777 keySize_pos++;
14778
14779 char *saltSize_pos = strchr (keySize_pos, '*');
14780
14781 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14782
14783 u32 keySize_len = saltSize_pos - keySize_pos;
14784
14785 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14786
14787 saltSize_pos++;
14788
14789 char *osalt_pos = strchr (saltSize_pos, '*');
14790
14791 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14792
14793 u32 saltSize_len = osalt_pos - saltSize_pos;
14794
14795 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14796
14797 osalt_pos++;
14798
14799 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14800
14801 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14802
14803 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14804
14805 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14806
14807 encryptedVerifier_pos++;
14808
14809 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14810
14811 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14812
14813 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14814
14815 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14816
14817 encryptedVerifierHash_pos++;
14818
14819 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;
14820
14821 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14822
14823 const uint version = atoi (version_pos);
14824
14825 if (version != 2007) return (PARSER_SALT_VALUE);
14826
14827 const uint verifierHashSize = atoi (verifierHashSize_pos);
14828
14829 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14830
14831 const uint keySize = atoi (keySize_pos);
14832
14833 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14834
14835 office2007->keySize = keySize;
14836
14837 const uint saltSize = atoi (saltSize_pos);
14838
14839 if (saltSize != 16) return (PARSER_SALT_VALUE);
14840
14841 /**
14842 * salt
14843 */
14844
14845 salt->salt_len = 16;
14846 salt->salt_iter = ROUNDS_OFFICE2007;
14847
14848 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14849 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14850 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14851 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14852
14853 /**
14854 * esalt
14855 */
14856
14857 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14858 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14859 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14860 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14861
14862 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14863 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14864 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14865 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14866 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14867
14868 /**
14869 * digest
14870 */
14871
14872 digest[0] = office2007->encryptedVerifierHash[0];
14873 digest[1] = office2007->encryptedVerifierHash[1];
14874 digest[2] = office2007->encryptedVerifierHash[2];
14875 digest[3] = office2007->encryptedVerifierHash[3];
14876
14877 return (PARSER_OK);
14878 }
14879
14880 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14881 {
14882 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14883
14884 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14885
14886 u32 *digest = (u32 *) hash_buf->digest;
14887
14888 salt_t *salt = hash_buf->salt;
14889
14890 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14891
14892 /**
14893 * parse line
14894 */
14895
14896 char *version_pos = input_buf + 8 + 1;
14897
14898 char *spinCount_pos = strchr (version_pos, '*');
14899
14900 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14901
14902 u32 version_len = spinCount_pos - version_pos;
14903
14904 if (version_len != 4) return (PARSER_SALT_LENGTH);
14905
14906 spinCount_pos++;
14907
14908 char *keySize_pos = strchr (spinCount_pos, '*');
14909
14910 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14911
14912 u32 spinCount_len = keySize_pos - spinCount_pos;
14913
14914 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14915
14916 keySize_pos++;
14917
14918 char *saltSize_pos = strchr (keySize_pos, '*');
14919
14920 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14921
14922 u32 keySize_len = saltSize_pos - keySize_pos;
14923
14924 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14925
14926 saltSize_pos++;
14927
14928 char *osalt_pos = strchr (saltSize_pos, '*');
14929
14930 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14931
14932 u32 saltSize_len = osalt_pos - saltSize_pos;
14933
14934 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14935
14936 osalt_pos++;
14937
14938 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14939
14940 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14941
14942 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14943
14944 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14945
14946 encryptedVerifier_pos++;
14947
14948 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14949
14950 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14951
14952 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14953
14954 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14955
14956 encryptedVerifierHash_pos++;
14957
14958 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;
14959
14960 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14961
14962 const uint version = atoi (version_pos);
14963
14964 if (version != 2010) return (PARSER_SALT_VALUE);
14965
14966 const uint spinCount = atoi (spinCount_pos);
14967
14968 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14969
14970 const uint keySize = atoi (keySize_pos);
14971
14972 if (keySize != 128) return (PARSER_SALT_VALUE);
14973
14974 const uint saltSize = atoi (saltSize_pos);
14975
14976 if (saltSize != 16) return (PARSER_SALT_VALUE);
14977
14978 /**
14979 * salt
14980 */
14981
14982 salt->salt_len = 16;
14983 salt->salt_iter = spinCount;
14984
14985 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14986 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14987 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14988 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14989
14990 /**
14991 * esalt
14992 */
14993
14994 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14995 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14996 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14997 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14998
14999 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15000 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15001 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15002 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15003 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15004 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15005 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15006 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15007
15008 /**
15009 * digest
15010 */
15011
15012 digest[0] = office2010->encryptedVerifierHash[0];
15013 digest[1] = office2010->encryptedVerifierHash[1];
15014 digest[2] = office2010->encryptedVerifierHash[2];
15015 digest[3] = office2010->encryptedVerifierHash[3];
15016
15017 return (PARSER_OK);
15018 }
15019
15020 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15021 {
15022 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15023
15024 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15025
15026 u32 *digest = (u32 *) hash_buf->digest;
15027
15028 salt_t *salt = hash_buf->salt;
15029
15030 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15031
15032 /**
15033 * parse line
15034 */
15035
15036 char *version_pos = input_buf + 8 + 1;
15037
15038 char *spinCount_pos = strchr (version_pos, '*');
15039
15040 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15041
15042 u32 version_len = spinCount_pos - version_pos;
15043
15044 if (version_len != 4) return (PARSER_SALT_LENGTH);
15045
15046 spinCount_pos++;
15047
15048 char *keySize_pos = strchr (spinCount_pos, '*');
15049
15050 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15051
15052 u32 spinCount_len = keySize_pos - spinCount_pos;
15053
15054 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15055
15056 keySize_pos++;
15057
15058 char *saltSize_pos = strchr (keySize_pos, '*');
15059
15060 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15061
15062 u32 keySize_len = saltSize_pos - keySize_pos;
15063
15064 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15065
15066 saltSize_pos++;
15067
15068 char *osalt_pos = strchr (saltSize_pos, '*');
15069
15070 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15071
15072 u32 saltSize_len = osalt_pos - saltSize_pos;
15073
15074 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15075
15076 osalt_pos++;
15077
15078 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15079
15080 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15081
15082 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15083
15084 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15085
15086 encryptedVerifier_pos++;
15087
15088 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15089
15090 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15091
15092 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15093
15094 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15095
15096 encryptedVerifierHash_pos++;
15097
15098 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;
15099
15100 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15101
15102 const uint version = atoi (version_pos);
15103
15104 if (version != 2013) return (PARSER_SALT_VALUE);
15105
15106 const uint spinCount = atoi (spinCount_pos);
15107
15108 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15109
15110 const uint keySize = atoi (keySize_pos);
15111
15112 if (keySize != 256) return (PARSER_SALT_VALUE);
15113
15114 const uint saltSize = atoi (saltSize_pos);
15115
15116 if (saltSize != 16) return (PARSER_SALT_VALUE);
15117
15118 /**
15119 * salt
15120 */
15121
15122 salt->salt_len = 16;
15123 salt->salt_iter = spinCount;
15124
15125 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15126 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15127 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15128 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15129
15130 /**
15131 * esalt
15132 */
15133
15134 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15135 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15136 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15137 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15138
15139 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15140 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15141 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15142 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15143 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15144 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15145 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15146 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15147
15148 /**
15149 * digest
15150 */
15151
15152 digest[0] = office2013->encryptedVerifierHash[0];
15153 digest[1] = office2013->encryptedVerifierHash[1];
15154 digest[2] = office2013->encryptedVerifierHash[2];
15155 digest[3] = office2013->encryptedVerifierHash[3];
15156
15157 return (PARSER_OK);
15158 }
15159
15160 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15161 {
15162 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15163
15164 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15165
15166 u32 *digest = (u32 *) hash_buf->digest;
15167
15168 salt_t *salt = hash_buf->salt;
15169
15170 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15171
15172 /**
15173 * parse line
15174 */
15175
15176 char *version_pos = input_buf + 11;
15177
15178 char *osalt_pos = strchr (version_pos, '*');
15179
15180 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15181
15182 u32 version_len = osalt_pos - version_pos;
15183
15184 if (version_len != 1) return (PARSER_SALT_LENGTH);
15185
15186 osalt_pos++;
15187
15188 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15189
15190 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15191
15192 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15193
15194 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15195
15196 encryptedVerifier_pos++;
15197
15198 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15199
15200 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15201
15202 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15203
15204 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15205
15206 encryptedVerifierHash_pos++;
15207
15208 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15209
15210 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15211
15212 const uint version = *version_pos - 0x30;
15213
15214 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15215
15216 /**
15217 * esalt
15218 */
15219
15220 oldoffice01->version = version;
15221
15222 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15223 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15224 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15225 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15226
15227 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15228 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15229 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15230 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15231
15232 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15233 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15234 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15235 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15236
15237 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15238 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15239 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15240 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15241
15242 /**
15243 * salt
15244 */
15245
15246 salt->salt_len = 16;
15247
15248 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15249 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15250 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15251 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15252
15253 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15254 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15255 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15256 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15257
15258 // this is a workaround as office produces multiple documents with the same salt
15259
15260 salt->salt_len += 32;
15261
15262 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15263 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15264 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15265 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15266 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15267 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15268 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15269 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15270
15271 /**
15272 * digest
15273 */
15274
15275 digest[0] = oldoffice01->encryptedVerifierHash[0];
15276 digest[1] = oldoffice01->encryptedVerifierHash[1];
15277 digest[2] = oldoffice01->encryptedVerifierHash[2];
15278 digest[3] = oldoffice01->encryptedVerifierHash[3];
15279
15280 return (PARSER_OK);
15281 }
15282
15283 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15284 {
15285 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15286 }
15287
15288 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15289 {
15290 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15291
15292 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15293
15294 u32 *digest = (u32 *) hash_buf->digest;
15295
15296 salt_t *salt = hash_buf->salt;
15297
15298 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15299
15300 /**
15301 * parse line
15302 */
15303
15304 char *version_pos = input_buf + 11;
15305
15306 char *osalt_pos = strchr (version_pos, '*');
15307
15308 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15309
15310 u32 version_len = osalt_pos - version_pos;
15311
15312 if (version_len != 1) return (PARSER_SALT_LENGTH);
15313
15314 osalt_pos++;
15315
15316 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15317
15318 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15319
15320 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15321
15322 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15323
15324 encryptedVerifier_pos++;
15325
15326 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15327
15328 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15329
15330 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15331
15332 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15333
15334 encryptedVerifierHash_pos++;
15335
15336 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15337
15338 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15339
15340 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15341
15342 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15343
15344 rc4key_pos++;
15345
15346 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15347
15348 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15349
15350 const uint version = *version_pos - 0x30;
15351
15352 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15353
15354 /**
15355 * esalt
15356 */
15357
15358 oldoffice01->version = version;
15359
15360 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15361 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15362 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15363 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15364
15365 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15366 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15367 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15368 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15369
15370 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15371 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15372 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15373 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15374
15375 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15376 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15377 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15378 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15379
15380 oldoffice01->rc4key[1] = 0;
15381 oldoffice01->rc4key[0] = 0;
15382
15383 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15384 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15385 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15386 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15387 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15388 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15389 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15390 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15391 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15392 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15393
15394 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15395 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15396
15397 /**
15398 * salt
15399 */
15400
15401 salt->salt_len = 16;
15402
15403 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15404 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15405 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15406 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15407
15408 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15409 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15410 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15411 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15412
15413 // this is a workaround as office produces multiple documents with the same salt
15414
15415 salt->salt_len += 32;
15416
15417 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15418 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15419 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15420 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15421 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15422 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15423 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15424 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15425
15426 /**
15427 * digest
15428 */
15429
15430 digest[0] = oldoffice01->rc4key[0];
15431 digest[1] = oldoffice01->rc4key[1];
15432 digest[2] = 0;
15433 digest[3] = 0;
15434
15435 return (PARSER_OK);
15436 }
15437
15438 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15439 {
15440 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15441
15442 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15443
15444 u32 *digest = (u32 *) hash_buf->digest;
15445
15446 salt_t *salt = hash_buf->salt;
15447
15448 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15449
15450 /**
15451 * parse line
15452 */
15453
15454 char *version_pos = input_buf + 11;
15455
15456 char *osalt_pos = strchr (version_pos, '*');
15457
15458 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15459
15460 u32 version_len = osalt_pos - version_pos;
15461
15462 if (version_len != 1) return (PARSER_SALT_LENGTH);
15463
15464 osalt_pos++;
15465
15466 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15467
15468 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15469
15470 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15471
15472 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15473
15474 encryptedVerifier_pos++;
15475
15476 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15477
15478 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15479
15480 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15481
15482 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15483
15484 encryptedVerifierHash_pos++;
15485
15486 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15487
15488 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15489
15490 const uint version = *version_pos - 0x30;
15491
15492 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15493
15494 /**
15495 * esalt
15496 */
15497
15498 oldoffice34->version = version;
15499
15500 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15501 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15502 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15503 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15504
15505 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15506 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15507 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15508 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15509
15510 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15511 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15512 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15513 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15514 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15515
15516 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15517 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15518 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15519 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15520 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15521
15522 /**
15523 * salt
15524 */
15525
15526 salt->salt_len = 16;
15527
15528 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15529 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15530 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15531 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15532
15533 // this is a workaround as office produces multiple documents with the same salt
15534
15535 salt->salt_len += 32;
15536
15537 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15538 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15539 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15540 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15541 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15542 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15543 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15544 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15545
15546 /**
15547 * digest
15548 */
15549
15550 digest[0] = oldoffice34->encryptedVerifierHash[0];
15551 digest[1] = oldoffice34->encryptedVerifierHash[1];
15552 digest[2] = oldoffice34->encryptedVerifierHash[2];
15553 digest[3] = oldoffice34->encryptedVerifierHash[3];
15554
15555 return (PARSER_OK);
15556 }
15557
15558 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15559 {
15560 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15561
15562 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15563 }
15564
15565 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15566 {
15567 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15568
15569 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15570
15571 u32 *digest = (u32 *) hash_buf->digest;
15572
15573 salt_t *salt = hash_buf->salt;
15574
15575 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15576
15577 /**
15578 * parse line
15579 */
15580
15581 char *version_pos = input_buf + 11;
15582
15583 char *osalt_pos = strchr (version_pos, '*');
15584
15585 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15586
15587 u32 version_len = osalt_pos - version_pos;
15588
15589 if (version_len != 1) return (PARSER_SALT_LENGTH);
15590
15591 osalt_pos++;
15592
15593 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15594
15595 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15596
15597 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15598
15599 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15600
15601 encryptedVerifier_pos++;
15602
15603 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15604
15605 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15606
15607 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15608
15609 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15610
15611 encryptedVerifierHash_pos++;
15612
15613 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15614
15615 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15616
15617 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15618
15619 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15620
15621 rc4key_pos++;
15622
15623 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15624
15625 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15626
15627 const uint version = *version_pos - 0x30;
15628
15629 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15630
15631 /**
15632 * esalt
15633 */
15634
15635 oldoffice34->version = version;
15636
15637 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15638 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15639 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15640 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15641
15642 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15643 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15644 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15645 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15646
15647 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15648 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15649 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15650 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15651 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15652
15653 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15654 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15655 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15656 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15657 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15658
15659 oldoffice34->rc4key[1] = 0;
15660 oldoffice34->rc4key[0] = 0;
15661
15662 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15663 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15664 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15665 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15666 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15667 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15668 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15669 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15670 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15671 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15672
15673 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15674 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15675
15676 /**
15677 * salt
15678 */
15679
15680 salt->salt_len = 16;
15681
15682 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15683 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15684 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15685 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15686
15687 // this is a workaround as office produces multiple documents with the same salt
15688
15689 salt->salt_len += 32;
15690
15691 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15692 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15693 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15694 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15695 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15696 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15697 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15698 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15699
15700 /**
15701 * digest
15702 */
15703
15704 digest[0] = oldoffice34->rc4key[0];
15705 digest[1] = oldoffice34->rc4key[1];
15706 digest[2] = 0;
15707 digest[3] = 0;
15708
15709 return (PARSER_OK);
15710 }
15711
15712 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15713 {
15714 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15715
15716 u32 *digest = (u32 *) hash_buf->digest;
15717
15718 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15719 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15720 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15721 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15722
15723 digest[0] = byte_swap_32 (digest[0]);
15724 digest[1] = byte_swap_32 (digest[1]);
15725 digest[2] = byte_swap_32 (digest[2]);
15726 digest[3] = byte_swap_32 (digest[3]);
15727
15728 return (PARSER_OK);
15729 }
15730
15731 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15732 {
15733 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15734
15735 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15736
15737 u32 *digest = (u32 *) hash_buf->digest;
15738
15739 salt_t *salt = hash_buf->salt;
15740
15741 char *signature_pos = input_buf;
15742
15743 char *salt_pos = strchr (signature_pos, '$');
15744
15745 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15746
15747 u32 signature_len = salt_pos - signature_pos;
15748
15749 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15750
15751 salt_pos++;
15752
15753 char *hash_pos = strchr (salt_pos, '$');
15754
15755 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15756
15757 u32 salt_len = hash_pos - salt_pos;
15758
15759 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15760
15761 hash_pos++;
15762
15763 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15764
15765 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15766
15767 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15768 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15769 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15770 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15771 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15772
15773 digest[0] -= SHA1M_A;
15774 digest[1] -= SHA1M_B;
15775 digest[2] -= SHA1M_C;
15776 digest[3] -= SHA1M_D;
15777 digest[4] -= SHA1M_E;
15778
15779 char *salt_buf_ptr = (char *) salt->salt_buf;
15780
15781 memcpy (salt_buf_ptr, salt_pos, salt_len);
15782
15783 salt->salt_len = salt_len;
15784
15785 return (PARSER_OK);
15786 }
15787
15788 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15789 {
15790 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15791
15792 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15793
15794 u32 *digest = (u32 *) hash_buf->digest;
15795
15796 salt_t *salt = hash_buf->salt;
15797
15798 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15799
15800 /**
15801 * parse line
15802 */
15803
15804 char *iter_pos = input_buf + 14;
15805
15806 const int iter = atoi (iter_pos);
15807
15808 if (iter < 1) return (PARSER_SALT_ITERATION);
15809
15810 salt->salt_iter = iter - 1;
15811
15812 char *salt_pos = strchr (iter_pos, '$');
15813
15814 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15815
15816 salt_pos++;
15817
15818 char *hash_pos = strchr (salt_pos, '$');
15819
15820 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15821
15822 const uint salt_len = hash_pos - salt_pos;
15823
15824 hash_pos++;
15825
15826 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15827
15828 memcpy (salt_buf_ptr, salt_pos, salt_len);
15829
15830 salt->salt_len = salt_len;
15831
15832 salt_buf_ptr[salt_len + 3] = 0x01;
15833 salt_buf_ptr[salt_len + 4] = 0x80;
15834
15835 // add some stuff to normal salt to make sorted happy
15836
15837 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15838 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15839 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15840 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15841 salt->salt_buf[4] = salt->salt_iter;
15842
15843 // base64 decode hash
15844
15845 u8 tmp_buf[100] = { 0 };
15846
15847 uint hash_len = input_len - (hash_pos - input_buf);
15848
15849 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15850
15851 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15852
15853 memcpy (digest, tmp_buf, 32);
15854
15855 digest[0] = byte_swap_32 (digest[0]);
15856 digest[1] = byte_swap_32 (digest[1]);
15857 digest[2] = byte_swap_32 (digest[2]);
15858 digest[3] = byte_swap_32 (digest[3]);
15859 digest[4] = byte_swap_32 (digest[4]);
15860 digest[5] = byte_swap_32 (digest[5]);
15861 digest[6] = byte_swap_32 (digest[6]);
15862 digest[7] = byte_swap_32 (digest[7]);
15863
15864 return (PARSER_OK);
15865 }
15866
15867 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15868 {
15869 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15870
15871 u32 *digest = (u32 *) hash_buf->digest;
15872
15873 salt_t *salt = hash_buf->salt;
15874
15875 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15876 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15877 digest[2] = 0;
15878 digest[3] = 0;
15879
15880 digest[0] = byte_swap_32 (digest[0]);
15881 digest[1] = byte_swap_32 (digest[1]);
15882
15883 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15884 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15885 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15886
15887 char iter_c = input_buf[17];
15888 char iter_d = input_buf[19];
15889
15890 // atm only defaults, let's see if there's more request
15891 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15892 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15893
15894 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15895
15896 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
15897 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
15898 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
15899 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
15900
15901 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15902 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15903 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15904 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15905
15906 salt->salt_len = 16;
15907
15908 return (PARSER_OK);
15909 }
15910
15911 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15912 {
15913 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15914
15915 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15916
15917 u32 *digest = (u32 *) hash_buf->digest;
15918
15919 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15920
15921 salt_t *salt = hash_buf->salt;
15922
15923 char *salt_pos = input_buf + 10;
15924
15925 char *hash_pos = strchr (salt_pos, '$');
15926
15927 uint salt_len = hash_pos - salt_pos;
15928
15929 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15930
15931 hash_pos++;
15932
15933 uint hash_len = input_len - 10 - salt_len - 1;
15934
15935 // base64 decode salt
15936
15937 u8 tmp_buf[100] = { 0 };
15938
15939 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
15940
15941 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15942
15943 tmp_buf[salt_len] = 0x80;
15944
15945 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15946
15947 salt->salt_len = salt_len;
15948
15949 // base64 decode salt
15950
15951 memset (tmp_buf, 0, sizeof (tmp_buf));
15952
15953 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15954
15955 uint user_len = hash_len - 32;
15956
15957 const u8 *tmp_hash = tmp_buf + user_len;
15958
15959 user_len--; // skip the trailing space
15960
15961 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
15962 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
15963 digest[2] = hex_to_u32 (&tmp_hash[16]);
15964 digest[3] = hex_to_u32 (&tmp_hash[24]);
15965
15966 digest[0] = byte_swap_32 (digest[0]);
15967 digest[1] = byte_swap_32 (digest[1]);
15968 digest[2] = byte_swap_32 (digest[2]);
15969 digest[3] = byte_swap_32 (digest[3]);
15970
15971 // store username for host only (output hash if cracked)
15972
15973 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15974 memcpy (cram_md5->user, tmp_buf, user_len);
15975
15976 return (PARSER_OK);
15977 }
15978
15979 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15980 {
15981 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15982
15983 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15984
15985 u32 *digest = (u32 *) hash_buf->digest;
15986
15987 salt_t *salt = hash_buf->salt;
15988
15989 char *iter_pos = input_buf + 10;
15990
15991 u32 iter = atoi (iter_pos);
15992
15993 if (iter < 1)
15994 {
15995 return (PARSER_SALT_ITERATION);
15996 }
15997
15998 iter--; // first iteration is special
15999
16000 salt->salt_iter = iter;
16001
16002 char *base64_pos = strchr (iter_pos, '}');
16003
16004 if (base64_pos == NULL)
16005 {
16006 return (PARSER_SIGNATURE_UNMATCHED);
16007 }
16008
16009 base64_pos++;
16010
16011 // base64 decode salt
16012
16013 u32 base64_len = input_len - (base64_pos - input_buf);
16014
16015 u8 tmp_buf[100] = { 0 };
16016
16017 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16018
16019 if (decoded_len < 24)
16020 {
16021 return (PARSER_SALT_LENGTH);
16022 }
16023
16024 // copy the salt
16025
16026 uint salt_len = decoded_len - 20;
16027
16028 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16029 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16030
16031 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16032
16033 salt->salt_len = salt_len;
16034
16035 // set digest
16036
16037 u32 *digest_ptr = (u32*) tmp_buf;
16038
16039 digest[0] = byte_swap_32 (digest_ptr[0]);
16040 digest[1] = byte_swap_32 (digest_ptr[1]);
16041 digest[2] = byte_swap_32 (digest_ptr[2]);
16042 digest[3] = byte_swap_32 (digest_ptr[3]);
16043 digest[4] = byte_swap_32 (digest_ptr[4]);
16044
16045 return (PARSER_OK);
16046 }
16047
16048 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16049 {
16050 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16051
16052 u32 *digest = (u32 *) hash_buf->digest;
16053
16054 salt_t *salt = hash_buf->salt;
16055
16056 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16057 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16058 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16059 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16060 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16061
16062 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16063
16064 uint salt_len = input_len - 40 - 1;
16065
16066 char *salt_buf = input_buf + 40 + 1;
16067
16068 char *salt_buf_ptr = (char *) salt->salt_buf;
16069
16070 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16071
16072 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16073
16074 salt->salt_len = salt_len;
16075
16076 return (PARSER_OK);
16077 }
16078
16079 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16080 {
16081 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16082
16083 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16084
16085 u32 *digest = (u32 *) hash_buf->digest;
16086
16087 salt_t *salt = hash_buf->salt;
16088
16089 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16090
16091 /**
16092 * parse line
16093 */
16094
16095 char *V_pos = input_buf + 5;
16096
16097 char *R_pos = strchr (V_pos, '*');
16098
16099 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16100
16101 u32 V_len = R_pos - V_pos;
16102
16103 R_pos++;
16104
16105 char *bits_pos = strchr (R_pos, '*');
16106
16107 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16108
16109 u32 R_len = bits_pos - R_pos;
16110
16111 bits_pos++;
16112
16113 char *P_pos = strchr (bits_pos, '*');
16114
16115 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16116
16117 u32 bits_len = P_pos - bits_pos;
16118
16119 P_pos++;
16120
16121 char *enc_md_pos = strchr (P_pos, '*');
16122
16123 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16124
16125 u32 P_len = enc_md_pos - P_pos;
16126
16127 enc_md_pos++;
16128
16129 char *id_len_pos = strchr (enc_md_pos, '*');
16130
16131 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16132
16133 u32 enc_md_len = id_len_pos - enc_md_pos;
16134
16135 id_len_pos++;
16136
16137 char *id_buf_pos = strchr (id_len_pos, '*');
16138
16139 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16140
16141 u32 id_len_len = id_buf_pos - id_len_pos;
16142
16143 id_buf_pos++;
16144
16145 char *u_len_pos = strchr (id_buf_pos, '*');
16146
16147 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16148
16149 u32 id_buf_len = u_len_pos - id_buf_pos;
16150
16151 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16152
16153 u_len_pos++;
16154
16155 char *u_buf_pos = strchr (u_len_pos, '*');
16156
16157 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16158
16159 u32 u_len_len = u_buf_pos - u_len_pos;
16160
16161 u_buf_pos++;
16162
16163 char *o_len_pos = strchr (u_buf_pos, '*');
16164
16165 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16166
16167 u32 u_buf_len = o_len_pos - u_buf_pos;
16168
16169 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16170
16171 o_len_pos++;
16172
16173 char *o_buf_pos = strchr (o_len_pos, '*');
16174
16175 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16176
16177 u32 o_len_len = o_buf_pos - o_len_pos;
16178
16179 o_buf_pos++;
16180
16181 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;
16182
16183 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16184
16185 // validate data
16186
16187 const int V = atoi (V_pos);
16188 const int R = atoi (R_pos);
16189 const int P = atoi (P_pos);
16190
16191 if (V != 1) return (PARSER_SALT_VALUE);
16192 if (R != 2) return (PARSER_SALT_VALUE);
16193
16194 const int enc_md = atoi (enc_md_pos);
16195
16196 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16197
16198 const int id_len = atoi (id_len_pos);
16199 const int u_len = atoi (u_len_pos);
16200 const int o_len = atoi (o_len_pos);
16201
16202 if (id_len != 16) return (PARSER_SALT_VALUE);
16203 if (u_len != 32) return (PARSER_SALT_VALUE);
16204 if (o_len != 32) return (PARSER_SALT_VALUE);
16205
16206 const int bits = atoi (bits_pos);
16207
16208 if (bits != 40) return (PARSER_SALT_VALUE);
16209
16210 // copy data to esalt
16211
16212 pdf->V = V;
16213 pdf->R = R;
16214 pdf->P = P;
16215
16216 pdf->enc_md = enc_md;
16217
16218 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16219 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16220 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16221 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16222 pdf->id_len = id_len;
16223
16224 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16225 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16226 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16227 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16228 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16229 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16230 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16231 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16232 pdf->u_len = u_len;
16233
16234 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16235 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16236 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16237 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16238 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16239 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16240 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16241 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16242 pdf->o_len = o_len;
16243
16244 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16245 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16246 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16247 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16248
16249 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16250 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16251 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16252 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16253 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16254 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16255 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16256 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16257
16258 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16259 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16260 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16261 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16262 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16263 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16264 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16265 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16266
16267 // we use ID for salt, maybe needs to change, we will see...
16268
16269 salt->salt_buf[0] = pdf->id_buf[0];
16270 salt->salt_buf[1] = pdf->id_buf[1];
16271 salt->salt_buf[2] = pdf->id_buf[2];
16272 salt->salt_buf[3] = pdf->id_buf[3];
16273 salt->salt_len = pdf->id_len;
16274
16275 digest[0] = pdf->u_buf[0];
16276 digest[1] = pdf->u_buf[1];
16277 digest[2] = pdf->u_buf[2];
16278 digest[3] = pdf->u_buf[3];
16279
16280 return (PARSER_OK);
16281 }
16282
16283 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16284 {
16285 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16286 }
16287
16288 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16289 {
16290 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16291
16292 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16293
16294 u32 *digest = (u32 *) hash_buf->digest;
16295
16296 salt_t *salt = hash_buf->salt;
16297
16298 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16299
16300 /**
16301 * parse line
16302 */
16303
16304 char *V_pos = input_buf + 5;
16305
16306 char *R_pos = strchr (V_pos, '*');
16307
16308 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16309
16310 u32 V_len = R_pos - V_pos;
16311
16312 R_pos++;
16313
16314 char *bits_pos = strchr (R_pos, '*');
16315
16316 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16317
16318 u32 R_len = bits_pos - R_pos;
16319
16320 bits_pos++;
16321
16322 char *P_pos = strchr (bits_pos, '*');
16323
16324 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16325
16326 u32 bits_len = P_pos - bits_pos;
16327
16328 P_pos++;
16329
16330 char *enc_md_pos = strchr (P_pos, '*');
16331
16332 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16333
16334 u32 P_len = enc_md_pos - P_pos;
16335
16336 enc_md_pos++;
16337
16338 char *id_len_pos = strchr (enc_md_pos, '*');
16339
16340 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16341
16342 u32 enc_md_len = id_len_pos - enc_md_pos;
16343
16344 id_len_pos++;
16345
16346 char *id_buf_pos = strchr (id_len_pos, '*');
16347
16348 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16349
16350 u32 id_len_len = id_buf_pos - id_len_pos;
16351
16352 id_buf_pos++;
16353
16354 char *u_len_pos = strchr (id_buf_pos, '*');
16355
16356 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16357
16358 u32 id_buf_len = u_len_pos - id_buf_pos;
16359
16360 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16361
16362 u_len_pos++;
16363
16364 char *u_buf_pos = strchr (u_len_pos, '*');
16365
16366 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16367
16368 u32 u_len_len = u_buf_pos - u_len_pos;
16369
16370 u_buf_pos++;
16371
16372 char *o_len_pos = strchr (u_buf_pos, '*');
16373
16374 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16375
16376 u32 u_buf_len = o_len_pos - u_buf_pos;
16377
16378 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16379
16380 o_len_pos++;
16381
16382 char *o_buf_pos = strchr (o_len_pos, '*');
16383
16384 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16385
16386 u32 o_len_len = o_buf_pos - o_len_pos;
16387
16388 o_buf_pos++;
16389
16390 char *rc4key_pos = strchr (o_buf_pos, ':');
16391
16392 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16393
16394 u32 o_buf_len = rc4key_pos - o_buf_pos;
16395
16396 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16397
16398 rc4key_pos++;
16399
16400 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;
16401
16402 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16403
16404 // validate data
16405
16406 const int V = atoi (V_pos);
16407 const int R = atoi (R_pos);
16408 const int P = atoi (P_pos);
16409
16410 if (V != 1) return (PARSER_SALT_VALUE);
16411 if (R != 2) return (PARSER_SALT_VALUE);
16412
16413 const int enc_md = atoi (enc_md_pos);
16414
16415 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16416
16417 const int id_len = atoi (id_len_pos);
16418 const int u_len = atoi (u_len_pos);
16419 const int o_len = atoi (o_len_pos);
16420
16421 if (id_len != 16) return (PARSER_SALT_VALUE);
16422 if (u_len != 32) return (PARSER_SALT_VALUE);
16423 if (o_len != 32) return (PARSER_SALT_VALUE);
16424
16425 const int bits = atoi (bits_pos);
16426
16427 if (bits != 40) return (PARSER_SALT_VALUE);
16428
16429 // copy data to esalt
16430
16431 pdf->V = V;
16432 pdf->R = R;
16433 pdf->P = P;
16434
16435 pdf->enc_md = enc_md;
16436
16437 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16438 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16439 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16440 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16441 pdf->id_len = id_len;
16442
16443 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16444 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16445 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16446 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16447 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16448 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16449 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16450 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16451 pdf->u_len = u_len;
16452
16453 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16454 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16455 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16456 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16457 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16458 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16459 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16460 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16461 pdf->o_len = o_len;
16462
16463 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16464 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16465 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16466 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16467
16468 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16469 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16470 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16471 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16472 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16473 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16474 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16475 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16476
16477 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16478 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16479 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16480 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16481 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16482 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16483 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16484 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16485
16486 pdf->rc4key[1] = 0;
16487 pdf->rc4key[0] = 0;
16488
16489 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16490 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16491 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16492 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16493 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16494 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16495 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16496 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16497 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16498 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16499
16500 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16501 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16502
16503 // we use ID for salt, maybe needs to change, we will see...
16504
16505 salt->salt_buf[0] = pdf->id_buf[0];
16506 salt->salt_buf[1] = pdf->id_buf[1];
16507 salt->salt_buf[2] = pdf->id_buf[2];
16508 salt->salt_buf[3] = pdf->id_buf[3];
16509 salt->salt_buf[4] = pdf->u_buf[0];
16510 salt->salt_buf[5] = pdf->u_buf[1];
16511 salt->salt_buf[6] = pdf->o_buf[0];
16512 salt->salt_buf[7] = pdf->o_buf[1];
16513 salt->salt_len = pdf->id_len + 16;
16514
16515 digest[0] = pdf->rc4key[0];
16516 digest[1] = pdf->rc4key[1];
16517 digest[2] = 0;
16518 digest[3] = 0;
16519
16520 return (PARSER_OK);
16521 }
16522
16523 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16524 {
16525 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16526
16527 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16528
16529 u32 *digest = (u32 *) hash_buf->digest;
16530
16531 salt_t *salt = hash_buf->salt;
16532
16533 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16534
16535 /**
16536 * parse line
16537 */
16538
16539 char *V_pos = input_buf + 5;
16540
16541 char *R_pos = strchr (V_pos, '*');
16542
16543 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16544
16545 u32 V_len = R_pos - V_pos;
16546
16547 R_pos++;
16548
16549 char *bits_pos = strchr (R_pos, '*');
16550
16551 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16552
16553 u32 R_len = bits_pos - R_pos;
16554
16555 bits_pos++;
16556
16557 char *P_pos = strchr (bits_pos, '*');
16558
16559 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16560
16561 u32 bits_len = P_pos - bits_pos;
16562
16563 P_pos++;
16564
16565 char *enc_md_pos = strchr (P_pos, '*');
16566
16567 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16568
16569 u32 P_len = enc_md_pos - P_pos;
16570
16571 enc_md_pos++;
16572
16573 char *id_len_pos = strchr (enc_md_pos, '*');
16574
16575 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16576
16577 u32 enc_md_len = id_len_pos - enc_md_pos;
16578
16579 id_len_pos++;
16580
16581 char *id_buf_pos = strchr (id_len_pos, '*');
16582
16583 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16584
16585 u32 id_len_len = id_buf_pos - id_len_pos;
16586
16587 id_buf_pos++;
16588
16589 char *u_len_pos = strchr (id_buf_pos, '*');
16590
16591 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16592
16593 u32 id_buf_len = u_len_pos - id_buf_pos;
16594
16595 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16596
16597 u_len_pos++;
16598
16599 char *u_buf_pos = strchr (u_len_pos, '*');
16600
16601 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16602
16603 u32 u_len_len = u_buf_pos - u_len_pos;
16604
16605 u_buf_pos++;
16606
16607 char *o_len_pos = strchr (u_buf_pos, '*');
16608
16609 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16610
16611 u32 u_buf_len = o_len_pos - u_buf_pos;
16612
16613 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16614
16615 o_len_pos++;
16616
16617 char *o_buf_pos = strchr (o_len_pos, '*');
16618
16619 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16620
16621 u32 o_len_len = o_buf_pos - o_len_pos;
16622
16623 o_buf_pos++;
16624
16625 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;
16626
16627 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16628
16629 // validate data
16630
16631 const int V = atoi (V_pos);
16632 const int R = atoi (R_pos);
16633 const int P = atoi (P_pos);
16634
16635 int vr_ok = 0;
16636
16637 if ((V == 2) && (R == 3)) vr_ok = 1;
16638 if ((V == 4) && (R == 4)) vr_ok = 1;
16639
16640 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16641
16642 const int id_len = atoi (id_len_pos);
16643 const int u_len = atoi (u_len_pos);
16644 const int o_len = atoi (o_len_pos);
16645
16646 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16647
16648 if (u_len != 32) return (PARSER_SALT_VALUE);
16649 if (o_len != 32) return (PARSER_SALT_VALUE);
16650
16651 const int bits = atoi (bits_pos);
16652
16653 if (bits != 128) return (PARSER_SALT_VALUE);
16654
16655 int enc_md = 1;
16656
16657 if (R >= 4)
16658 {
16659 enc_md = atoi (enc_md_pos);
16660 }
16661
16662 // copy data to esalt
16663
16664 pdf->V = V;
16665 pdf->R = R;
16666 pdf->P = P;
16667
16668 pdf->enc_md = enc_md;
16669
16670 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16671 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16672 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16673 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16674
16675 if (id_len == 32)
16676 {
16677 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16678 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16679 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16680 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16681 }
16682
16683 pdf->id_len = id_len;
16684
16685 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16686 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16687 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16688 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16689 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16690 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16691 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16692 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16693 pdf->u_len = u_len;
16694
16695 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16696 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16697 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16698 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16699 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16700 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16701 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16702 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16703 pdf->o_len = o_len;
16704
16705 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16706 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16707 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16708 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16709
16710 if (id_len == 32)
16711 {
16712 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16713 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16714 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16715 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16716 }
16717
16718 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16719 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16720 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16721 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16722 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16723 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16724 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16725 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16726
16727 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16728 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16729 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16730 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16731 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16732 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16733 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16734 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16735
16736 // precompute rc4 data for later use
16737
16738 uint padding[8] =
16739 {
16740 0x5e4ebf28,
16741 0x418a754e,
16742 0x564e0064,
16743 0x0801faff,
16744 0xb6002e2e,
16745 0x803e68d0,
16746 0xfea90c2f,
16747 0x7a695364
16748 };
16749
16750 // md5
16751
16752 uint salt_pc_block[32] = { 0 };
16753
16754 char *salt_pc_ptr = (char *) salt_pc_block;
16755
16756 memcpy (salt_pc_ptr, padding, 32);
16757 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16758
16759 uint salt_pc_digest[4] = { 0 };
16760
16761 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16762
16763 pdf->rc4data[0] = salt_pc_digest[0];
16764 pdf->rc4data[1] = salt_pc_digest[1];
16765
16766 // we use ID for salt, maybe needs to change, we will see...
16767
16768 salt->salt_buf[0] = pdf->id_buf[0];
16769 salt->salt_buf[1] = pdf->id_buf[1];
16770 salt->salt_buf[2] = pdf->id_buf[2];
16771 salt->salt_buf[3] = pdf->id_buf[3];
16772 salt->salt_buf[4] = pdf->u_buf[0];
16773 salt->salt_buf[5] = pdf->u_buf[1];
16774 salt->salt_buf[6] = pdf->o_buf[0];
16775 salt->salt_buf[7] = pdf->o_buf[1];
16776 salt->salt_len = pdf->id_len + 16;
16777
16778 salt->salt_iter = ROUNDS_PDF14;
16779
16780 digest[0] = pdf->u_buf[0];
16781 digest[1] = pdf->u_buf[1];
16782 digest[2] = 0;
16783 digest[3] = 0;
16784
16785 return (PARSER_OK);
16786 }
16787
16788 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16789 {
16790 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16791
16792 if (ret != PARSER_OK)
16793 {
16794 return ret;
16795 }
16796
16797 u32 *digest = (u32 *) hash_buf->digest;
16798
16799 salt_t *salt = hash_buf->salt;
16800
16801 digest[0] -= SHA256M_A;
16802 digest[1] -= SHA256M_B;
16803 digest[2] -= SHA256M_C;
16804 digest[3] -= SHA256M_D;
16805 digest[4] -= SHA256M_E;
16806 digest[5] -= SHA256M_F;
16807 digest[6] -= SHA256M_G;
16808 digest[7] -= SHA256M_H;
16809
16810 salt->salt_buf[2] = 0x80;
16811
16812 return (PARSER_OK);
16813 }
16814
16815 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16816 {
16817 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16818
16819 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16820
16821 u32 *digest = (u32 *) hash_buf->digest;
16822
16823 salt_t *salt = hash_buf->salt;
16824
16825 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16826
16827 /**
16828 * parse line
16829 */
16830
16831 char *V_pos = input_buf + 5;
16832
16833 char *R_pos = strchr (V_pos, '*');
16834
16835 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16836
16837 u32 V_len = R_pos - V_pos;
16838
16839 R_pos++;
16840
16841 char *bits_pos = strchr (R_pos, '*');
16842
16843 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16844
16845 u32 R_len = bits_pos - R_pos;
16846
16847 bits_pos++;
16848
16849 char *P_pos = strchr (bits_pos, '*');
16850
16851 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16852
16853 u32 bits_len = P_pos - bits_pos;
16854
16855 P_pos++;
16856
16857 char *enc_md_pos = strchr (P_pos, '*');
16858
16859 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16860
16861 u32 P_len = enc_md_pos - P_pos;
16862
16863 enc_md_pos++;
16864
16865 char *id_len_pos = strchr (enc_md_pos, '*');
16866
16867 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16868
16869 u32 enc_md_len = id_len_pos - enc_md_pos;
16870
16871 id_len_pos++;
16872
16873 char *id_buf_pos = strchr (id_len_pos, '*');
16874
16875 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16876
16877 u32 id_len_len = id_buf_pos - id_len_pos;
16878
16879 id_buf_pos++;
16880
16881 char *u_len_pos = strchr (id_buf_pos, '*');
16882
16883 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16884
16885 u32 id_buf_len = u_len_pos - id_buf_pos;
16886
16887 u_len_pos++;
16888
16889 char *u_buf_pos = strchr (u_len_pos, '*');
16890
16891 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16892
16893 u32 u_len_len = u_buf_pos - u_len_pos;
16894
16895 u_buf_pos++;
16896
16897 char *o_len_pos = strchr (u_buf_pos, '*');
16898
16899 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16900
16901 u32 u_buf_len = o_len_pos - u_buf_pos;
16902
16903 o_len_pos++;
16904
16905 char *o_buf_pos = strchr (o_len_pos, '*');
16906
16907 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16908
16909 u32 o_len_len = o_buf_pos - o_len_pos;
16910
16911 o_buf_pos++;
16912
16913 char *last = strchr (o_buf_pos, '*');
16914
16915 if (last == NULL) last = input_buf + input_len;
16916
16917 u32 o_buf_len = last - o_buf_pos;
16918
16919 // validate data
16920
16921 const int V = atoi (V_pos);
16922 const int R = atoi (R_pos);
16923
16924 int vr_ok = 0;
16925
16926 if ((V == 5) && (R == 5)) vr_ok = 1;
16927 if ((V == 5) && (R == 6)) vr_ok = 1;
16928
16929 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16930
16931 const int bits = atoi (bits_pos);
16932
16933 if (bits != 256) return (PARSER_SALT_VALUE);
16934
16935 int enc_md = atoi (enc_md_pos);
16936
16937 if (enc_md != 1) return (PARSER_SALT_VALUE);
16938
16939 const uint id_len = atoi (id_len_pos);
16940 const uint u_len = atoi (u_len_pos);
16941 const uint o_len = atoi (o_len_pos);
16942
16943 if (V_len > 6) return (PARSER_SALT_LENGTH);
16944 if (R_len > 6) return (PARSER_SALT_LENGTH);
16945 if (P_len > 6) return (PARSER_SALT_LENGTH);
16946 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16947 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16948 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16949 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16950 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16951
16952 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16953 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16954 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16955
16956 // copy data to esalt
16957
16958 if (u_len < 40) return (PARSER_SALT_VALUE);
16959
16960 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16961 {
16962 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
16963 }
16964
16965 salt->salt_buf[0] = pdf->u_buf[8];
16966 salt->salt_buf[1] = pdf->u_buf[9];
16967
16968 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16969 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16970
16971 salt->salt_len = 8;
16972 salt->salt_iter = ROUNDS_PDF17L8;
16973
16974 digest[0] = pdf->u_buf[0];
16975 digest[1] = pdf->u_buf[1];
16976 digest[2] = pdf->u_buf[2];
16977 digest[3] = pdf->u_buf[3];
16978 digest[4] = pdf->u_buf[4];
16979 digest[5] = pdf->u_buf[5];
16980 digest[6] = pdf->u_buf[6];
16981 digest[7] = pdf->u_buf[7];
16982
16983 return (PARSER_OK);
16984 }
16985
16986 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16987 {
16988 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16989
16990 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16991
16992 u32 *digest = (u32 *) hash_buf->digest;
16993
16994 salt_t *salt = hash_buf->salt;
16995
16996 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16997
16998 /**
16999 * parse line
17000 */
17001
17002 // iterations
17003
17004 char *iter_pos = input_buf + 7;
17005
17006 u32 iter = atoi (iter_pos);
17007
17008 if (iter < 1) return (PARSER_SALT_ITERATION);
17009 if (iter > 999999) return (PARSER_SALT_ITERATION);
17010
17011 // first is *raw* salt
17012
17013 char *salt_pos = strchr (iter_pos, ':');
17014
17015 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17016
17017 salt_pos++;
17018
17019 char *hash_pos = strchr (salt_pos, ':');
17020
17021 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17022
17023 u32 salt_len = hash_pos - salt_pos;
17024
17025 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17026
17027 hash_pos++;
17028
17029 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17030
17031 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17032
17033 // decode salt
17034
17035 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17036
17037 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17038
17039 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17040
17041 salt_buf_ptr[salt_len + 3] = 0x01;
17042 salt_buf_ptr[salt_len + 4] = 0x80;
17043
17044 salt->salt_len = salt_len;
17045 salt->salt_iter = iter - 1;
17046
17047 // decode hash
17048
17049 u8 tmp_buf[100] = { 0 };
17050
17051 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17052
17053 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17054
17055 memcpy (digest, tmp_buf, 16);
17056
17057 digest[0] = byte_swap_32 (digest[0]);
17058 digest[1] = byte_swap_32 (digest[1]);
17059 digest[2] = byte_swap_32 (digest[2]);
17060 digest[3] = byte_swap_32 (digest[3]);
17061
17062 // add some stuff to normal salt to make sorted happy
17063
17064 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17065 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17066 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17067 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17068 salt->salt_buf[4] = salt->salt_iter;
17069
17070 return (PARSER_OK);
17071 }
17072
17073 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17074 {
17075 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17076
17077 u32 *digest = (u32 *) hash_buf->digest;
17078
17079 salt_t *salt = hash_buf->salt;
17080
17081 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17082 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17083 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17084 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17085
17086 digest[0] = byte_swap_32 (digest[0]);
17087 digest[1] = byte_swap_32 (digest[1]);
17088 digest[2] = byte_swap_32 (digest[2]);
17089 digest[3] = byte_swap_32 (digest[3]);
17090
17091 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17092
17093 uint salt_len = input_len - 32 - 1;
17094
17095 char *salt_buf = input_buf + 32 + 1;
17096
17097 char *salt_buf_ptr = (char *) salt->salt_buf;
17098
17099 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17100
17101 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17102
17103 salt->salt_len = salt_len;
17104
17105 return (PARSER_OK);
17106 }
17107
17108 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17109 {
17110 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17111
17112 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17113
17114 u32 *digest = (u32 *) hash_buf->digest;
17115
17116 salt_t *salt = hash_buf->salt;
17117
17118 char *user_pos = input_buf + 10;
17119
17120 char *salt_pos = strchr (user_pos, '*');
17121
17122 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17123
17124 salt_pos++;
17125
17126 char *hash_pos = strchr (salt_pos, '*');
17127
17128 hash_pos++;
17129
17130 uint hash_len = input_len - (hash_pos - input_buf);
17131
17132 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17133
17134 uint user_len = salt_pos - user_pos - 1;
17135
17136 uint salt_len = hash_pos - salt_pos - 1;
17137
17138 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17139
17140 /*
17141 * store digest
17142 */
17143
17144 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17145 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17146 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17147 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17148
17149 digest[0] = byte_swap_32 (digest[0]);
17150 digest[1] = byte_swap_32 (digest[1]);
17151 digest[2] = byte_swap_32 (digest[2]);
17152 digest[3] = byte_swap_32 (digest[3]);
17153
17154 digest[0] -= MD5M_A;
17155 digest[1] -= MD5M_B;
17156 digest[2] -= MD5M_C;
17157 digest[3] -= MD5M_D;
17158
17159 /*
17160 * store salt
17161 */
17162
17163 char *salt_buf_ptr = (char *) salt->salt_buf;
17164
17165 // first 4 bytes are the "challenge"
17166
17167 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17168 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17169 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17170 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17171
17172 // append the user name
17173
17174 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17175
17176 salt->salt_len = 4 + user_len;
17177
17178 return (PARSER_OK);
17179 }
17180
17181 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17182 {
17183 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17184
17185 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17186
17187 u32 *digest = (u32 *) hash_buf->digest;
17188
17189 salt_t *salt = hash_buf->salt;
17190
17191 char *salt_pos = input_buf + 9;
17192
17193 char *hash_pos = strchr (salt_pos, '*');
17194
17195 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17196
17197 hash_pos++;
17198
17199 uint hash_len = input_len - (hash_pos - input_buf);
17200
17201 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17202
17203 uint salt_len = hash_pos - salt_pos - 1;
17204
17205 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17206
17207 /*
17208 * store digest
17209 */
17210
17211 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17212 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17213 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17214 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17215 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17216
17217 /*
17218 * store salt
17219 */
17220
17221 char *salt_buf_ptr = (char *) salt->salt_buf;
17222
17223 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17224
17225 salt->salt_len = salt_len;
17226
17227 return (PARSER_OK);
17228 }
17229
17230 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17231 {
17232 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17233
17234 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17235
17236 u32 *digest = (u32 *) hash_buf->digest;
17237
17238 salt_t *salt = hash_buf->salt;
17239
17240 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17241
17242 /**
17243 * parse line
17244 */
17245
17246 char *cry_master_len_pos = input_buf + 9;
17247
17248 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17249
17250 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17251
17252 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17253
17254 cry_master_buf_pos++;
17255
17256 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17257
17258 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17259
17260 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17261
17262 cry_salt_len_pos++;
17263
17264 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17265
17266 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17267
17268 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17269
17270 cry_salt_buf_pos++;
17271
17272 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17273
17274 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17275
17276 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17277
17278 cry_rounds_pos++;
17279
17280 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17281
17282 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17283
17284 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17285
17286 ckey_len_pos++;
17287
17288 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17289
17290 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17291
17292 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17293
17294 ckey_buf_pos++;
17295
17296 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17297
17298 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17299
17300 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17301
17302 public_key_len_pos++;
17303
17304 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17305
17306 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17307
17308 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17309
17310 public_key_buf_pos++;
17311
17312 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;
17313
17314 const uint cry_master_len = atoi (cry_master_len_pos);
17315 const uint cry_salt_len = atoi (cry_salt_len_pos);
17316 const uint ckey_len = atoi (ckey_len_pos);
17317 const uint public_key_len = atoi (public_key_len_pos);
17318
17319 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17320 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17321 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17322 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17323
17324 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17325 {
17326 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17327
17328 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17329 }
17330
17331 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17332 {
17333 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17334
17335 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17336 }
17337
17338 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17339 {
17340 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17341
17342 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17343 }
17344
17345 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17346 bitcoin_wallet->ckey_len = ckey_len / 2;
17347 bitcoin_wallet->public_key_len = public_key_len / 2;
17348
17349 /*
17350 * store digest (should be unique enought, hopefully)
17351 */
17352
17353 digest[0] = bitcoin_wallet->cry_master_buf[0];
17354 digest[1] = bitcoin_wallet->cry_master_buf[1];
17355 digest[2] = bitcoin_wallet->cry_master_buf[2];
17356 digest[3] = bitcoin_wallet->cry_master_buf[3];
17357
17358 /*
17359 * store salt
17360 */
17361
17362 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17363
17364 const uint cry_rounds = atoi (cry_rounds_pos);
17365
17366 salt->salt_iter = cry_rounds - 1;
17367
17368 char *salt_buf_ptr = (char *) salt->salt_buf;
17369
17370 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17371
17372 salt->salt_len = salt_len;
17373
17374 return (PARSER_OK);
17375 }
17376
17377 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17378 {
17379 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17380
17381 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17382
17383 u32 *digest = (u32 *) hash_buf->digest;
17384
17385 salt_t *salt = hash_buf->salt;
17386
17387 sip_t *sip = (sip_t *) hash_buf->esalt;
17388
17389 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17390
17391 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17392
17393 memcpy (temp_input_buf, input_buf, input_len);
17394
17395 // URI_server:
17396
17397 char *URI_server_pos = temp_input_buf + 6;
17398
17399 char *URI_client_pos = strchr (URI_server_pos, '*');
17400
17401 if (URI_client_pos == NULL)
17402 {
17403 myfree (temp_input_buf);
17404
17405 return (PARSER_SEPARATOR_UNMATCHED);
17406 }
17407
17408 URI_client_pos[0] = 0;
17409 URI_client_pos++;
17410
17411 uint URI_server_len = strlen (URI_server_pos);
17412
17413 if (URI_server_len > 512)
17414 {
17415 myfree (temp_input_buf);
17416
17417 return (PARSER_SALT_LENGTH);
17418 }
17419
17420 // URI_client:
17421
17422 char *user_pos = strchr (URI_client_pos, '*');
17423
17424 if (user_pos == NULL)
17425 {
17426 myfree (temp_input_buf);
17427
17428 return (PARSER_SEPARATOR_UNMATCHED);
17429 }
17430
17431 user_pos[0] = 0;
17432 user_pos++;
17433
17434 uint URI_client_len = strlen (URI_client_pos);
17435
17436 if (URI_client_len > 512)
17437 {
17438 myfree (temp_input_buf);
17439
17440 return (PARSER_SALT_LENGTH);
17441 }
17442
17443 // user:
17444
17445 char *realm_pos = strchr (user_pos, '*');
17446
17447 if (realm_pos == NULL)
17448 {
17449 myfree (temp_input_buf);
17450
17451 return (PARSER_SEPARATOR_UNMATCHED);
17452 }
17453
17454 realm_pos[0] = 0;
17455 realm_pos++;
17456
17457 uint user_len = strlen (user_pos);
17458
17459 if (user_len > 116)
17460 {
17461 myfree (temp_input_buf);
17462
17463 return (PARSER_SALT_LENGTH);
17464 }
17465
17466 // realm:
17467
17468 char *method_pos = strchr (realm_pos, '*');
17469
17470 if (method_pos == NULL)
17471 {
17472 myfree (temp_input_buf);
17473
17474 return (PARSER_SEPARATOR_UNMATCHED);
17475 }
17476
17477 method_pos[0] = 0;
17478 method_pos++;
17479
17480 uint realm_len = strlen (realm_pos);
17481
17482 if (realm_len > 116)
17483 {
17484 myfree (temp_input_buf);
17485
17486 return (PARSER_SALT_LENGTH);
17487 }
17488
17489 // method:
17490
17491 char *URI_prefix_pos = strchr (method_pos, '*');
17492
17493 if (URI_prefix_pos == NULL)
17494 {
17495 myfree (temp_input_buf);
17496
17497 return (PARSER_SEPARATOR_UNMATCHED);
17498 }
17499
17500 URI_prefix_pos[0] = 0;
17501 URI_prefix_pos++;
17502
17503 uint method_len = strlen (method_pos);
17504
17505 if (method_len > 246)
17506 {
17507 myfree (temp_input_buf);
17508
17509 return (PARSER_SALT_LENGTH);
17510 }
17511
17512 // URI_prefix:
17513
17514 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17515
17516 if (URI_resource_pos == NULL)
17517 {
17518 myfree (temp_input_buf);
17519
17520 return (PARSER_SEPARATOR_UNMATCHED);
17521 }
17522
17523 URI_resource_pos[0] = 0;
17524 URI_resource_pos++;
17525
17526 uint URI_prefix_len = strlen (URI_prefix_pos);
17527
17528 if (URI_prefix_len > 245)
17529 {
17530 myfree (temp_input_buf);
17531
17532 return (PARSER_SALT_LENGTH);
17533 }
17534
17535 // URI_resource:
17536
17537 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17538
17539 if (URI_suffix_pos == NULL)
17540 {
17541 myfree (temp_input_buf);
17542
17543 return (PARSER_SEPARATOR_UNMATCHED);
17544 }
17545
17546 URI_suffix_pos[0] = 0;
17547 URI_suffix_pos++;
17548
17549 uint URI_resource_len = strlen (URI_resource_pos);
17550
17551 if (URI_resource_len < 1 || URI_resource_len > 246)
17552 {
17553 myfree (temp_input_buf);
17554
17555 return (PARSER_SALT_LENGTH);
17556 }
17557
17558 // URI_suffix:
17559
17560 char *nonce_pos = strchr (URI_suffix_pos, '*');
17561
17562 if (nonce_pos == NULL)
17563 {
17564 myfree (temp_input_buf);
17565
17566 return (PARSER_SEPARATOR_UNMATCHED);
17567 }
17568
17569 nonce_pos[0] = 0;
17570 nonce_pos++;
17571
17572 uint URI_suffix_len = strlen (URI_suffix_pos);
17573
17574 if (URI_suffix_len > 245)
17575 {
17576 myfree (temp_input_buf);
17577
17578 return (PARSER_SALT_LENGTH);
17579 }
17580
17581 // nonce:
17582
17583 char *nonce_client_pos = strchr (nonce_pos, '*');
17584
17585 if (nonce_client_pos == NULL)
17586 {
17587 myfree (temp_input_buf);
17588
17589 return (PARSER_SEPARATOR_UNMATCHED);
17590 }
17591
17592 nonce_client_pos[0] = 0;
17593 nonce_client_pos++;
17594
17595 uint nonce_len = strlen (nonce_pos);
17596
17597 if (nonce_len < 1 || nonce_len > 50)
17598 {
17599 myfree (temp_input_buf);
17600
17601 return (PARSER_SALT_LENGTH);
17602 }
17603
17604 // nonce_client:
17605
17606 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17607
17608 if (nonce_count_pos == NULL)
17609 {
17610 myfree (temp_input_buf);
17611
17612 return (PARSER_SEPARATOR_UNMATCHED);
17613 }
17614
17615 nonce_count_pos[0] = 0;
17616 nonce_count_pos++;
17617
17618 uint nonce_client_len = strlen (nonce_client_pos);
17619
17620 if (nonce_client_len > 50)
17621 {
17622 myfree (temp_input_buf);
17623
17624 return (PARSER_SALT_LENGTH);
17625 }
17626
17627 // nonce_count:
17628
17629 char *qop_pos = strchr (nonce_count_pos, '*');
17630
17631 if (qop_pos == NULL)
17632 {
17633 myfree (temp_input_buf);
17634
17635 return (PARSER_SEPARATOR_UNMATCHED);
17636 }
17637
17638 qop_pos[0] = 0;
17639 qop_pos++;
17640
17641 uint nonce_count_len = strlen (nonce_count_pos);
17642
17643 if (nonce_count_len > 50)
17644 {
17645 myfree (temp_input_buf);
17646
17647 return (PARSER_SALT_LENGTH);
17648 }
17649
17650 // qop:
17651
17652 char *directive_pos = strchr (qop_pos, '*');
17653
17654 if (directive_pos == NULL)
17655 {
17656 myfree (temp_input_buf);
17657
17658 return (PARSER_SEPARATOR_UNMATCHED);
17659 }
17660
17661 directive_pos[0] = 0;
17662 directive_pos++;
17663
17664 uint qop_len = strlen (qop_pos);
17665
17666 if (qop_len > 50)
17667 {
17668 myfree (temp_input_buf);
17669
17670 return (PARSER_SALT_LENGTH);
17671 }
17672
17673 // directive
17674
17675 char *digest_pos = strchr (directive_pos, '*');
17676
17677 if (digest_pos == NULL)
17678 {
17679 myfree (temp_input_buf);
17680
17681 return (PARSER_SEPARATOR_UNMATCHED);
17682 }
17683
17684 digest_pos[0] = 0;
17685 digest_pos++;
17686
17687 uint directive_len = strlen (directive_pos);
17688
17689 if (directive_len != 3)
17690 {
17691 myfree (temp_input_buf);
17692
17693 return (PARSER_SALT_LENGTH);
17694 }
17695
17696 if (memcmp (directive_pos, "MD5", 3))
17697 {
17698 log_info ("ERROR: only the MD5 directive is currently supported\n");
17699
17700 myfree (temp_input_buf);
17701
17702 return (PARSER_SIP_AUTH_DIRECTIVE);
17703 }
17704
17705 /*
17706 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17707 */
17708
17709 uint md5_len = 0;
17710
17711 uint md5_max_len = 4 * 64;
17712
17713 uint md5_remaining_len = md5_max_len;
17714
17715 uint tmp_md5_buf[64] = { 0 };
17716
17717 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17718
17719 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17720
17721 md5_len += method_len + 1;
17722 tmp_md5_ptr += method_len + 1;
17723
17724 if (URI_prefix_len > 0)
17725 {
17726 md5_remaining_len = md5_max_len - md5_len;
17727
17728 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17729
17730 md5_len += URI_prefix_len + 1;
17731 tmp_md5_ptr += URI_prefix_len + 1;
17732 }
17733
17734 md5_remaining_len = md5_max_len - md5_len;
17735
17736 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17737
17738 md5_len += URI_resource_len;
17739 tmp_md5_ptr += URI_resource_len;
17740
17741 if (URI_suffix_len > 0)
17742 {
17743 md5_remaining_len = md5_max_len - md5_len;
17744
17745 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17746
17747 md5_len += 1 + URI_suffix_len;
17748 }
17749
17750 uint tmp_digest[4] = { 0 };
17751
17752 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17753
17754 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17755 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17756 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17757 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17758
17759 /*
17760 * esalt
17761 */
17762
17763 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17764
17765 uint esalt_len = 0;
17766
17767 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17768
17769 // there are 2 possibilities for the esalt:
17770
17771 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17772 {
17773 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17774
17775 if (esalt_len > max_esalt_len)
17776 {
17777 myfree (temp_input_buf);
17778
17779 return (PARSER_SALT_LENGTH);
17780 }
17781
17782 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17783 nonce_pos,
17784 nonce_count_pos,
17785 nonce_client_pos,
17786 qop_pos,
17787 tmp_digest[0],
17788 tmp_digest[1],
17789 tmp_digest[2],
17790 tmp_digest[3]);
17791 }
17792 else
17793 {
17794 esalt_len = 1 + nonce_len + 1 + 32;
17795
17796 if (esalt_len > max_esalt_len)
17797 {
17798 myfree (temp_input_buf);
17799
17800 return (PARSER_SALT_LENGTH);
17801 }
17802
17803 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17804 nonce_pos,
17805 tmp_digest[0],
17806 tmp_digest[1],
17807 tmp_digest[2],
17808 tmp_digest[3]);
17809 }
17810
17811 // add 0x80 to esalt
17812
17813 esalt_buf_ptr[esalt_len] = 0x80;
17814
17815 sip->esalt_len = esalt_len;
17816
17817 /*
17818 * actual salt
17819 */
17820
17821 char *sip_salt_ptr = (char *) sip->salt_buf;
17822
17823 uint salt_len = user_len + 1 + realm_len + 1;
17824
17825 uint max_salt_len = 119;
17826
17827 if (salt_len > max_salt_len)
17828 {
17829 myfree (temp_input_buf);
17830
17831 return (PARSER_SALT_LENGTH);
17832 }
17833
17834 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17835
17836 sip->salt_len = salt_len;
17837
17838 /*
17839 * fake salt (for sorting)
17840 */
17841
17842 char *salt_buf_ptr = (char *) salt->salt_buf;
17843
17844 max_salt_len = 55;
17845
17846 uint fake_salt_len = salt_len;
17847
17848 if (fake_salt_len > max_salt_len)
17849 {
17850 fake_salt_len = max_salt_len;
17851 }
17852
17853 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17854
17855 salt->salt_len = fake_salt_len;
17856
17857 /*
17858 * digest
17859 */
17860
17861 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
17862 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
17863 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
17864 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
17865
17866 digest[0] = byte_swap_32 (digest[0]);
17867 digest[1] = byte_swap_32 (digest[1]);
17868 digest[2] = byte_swap_32 (digest[2]);
17869 digest[3] = byte_swap_32 (digest[3]);
17870
17871 myfree (temp_input_buf);
17872
17873 return (PARSER_OK);
17874 }
17875
17876 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17877 {
17878 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17879
17880 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17881
17882 u32 *digest = (u32 *) hash_buf->digest;
17883
17884 salt_t *salt = hash_buf->salt;
17885
17886 // digest
17887
17888 char *digest_pos = input_buf;
17889
17890 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
17891 digest[1] = 0;
17892 digest[2] = 0;
17893 digest[3] = 0;
17894
17895 // salt
17896
17897 char *salt_buf = input_buf + 8 + 1;
17898
17899 uint salt_len = 8;
17900
17901 char *salt_buf_ptr = (char *) salt->salt_buf;
17902
17903 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17904
17905 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17906
17907 salt->salt_len = salt_len;
17908
17909 return (PARSER_OK);
17910 }
17911
17912 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17913 {
17914 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17915
17916 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17917
17918 u32 *digest = (u32 *) hash_buf->digest;
17919
17920 salt_t *salt = hash_buf->salt;
17921
17922 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17923
17924 /**
17925 * parse line
17926 */
17927
17928 char *p_buf_pos = input_buf + 4;
17929
17930 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17931
17932 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17933
17934 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
17935
17936 NumCyclesPower_pos++;
17937
17938 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17939
17940 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17941
17942 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17943
17944 salt_len_pos++;
17945
17946 char *salt_buf_pos = strchr (salt_len_pos, '$');
17947
17948 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17949
17950 u32 salt_len_len = salt_buf_pos - salt_len_pos;
17951
17952 salt_buf_pos++;
17953
17954 char *iv_len_pos = strchr (salt_buf_pos, '$');
17955
17956 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17957
17958 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
17959
17960 iv_len_pos++;
17961
17962 char *iv_buf_pos = strchr (iv_len_pos, '$');
17963
17964 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17965
17966 u32 iv_len_len = iv_buf_pos - iv_len_pos;
17967
17968 iv_buf_pos++;
17969
17970 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17971
17972 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17973
17974 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
17975
17976 crc_buf_pos++;
17977
17978 char *data_len_pos = strchr (crc_buf_pos, '$');
17979
17980 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17981
17982 u32 crc_buf_len = data_len_pos - crc_buf_pos;
17983
17984 data_len_pos++;
17985
17986 char *unpack_size_pos = strchr (data_len_pos, '$');
17987
17988 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17989
17990 u32 data_len_len = unpack_size_pos - data_len_pos;
17991
17992 unpack_size_pos++;
17993
17994 char *data_buf_pos = strchr (unpack_size_pos, '$');
17995
17996 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17997
17998 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
17999
18000 data_buf_pos++;
18001
18002 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;
18003
18004 const uint iter = atoi (NumCyclesPower_pos);
18005 const uint crc = atoi (crc_buf_pos);
18006 const uint p_buf = atoi (p_buf_pos);
18007 const uint salt_len = atoi (salt_len_pos);
18008 const uint iv_len = atoi (iv_len_pos);
18009 const uint unpack_size = atoi (unpack_size_pos);
18010 const uint data_len = atoi (data_len_pos);
18011
18012 /**
18013 * verify some data
18014 */
18015
18016 if (p_buf != 0) return (PARSER_SALT_VALUE);
18017 if (salt_len != 0) return (PARSER_SALT_VALUE);
18018
18019 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18020
18021 if (data_len > 384) return (PARSER_SALT_VALUE);
18022
18023 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18024
18025 /**
18026 * store data
18027 */
18028
18029 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18030 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18031 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18032 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18033
18034 seven_zip->iv_len = iv_len;
18035
18036 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18037
18038 seven_zip->salt_len = 0;
18039
18040 seven_zip->crc = crc;
18041
18042 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18043 {
18044 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18045
18046 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18047 }
18048
18049 seven_zip->data_len = data_len;
18050
18051 seven_zip->unpack_size = unpack_size;
18052
18053 // real salt
18054
18055 salt->salt_buf[0] = seven_zip->data_buf[0];
18056 salt->salt_buf[1] = seven_zip->data_buf[1];
18057 salt->salt_buf[2] = seven_zip->data_buf[2];
18058 salt->salt_buf[3] = seven_zip->data_buf[3];
18059
18060 salt->salt_len = 16;
18061
18062 salt->salt_sign[0] = iter;
18063
18064 salt->salt_iter = 1 << iter;
18065
18066 /**
18067 * digest
18068 */
18069
18070 digest[0] = crc;
18071 digest[1] = 0;
18072 digest[2] = 0;
18073 digest[3] = 0;
18074
18075 return (PARSER_OK);
18076 }
18077
18078 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18079 {
18080 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18081
18082 u32 *digest = (u32 *) hash_buf->digest;
18083
18084 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18085 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18086 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18087 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18088 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18089 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18090 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18091 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18092
18093 digest[0] = byte_swap_32 (digest[0]);
18094 digest[1] = byte_swap_32 (digest[1]);
18095 digest[2] = byte_swap_32 (digest[2]);
18096 digest[3] = byte_swap_32 (digest[3]);
18097 digest[4] = byte_swap_32 (digest[4]);
18098 digest[5] = byte_swap_32 (digest[5]);
18099 digest[6] = byte_swap_32 (digest[6]);
18100 digest[7] = byte_swap_32 (digest[7]);
18101
18102 return (PARSER_OK);
18103 }
18104
18105 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18106 {
18107 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18108
18109 u32 *digest = (u32 *) hash_buf->digest;
18110
18111 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18112 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18113 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18114 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18115 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18116 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18117 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18118 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18119 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18120 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18121 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18122 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18123 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18124 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18125 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18126 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18127
18128 digest[ 0] = byte_swap_32 (digest[ 0]);
18129 digest[ 1] = byte_swap_32 (digest[ 1]);
18130 digest[ 2] = byte_swap_32 (digest[ 2]);
18131 digest[ 3] = byte_swap_32 (digest[ 3]);
18132 digest[ 4] = byte_swap_32 (digest[ 4]);
18133 digest[ 5] = byte_swap_32 (digest[ 5]);
18134 digest[ 6] = byte_swap_32 (digest[ 6]);
18135 digest[ 7] = byte_swap_32 (digest[ 7]);
18136 digest[ 8] = byte_swap_32 (digest[ 8]);
18137 digest[ 9] = byte_swap_32 (digest[ 9]);
18138 digest[10] = byte_swap_32 (digest[10]);
18139 digest[11] = byte_swap_32 (digest[11]);
18140 digest[12] = byte_swap_32 (digest[12]);
18141 digest[13] = byte_swap_32 (digest[13]);
18142 digest[14] = byte_swap_32 (digest[14]);
18143 digest[15] = byte_swap_32 (digest[15]);
18144
18145 return (PARSER_OK);
18146 }
18147
18148 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18149 {
18150 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18151
18152 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18153
18154 u32 *digest = (u32 *) hash_buf->digest;
18155
18156 salt_t *salt = hash_buf->salt;
18157
18158 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18159
18160 /**
18161 * parse line
18162 */
18163
18164 // iterations
18165
18166 char *iter_pos = input_buf + 4;
18167
18168 u32 iter = atoi (iter_pos);
18169
18170 if (iter < 1) return (PARSER_SALT_ITERATION);
18171 if (iter > 999999) return (PARSER_SALT_ITERATION);
18172
18173 // first is *raw* salt
18174
18175 char *salt_pos = strchr (iter_pos, ':');
18176
18177 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18178
18179 salt_pos++;
18180
18181 char *hash_pos = strchr (salt_pos, ':');
18182
18183 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18184
18185 u32 salt_len = hash_pos - salt_pos;
18186
18187 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18188
18189 hash_pos++;
18190
18191 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18192
18193 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18194
18195 // decode salt
18196
18197 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18198
18199 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18200
18201 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18202
18203 salt_buf_ptr[salt_len + 3] = 0x01;
18204 salt_buf_ptr[salt_len + 4] = 0x80;
18205
18206 salt->salt_len = salt_len;
18207 salt->salt_iter = iter - 1;
18208
18209 // decode hash
18210
18211 u8 tmp_buf[100] = { 0 };
18212
18213 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18214
18215 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18216
18217 memcpy (digest, tmp_buf, 16);
18218
18219 // add some stuff to normal salt to make sorted happy
18220
18221 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18222 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18223 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18224 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18225 salt->salt_buf[4] = salt->salt_iter;
18226
18227 return (PARSER_OK);
18228 }
18229
18230 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18231 {
18232 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18233
18234 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18235
18236 u32 *digest = (u32 *) hash_buf->digest;
18237
18238 salt_t *salt = hash_buf->salt;
18239
18240 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18241
18242 /**
18243 * parse line
18244 */
18245
18246 // iterations
18247
18248 char *iter_pos = input_buf + 5;
18249
18250 u32 iter = atoi (iter_pos);
18251
18252 if (iter < 1) return (PARSER_SALT_ITERATION);
18253 if (iter > 999999) return (PARSER_SALT_ITERATION);
18254
18255 // first is *raw* salt
18256
18257 char *salt_pos = strchr (iter_pos, ':');
18258
18259 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18260
18261 salt_pos++;
18262
18263 char *hash_pos = strchr (salt_pos, ':');
18264
18265 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18266
18267 u32 salt_len = hash_pos - salt_pos;
18268
18269 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18270
18271 hash_pos++;
18272
18273 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18274
18275 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18276
18277 // decode salt
18278
18279 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18280
18281 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18282
18283 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18284
18285 salt_buf_ptr[salt_len + 3] = 0x01;
18286 salt_buf_ptr[salt_len + 4] = 0x80;
18287
18288 salt->salt_len = salt_len;
18289 salt->salt_iter = iter - 1;
18290
18291 // decode hash
18292
18293 u8 tmp_buf[100] = { 0 };
18294
18295 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18296
18297 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18298
18299 memcpy (digest, tmp_buf, 16);
18300
18301 digest[0] = byte_swap_32 (digest[0]);
18302 digest[1] = byte_swap_32 (digest[1]);
18303 digest[2] = byte_swap_32 (digest[2]);
18304 digest[3] = byte_swap_32 (digest[3]);
18305
18306 // add some stuff to normal salt to make sorted happy
18307
18308 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18309 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18310 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18311 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18312 salt->salt_buf[4] = salt->salt_iter;
18313
18314 return (PARSER_OK);
18315 }
18316
18317 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18318 {
18319 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18320
18321 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18322
18323 u64 *digest = (u64 *) hash_buf->digest;
18324
18325 salt_t *salt = hash_buf->salt;
18326
18327 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18328
18329 /**
18330 * parse line
18331 */
18332
18333 // iterations
18334
18335 char *iter_pos = input_buf + 7;
18336
18337 u32 iter = atoi (iter_pos);
18338
18339 if (iter < 1) return (PARSER_SALT_ITERATION);
18340 if (iter > 999999) return (PARSER_SALT_ITERATION);
18341
18342 // first is *raw* salt
18343
18344 char *salt_pos = strchr (iter_pos, ':');
18345
18346 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18347
18348 salt_pos++;
18349
18350 char *hash_pos = strchr (salt_pos, ':');
18351
18352 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18353
18354 u32 salt_len = hash_pos - salt_pos;
18355
18356 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18357
18358 hash_pos++;
18359
18360 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18361
18362 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18363
18364 // decode salt
18365
18366 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18367
18368 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18369
18370 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18371
18372 salt_buf_ptr[salt_len + 3] = 0x01;
18373 salt_buf_ptr[salt_len + 4] = 0x80;
18374
18375 salt->salt_len = salt_len;
18376 salt->salt_iter = iter - 1;
18377
18378 // decode hash
18379
18380 u8 tmp_buf[100] = { 0 };
18381
18382 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18383
18384 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18385
18386 memcpy (digest, tmp_buf, 64);
18387
18388 digest[0] = byte_swap_64 (digest[0]);
18389 digest[1] = byte_swap_64 (digest[1]);
18390 digest[2] = byte_swap_64 (digest[2]);
18391 digest[3] = byte_swap_64 (digest[3]);
18392 digest[4] = byte_swap_64 (digest[4]);
18393 digest[5] = byte_swap_64 (digest[5]);
18394 digest[6] = byte_swap_64 (digest[6]);
18395 digest[7] = byte_swap_64 (digest[7]);
18396
18397 // add some stuff to normal salt to make sorted happy
18398
18399 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18400 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18401 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18402 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18403 salt->salt_buf[4] = salt->salt_iter;
18404
18405 return (PARSER_OK);
18406 }
18407
18408 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18409 {
18410 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18411
18412 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18413
18414 uint *digest = (uint *) hash_buf->digest;
18415
18416 salt_t *salt = hash_buf->salt;
18417
18418 /**
18419 * parse line
18420 */
18421
18422 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18423
18424 char *hash_pos = strchr (salt_pos, '$');
18425
18426 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18427
18428 u32 salt_len = hash_pos - salt_pos;
18429
18430 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18431
18432 hash_pos++;
18433
18434 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18435
18436 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18437
18438 // decode hash
18439
18440 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18441 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18442 digest[ 2] = 0;
18443 digest[ 3] = 0;
18444 digest[ 4] = 0;
18445 digest[ 5] = 0;
18446 digest[ 6] = 0;
18447 digest[ 7] = 0;
18448 digest[ 8] = 0;
18449 digest[ 9] = 0;
18450 digest[10] = 0;
18451 digest[11] = 0;
18452 digest[12] = 0;
18453 digest[13] = 0;
18454 digest[14] = 0;
18455 digest[15] = 0;
18456
18457 // decode salt
18458
18459 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18460 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18461
18462 salt->salt_iter = ROUNDS_ECRYPTFS;
18463 salt->salt_len = 8;
18464
18465 return (PARSER_OK);
18466 }
18467
18468 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18469 {
18470 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18471
18472 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18473
18474 unsigned char c19 = itoa64_to_int (input_buf[19]);
18475
18476 if (c19 & 3) return (PARSER_HASH_VALUE);
18477
18478 salt_t *salt = hash_buf->salt;
18479
18480 u32 *digest = (u32 *) hash_buf->digest;
18481
18482 // iteration count
18483
18484 salt->salt_iter = itoa64_to_int (input_buf[1])
18485 | itoa64_to_int (input_buf[2]) << 6
18486 | itoa64_to_int (input_buf[3]) << 12
18487 | itoa64_to_int (input_buf[4]) << 18;
18488
18489 // set salt
18490
18491 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18492 | itoa64_to_int (input_buf[6]) << 6
18493 | itoa64_to_int (input_buf[7]) << 12
18494 | itoa64_to_int (input_buf[8]) << 18;
18495
18496 salt->salt_len = 4;
18497
18498 u8 tmp_buf[100] = { 0 };
18499
18500 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18501
18502 memcpy (digest, tmp_buf, 8);
18503
18504 uint tt;
18505
18506 IP (digest[0], digest[1], tt);
18507
18508 digest[0] = rotr32 (digest[0], 31);
18509 digest[1] = rotr32 (digest[1], 31);
18510 digest[2] = 0;
18511 digest[3] = 0;
18512
18513 return (PARSER_OK);
18514 }
18515
18516 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18517 {
18518 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18519
18520 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18521
18522 u32 *digest = (u32 *) hash_buf->digest;
18523
18524 salt_t *salt = hash_buf->salt;
18525
18526 /**
18527 * parse line
18528 */
18529
18530 char *type_pos = input_buf + 6 + 1;
18531
18532 char *salt_pos = strchr (type_pos, '*');
18533
18534 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18535
18536 u32 type_len = salt_pos - type_pos;
18537
18538 if (type_len != 1) return (PARSER_SALT_LENGTH);
18539
18540 salt_pos++;
18541
18542 char *crypted_pos = strchr (salt_pos, '*');
18543
18544 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18545
18546 u32 salt_len = crypted_pos - salt_pos;
18547
18548 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18549
18550 crypted_pos++;
18551
18552 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18553
18554 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18555
18556 /**
18557 * copy data
18558 */
18559
18560 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18561 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18562
18563 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18564 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18565
18566 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18567 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18568 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18569 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18570
18571 salt->salt_len = 24;
18572 salt->salt_iter = ROUNDS_RAR3;
18573
18574 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18575 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18576
18577 digest[0] = 0xc43d7b00;
18578 digest[1] = 0x40070000;
18579 digest[2] = 0;
18580 digest[3] = 0;
18581
18582 return (PARSER_OK);
18583 }
18584
18585 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18586 {
18587 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18588
18589 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18590
18591 u32 *digest = (u32 *) hash_buf->digest;
18592
18593 salt_t *salt = hash_buf->salt;
18594
18595 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18596
18597 /**
18598 * parse line
18599 */
18600
18601 char *param0_pos = input_buf + 1 + 4 + 1;
18602
18603 char *param1_pos = strchr (param0_pos, '$');
18604
18605 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18606
18607 u32 param0_len = param1_pos - param0_pos;
18608
18609 param1_pos++;
18610
18611 char *param2_pos = strchr (param1_pos, '$');
18612
18613 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18614
18615 u32 param1_len = param2_pos - param1_pos;
18616
18617 param2_pos++;
18618
18619 char *param3_pos = strchr (param2_pos, '$');
18620
18621 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18622
18623 u32 param2_len = param3_pos - param2_pos;
18624
18625 param3_pos++;
18626
18627 char *param4_pos = strchr (param3_pos, '$');
18628
18629 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18630
18631 u32 param3_len = param4_pos - param3_pos;
18632
18633 param4_pos++;
18634
18635 char *param5_pos = strchr (param4_pos, '$');
18636
18637 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18638
18639 u32 param4_len = param5_pos - param4_pos;
18640
18641 param5_pos++;
18642
18643 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18644
18645 char *salt_buf = param1_pos;
18646 char *iv = param3_pos;
18647 char *pswcheck = param5_pos;
18648
18649 const uint salt_len = atoi (param0_pos);
18650 const uint iterations = atoi (param2_pos);
18651 const uint pswcheck_len = atoi (param4_pos);
18652
18653 /**
18654 * verify some data
18655 */
18656
18657 if (param1_len != 32) return (PARSER_SALT_VALUE);
18658 if (param3_len != 32) return (PARSER_SALT_VALUE);
18659 if (param5_len != 16) return (PARSER_SALT_VALUE);
18660
18661 if (salt_len != 16) return (PARSER_SALT_VALUE);
18662 if (iterations == 0) return (PARSER_SALT_VALUE);
18663 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18664
18665 /**
18666 * store data
18667 */
18668
18669 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18670 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18671 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18672 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18673
18674 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18675 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18676 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18677 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18678
18679 salt->salt_len = 16;
18680
18681 salt->salt_sign[0] = iterations;
18682
18683 salt->salt_iter = ((1 << iterations) + 32) - 1;
18684
18685 /**
18686 * digest buf
18687 */
18688
18689 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18690 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18691 digest[2] = 0;
18692 digest[3] = 0;
18693
18694 return (PARSER_OK);
18695 }
18696
18697 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18698 {
18699 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18700
18701 u32 *digest = (u32 *) hash_buf->digest;
18702
18703 salt_t *salt = hash_buf->salt;
18704
18705 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18706 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18707 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18708 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18709 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18710 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18711 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18712 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18713
18714 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18715
18716 uint salt_len = input_len - 64 - 1;
18717
18718 char *salt_buf = input_buf + 64 + 1;
18719
18720 char *salt_buf_ptr = (char *) salt->salt_buf;
18721
18722 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18723
18724 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18725
18726 salt->salt_len = salt_len;
18727
18728 /**
18729 * we can precompute the first sha256 transform
18730 */
18731
18732 uint w[16] = { 0 };
18733
18734 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18735 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18736 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18737 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18738 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18739 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18740 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18741 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18742 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18743 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18744 w[10] = byte_swap_32 (salt->salt_buf[10]);
18745 w[11] = byte_swap_32 (salt->salt_buf[11]);
18746 w[12] = byte_swap_32 (salt->salt_buf[12]);
18747 w[13] = byte_swap_32 (salt->salt_buf[13]);
18748 w[14] = byte_swap_32 (salt->salt_buf[14]);
18749 w[15] = byte_swap_32 (salt->salt_buf[15]);
18750
18751 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
18752
18753 sha256_64 (w, pc256);
18754
18755 salt->salt_buf_pc[0] = pc256[0];
18756 salt->salt_buf_pc[1] = pc256[1];
18757 salt->salt_buf_pc[2] = pc256[2];
18758 salt->salt_buf_pc[3] = pc256[3];
18759 salt->salt_buf_pc[4] = pc256[4];
18760 salt->salt_buf_pc[5] = pc256[5];
18761 salt->salt_buf_pc[6] = pc256[6];
18762 salt->salt_buf_pc[7] = pc256[7];
18763
18764 digest[0] -= pc256[0];
18765 digest[1] -= pc256[1];
18766 digest[2] -= pc256[2];
18767 digest[3] -= pc256[3];
18768 digest[4] -= pc256[4];
18769 digest[5] -= pc256[5];
18770 digest[6] -= pc256[6];
18771 digest[7] -= pc256[7];
18772
18773 return (PARSER_OK);
18774 }
18775
18776 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18777 {
18778 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18779
18780 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18781
18782 u32 *digest = (u32 *) hash_buf->digest;
18783
18784 salt_t *salt = hash_buf->salt;
18785
18786 /**
18787 * parse line
18788 */
18789
18790 char *data_len_pos = input_buf + 1 + 10 + 1;
18791
18792 char *data_buf_pos = strchr (data_len_pos, '$');
18793
18794 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18795
18796 u32 data_len_len = data_buf_pos - data_len_pos;
18797
18798 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18799 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18800
18801 data_buf_pos++;
18802
18803 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18804
18805 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18806
18807 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18808
18809 u32 data_len = atoi (data_len_pos);
18810
18811 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18812
18813 /**
18814 * salt
18815 */
18816
18817 char *salt_pos = data_buf_pos;
18818
18819 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18820 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18821 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
18822 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
18823
18824 // this is actually the CT, which is also the hash later (if matched)
18825
18826 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
18827 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
18828 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
18829 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
18830
18831 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18832
18833 salt->salt_iter = 10 - 1;
18834
18835 /**
18836 * digest buf
18837 */
18838
18839 digest[0] = salt->salt_buf[4];
18840 digest[1] = salt->salt_buf[5];
18841 digest[2] = salt->salt_buf[6];
18842 digest[3] = salt->salt_buf[7];
18843
18844 return (PARSER_OK);
18845 }
18846
18847 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18848 {
18849 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18850
18851 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18852
18853 u32 *digest = (u32 *) hash_buf->digest;
18854
18855 salt_t *salt = hash_buf->salt;
18856
18857 /**
18858 * parse line
18859 */
18860
18861 char *salt_pos = input_buf + 11 + 1;
18862
18863 char *iter_pos = strchr (salt_pos, ',');
18864
18865 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18866
18867 u32 salt_len = iter_pos - salt_pos;
18868
18869 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18870
18871 iter_pos++;
18872
18873 char *hash_pos = strchr (iter_pos, ',');
18874
18875 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18876
18877 u32 iter_len = hash_pos - iter_pos;
18878
18879 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18880
18881 hash_pos++;
18882
18883 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18884
18885 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18886
18887 /**
18888 * salt
18889 */
18890
18891 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18892 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18893 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
18894 salt->salt_buf[3] = 0x00018000;
18895
18896 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18897 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18898 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18899 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18900
18901 salt->salt_len = salt_len / 2;
18902
18903 salt->salt_iter = atoi (iter_pos) - 1;
18904
18905 /**
18906 * digest buf
18907 */
18908
18909 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18910 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18911 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18912 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18913 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18914 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18915 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
18916 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
18917
18918 return (PARSER_OK);
18919 }
18920
18921 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18922 {
18923 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
18924
18925 u32 *digest = (u32 *) hash_buf->digest;
18926
18927 salt_t *salt = hash_buf->salt;
18928
18929 /**
18930 * parse line
18931 */
18932
18933 char *hash_pos = input_buf + 64;
18934 char *salt1_pos = input_buf + 128;
18935 char *salt2_pos = input_buf;
18936
18937 /**
18938 * salt
18939 */
18940
18941 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
18942 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
18943 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
18944 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
18945
18946 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
18947 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
18948 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
18949 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
18950
18951 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
18952 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
18953 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
18954 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
18955
18956 salt->salt_len = 48;
18957
18958 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
18959
18960 /**
18961 * digest buf
18962 */
18963
18964 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18965 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18966 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18967 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18968 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18969 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18970 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
18971 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
18972
18973 return (PARSER_OK);
18974 }
18975
18976 /**
18977 * parallel running threads
18978 */
18979
18980 #ifdef WIN
18981
18982 BOOL WINAPI sigHandler_default (DWORD sig)
18983 {
18984 switch (sig)
18985 {
18986 case CTRL_CLOSE_EVENT:
18987
18988 /*
18989 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18990 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18991 * function otherwise it is too late (e.g. after returning from this function)
18992 */
18993
18994 myabort ();
18995
18996 SetConsoleCtrlHandler (NULL, TRUE);
18997
18998 hc_sleep (10);
18999
19000 return TRUE;
19001
19002 case CTRL_C_EVENT:
19003 case CTRL_LOGOFF_EVENT:
19004 case CTRL_SHUTDOWN_EVENT:
19005
19006 myabort ();
19007
19008 SetConsoleCtrlHandler (NULL, TRUE);
19009
19010 return TRUE;
19011 }
19012
19013 return FALSE;
19014 }
19015
19016 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19017 {
19018 switch (sig)
19019 {
19020 case CTRL_CLOSE_EVENT:
19021
19022 myabort ();
19023
19024 SetConsoleCtrlHandler (NULL, TRUE);
19025
19026 hc_sleep (10);
19027
19028 return TRUE;
19029
19030 case CTRL_C_EVENT:
19031 case CTRL_LOGOFF_EVENT:
19032 case CTRL_SHUTDOWN_EVENT:
19033
19034 myquit ();
19035
19036 SetConsoleCtrlHandler (NULL, TRUE);
19037
19038 return TRUE;
19039 }
19040
19041 return FALSE;
19042 }
19043
19044 void hc_signal (BOOL WINAPI (callback) (DWORD))
19045 {
19046 if (callback == NULL)
19047 {
19048 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19049 }
19050 else
19051 {
19052 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19053 }
19054 }
19055
19056 #else
19057
19058 void sigHandler_default (int sig)
19059 {
19060 myabort ();
19061
19062 signal (sig, NULL);
19063 }
19064
19065 void sigHandler_benchmark (int sig)
19066 {
19067 myquit ();
19068
19069 signal (sig, NULL);
19070 }
19071
19072 void hc_signal (void (callback) (int))
19073 {
19074 if (callback == NULL) callback = SIG_DFL;
19075
19076 signal (SIGINT, callback);
19077 signal (SIGTERM, callback);
19078 signal (SIGABRT, callback);
19079 }
19080
19081 #endif
19082
19083 void status_display ();
19084
19085 void *thread_keypress (void *p)
19086 {
19087 int benchmark = *((int *) p);
19088
19089 uint quiet = data.quiet;
19090
19091 tty_break();
19092
19093 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19094 {
19095 int ch = tty_getchar();
19096
19097 if (ch == -1) break;
19098
19099 if (ch == 0) continue;
19100
19101 #ifdef _POSIX
19102 if (ch != '\n')
19103 #endif
19104
19105 hc_thread_mutex_lock (mux_display);
19106
19107 log_info ("");
19108
19109 switch (ch)
19110 {
19111 case 's':
19112 case '\n':
19113
19114 log_info ("");
19115
19116 status_display ();
19117
19118 log_info ("");
19119
19120 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19121 if (quiet == 0) fflush (stdout);
19122
19123 break;
19124
19125 case 'b':
19126
19127 log_info ("");
19128
19129 bypass ();
19130
19131 log_info ("");
19132
19133 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19134 if (quiet == 0) fflush (stdout);
19135
19136 break;
19137
19138 case 'p':
19139
19140 log_info ("");
19141
19142 SuspendThreads ();
19143
19144 log_info ("");
19145
19146 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19147 if (quiet == 0) fflush (stdout);
19148
19149 break;
19150
19151 case 'r':
19152
19153 log_info ("");
19154
19155 ResumeThreads ();
19156
19157 log_info ("");
19158
19159 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19160 if (quiet == 0) fflush (stdout);
19161
19162 break;
19163
19164 case 'c':
19165
19166 log_info ("");
19167
19168 if (benchmark == 1) break;
19169
19170 stop_at_checkpoint ();
19171
19172 log_info ("");
19173
19174 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19175 if (quiet == 0) fflush (stdout);
19176
19177 break;
19178
19179 case 'q':
19180
19181 log_info ("");
19182
19183 if (benchmark == 1)
19184 {
19185 myquit ();
19186 }
19187 else
19188 {
19189 myabort ();
19190 }
19191
19192 break;
19193 }
19194
19195 hc_thread_mutex_unlock (mux_display);
19196 }
19197
19198 tty_fix();
19199
19200 return (p);
19201 }
19202
19203 /**
19204 * rules common
19205 */
19206
19207 bool class_num (const u8 c)
19208 {
19209 return ((c >= '0') && (c <= '9'));
19210 }
19211
19212 bool class_lower (const u8 c)
19213 {
19214 return ((c >= 'a') && (c <= 'z'));
19215 }
19216
19217 bool class_upper (const u8 c)
19218 {
19219 return ((c >= 'A') && (c <= 'Z'));
19220 }
19221
19222 bool class_alpha (const u8 c)
19223 {
19224 return (class_lower (c) || class_upper (c));
19225 }
19226
19227 int conv_ctoi (const u8 c)
19228 {
19229 if (class_num (c))
19230 {
19231 return c - '0';
19232 }
19233 else if (class_upper (c))
19234 {
19235 return c - 'A' + 10;
19236 }
19237
19238 return -1;
19239 }
19240
19241 int conv_itoc (const u8 c)
19242 {
19243 if (c < 10)
19244 {
19245 return c + '0';
19246 }
19247 else if (c < 37)
19248 {
19249 return c + 'A' - 10;
19250 }
19251
19252 return -1;
19253 }
19254
19255 /**
19256 * device rules
19257 */
19258
19259 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19260 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19261 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19262 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19263 #define MAX_KERNEL_RULES 255
19264 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19265 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19266 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19267
19268 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19269 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19270 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19271 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19272
19273 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19274 {
19275 uint rule_pos;
19276 uint rule_cnt;
19277
19278 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19279 {
19280 switch (rule_buf[rule_pos])
19281 {
19282 case ' ':
19283 rule_cnt--;
19284 break;
19285
19286 case RULE_OP_MANGLE_NOOP:
19287 SET_NAME (rule, rule_buf[rule_pos]);
19288 break;
19289
19290 case RULE_OP_MANGLE_LREST:
19291 SET_NAME (rule, rule_buf[rule_pos]);
19292 break;
19293
19294 case RULE_OP_MANGLE_UREST:
19295 SET_NAME (rule, rule_buf[rule_pos]);
19296 break;
19297
19298 case RULE_OP_MANGLE_LREST_UFIRST:
19299 SET_NAME (rule, rule_buf[rule_pos]);
19300 break;
19301
19302 case RULE_OP_MANGLE_UREST_LFIRST:
19303 SET_NAME (rule, rule_buf[rule_pos]);
19304 break;
19305
19306 case RULE_OP_MANGLE_TREST:
19307 SET_NAME (rule, rule_buf[rule_pos]);
19308 break;
19309
19310 case RULE_OP_MANGLE_TOGGLE_AT:
19311 SET_NAME (rule, rule_buf[rule_pos]);
19312 SET_P0_CONV (rule, rule_buf[rule_pos]);
19313 break;
19314
19315 case RULE_OP_MANGLE_REVERSE:
19316 SET_NAME (rule, rule_buf[rule_pos]);
19317 break;
19318
19319 case RULE_OP_MANGLE_DUPEWORD:
19320 SET_NAME (rule, rule_buf[rule_pos]);
19321 break;
19322
19323 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19324 SET_NAME (rule, rule_buf[rule_pos]);
19325 SET_P0_CONV (rule, rule_buf[rule_pos]);
19326 break;
19327
19328 case RULE_OP_MANGLE_REFLECT:
19329 SET_NAME (rule, rule_buf[rule_pos]);
19330 break;
19331
19332 case RULE_OP_MANGLE_ROTATE_LEFT:
19333 SET_NAME (rule, rule_buf[rule_pos]);
19334 break;
19335
19336 case RULE_OP_MANGLE_ROTATE_RIGHT:
19337 SET_NAME (rule, rule_buf[rule_pos]);
19338 break;
19339
19340 case RULE_OP_MANGLE_APPEND:
19341 SET_NAME (rule, rule_buf[rule_pos]);
19342 SET_P0 (rule, rule_buf[rule_pos]);
19343 break;
19344
19345 case RULE_OP_MANGLE_PREPEND:
19346 SET_NAME (rule, rule_buf[rule_pos]);
19347 SET_P0 (rule, rule_buf[rule_pos]);
19348 break;
19349
19350 case RULE_OP_MANGLE_DELETE_FIRST:
19351 SET_NAME (rule, rule_buf[rule_pos]);
19352 break;
19353
19354 case RULE_OP_MANGLE_DELETE_LAST:
19355 SET_NAME (rule, rule_buf[rule_pos]);
19356 break;
19357
19358 case RULE_OP_MANGLE_DELETE_AT:
19359 SET_NAME (rule, rule_buf[rule_pos]);
19360 SET_P0_CONV (rule, rule_buf[rule_pos]);
19361 break;
19362
19363 case RULE_OP_MANGLE_EXTRACT:
19364 SET_NAME (rule, rule_buf[rule_pos]);
19365 SET_P0_CONV (rule, rule_buf[rule_pos]);
19366 SET_P1_CONV (rule, rule_buf[rule_pos]);
19367 break;
19368
19369 case RULE_OP_MANGLE_OMIT:
19370 SET_NAME (rule, rule_buf[rule_pos]);
19371 SET_P0_CONV (rule, rule_buf[rule_pos]);
19372 SET_P1_CONV (rule, rule_buf[rule_pos]);
19373 break;
19374
19375 case RULE_OP_MANGLE_INSERT:
19376 SET_NAME (rule, rule_buf[rule_pos]);
19377 SET_P0_CONV (rule, rule_buf[rule_pos]);
19378 SET_P1 (rule, rule_buf[rule_pos]);
19379 break;
19380
19381 case RULE_OP_MANGLE_OVERSTRIKE:
19382 SET_NAME (rule, rule_buf[rule_pos]);
19383 SET_P0_CONV (rule, rule_buf[rule_pos]);
19384 SET_P1 (rule, rule_buf[rule_pos]);
19385 break;
19386
19387 case RULE_OP_MANGLE_TRUNCATE_AT:
19388 SET_NAME (rule, rule_buf[rule_pos]);
19389 SET_P0_CONV (rule, rule_buf[rule_pos]);
19390 break;
19391
19392 case RULE_OP_MANGLE_REPLACE:
19393 SET_NAME (rule, rule_buf[rule_pos]);
19394 SET_P0 (rule, rule_buf[rule_pos]);
19395 SET_P1 (rule, rule_buf[rule_pos]);
19396 break;
19397
19398 case RULE_OP_MANGLE_PURGECHAR:
19399 return (-1);
19400 break;
19401
19402 case RULE_OP_MANGLE_TOGGLECASE_REC:
19403 return (-1);
19404 break;
19405
19406 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19407 SET_NAME (rule, rule_buf[rule_pos]);
19408 SET_P0_CONV (rule, rule_buf[rule_pos]);
19409 break;
19410
19411 case RULE_OP_MANGLE_DUPECHAR_LAST:
19412 SET_NAME (rule, rule_buf[rule_pos]);
19413 SET_P0_CONV (rule, rule_buf[rule_pos]);
19414 break;
19415
19416 case RULE_OP_MANGLE_DUPECHAR_ALL:
19417 SET_NAME (rule, rule_buf[rule_pos]);
19418 break;
19419
19420 case RULE_OP_MANGLE_SWITCH_FIRST:
19421 SET_NAME (rule, rule_buf[rule_pos]);
19422 break;
19423
19424 case RULE_OP_MANGLE_SWITCH_LAST:
19425 SET_NAME (rule, rule_buf[rule_pos]);
19426 break;
19427
19428 case RULE_OP_MANGLE_SWITCH_AT:
19429 SET_NAME (rule, rule_buf[rule_pos]);
19430 SET_P0_CONV (rule, rule_buf[rule_pos]);
19431 SET_P1_CONV (rule, rule_buf[rule_pos]);
19432 break;
19433
19434 case RULE_OP_MANGLE_CHR_SHIFTL:
19435 SET_NAME (rule, rule_buf[rule_pos]);
19436 SET_P0_CONV (rule, rule_buf[rule_pos]);
19437 break;
19438
19439 case RULE_OP_MANGLE_CHR_SHIFTR:
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_CHR_INCR:
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_CHR_DECR:
19450 SET_NAME (rule, rule_buf[rule_pos]);
19451 SET_P0_CONV (rule, rule_buf[rule_pos]);
19452 break;
19453
19454 case RULE_OP_MANGLE_REPLACE_NP1:
19455 SET_NAME (rule, rule_buf[rule_pos]);
19456 SET_P0_CONV (rule, rule_buf[rule_pos]);
19457 break;
19458
19459 case RULE_OP_MANGLE_REPLACE_NM1:
19460 SET_NAME (rule, rule_buf[rule_pos]);
19461 SET_P0_CONV (rule, rule_buf[rule_pos]);
19462 break;
19463
19464 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19465 SET_NAME (rule, rule_buf[rule_pos]);
19466 SET_P0_CONV (rule, rule_buf[rule_pos]);
19467 break;
19468
19469 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19470 SET_NAME (rule, rule_buf[rule_pos]);
19471 SET_P0_CONV (rule, rule_buf[rule_pos]);
19472 break;
19473
19474 case RULE_OP_MANGLE_TITLE:
19475 SET_NAME (rule, rule_buf[rule_pos]);
19476 break;
19477
19478 default:
19479 return (-1);
19480 break;
19481 }
19482 }
19483
19484 if (rule_pos < rule_len) return (-1);
19485
19486 return (0);
19487 }
19488
19489 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19490 {
19491 uint rule_cnt;
19492 uint rule_pos;
19493 uint rule_len = BUFSIZ - 1; // maximum possible len
19494
19495 char rule_cmd;
19496
19497 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19498 {
19499 GET_NAME (rule);
19500
19501 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19502
19503 switch (rule_cmd)
19504 {
19505 case RULE_OP_MANGLE_NOOP:
19506 rule_buf[rule_pos] = rule_cmd;
19507 break;
19508
19509 case RULE_OP_MANGLE_LREST:
19510 rule_buf[rule_pos] = rule_cmd;
19511 break;
19512
19513 case RULE_OP_MANGLE_UREST:
19514 rule_buf[rule_pos] = rule_cmd;
19515 break;
19516
19517 case RULE_OP_MANGLE_LREST_UFIRST:
19518 rule_buf[rule_pos] = rule_cmd;
19519 break;
19520
19521 case RULE_OP_MANGLE_UREST_LFIRST:
19522 rule_buf[rule_pos] = rule_cmd;
19523 break;
19524
19525 case RULE_OP_MANGLE_TREST:
19526 rule_buf[rule_pos] = rule_cmd;
19527 break;
19528
19529 case RULE_OP_MANGLE_TOGGLE_AT:
19530 rule_buf[rule_pos] = rule_cmd;
19531 GET_P0_CONV (rule);
19532 break;
19533
19534 case RULE_OP_MANGLE_REVERSE:
19535 rule_buf[rule_pos] = rule_cmd;
19536 break;
19537
19538 case RULE_OP_MANGLE_DUPEWORD:
19539 rule_buf[rule_pos] = rule_cmd;
19540 break;
19541
19542 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19543 rule_buf[rule_pos] = rule_cmd;
19544 GET_P0_CONV (rule);
19545 break;
19546
19547 case RULE_OP_MANGLE_REFLECT:
19548 rule_buf[rule_pos] = rule_cmd;
19549 break;
19550
19551 case RULE_OP_MANGLE_ROTATE_LEFT:
19552 rule_buf[rule_pos] = rule_cmd;
19553 break;
19554
19555 case RULE_OP_MANGLE_ROTATE_RIGHT:
19556 rule_buf[rule_pos] = rule_cmd;
19557 break;
19558
19559 case RULE_OP_MANGLE_APPEND:
19560 rule_buf[rule_pos] = rule_cmd;
19561 GET_P0 (rule);
19562 break;
19563
19564 case RULE_OP_MANGLE_PREPEND:
19565 rule_buf[rule_pos] = rule_cmd;
19566 GET_P0 (rule);
19567 break;
19568
19569 case RULE_OP_MANGLE_DELETE_FIRST:
19570 rule_buf[rule_pos] = rule_cmd;
19571 break;
19572
19573 case RULE_OP_MANGLE_DELETE_LAST:
19574 rule_buf[rule_pos] = rule_cmd;
19575 break;
19576
19577 case RULE_OP_MANGLE_DELETE_AT:
19578 rule_buf[rule_pos] = rule_cmd;
19579 GET_P0_CONV (rule);
19580 break;
19581
19582 case RULE_OP_MANGLE_EXTRACT:
19583 rule_buf[rule_pos] = rule_cmd;
19584 GET_P0_CONV (rule);
19585 GET_P1_CONV (rule);
19586 break;
19587
19588 case RULE_OP_MANGLE_OMIT:
19589 rule_buf[rule_pos] = rule_cmd;
19590 GET_P0_CONV (rule);
19591 GET_P1_CONV (rule);
19592 break;
19593
19594 case RULE_OP_MANGLE_INSERT:
19595 rule_buf[rule_pos] = rule_cmd;
19596 GET_P0_CONV (rule);
19597 GET_P1 (rule);
19598 break;
19599
19600 case RULE_OP_MANGLE_OVERSTRIKE:
19601 rule_buf[rule_pos] = rule_cmd;
19602 GET_P0_CONV (rule);
19603 GET_P1 (rule);
19604 break;
19605
19606 case RULE_OP_MANGLE_TRUNCATE_AT:
19607 rule_buf[rule_pos] = rule_cmd;
19608 GET_P0_CONV (rule);
19609 break;
19610
19611 case RULE_OP_MANGLE_REPLACE:
19612 rule_buf[rule_pos] = rule_cmd;
19613 GET_P0 (rule);
19614 GET_P1 (rule);
19615 break;
19616
19617 case RULE_OP_MANGLE_PURGECHAR:
19618 return (-1);
19619 break;
19620
19621 case RULE_OP_MANGLE_TOGGLECASE_REC:
19622 return (-1);
19623 break;
19624
19625 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19626 rule_buf[rule_pos] = rule_cmd;
19627 GET_P0_CONV (rule);
19628 break;
19629
19630 case RULE_OP_MANGLE_DUPECHAR_LAST:
19631 rule_buf[rule_pos] = rule_cmd;
19632 GET_P0_CONV (rule);
19633 break;
19634
19635 case RULE_OP_MANGLE_DUPECHAR_ALL:
19636 rule_buf[rule_pos] = rule_cmd;
19637 break;
19638
19639 case RULE_OP_MANGLE_SWITCH_FIRST:
19640 rule_buf[rule_pos] = rule_cmd;
19641 break;
19642
19643 case RULE_OP_MANGLE_SWITCH_LAST:
19644 rule_buf[rule_pos] = rule_cmd;
19645 break;
19646
19647 case RULE_OP_MANGLE_SWITCH_AT:
19648 rule_buf[rule_pos] = rule_cmd;
19649 GET_P0_CONV (rule);
19650 GET_P1_CONV (rule);
19651 break;
19652
19653 case RULE_OP_MANGLE_CHR_SHIFTL:
19654 rule_buf[rule_pos] = rule_cmd;
19655 GET_P0_CONV (rule);
19656 break;
19657
19658 case RULE_OP_MANGLE_CHR_SHIFTR:
19659 rule_buf[rule_pos] = rule_cmd;
19660 GET_P0_CONV (rule);
19661 break;
19662
19663 case RULE_OP_MANGLE_CHR_INCR:
19664 rule_buf[rule_pos] = rule_cmd;
19665 GET_P0_CONV (rule);
19666 break;
19667
19668 case RULE_OP_MANGLE_CHR_DECR:
19669 rule_buf[rule_pos] = rule_cmd;
19670 GET_P0_CONV (rule);
19671 break;
19672
19673 case RULE_OP_MANGLE_REPLACE_NP1:
19674 rule_buf[rule_pos] = rule_cmd;
19675 GET_P0_CONV (rule);
19676 break;
19677
19678 case RULE_OP_MANGLE_REPLACE_NM1:
19679 rule_buf[rule_pos] = rule_cmd;
19680 GET_P0_CONV (rule);
19681 break;
19682
19683 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19684 rule_buf[rule_pos] = rule_cmd;
19685 GET_P0_CONV (rule);
19686 break;
19687
19688 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19689 rule_buf[rule_pos] = rule_cmd;
19690 GET_P0_CONV (rule);
19691 break;
19692
19693 case RULE_OP_MANGLE_TITLE:
19694 rule_buf[rule_pos] = rule_cmd;
19695 break;
19696
19697 case 0:
19698 return rule_pos - 1;
19699 break;
19700
19701 default:
19702 return (-1);
19703 break;
19704 }
19705 }
19706
19707 if (rule_cnt > 0)
19708 {
19709 return rule_pos;
19710 }
19711
19712 return (-1);
19713 }
19714
19715 /**
19716 * CPU rules : this is from hashcat sources, cpu based rules
19717 */
19718
19719 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19720 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19721
19722 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19723 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19724 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19725
19726 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19727 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19728 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19729
19730 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19731 {
19732 int pos;
19733
19734 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19735
19736 return (arr_len);
19737 }
19738
19739 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19740 {
19741 int pos;
19742
19743 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19744
19745 return (arr_len);
19746 }
19747
19748 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19749 {
19750 int pos;
19751
19752 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19753
19754 return (arr_len);
19755 }
19756
19757 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19758 {
19759 int l;
19760 int r;
19761
19762 for (l = 0; l < arr_len; l++)
19763 {
19764 r = arr_len - 1 - l;
19765
19766 if (l >= r) break;
19767
19768 MANGLE_SWITCH (arr, l, r);
19769 }
19770
19771 return (arr_len);
19772 }
19773
19774 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19775 {
19776 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19777
19778 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19779
19780 return (arr_len * 2);
19781 }
19782
19783 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19784 {
19785 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19786
19787 int orig_len = arr_len;
19788
19789 int i;
19790
19791 for (i = 0; i < times; i++)
19792 {
19793 memcpy (&arr[arr_len], arr, orig_len);
19794
19795 arr_len += orig_len;
19796 }
19797
19798 return (arr_len);
19799 }
19800
19801 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19802 {
19803 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19804
19805 mangle_double (arr, arr_len);
19806
19807 mangle_reverse (arr + arr_len, arr_len);
19808
19809 return (arr_len * 2);
19810 }
19811
19812 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19813 {
19814 int l;
19815 int r;
19816
19817 for (l = 0, r = arr_len - 1; r > 0; r--)
19818 {
19819 MANGLE_SWITCH (arr, l, r);
19820 }
19821
19822 return (arr_len);
19823 }
19824
19825 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19826 {
19827 int l;
19828 int r;
19829
19830 for (l = 0, r = arr_len - 1; l < r; l++)
19831 {
19832 MANGLE_SWITCH (arr, l, r);
19833 }
19834
19835 return (arr_len);
19836 }
19837
19838 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19839 {
19840 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19841
19842 arr[arr_len] = c;
19843
19844 return (arr_len + 1);
19845 }
19846
19847 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19848 {
19849 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19850
19851 int arr_pos;
19852
19853 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19854 {
19855 arr[arr_pos + 1] = arr[arr_pos];
19856 }
19857
19858 arr[0] = c;
19859
19860 return (arr_len + 1);
19861 }
19862
19863 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19864 {
19865 if (upos >= arr_len) return (arr_len);
19866
19867 int arr_pos;
19868
19869 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19870 {
19871 arr[arr_pos] = arr[arr_pos + 1];
19872 }
19873
19874 return (arr_len - 1);
19875 }
19876
19877 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19878 {
19879 if (upos >= arr_len) return (arr_len);
19880
19881 if ((upos + ulen) > arr_len) return (arr_len);
19882
19883 int arr_pos;
19884
19885 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19886 {
19887 arr[arr_pos] = arr[upos + arr_pos];
19888 }
19889
19890 return (ulen);
19891 }
19892
19893 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19894 {
19895 if (upos >= arr_len) return (arr_len);
19896
19897 if ((upos + ulen) >= arr_len) return (arr_len);
19898
19899 int arr_pos;
19900
19901 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19902 {
19903 arr[arr_pos] = arr[arr_pos + ulen];
19904 }
19905
19906 return (arr_len - ulen);
19907 }
19908
19909 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19910 {
19911 if (upos >= arr_len) return (arr_len);
19912
19913 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19914
19915 int arr_pos;
19916
19917 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19918 {
19919 arr[arr_pos + 1] = arr[arr_pos];
19920 }
19921
19922 arr[upos] = c;
19923
19924 return (arr_len + 1);
19925 }
19926
19927 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)
19928 {
19929 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19930
19931 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19932
19933 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19934
19935 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19936
19937 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19938
19939 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19940
19941 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19942
19943 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19944
19945 return (arr_len + arr2_cpy);
19946 }
19947
19948 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19949 {
19950 if (upos >= arr_len) return (arr_len);
19951
19952 arr[upos] = c;
19953
19954 return (arr_len);
19955 }
19956
19957 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19958 {
19959 if (upos >= arr_len) return (arr_len);
19960
19961 memset (arr + upos, 0, arr_len - upos);
19962
19963 return (upos);
19964 }
19965
19966 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19967 {
19968 int arr_pos;
19969
19970 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19971 {
19972 if (arr[arr_pos] != oldc) continue;
19973
19974 arr[arr_pos] = newc;
19975 }
19976
19977 return (arr_len);
19978 }
19979
19980 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19981 {
19982 int arr_pos;
19983
19984 int ret_len;
19985
19986 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19987 {
19988 if (arr[arr_pos] == c) continue;
19989
19990 arr[ret_len] = arr[arr_pos];
19991
19992 ret_len++;
19993 }
19994
19995 return (ret_len);
19996 }
19997
19998 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19999 {
20000 if (ulen > arr_len) return (arr_len);
20001
20002 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20003
20004 char cs[100] = { 0 };
20005
20006 memcpy (cs, arr, ulen);
20007
20008 int i;
20009
20010 for (i = 0; i < ulen; i++)
20011 {
20012 char c = cs[i];
20013
20014 arr_len = mangle_insert (arr, arr_len, i, c);
20015 }
20016
20017 return (arr_len);
20018 }
20019
20020 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20021 {
20022 if (ulen > arr_len) return (arr_len);
20023
20024 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20025
20026 int upos = arr_len - ulen;
20027
20028 int i;
20029
20030 for (i = 0; i < ulen; i++)
20031 {
20032 char c = arr[upos + i];
20033
20034 arr_len = mangle_append (arr, arr_len, c);
20035 }
20036
20037 return (arr_len);
20038 }
20039
20040 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20041 {
20042 if ( arr_len == 0) return (arr_len);
20043 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20044
20045 char c = arr[upos];
20046
20047 int i;
20048
20049 for (i = 0; i < ulen; i++)
20050 {
20051 arr_len = mangle_insert (arr, arr_len, upos, c);
20052 }
20053
20054 return (arr_len);
20055 }
20056
20057 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20058 {
20059 if ( arr_len == 0) return (arr_len);
20060 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20061
20062 int arr_pos;
20063
20064 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20065 {
20066 int new_pos = arr_pos * 2;
20067
20068 arr[new_pos] = arr[arr_pos];
20069
20070 arr[new_pos + 1] = arr[arr_pos];
20071 }
20072
20073 return (arr_len * 2);
20074 }
20075
20076 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20077 {
20078 if (upos >= arr_len) return (arr_len);
20079 if (upos2 >= arr_len) return (arr_len);
20080
20081 MANGLE_SWITCH (arr, upos, upos2);
20082
20083 return (arr_len);
20084 }
20085
20086 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20087 {
20088 MANGLE_SWITCH (arr, upos, upos2);
20089
20090 return (arr_len);
20091 }
20092
20093 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20094 {
20095 if (upos >= arr_len) return (arr_len);
20096
20097 arr[upos] <<= 1;
20098
20099 return (arr_len);
20100 }
20101
20102 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20103 {
20104 if (upos >= arr_len) return (arr_len);
20105
20106 arr[upos] >>= 1;
20107
20108 return (arr_len);
20109 }
20110
20111 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20112 {
20113 if (upos >= arr_len) return (arr_len);
20114
20115 arr[upos] += 1;
20116
20117 return (arr_len);
20118 }
20119
20120 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20121 {
20122 if (upos >= arr_len) return (arr_len);
20123
20124 arr[upos] -= 1;
20125
20126 return (arr_len);
20127 }
20128
20129 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20130 {
20131 int upper_next = 1;
20132
20133 int pos;
20134
20135 for (pos = 0; pos < arr_len; pos++)
20136 {
20137 if (arr[pos] == ' ')
20138 {
20139 upper_next = 1;
20140
20141 continue;
20142 }
20143
20144 if (upper_next)
20145 {
20146 upper_next = 0;
20147
20148 MANGLE_UPPER_AT (arr, pos);
20149 }
20150 else
20151 {
20152 MANGLE_LOWER_AT (arr, pos);
20153 }
20154 }
20155
20156 return (arr_len);
20157 }
20158
20159 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20160 {
20161 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20162
20163 u32 j;
20164
20165 u32 rule_pos = 0;
20166
20167 for (j = 0; j < rp_gen_num; j++)
20168 {
20169 u32 r = 0;
20170 u32 p1 = 0;
20171 u32 p2 = 0;
20172 u32 p3 = 0;
20173
20174 switch ((char) get_random_num (0, 9))
20175 {
20176 case 0:
20177 r = get_random_num (0, sizeof (grp_op_nop));
20178 rule_buf[rule_pos++] = grp_op_nop[r];
20179 break;
20180
20181 case 1:
20182 r = get_random_num (0, sizeof (grp_op_pos_p0));
20183 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20184 p1 = get_random_num (0, sizeof (grp_pos));
20185 rule_buf[rule_pos++] = grp_pos[p1];
20186 break;
20187
20188 case 2:
20189 r = get_random_num (0, sizeof (grp_op_pos_p1));
20190 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20191 p1 = get_random_num (1, 6);
20192 rule_buf[rule_pos++] = grp_pos[p1];
20193 break;
20194
20195 case 3:
20196 r = get_random_num (0, sizeof (grp_op_chr));
20197 rule_buf[rule_pos++] = grp_op_chr[r];
20198 p1 = get_random_num (0x20, 0x7e);
20199 rule_buf[rule_pos++] = (char) p1;
20200 break;
20201
20202 case 4:
20203 r = get_random_num (0, sizeof (grp_op_chr_chr));
20204 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20205 p1 = get_random_num (0x20, 0x7e);
20206 rule_buf[rule_pos++] = (char) p1;
20207 p2 = get_random_num (0x20, 0x7e);
20208 while (p1 == p2)
20209 p2 = get_random_num (0x20, 0x7e);
20210 rule_buf[rule_pos++] = (char) p2;
20211 break;
20212
20213 case 5:
20214 r = get_random_num (0, sizeof (grp_op_pos_chr));
20215 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20216 p1 = get_random_num (0, sizeof (grp_pos));
20217 rule_buf[rule_pos++] = grp_pos[p1];
20218 p2 = get_random_num (0x20, 0x7e);
20219 rule_buf[rule_pos++] = (char) p2;
20220 break;
20221
20222 case 6:
20223 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20224 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20225 p1 = get_random_num (0, sizeof (grp_pos));
20226 rule_buf[rule_pos++] = grp_pos[p1];
20227 p2 = get_random_num (0, sizeof (grp_pos));
20228 while (p1 == p2)
20229 p2 = get_random_num (0, sizeof (grp_pos));
20230 rule_buf[rule_pos++] = grp_pos[p2];
20231 break;
20232
20233 case 7:
20234 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20235 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20236 p1 = get_random_num (0, sizeof (grp_pos));
20237 rule_buf[rule_pos++] = grp_pos[p1];
20238 p2 = get_random_num (1, sizeof (grp_pos));
20239 while (p1 == p2)
20240 p2 = get_random_num (1, sizeof (grp_pos));
20241 rule_buf[rule_pos++] = grp_pos[p2];
20242 break;
20243
20244 case 8:
20245 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20246 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20247 p1 = get_random_num (0, sizeof (grp_pos));
20248 rule_buf[rule_pos++] = grp_pos[p1];
20249 p2 = get_random_num (1, sizeof (grp_pos));
20250 rule_buf[rule_pos++] = grp_pos[p1];
20251 p3 = get_random_num (0, sizeof (grp_pos));
20252 rule_buf[rule_pos++] = grp_pos[p3];
20253 break;
20254 }
20255 }
20256
20257 return (rule_pos);
20258 }
20259
20260 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20261 {
20262 char mem[BLOCK_SIZE] = { 0 };
20263
20264 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20265
20266 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20267
20268 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20269
20270 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20271
20272 int out_len = in_len;
20273 int mem_len = in_len;
20274
20275 memcpy (out, in, out_len);
20276
20277 int rule_pos;
20278
20279 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20280 {
20281 int upos, upos2;
20282 int ulen;
20283
20284 switch (rule[rule_pos])
20285 {
20286 case ' ':
20287 break;
20288
20289 case RULE_OP_MANGLE_NOOP:
20290 break;
20291
20292 case RULE_OP_MANGLE_LREST:
20293 out_len = mangle_lrest (out, out_len);
20294 break;
20295
20296 case RULE_OP_MANGLE_UREST:
20297 out_len = mangle_urest (out, out_len);
20298 break;
20299
20300 case RULE_OP_MANGLE_LREST_UFIRST:
20301 out_len = mangle_lrest (out, out_len);
20302 if (out_len) MANGLE_UPPER_AT (out, 0);
20303 break;
20304
20305 case RULE_OP_MANGLE_UREST_LFIRST:
20306 out_len = mangle_urest (out, out_len);
20307 if (out_len) MANGLE_LOWER_AT (out, 0);
20308 break;
20309
20310 case RULE_OP_MANGLE_TREST:
20311 out_len = mangle_trest (out, out_len);
20312 break;
20313
20314 case RULE_OP_MANGLE_TOGGLE_AT:
20315 NEXT_RULEPOS (rule_pos);
20316 NEXT_RPTOI (rule, rule_pos, upos);
20317 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20318 break;
20319
20320 case RULE_OP_MANGLE_REVERSE:
20321 out_len = mangle_reverse (out, out_len);
20322 break;
20323
20324 case RULE_OP_MANGLE_DUPEWORD:
20325 out_len = mangle_double (out, out_len);
20326 break;
20327
20328 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20329 NEXT_RULEPOS (rule_pos);
20330 NEXT_RPTOI (rule, rule_pos, ulen);
20331 out_len = mangle_double_times (out, out_len, ulen);
20332 break;
20333
20334 case RULE_OP_MANGLE_REFLECT:
20335 out_len = mangle_reflect (out, out_len);
20336 break;
20337
20338 case RULE_OP_MANGLE_ROTATE_LEFT:
20339 mangle_rotate_left (out, out_len);
20340 break;
20341
20342 case RULE_OP_MANGLE_ROTATE_RIGHT:
20343 mangle_rotate_right (out, out_len);
20344 break;
20345
20346 case RULE_OP_MANGLE_APPEND:
20347 NEXT_RULEPOS (rule_pos);
20348 out_len = mangle_append (out, out_len, rule[rule_pos]);
20349 break;
20350
20351 case RULE_OP_MANGLE_PREPEND:
20352 NEXT_RULEPOS (rule_pos);
20353 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20354 break;
20355
20356 case RULE_OP_MANGLE_DELETE_FIRST:
20357 out_len = mangle_delete_at (out, out_len, 0);
20358 break;
20359
20360 case RULE_OP_MANGLE_DELETE_LAST:
20361 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20362 break;
20363
20364 case RULE_OP_MANGLE_DELETE_AT:
20365 NEXT_RULEPOS (rule_pos);
20366 NEXT_RPTOI (rule, rule_pos, upos);
20367 out_len = mangle_delete_at (out, out_len, upos);
20368 break;
20369
20370 case RULE_OP_MANGLE_EXTRACT:
20371 NEXT_RULEPOS (rule_pos);
20372 NEXT_RPTOI (rule, rule_pos, upos);
20373 NEXT_RULEPOS (rule_pos);
20374 NEXT_RPTOI (rule, rule_pos, ulen);
20375 out_len = mangle_extract (out, out_len, upos, ulen);
20376 break;
20377
20378 case RULE_OP_MANGLE_OMIT:
20379 NEXT_RULEPOS (rule_pos);
20380 NEXT_RPTOI (rule, rule_pos, upos);
20381 NEXT_RULEPOS (rule_pos);
20382 NEXT_RPTOI (rule, rule_pos, ulen);
20383 out_len = mangle_omit (out, out_len, upos, ulen);
20384 break;
20385
20386 case RULE_OP_MANGLE_INSERT:
20387 NEXT_RULEPOS (rule_pos);
20388 NEXT_RPTOI (rule, rule_pos, upos);
20389 NEXT_RULEPOS (rule_pos);
20390 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20391 break;
20392
20393 case RULE_OP_MANGLE_OVERSTRIKE:
20394 NEXT_RULEPOS (rule_pos);
20395 NEXT_RPTOI (rule, rule_pos, upos);
20396 NEXT_RULEPOS (rule_pos);
20397 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20398 break;
20399
20400 case RULE_OP_MANGLE_TRUNCATE_AT:
20401 NEXT_RULEPOS (rule_pos);
20402 NEXT_RPTOI (rule, rule_pos, upos);
20403 out_len = mangle_truncate_at (out, out_len, upos);
20404 break;
20405
20406 case RULE_OP_MANGLE_REPLACE:
20407 NEXT_RULEPOS (rule_pos);
20408 NEXT_RULEPOS (rule_pos);
20409 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20410 break;
20411
20412 case RULE_OP_MANGLE_PURGECHAR:
20413 NEXT_RULEPOS (rule_pos);
20414 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20415 break;
20416
20417 case RULE_OP_MANGLE_TOGGLECASE_REC:
20418 /* todo */
20419 break;
20420
20421 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20422 NEXT_RULEPOS (rule_pos);
20423 NEXT_RPTOI (rule, rule_pos, ulen);
20424 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20425 break;
20426
20427 case RULE_OP_MANGLE_DUPECHAR_LAST:
20428 NEXT_RULEPOS (rule_pos);
20429 NEXT_RPTOI (rule, rule_pos, ulen);
20430 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20431 break;
20432
20433 case RULE_OP_MANGLE_DUPECHAR_ALL:
20434 out_len = mangle_dupechar (out, out_len);
20435 break;
20436
20437 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20438 NEXT_RULEPOS (rule_pos);
20439 NEXT_RPTOI (rule, rule_pos, ulen);
20440 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20441 break;
20442
20443 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20444 NEXT_RULEPOS (rule_pos);
20445 NEXT_RPTOI (rule, rule_pos, ulen);
20446 out_len = mangle_dupeblock_append (out, out_len, ulen);
20447 break;
20448
20449 case RULE_OP_MANGLE_SWITCH_FIRST:
20450 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20451 break;
20452
20453 case RULE_OP_MANGLE_SWITCH_LAST:
20454 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20455 break;
20456
20457 case RULE_OP_MANGLE_SWITCH_AT:
20458 NEXT_RULEPOS (rule_pos);
20459 NEXT_RPTOI (rule, rule_pos, upos);
20460 NEXT_RULEPOS (rule_pos);
20461 NEXT_RPTOI (rule, rule_pos, upos2);
20462 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20463 break;
20464
20465 case RULE_OP_MANGLE_CHR_SHIFTL:
20466 NEXT_RULEPOS (rule_pos);
20467 NEXT_RPTOI (rule, rule_pos, upos);
20468 mangle_chr_shiftl (out, out_len, upos);
20469 break;
20470
20471 case RULE_OP_MANGLE_CHR_SHIFTR:
20472 NEXT_RULEPOS (rule_pos);
20473 NEXT_RPTOI (rule, rule_pos, upos);
20474 mangle_chr_shiftr (out, out_len, upos);
20475 break;
20476
20477 case RULE_OP_MANGLE_CHR_INCR:
20478 NEXT_RULEPOS (rule_pos);
20479 NEXT_RPTOI (rule, rule_pos, upos);
20480 mangle_chr_incr (out, out_len, upos);
20481 break;
20482
20483 case RULE_OP_MANGLE_CHR_DECR:
20484 NEXT_RULEPOS (rule_pos);
20485 NEXT_RPTOI (rule, rule_pos, upos);
20486 mangle_chr_decr (out, out_len, upos);
20487 break;
20488
20489 case RULE_OP_MANGLE_REPLACE_NP1:
20490 NEXT_RULEPOS (rule_pos);
20491 NEXT_RPTOI (rule, rule_pos, upos);
20492 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20493 break;
20494
20495 case RULE_OP_MANGLE_REPLACE_NM1:
20496 NEXT_RULEPOS (rule_pos);
20497 NEXT_RPTOI (rule, rule_pos, upos);
20498 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20499 break;
20500
20501 case RULE_OP_MANGLE_TITLE:
20502 out_len = mangle_title (out, out_len);
20503 break;
20504
20505 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20506 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20507 NEXT_RULEPOS (rule_pos);
20508 NEXT_RPTOI (rule, rule_pos, upos);
20509 NEXT_RULEPOS (rule_pos);
20510 NEXT_RPTOI (rule, rule_pos, ulen);
20511 NEXT_RULEPOS (rule_pos);
20512 NEXT_RPTOI (rule, rule_pos, upos2);
20513 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20514 break;
20515
20516 case RULE_OP_MANGLE_APPEND_MEMORY:
20517 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20518 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20519 memcpy (out + out_len, mem, mem_len);
20520 out_len += mem_len;
20521 break;
20522
20523 case RULE_OP_MANGLE_PREPEND_MEMORY:
20524 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20525 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20526 memcpy (mem + mem_len, out, out_len);
20527 out_len += mem_len;
20528 memcpy (out, mem, out_len);
20529 break;
20530
20531 case RULE_OP_MEMORIZE_WORD:
20532 memcpy (mem, out, out_len);
20533 mem_len = out_len;
20534 break;
20535
20536 case RULE_OP_REJECT_LESS:
20537 NEXT_RULEPOS (rule_pos);
20538 NEXT_RPTOI (rule, rule_pos, upos);
20539 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20540 break;
20541
20542 case RULE_OP_REJECT_GREATER:
20543 NEXT_RULEPOS (rule_pos);
20544 NEXT_RPTOI (rule, rule_pos, upos);
20545 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20546 break;
20547
20548 case RULE_OP_REJECT_CONTAIN:
20549 NEXT_RULEPOS (rule_pos);
20550 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20551 break;
20552
20553 case RULE_OP_REJECT_NOT_CONTAIN:
20554 NEXT_RULEPOS (rule_pos);
20555 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20556 break;
20557
20558 case RULE_OP_REJECT_EQUAL_FIRST:
20559 NEXT_RULEPOS (rule_pos);
20560 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20561 break;
20562
20563 case RULE_OP_REJECT_EQUAL_LAST:
20564 NEXT_RULEPOS (rule_pos);
20565 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20566 break;
20567
20568 case RULE_OP_REJECT_EQUAL_AT:
20569 NEXT_RULEPOS (rule_pos);
20570 NEXT_RPTOI (rule, rule_pos, upos);
20571 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20572 NEXT_RULEPOS (rule_pos);
20573 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20574 break;
20575
20576 case RULE_OP_REJECT_CONTAINS:
20577 NEXT_RULEPOS (rule_pos);
20578 NEXT_RPTOI (rule, rule_pos, upos);
20579 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20580 NEXT_RULEPOS (rule_pos);
20581 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20582 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20583 break;
20584
20585 case RULE_OP_REJECT_MEMORY:
20586 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20587 break;
20588
20589 default:
20590 return (RULE_RC_SYNTAX_ERROR);
20591 break;
20592 }
20593 }
20594
20595 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20596
20597 return (out_len);
20598 }