Merge pull request #151 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];
101
102 int max_len = (int) sizeof (s);
103
104 int len = vsnprintf (s, max_len, fmt, ap);
105
106 if (len > max_len) len = max_len;
107
108 fwrite (s, len, 1, fp);
109
110 fflush (fp);
111
112 last_len = len;
113 }
114
115 void log_out_nn (FILE *fp, const char *fmt, ...)
116 {
117 if (SUPPRESS_OUTPUT) return;
118
119 va_list ap;
120
121 va_start (ap, fmt);
122
123 log_final (fp, fmt, ap);
124
125 va_end (ap);
126 }
127
128 void log_info_nn (const char *fmt, ...)
129 {
130 if (SUPPRESS_OUTPUT) return;
131
132 va_list ap;
133
134 va_start (ap, fmt);
135
136 log_final (stdout, fmt, ap);
137
138 va_end (ap);
139 }
140
141 void log_error_nn (const char *fmt, ...)
142 {
143 if (SUPPRESS_OUTPUT) return;
144
145 va_list ap;
146
147 va_start (ap, fmt);
148
149 log_final (stderr, fmt, ap);
150
151 va_end (ap);
152 }
153
154 void log_out (FILE *fp, const char *fmt, ...)
155 {
156 if (SUPPRESS_OUTPUT) return;
157
158 va_list ap;
159
160 va_start (ap, fmt);
161
162 log_final (fp, fmt, ap);
163
164 va_end (ap);
165
166 fputc ('\n', fp);
167
168 last_len = 0;
169 }
170
171 void log_info (const char *fmt, ...)
172 {
173 if (SUPPRESS_OUTPUT) return;
174
175 va_list ap;
176
177 va_start (ap, fmt);
178
179 log_final (stdout, fmt, ap);
180
181 va_end (ap);
182
183 fputc ('\n', stdout);
184
185 last_len = 0;
186 }
187
188 void log_error (const char *fmt, ...)
189 {
190 if (SUPPRESS_OUTPUT) return;
191
192 fputc ('\n', stderr);
193 fputc ('\n', stderr);
194
195 va_list ap;
196
197 va_start (ap, fmt);
198
199 log_final (stderr, fmt, ap);
200
201 va_end (ap);
202
203 fputc ('\n', stderr);
204 fputc ('\n', stderr);
205
206 last_len = 0;
207 }
208
209 /**
210 * converter
211 */
212
213 u8 int_to_base32 (const u8 c)
214 {
215 static const u8 tbl[0x20] =
216 {
217 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
218 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
219 };
220
221 return tbl[c];
222 }
223
224 u8 base32_to_int (const u8 c)
225 {
226 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
227 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
228
229 return 0;
230 }
231
232 u8 int_to_itoa32 (const u8 c)
233 {
234 static const u8 tbl[0x20] =
235 {
236 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
237 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
238 };
239
240 return tbl[c];
241 }
242
243 u8 itoa32_to_int (const u8 c)
244 {
245 if ((c >= '0') && (c <= '9')) return c - '0';
246 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
247
248 return 0;
249 }
250
251 u8 int_to_itoa64 (const u8 c)
252 {
253 static const u8 tbl[0x40] =
254 {
255 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
256 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
257 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
258 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
259 };
260
261 return tbl[c];
262 }
263
264 u8 itoa64_to_int (const u8 c)
265 {
266 static const u8 tbl[0x100] =
267 {
268 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
269 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
270 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
271 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
272 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
273 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
274 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
275 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
276 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
277 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
278 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
279 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
280 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
281 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
282 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
283 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
284 };
285
286 return tbl[c];
287 }
288
289 u8 int_to_base64 (const u8 c)
290 {
291 static const u8 tbl[0x40] =
292 {
293 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
294 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
295 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
296 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
297 };
298
299 return tbl[c];
300 }
301
302 u8 base64_to_int (const u8 c)
303 {
304 static const u8 tbl[0x100] =
305 {
306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
309 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
311 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
313 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 };
323
324 return tbl[c];
325 }
326
327 u8 int_to_bf64 (const u8 c)
328 {
329 static const u8 tbl[0x40] =
330 {
331 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
332 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
333 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
334 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
335 };
336
337 return tbl[c];
338 }
339
340 u8 bf64_to_int (const u8 c)
341 {
342 static const u8 tbl[0x100] =
343 {
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
347 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
349 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
351 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 };
361
362 return tbl[c];
363 }
364
365 u8 int_to_lotus64 (const u8 c)
366 {
367 if (c < 10) return '0' + c;
368 else if (c < 36) return 'A' + c - 10;
369 else if (c < 62) return 'a' + c - 36;
370 else if (c == 62) return '+';
371 else if (c == 63) return '/';
372
373 return 0;
374 }
375
376 u8 lotus64_to_int (const u8 c)
377 {
378 if ((c >= '0') && (c <= '9')) return c - '0';
379 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
380 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
381 else if (c == '+') return 62;
382 else if (c == '/') return 63;
383 else
384
385 return 0;
386 }
387
388 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
389 {
390 const u8 *in_ptr = in_buf;
391
392 u8 *out_ptr = out_buf;
393
394 for (int i = 0; i < in_len; i += 8)
395 {
396 const u8 out_val0 = f (in_ptr[0] & 0x7f);
397 const u8 out_val1 = f (in_ptr[1] & 0x7f);
398 const u8 out_val2 = f (in_ptr[2] & 0x7f);
399 const u8 out_val3 = f (in_ptr[3] & 0x7f);
400 const u8 out_val4 = f (in_ptr[4] & 0x7f);
401 const u8 out_val5 = f (in_ptr[5] & 0x7f);
402 const u8 out_val6 = f (in_ptr[6] & 0x7f);
403 const u8 out_val7 = f (in_ptr[7] & 0x7f);
404
405 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
406 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
407 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
408 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
409 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
410
411 in_ptr += 8;
412 out_ptr += 5;
413 }
414
415 for (int i = 0; i < in_len; i++)
416 {
417 if (in_buf[i] != '=') continue;
418
419 in_len = i;
420 }
421
422 int out_len = (in_len * 5) / 8;
423
424 return out_len;
425 }
426
427 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
428 {
429 const u8 *in_ptr = in_buf;
430
431 u8 *out_ptr = out_buf;
432
433 for (int i = 0; i < in_len; i += 5)
434 {
435 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
436 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
437 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
438 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
439 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
440 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
441 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
442 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
443
444 out_ptr[0] = out_val0 & 0x7f;
445 out_ptr[1] = out_val1 & 0x7f;
446 out_ptr[2] = out_val2 & 0x7f;
447 out_ptr[3] = out_val3 & 0x7f;
448 out_ptr[4] = out_val4 & 0x7f;
449 out_ptr[5] = out_val5 & 0x7f;
450 out_ptr[6] = out_val6 & 0x7f;
451 out_ptr[7] = out_val7 & 0x7f;
452
453 in_ptr += 5;
454 out_ptr += 8;
455 }
456
457 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
458
459 while (out_len % 8)
460 {
461 out_buf[out_len] = '=';
462
463 out_len++;
464 }
465
466 return out_len;
467 }
468
469 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
470 {
471 const u8 *in_ptr = in_buf;
472
473 u8 *out_ptr = out_buf;
474
475 for (int i = 0; i < in_len; i += 4)
476 {
477 const u8 out_val0 = f (in_ptr[0] & 0x7f);
478 const u8 out_val1 = f (in_ptr[1] & 0x7f);
479 const u8 out_val2 = f (in_ptr[2] & 0x7f);
480 const u8 out_val3 = f (in_ptr[3] & 0x7f);
481
482 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
483 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
484 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
485
486 in_ptr += 4;
487 out_ptr += 3;
488 }
489
490 for (int i = 0; i < in_len; i++)
491 {
492 if (in_buf[i] != '=') continue;
493
494 in_len = i;
495 }
496
497 int out_len = (in_len * 6) / 8;
498
499 return out_len;
500 }
501
502 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
503 {
504 const u8 *in_ptr = in_buf;
505
506 u8 *out_ptr = out_buf;
507
508 for (int i = 0; i < in_len; i += 3)
509 {
510 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
511 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
512 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
513 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
514
515 out_ptr[0] = out_val0 & 0x7f;
516 out_ptr[1] = out_val1 & 0x7f;
517 out_ptr[2] = out_val2 & 0x7f;
518 out_ptr[3] = out_val3 & 0x7f;
519
520 in_ptr += 3;
521 out_ptr += 4;
522 }
523
524 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
525
526 while (out_len % 4)
527 {
528 out_buf[out_len] = '=';
529
530 out_len++;
531 }
532
533 return out_len;
534 }
535
536 int is_valid_hex_char (const u8 c)
537 {
538 if ((c >= '0') && (c <= '9')) return 1;
539 if ((c >= 'A') && (c <= 'F')) return 1;
540 if ((c >= 'a') && (c <= 'f')) return 1;
541
542 return 0;
543 }
544
545 u8 hex_convert (const u8 c)
546 {
547 return (c & 15) + (c >> 6) * 9;
548 }
549
550 u8 hex_to_u8 (const u8 hex[2])
551 {
552 u8 v = 0;
553
554 v |= (hex_convert (hex[1]) << 0);
555 v |= (hex_convert (hex[0]) << 4);
556
557 return (v);
558 }
559
560 u32 hex_to_u32 (const u8 hex[8])
561 {
562 u32 v = 0;
563
564 v |= ((u32) hex_convert (hex[7])) << 0;
565 v |= ((u32) hex_convert (hex[6])) << 4;
566 v |= ((u32) hex_convert (hex[5])) << 8;
567 v |= ((u32) hex_convert (hex[4])) << 12;
568 v |= ((u32) hex_convert (hex[3])) << 16;
569 v |= ((u32) hex_convert (hex[2])) << 20;
570 v |= ((u32) hex_convert (hex[1])) << 24;
571 v |= ((u32) hex_convert (hex[0])) << 28;
572
573 return (v);
574 }
575
576 u64 hex_to_u64 (const u8 hex[16])
577 {
578 u64 v = 0;
579
580 v |= ((u64) hex_convert (hex[15]) << 0);
581 v |= ((u64) hex_convert (hex[14]) << 4);
582 v |= ((u64) hex_convert (hex[13]) << 8);
583 v |= ((u64) hex_convert (hex[12]) << 12);
584 v |= ((u64) hex_convert (hex[11]) << 16);
585 v |= ((u64) hex_convert (hex[10]) << 20);
586 v |= ((u64) hex_convert (hex[ 9]) << 24);
587 v |= ((u64) hex_convert (hex[ 8]) << 28);
588 v |= ((u64) hex_convert (hex[ 7]) << 32);
589 v |= ((u64) hex_convert (hex[ 6]) << 36);
590 v |= ((u64) hex_convert (hex[ 5]) << 40);
591 v |= ((u64) hex_convert (hex[ 4]) << 44);
592 v |= ((u64) hex_convert (hex[ 3]) << 48);
593 v |= ((u64) hex_convert (hex[ 2]) << 52);
594 v |= ((u64) hex_convert (hex[ 1]) << 56);
595 v |= ((u64) hex_convert (hex[ 0]) << 60);
596
597 return (v);
598 }
599
600 void bin_to_hex_lower (const u32 v, u8 hex[8])
601 {
602 hex[0] = v >> 28 & 15;
603 hex[1] = v >> 24 & 15;
604 hex[2] = v >> 20 & 15;
605 hex[3] = v >> 16 & 15;
606 hex[4] = v >> 12 & 15;
607 hex[5] = v >> 8 & 15;
608 hex[6] = v >> 4 & 15;
609 hex[7] = v >> 0 & 15;
610
611 u32 add;
612
613 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
614 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
615 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
616 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
617 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
618 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
619 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
620 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
621 }
622
623 /**
624 * decoder
625 */
626
627 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
628 {
629 AES_KEY skey;
630
631 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
632
633 u32 _iv[4];
634
635 _iv[0] = iv[0];
636 _iv[1] = iv[1];
637 _iv[2] = iv[2];
638 _iv[3] = iv[3];
639
640 for (int i = 0; i < 16; i += 4)
641 {
642 u32 _in[4];
643 u32 _out[4];
644
645 _in[0] = in[i + 0];
646 _in[1] = in[i + 1];
647 _in[2] = in[i + 2];
648 _in[3] = in[i + 3];
649
650 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
651
652 _out[0] ^= _iv[0];
653 _out[1] ^= _iv[1];
654 _out[2] ^= _iv[2];
655 _out[3] ^= _iv[3];
656
657 out[i + 0] = _out[0];
658 out[i + 1] = _out[1];
659 out[i + 2] = _out[2];
660 out[i + 3] = _out[3];
661
662 _iv[0] = _in[0];
663 _iv[1] = _in[1];
664 _iv[2] = _in[2];
665 _iv[3] = _in[3];
666 }
667 }
668
669 static void juniper_decrypt_hash (char *in, char *out)
670 {
671 // base64 decode
672
673 u8 base64_buf[100];
674
675 memset (base64_buf, 0, sizeof (base64_buf));
676
677 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
678
679 // iv stuff
680
681 u32 juniper_iv[4] = { 0 };
682
683 memcpy (juniper_iv, base64_buf, 12);
684
685 memcpy (out, juniper_iv, 12);
686
687 // reversed key
688
689 u32 juniper_key[4];
690
691 juniper_key[0] = byte_swap_32 (0xa6707a7e);
692 juniper_key[1] = byte_swap_32 (0x8df91059);
693 juniper_key[2] = byte_swap_32 (0xdea70ae5);
694 juniper_key[3] = byte_swap_32 (0x2f9c2442);
695
696 // AES decrypt
697
698 u32 *in_ptr = (u32 *) (base64_buf + 12);
699 u32 *out_ptr = (u32 *) (out + 12);
700
701 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
702 }
703
704 void phpass_decode (u8 digest[16], u8 buf[22])
705 {
706 int l;
707
708 l = itoa64_to_int (buf[ 0]) << 0;
709 l |= itoa64_to_int (buf[ 1]) << 6;
710 l |= itoa64_to_int (buf[ 2]) << 12;
711 l |= itoa64_to_int (buf[ 3]) << 18;
712
713 digest[ 0] = (l >> 0) & 0xff;
714 digest[ 1] = (l >> 8) & 0xff;
715 digest[ 2] = (l >> 16) & 0xff;
716
717 l = itoa64_to_int (buf[ 4]) << 0;
718 l |= itoa64_to_int (buf[ 5]) << 6;
719 l |= itoa64_to_int (buf[ 6]) << 12;
720 l |= itoa64_to_int (buf[ 7]) << 18;
721
722 digest[ 3] = (l >> 0) & 0xff;
723 digest[ 4] = (l >> 8) & 0xff;
724 digest[ 5] = (l >> 16) & 0xff;
725
726 l = itoa64_to_int (buf[ 8]) << 0;
727 l |= itoa64_to_int (buf[ 9]) << 6;
728 l |= itoa64_to_int (buf[10]) << 12;
729 l |= itoa64_to_int (buf[11]) << 18;
730
731 digest[ 6] = (l >> 0) & 0xff;
732 digest[ 7] = (l >> 8) & 0xff;
733 digest[ 8] = (l >> 16) & 0xff;
734
735 l = itoa64_to_int (buf[12]) << 0;
736 l |= itoa64_to_int (buf[13]) << 6;
737 l |= itoa64_to_int (buf[14]) << 12;
738 l |= itoa64_to_int (buf[15]) << 18;
739
740 digest[ 9] = (l >> 0) & 0xff;
741 digest[10] = (l >> 8) & 0xff;
742 digest[11] = (l >> 16) & 0xff;
743
744 l = itoa64_to_int (buf[16]) << 0;
745 l |= itoa64_to_int (buf[17]) << 6;
746 l |= itoa64_to_int (buf[18]) << 12;
747 l |= itoa64_to_int (buf[19]) << 18;
748
749 digest[12] = (l >> 0) & 0xff;
750 digest[13] = (l >> 8) & 0xff;
751 digest[14] = (l >> 16) & 0xff;
752
753 l = itoa64_to_int (buf[20]) << 0;
754 l |= itoa64_to_int (buf[21]) << 6;
755
756 digest[15] = (l >> 0) & 0xff;
757 }
758
759 void phpass_encode (u8 digest[16], u8 buf[22])
760 {
761 int l;
762
763 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
764
765 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
766 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
767 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
768 buf[ 3] = int_to_itoa64 (l & 0x3f);
769
770 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
771
772 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
773 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
774 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
775 buf[ 7] = int_to_itoa64 (l & 0x3f);
776
777 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
778
779 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
781 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
782 buf[11] = int_to_itoa64 (l & 0x3f);
783
784 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
785
786 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
788 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
789 buf[15] = int_to_itoa64 (l & 0x3f);
790
791 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
792
793 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
794 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
795 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
796 buf[19] = int_to_itoa64 (l & 0x3f);
797
798 l = (digest[15] << 0);
799
800 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
801 buf[21] = int_to_itoa64 (l & 0x3f);
802 }
803
804 void md5crypt_decode (u8 digest[16], u8 buf[22])
805 {
806 int l;
807
808 l = itoa64_to_int (buf[ 0]) << 0;
809 l |= itoa64_to_int (buf[ 1]) << 6;
810 l |= itoa64_to_int (buf[ 2]) << 12;
811 l |= itoa64_to_int (buf[ 3]) << 18;
812
813 digest[ 0] = (l >> 16) & 0xff;
814 digest[ 6] = (l >> 8) & 0xff;
815 digest[12] = (l >> 0) & 0xff;
816
817 l = itoa64_to_int (buf[ 4]) << 0;
818 l |= itoa64_to_int (buf[ 5]) << 6;
819 l |= itoa64_to_int (buf[ 6]) << 12;
820 l |= itoa64_to_int (buf[ 7]) << 18;
821
822 digest[ 1] = (l >> 16) & 0xff;
823 digest[ 7] = (l >> 8) & 0xff;
824 digest[13] = (l >> 0) & 0xff;
825
826 l = itoa64_to_int (buf[ 8]) << 0;
827 l |= itoa64_to_int (buf[ 9]) << 6;
828 l |= itoa64_to_int (buf[10]) << 12;
829 l |= itoa64_to_int (buf[11]) << 18;
830
831 digest[ 2] = (l >> 16) & 0xff;
832 digest[ 8] = (l >> 8) & 0xff;
833 digest[14] = (l >> 0) & 0xff;
834
835 l = itoa64_to_int (buf[12]) << 0;
836 l |= itoa64_to_int (buf[13]) << 6;
837 l |= itoa64_to_int (buf[14]) << 12;
838 l |= itoa64_to_int (buf[15]) << 18;
839
840 digest[ 3] = (l >> 16) & 0xff;
841 digest[ 9] = (l >> 8) & 0xff;
842 digest[15] = (l >> 0) & 0xff;
843
844 l = itoa64_to_int (buf[16]) << 0;
845 l |= itoa64_to_int (buf[17]) << 6;
846 l |= itoa64_to_int (buf[18]) << 12;
847 l |= itoa64_to_int (buf[19]) << 18;
848
849 digest[ 4] = (l >> 16) & 0xff;
850 digest[10] = (l >> 8) & 0xff;
851 digest[ 5] = (l >> 0) & 0xff;
852
853 l = itoa64_to_int (buf[20]) << 0;
854 l |= itoa64_to_int (buf[21]) << 6;
855
856 digest[11] = (l >> 0) & 0xff;
857 }
858
859 void md5crypt_encode (u8 digest[16], u8 buf[22])
860 {
861 int l;
862
863 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
864
865 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
866 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
867 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
868 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
869
870 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
871
872 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
873 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
874 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
875 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
876
877 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
878
879 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
881 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
882 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
883
884 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
885
886 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
888 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
889 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
890
891 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
892
893 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
894 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
895 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
896 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
897
898 l = (digest[11] << 0);
899
900 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
901 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
902 }
903
904 void sha512crypt_decode (u8 digest[64], u8 buf[86])
905 {
906 int l;
907
908 l = itoa64_to_int (buf[ 0]) << 0;
909 l |= itoa64_to_int (buf[ 1]) << 6;
910 l |= itoa64_to_int (buf[ 2]) << 12;
911 l |= itoa64_to_int (buf[ 3]) << 18;
912
913 digest[ 0] = (l >> 16) & 0xff;
914 digest[21] = (l >> 8) & 0xff;
915 digest[42] = (l >> 0) & 0xff;
916
917 l = itoa64_to_int (buf[ 4]) << 0;
918 l |= itoa64_to_int (buf[ 5]) << 6;
919 l |= itoa64_to_int (buf[ 6]) << 12;
920 l |= itoa64_to_int (buf[ 7]) << 18;
921
922 digest[22] = (l >> 16) & 0xff;
923 digest[43] = (l >> 8) & 0xff;
924 digest[ 1] = (l >> 0) & 0xff;
925
926 l = itoa64_to_int (buf[ 8]) << 0;
927 l |= itoa64_to_int (buf[ 9]) << 6;
928 l |= itoa64_to_int (buf[10]) << 12;
929 l |= itoa64_to_int (buf[11]) << 18;
930
931 digest[44] = (l >> 16) & 0xff;
932 digest[ 2] = (l >> 8) & 0xff;
933 digest[23] = (l >> 0) & 0xff;
934
935 l = itoa64_to_int (buf[12]) << 0;
936 l |= itoa64_to_int (buf[13]) << 6;
937 l |= itoa64_to_int (buf[14]) << 12;
938 l |= itoa64_to_int (buf[15]) << 18;
939
940 digest[ 3] = (l >> 16) & 0xff;
941 digest[24] = (l >> 8) & 0xff;
942 digest[45] = (l >> 0) & 0xff;
943
944 l = itoa64_to_int (buf[16]) << 0;
945 l |= itoa64_to_int (buf[17]) << 6;
946 l |= itoa64_to_int (buf[18]) << 12;
947 l |= itoa64_to_int (buf[19]) << 18;
948
949 digest[25] = (l >> 16) & 0xff;
950 digest[46] = (l >> 8) & 0xff;
951 digest[ 4] = (l >> 0) & 0xff;
952
953 l = itoa64_to_int (buf[20]) << 0;
954 l |= itoa64_to_int (buf[21]) << 6;
955 l |= itoa64_to_int (buf[22]) << 12;
956 l |= itoa64_to_int (buf[23]) << 18;
957
958 digest[47] = (l >> 16) & 0xff;
959 digest[ 5] = (l >> 8) & 0xff;
960 digest[26] = (l >> 0) & 0xff;
961
962 l = itoa64_to_int (buf[24]) << 0;
963 l |= itoa64_to_int (buf[25]) << 6;
964 l |= itoa64_to_int (buf[26]) << 12;
965 l |= itoa64_to_int (buf[27]) << 18;
966
967 digest[ 6] = (l >> 16) & 0xff;
968 digest[27] = (l >> 8) & 0xff;
969 digest[48] = (l >> 0) & 0xff;
970
971 l = itoa64_to_int (buf[28]) << 0;
972 l |= itoa64_to_int (buf[29]) << 6;
973 l |= itoa64_to_int (buf[30]) << 12;
974 l |= itoa64_to_int (buf[31]) << 18;
975
976 digest[28] = (l >> 16) & 0xff;
977 digest[49] = (l >> 8) & 0xff;
978 digest[ 7] = (l >> 0) & 0xff;
979
980 l = itoa64_to_int (buf[32]) << 0;
981 l |= itoa64_to_int (buf[33]) << 6;
982 l |= itoa64_to_int (buf[34]) << 12;
983 l |= itoa64_to_int (buf[35]) << 18;
984
985 digest[50] = (l >> 16) & 0xff;
986 digest[ 8] = (l >> 8) & 0xff;
987 digest[29] = (l >> 0) & 0xff;
988
989 l = itoa64_to_int (buf[36]) << 0;
990 l |= itoa64_to_int (buf[37]) << 6;
991 l |= itoa64_to_int (buf[38]) << 12;
992 l |= itoa64_to_int (buf[39]) << 18;
993
994 digest[ 9] = (l >> 16) & 0xff;
995 digest[30] = (l >> 8) & 0xff;
996 digest[51] = (l >> 0) & 0xff;
997
998 l = itoa64_to_int (buf[40]) << 0;
999 l |= itoa64_to_int (buf[41]) << 6;
1000 l |= itoa64_to_int (buf[42]) << 12;
1001 l |= itoa64_to_int (buf[43]) << 18;
1002
1003 digest[31] = (l >> 16) & 0xff;
1004 digest[52] = (l >> 8) & 0xff;
1005 digest[10] = (l >> 0) & 0xff;
1006
1007 l = itoa64_to_int (buf[44]) << 0;
1008 l |= itoa64_to_int (buf[45]) << 6;
1009 l |= itoa64_to_int (buf[46]) << 12;
1010 l |= itoa64_to_int (buf[47]) << 18;
1011
1012 digest[53] = (l >> 16) & 0xff;
1013 digest[11] = (l >> 8) & 0xff;
1014 digest[32] = (l >> 0) & 0xff;
1015
1016 l = itoa64_to_int (buf[48]) << 0;
1017 l |= itoa64_to_int (buf[49]) << 6;
1018 l |= itoa64_to_int (buf[50]) << 12;
1019 l |= itoa64_to_int (buf[51]) << 18;
1020
1021 digest[12] = (l >> 16) & 0xff;
1022 digest[33] = (l >> 8) & 0xff;
1023 digest[54] = (l >> 0) & 0xff;
1024
1025 l = itoa64_to_int (buf[52]) << 0;
1026 l |= itoa64_to_int (buf[53]) << 6;
1027 l |= itoa64_to_int (buf[54]) << 12;
1028 l |= itoa64_to_int (buf[55]) << 18;
1029
1030 digest[34] = (l >> 16) & 0xff;
1031 digest[55] = (l >> 8) & 0xff;
1032 digest[13] = (l >> 0) & 0xff;
1033
1034 l = itoa64_to_int (buf[56]) << 0;
1035 l |= itoa64_to_int (buf[57]) << 6;
1036 l |= itoa64_to_int (buf[58]) << 12;
1037 l |= itoa64_to_int (buf[59]) << 18;
1038
1039 digest[56] = (l >> 16) & 0xff;
1040 digest[14] = (l >> 8) & 0xff;
1041 digest[35] = (l >> 0) & 0xff;
1042
1043 l = itoa64_to_int (buf[60]) << 0;
1044 l |= itoa64_to_int (buf[61]) << 6;
1045 l |= itoa64_to_int (buf[62]) << 12;
1046 l |= itoa64_to_int (buf[63]) << 18;
1047
1048 digest[15] = (l >> 16) & 0xff;
1049 digest[36] = (l >> 8) & 0xff;
1050 digest[57] = (l >> 0) & 0xff;
1051
1052 l = itoa64_to_int (buf[64]) << 0;
1053 l |= itoa64_to_int (buf[65]) << 6;
1054 l |= itoa64_to_int (buf[66]) << 12;
1055 l |= itoa64_to_int (buf[67]) << 18;
1056
1057 digest[37] = (l >> 16) & 0xff;
1058 digest[58] = (l >> 8) & 0xff;
1059 digest[16] = (l >> 0) & 0xff;
1060
1061 l = itoa64_to_int (buf[68]) << 0;
1062 l |= itoa64_to_int (buf[69]) << 6;
1063 l |= itoa64_to_int (buf[70]) << 12;
1064 l |= itoa64_to_int (buf[71]) << 18;
1065
1066 digest[59] = (l >> 16) & 0xff;
1067 digest[17] = (l >> 8) & 0xff;
1068 digest[38] = (l >> 0) & 0xff;
1069
1070 l = itoa64_to_int (buf[72]) << 0;
1071 l |= itoa64_to_int (buf[73]) << 6;
1072 l |= itoa64_to_int (buf[74]) << 12;
1073 l |= itoa64_to_int (buf[75]) << 18;
1074
1075 digest[18] = (l >> 16) & 0xff;
1076 digest[39] = (l >> 8) & 0xff;
1077 digest[60] = (l >> 0) & 0xff;
1078
1079 l = itoa64_to_int (buf[76]) << 0;
1080 l |= itoa64_to_int (buf[77]) << 6;
1081 l |= itoa64_to_int (buf[78]) << 12;
1082 l |= itoa64_to_int (buf[79]) << 18;
1083
1084 digest[40] = (l >> 16) & 0xff;
1085 digest[61] = (l >> 8) & 0xff;
1086 digest[19] = (l >> 0) & 0xff;
1087
1088 l = itoa64_to_int (buf[80]) << 0;
1089 l |= itoa64_to_int (buf[81]) << 6;
1090 l |= itoa64_to_int (buf[82]) << 12;
1091 l |= itoa64_to_int (buf[83]) << 18;
1092
1093 digest[62] = (l >> 16) & 0xff;
1094 digest[20] = (l >> 8) & 0xff;
1095 digest[41] = (l >> 0) & 0xff;
1096
1097 l = itoa64_to_int (buf[84]) << 0;
1098 l |= itoa64_to_int (buf[85]) << 6;
1099
1100 digest[63] = (l >> 0) & 0xff;
1101 }
1102
1103 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1104 {
1105 int l;
1106
1107 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1108
1109 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1112 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1113
1114 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1115
1116 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1119 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1120
1121 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1122
1123 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1126 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1127
1128 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1129
1130 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1133 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1134
1135 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1136
1137 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1140 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1141
1142 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1143
1144 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1147 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1148
1149 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1150
1151 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1154 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1155
1156 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1157
1158 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1161 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1162
1163 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1164
1165 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1168 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1169
1170 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1171
1172 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1175 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1176
1177 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1178
1179 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1182 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1183
1184 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1185
1186 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1189 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1190
1191 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1192
1193 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1196 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1197
1198 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1199
1200 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1203 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1204
1205 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1206
1207 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1210 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1211
1212 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1213
1214 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1217 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1218
1219 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1220
1221 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1224 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1225
1226 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1227
1228 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1231 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1232
1233 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1234
1235 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1238 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1239
1240 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1241
1242 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1245 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1246
1247 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1248
1249 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1250 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1252 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1253
1254 l = 0 | 0 | (digest[63] << 0);
1255
1256 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1257 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1258 }
1259
1260 void sha1aix_decode (u8 digest[20], u8 buf[27])
1261 {
1262 int l;
1263
1264 l = itoa64_to_int (buf[ 0]) << 0;
1265 l |= itoa64_to_int (buf[ 1]) << 6;
1266 l |= itoa64_to_int (buf[ 2]) << 12;
1267 l |= itoa64_to_int (buf[ 3]) << 18;
1268
1269 digest[ 2] = (l >> 0) & 0xff;
1270 digest[ 1] = (l >> 8) & 0xff;
1271 digest[ 0] = (l >> 16) & 0xff;
1272
1273 l = itoa64_to_int (buf[ 4]) << 0;
1274 l |= itoa64_to_int (buf[ 5]) << 6;
1275 l |= itoa64_to_int (buf[ 6]) << 12;
1276 l |= itoa64_to_int (buf[ 7]) << 18;
1277
1278 digest[ 5] = (l >> 0) & 0xff;
1279 digest[ 4] = (l >> 8) & 0xff;
1280 digest[ 3] = (l >> 16) & 0xff;
1281
1282 l = itoa64_to_int (buf[ 8]) << 0;
1283 l |= itoa64_to_int (buf[ 9]) << 6;
1284 l |= itoa64_to_int (buf[10]) << 12;
1285 l |= itoa64_to_int (buf[11]) << 18;
1286
1287 digest[ 8] = (l >> 0) & 0xff;
1288 digest[ 7] = (l >> 8) & 0xff;
1289 digest[ 6] = (l >> 16) & 0xff;
1290
1291 l = itoa64_to_int (buf[12]) << 0;
1292 l |= itoa64_to_int (buf[13]) << 6;
1293 l |= itoa64_to_int (buf[14]) << 12;
1294 l |= itoa64_to_int (buf[15]) << 18;
1295
1296 digest[11] = (l >> 0) & 0xff;
1297 digest[10] = (l >> 8) & 0xff;
1298 digest[ 9] = (l >> 16) & 0xff;
1299
1300 l = itoa64_to_int (buf[16]) << 0;
1301 l |= itoa64_to_int (buf[17]) << 6;
1302 l |= itoa64_to_int (buf[18]) << 12;
1303 l |= itoa64_to_int (buf[19]) << 18;
1304
1305 digest[14] = (l >> 0) & 0xff;
1306 digest[13] = (l >> 8) & 0xff;
1307 digest[12] = (l >> 16) & 0xff;
1308
1309 l = itoa64_to_int (buf[20]) << 0;
1310 l |= itoa64_to_int (buf[21]) << 6;
1311 l |= itoa64_to_int (buf[22]) << 12;
1312 l |= itoa64_to_int (buf[23]) << 18;
1313
1314 digest[17] = (l >> 0) & 0xff;
1315 digest[16] = (l >> 8) & 0xff;
1316 digest[15] = (l >> 16) & 0xff;
1317
1318 l = itoa64_to_int (buf[24]) << 0;
1319 l |= itoa64_to_int (buf[25]) << 6;
1320 l |= itoa64_to_int (buf[26]) << 12;
1321
1322 digest[19] = (l >> 8) & 0xff;
1323 digest[18] = (l >> 16) & 0xff;
1324 }
1325
1326 void sha1aix_encode (u8 digest[20], u8 buf[27])
1327 {
1328 int l;
1329
1330 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1331
1332 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1333 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1334 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1335 buf[ 3] = int_to_itoa64 (l & 0x3f);
1336
1337 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1338
1339 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1340 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1341 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1342 buf[ 7] = int_to_itoa64 (l & 0x3f);
1343
1344 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1345
1346 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1348 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1349 buf[11] = int_to_itoa64 (l & 0x3f);
1350
1351 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1352
1353 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1355 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1356 buf[15] = int_to_itoa64 (l & 0x3f);
1357
1358 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1359
1360 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1362 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1363 buf[19] = int_to_itoa64 (l & 0x3f);
1364
1365 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1366
1367 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1368 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1369 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1370 buf[23] = int_to_itoa64 (l & 0x3f);
1371
1372 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1373
1374 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1375 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1376 buf[26] = int_to_itoa64 (l & 0x3f);
1377 }
1378
1379 void sha256aix_decode (u8 digest[32], u8 buf[43])
1380 {
1381 int l;
1382
1383 l = itoa64_to_int (buf[ 0]) << 0;
1384 l |= itoa64_to_int (buf[ 1]) << 6;
1385 l |= itoa64_to_int (buf[ 2]) << 12;
1386 l |= itoa64_to_int (buf[ 3]) << 18;
1387
1388 digest[ 2] = (l >> 0) & 0xff;
1389 digest[ 1] = (l >> 8) & 0xff;
1390 digest[ 0] = (l >> 16) & 0xff;
1391
1392 l = itoa64_to_int (buf[ 4]) << 0;
1393 l |= itoa64_to_int (buf[ 5]) << 6;
1394 l |= itoa64_to_int (buf[ 6]) << 12;
1395 l |= itoa64_to_int (buf[ 7]) << 18;
1396
1397 digest[ 5] = (l >> 0) & 0xff;
1398 digest[ 4] = (l >> 8) & 0xff;
1399 digest[ 3] = (l >> 16) & 0xff;
1400
1401 l = itoa64_to_int (buf[ 8]) << 0;
1402 l |= itoa64_to_int (buf[ 9]) << 6;
1403 l |= itoa64_to_int (buf[10]) << 12;
1404 l |= itoa64_to_int (buf[11]) << 18;
1405
1406 digest[ 8] = (l >> 0) & 0xff;
1407 digest[ 7] = (l >> 8) & 0xff;
1408 digest[ 6] = (l >> 16) & 0xff;
1409
1410 l = itoa64_to_int (buf[12]) << 0;
1411 l |= itoa64_to_int (buf[13]) << 6;
1412 l |= itoa64_to_int (buf[14]) << 12;
1413 l |= itoa64_to_int (buf[15]) << 18;
1414
1415 digest[11] = (l >> 0) & 0xff;
1416 digest[10] = (l >> 8) & 0xff;
1417 digest[ 9] = (l >> 16) & 0xff;
1418
1419 l = itoa64_to_int (buf[16]) << 0;
1420 l |= itoa64_to_int (buf[17]) << 6;
1421 l |= itoa64_to_int (buf[18]) << 12;
1422 l |= itoa64_to_int (buf[19]) << 18;
1423
1424 digest[14] = (l >> 0) & 0xff;
1425 digest[13] = (l >> 8) & 0xff;
1426 digest[12] = (l >> 16) & 0xff;
1427
1428 l = itoa64_to_int (buf[20]) << 0;
1429 l |= itoa64_to_int (buf[21]) << 6;
1430 l |= itoa64_to_int (buf[22]) << 12;
1431 l |= itoa64_to_int (buf[23]) << 18;
1432
1433 digest[17] = (l >> 0) & 0xff;
1434 digest[16] = (l >> 8) & 0xff;
1435 digest[15] = (l >> 16) & 0xff;
1436
1437 l = itoa64_to_int (buf[24]) << 0;
1438 l |= itoa64_to_int (buf[25]) << 6;
1439 l |= itoa64_to_int (buf[26]) << 12;
1440 l |= itoa64_to_int (buf[27]) << 18;
1441
1442 digest[20] = (l >> 0) & 0xff;
1443 digest[19] = (l >> 8) & 0xff;
1444 digest[18] = (l >> 16) & 0xff;
1445
1446 l = itoa64_to_int (buf[28]) << 0;
1447 l |= itoa64_to_int (buf[29]) << 6;
1448 l |= itoa64_to_int (buf[30]) << 12;
1449 l |= itoa64_to_int (buf[31]) << 18;
1450
1451 digest[23] = (l >> 0) & 0xff;
1452 digest[22] = (l >> 8) & 0xff;
1453 digest[21] = (l >> 16) & 0xff;
1454
1455 l = itoa64_to_int (buf[32]) << 0;
1456 l |= itoa64_to_int (buf[33]) << 6;
1457 l |= itoa64_to_int (buf[34]) << 12;
1458 l |= itoa64_to_int (buf[35]) << 18;
1459
1460 digest[26] = (l >> 0) & 0xff;
1461 digest[25] = (l >> 8) & 0xff;
1462 digest[24] = (l >> 16) & 0xff;
1463
1464 l = itoa64_to_int (buf[36]) << 0;
1465 l |= itoa64_to_int (buf[37]) << 6;
1466 l |= itoa64_to_int (buf[38]) << 12;
1467 l |= itoa64_to_int (buf[39]) << 18;
1468
1469 digest[29] = (l >> 0) & 0xff;
1470 digest[28] = (l >> 8) & 0xff;
1471 digest[27] = (l >> 16) & 0xff;
1472
1473 l = itoa64_to_int (buf[40]) << 0;
1474 l |= itoa64_to_int (buf[41]) << 6;
1475 l |= itoa64_to_int (buf[42]) << 12;
1476
1477 //digest[32] = (l >> 0) & 0xff;
1478 digest[31] = (l >> 8) & 0xff;
1479 digest[30] = (l >> 16) & 0xff;
1480 }
1481
1482 void sha256aix_encode (u8 digest[32], u8 buf[43])
1483 {
1484 int l;
1485
1486 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1487
1488 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1489 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1490 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1491 buf[ 3] = int_to_itoa64 (l & 0x3f);
1492
1493 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1494
1495 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1496 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1497 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1498 buf[ 7] = int_to_itoa64 (l & 0x3f);
1499
1500 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1501
1502 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1504 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1505 buf[11] = int_to_itoa64 (l & 0x3f);
1506
1507 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1508
1509 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1511 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1512 buf[15] = int_to_itoa64 (l & 0x3f);
1513
1514 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1515
1516 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1518 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1519 buf[19] = int_to_itoa64 (l & 0x3f);
1520
1521 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1522
1523 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1525 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1526 buf[23] = int_to_itoa64 (l & 0x3f);
1527
1528 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1529
1530 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1532 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1533 buf[27] = int_to_itoa64 (l & 0x3f);
1534
1535 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1536
1537 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1539 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1540 buf[31] = int_to_itoa64 (l & 0x3f);
1541
1542 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1543
1544 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1546 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1547 buf[35] = int_to_itoa64 (l & 0x3f);
1548
1549 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1550
1551 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1552 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1553 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1554 buf[39] = int_to_itoa64 (l & 0x3f);
1555
1556 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1557
1558 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1559 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1560 buf[42] = int_to_itoa64 (l & 0x3f);
1561 }
1562
1563 void sha512aix_decode (u8 digest[64], u8 buf[86])
1564 {
1565 int l;
1566
1567 l = itoa64_to_int (buf[ 0]) << 0;
1568 l |= itoa64_to_int (buf[ 1]) << 6;
1569 l |= itoa64_to_int (buf[ 2]) << 12;
1570 l |= itoa64_to_int (buf[ 3]) << 18;
1571
1572 digest[ 2] = (l >> 0) & 0xff;
1573 digest[ 1] = (l >> 8) & 0xff;
1574 digest[ 0] = (l >> 16) & 0xff;
1575
1576 l = itoa64_to_int (buf[ 4]) << 0;
1577 l |= itoa64_to_int (buf[ 5]) << 6;
1578 l |= itoa64_to_int (buf[ 6]) << 12;
1579 l |= itoa64_to_int (buf[ 7]) << 18;
1580
1581 digest[ 5] = (l >> 0) & 0xff;
1582 digest[ 4] = (l >> 8) & 0xff;
1583 digest[ 3] = (l >> 16) & 0xff;
1584
1585 l = itoa64_to_int (buf[ 8]) << 0;
1586 l |= itoa64_to_int (buf[ 9]) << 6;
1587 l |= itoa64_to_int (buf[10]) << 12;
1588 l |= itoa64_to_int (buf[11]) << 18;
1589
1590 digest[ 8] = (l >> 0) & 0xff;
1591 digest[ 7] = (l >> 8) & 0xff;
1592 digest[ 6] = (l >> 16) & 0xff;
1593
1594 l = itoa64_to_int (buf[12]) << 0;
1595 l |= itoa64_to_int (buf[13]) << 6;
1596 l |= itoa64_to_int (buf[14]) << 12;
1597 l |= itoa64_to_int (buf[15]) << 18;
1598
1599 digest[11] = (l >> 0) & 0xff;
1600 digest[10] = (l >> 8) & 0xff;
1601 digest[ 9] = (l >> 16) & 0xff;
1602
1603 l = itoa64_to_int (buf[16]) << 0;
1604 l |= itoa64_to_int (buf[17]) << 6;
1605 l |= itoa64_to_int (buf[18]) << 12;
1606 l |= itoa64_to_int (buf[19]) << 18;
1607
1608 digest[14] = (l >> 0) & 0xff;
1609 digest[13] = (l >> 8) & 0xff;
1610 digest[12] = (l >> 16) & 0xff;
1611
1612 l = itoa64_to_int (buf[20]) << 0;
1613 l |= itoa64_to_int (buf[21]) << 6;
1614 l |= itoa64_to_int (buf[22]) << 12;
1615 l |= itoa64_to_int (buf[23]) << 18;
1616
1617 digest[17] = (l >> 0) & 0xff;
1618 digest[16] = (l >> 8) & 0xff;
1619 digest[15] = (l >> 16) & 0xff;
1620
1621 l = itoa64_to_int (buf[24]) << 0;
1622 l |= itoa64_to_int (buf[25]) << 6;
1623 l |= itoa64_to_int (buf[26]) << 12;
1624 l |= itoa64_to_int (buf[27]) << 18;
1625
1626 digest[20] = (l >> 0) & 0xff;
1627 digest[19] = (l >> 8) & 0xff;
1628 digest[18] = (l >> 16) & 0xff;
1629
1630 l = itoa64_to_int (buf[28]) << 0;
1631 l |= itoa64_to_int (buf[29]) << 6;
1632 l |= itoa64_to_int (buf[30]) << 12;
1633 l |= itoa64_to_int (buf[31]) << 18;
1634
1635 digest[23] = (l >> 0) & 0xff;
1636 digest[22] = (l >> 8) & 0xff;
1637 digest[21] = (l >> 16) & 0xff;
1638
1639 l = itoa64_to_int (buf[32]) << 0;
1640 l |= itoa64_to_int (buf[33]) << 6;
1641 l |= itoa64_to_int (buf[34]) << 12;
1642 l |= itoa64_to_int (buf[35]) << 18;
1643
1644 digest[26] = (l >> 0) & 0xff;
1645 digest[25] = (l >> 8) & 0xff;
1646 digest[24] = (l >> 16) & 0xff;
1647
1648 l = itoa64_to_int (buf[36]) << 0;
1649 l |= itoa64_to_int (buf[37]) << 6;
1650 l |= itoa64_to_int (buf[38]) << 12;
1651 l |= itoa64_to_int (buf[39]) << 18;
1652
1653 digest[29] = (l >> 0) & 0xff;
1654 digest[28] = (l >> 8) & 0xff;
1655 digest[27] = (l >> 16) & 0xff;
1656
1657 l = itoa64_to_int (buf[40]) << 0;
1658 l |= itoa64_to_int (buf[41]) << 6;
1659 l |= itoa64_to_int (buf[42]) << 12;
1660 l |= itoa64_to_int (buf[43]) << 18;
1661
1662 digest[32] = (l >> 0) & 0xff;
1663 digest[31] = (l >> 8) & 0xff;
1664 digest[30] = (l >> 16) & 0xff;
1665
1666 l = itoa64_to_int (buf[44]) << 0;
1667 l |= itoa64_to_int (buf[45]) << 6;
1668 l |= itoa64_to_int (buf[46]) << 12;
1669 l |= itoa64_to_int (buf[47]) << 18;
1670
1671 digest[35] = (l >> 0) & 0xff;
1672 digest[34] = (l >> 8) & 0xff;
1673 digest[33] = (l >> 16) & 0xff;
1674
1675 l = itoa64_to_int (buf[48]) << 0;
1676 l |= itoa64_to_int (buf[49]) << 6;
1677 l |= itoa64_to_int (buf[50]) << 12;
1678 l |= itoa64_to_int (buf[51]) << 18;
1679
1680 digest[38] = (l >> 0) & 0xff;
1681 digest[37] = (l >> 8) & 0xff;
1682 digest[36] = (l >> 16) & 0xff;
1683
1684 l = itoa64_to_int (buf[52]) << 0;
1685 l |= itoa64_to_int (buf[53]) << 6;
1686 l |= itoa64_to_int (buf[54]) << 12;
1687 l |= itoa64_to_int (buf[55]) << 18;
1688
1689 digest[41] = (l >> 0) & 0xff;
1690 digest[40] = (l >> 8) & 0xff;
1691 digest[39] = (l >> 16) & 0xff;
1692
1693 l = itoa64_to_int (buf[56]) << 0;
1694 l |= itoa64_to_int (buf[57]) << 6;
1695 l |= itoa64_to_int (buf[58]) << 12;
1696 l |= itoa64_to_int (buf[59]) << 18;
1697
1698 digest[44] = (l >> 0) & 0xff;
1699 digest[43] = (l >> 8) & 0xff;
1700 digest[42] = (l >> 16) & 0xff;
1701
1702 l = itoa64_to_int (buf[60]) << 0;
1703 l |= itoa64_to_int (buf[61]) << 6;
1704 l |= itoa64_to_int (buf[62]) << 12;
1705 l |= itoa64_to_int (buf[63]) << 18;
1706
1707 digest[47] = (l >> 0) & 0xff;
1708 digest[46] = (l >> 8) & 0xff;
1709 digest[45] = (l >> 16) & 0xff;
1710
1711 l = itoa64_to_int (buf[64]) << 0;
1712 l |= itoa64_to_int (buf[65]) << 6;
1713 l |= itoa64_to_int (buf[66]) << 12;
1714 l |= itoa64_to_int (buf[67]) << 18;
1715
1716 digest[50] = (l >> 0) & 0xff;
1717 digest[49] = (l >> 8) & 0xff;
1718 digest[48] = (l >> 16) & 0xff;
1719
1720 l = itoa64_to_int (buf[68]) << 0;
1721 l |= itoa64_to_int (buf[69]) << 6;
1722 l |= itoa64_to_int (buf[70]) << 12;
1723 l |= itoa64_to_int (buf[71]) << 18;
1724
1725 digest[53] = (l >> 0) & 0xff;
1726 digest[52] = (l >> 8) & 0xff;
1727 digest[51] = (l >> 16) & 0xff;
1728
1729 l = itoa64_to_int (buf[72]) << 0;
1730 l |= itoa64_to_int (buf[73]) << 6;
1731 l |= itoa64_to_int (buf[74]) << 12;
1732 l |= itoa64_to_int (buf[75]) << 18;
1733
1734 digest[56] = (l >> 0) & 0xff;
1735 digest[55] = (l >> 8) & 0xff;
1736 digest[54] = (l >> 16) & 0xff;
1737
1738 l = itoa64_to_int (buf[76]) << 0;
1739 l |= itoa64_to_int (buf[77]) << 6;
1740 l |= itoa64_to_int (buf[78]) << 12;
1741 l |= itoa64_to_int (buf[79]) << 18;
1742
1743 digest[59] = (l >> 0) & 0xff;
1744 digest[58] = (l >> 8) & 0xff;
1745 digest[57] = (l >> 16) & 0xff;
1746
1747 l = itoa64_to_int (buf[80]) << 0;
1748 l |= itoa64_to_int (buf[81]) << 6;
1749 l |= itoa64_to_int (buf[82]) << 12;
1750 l |= itoa64_to_int (buf[83]) << 18;
1751
1752 digest[62] = (l >> 0) & 0xff;
1753 digest[61] = (l >> 8) & 0xff;
1754 digest[60] = (l >> 16) & 0xff;
1755
1756 l = itoa64_to_int (buf[84]) << 0;
1757 l |= itoa64_to_int (buf[85]) << 6;
1758
1759 digest[63] = (l >> 16) & 0xff;
1760 }
1761
1762 void sha512aix_encode (u8 digest[64], u8 buf[86])
1763 {
1764 int l;
1765
1766 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1767
1768 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1769 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1770 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1771 buf[ 3] = int_to_itoa64 (l & 0x3f);
1772
1773 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1774
1775 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1776 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1777 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1778 buf[ 7] = int_to_itoa64 (l & 0x3f);
1779
1780 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1781
1782 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1784 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1785 buf[11] = int_to_itoa64 (l & 0x3f);
1786
1787 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1788
1789 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1791 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1792 buf[15] = int_to_itoa64 (l & 0x3f);
1793
1794 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1795
1796 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1798 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1799 buf[19] = int_to_itoa64 (l & 0x3f);
1800
1801 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1802
1803 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1805 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1806 buf[23] = int_to_itoa64 (l & 0x3f);
1807
1808 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1809
1810 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1812 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1813 buf[27] = int_to_itoa64 (l & 0x3f);
1814
1815 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1816
1817 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1819 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1820 buf[31] = int_to_itoa64 (l & 0x3f);
1821
1822 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1823
1824 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1826 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1827 buf[35] = int_to_itoa64 (l & 0x3f);
1828
1829 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1830
1831 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1833 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1834 buf[39] = int_to_itoa64 (l & 0x3f);
1835
1836 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1837
1838 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1840 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1841 buf[43] = int_to_itoa64 (l & 0x3f);
1842
1843 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1844
1845 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1847 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1848 buf[47] = int_to_itoa64 (l & 0x3f);
1849
1850 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1851
1852 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1854 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1855 buf[51] = int_to_itoa64 (l & 0x3f);
1856
1857 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1858
1859 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1861 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1862 buf[55] = int_to_itoa64 (l & 0x3f);
1863
1864 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1865
1866 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1868 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1869 buf[59] = int_to_itoa64 (l & 0x3f);
1870
1871 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1872
1873 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1875 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1876 buf[63] = int_to_itoa64 (l & 0x3f);
1877
1878 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1879
1880 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1882 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1883 buf[67] = int_to_itoa64 (l & 0x3f);
1884
1885 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1886
1887 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1889 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1890 buf[71] = int_to_itoa64 (l & 0x3f);
1891
1892 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1893
1894 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1896 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1897 buf[75] = int_to_itoa64 (l & 0x3f);
1898
1899 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1900
1901 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1903 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1904 buf[79] = int_to_itoa64 (l & 0x3f);
1905
1906 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1907
1908 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1909 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1910 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1911 buf[83] = int_to_itoa64 (l & 0x3f);
1912
1913 l = 0 | 0 | (digest[63] << 16);
1914
1915 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1916 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1917 }
1918
1919 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1920 {
1921 int l;
1922
1923 l = itoa64_to_int (buf[ 0]) << 0;
1924 l |= itoa64_to_int (buf[ 1]) << 6;
1925 l |= itoa64_to_int (buf[ 2]) << 12;
1926 l |= itoa64_to_int (buf[ 3]) << 18;
1927
1928 digest[ 0] = (l >> 16) & 0xff;
1929 digest[10] = (l >> 8) & 0xff;
1930 digest[20] = (l >> 0) & 0xff;
1931
1932 l = itoa64_to_int (buf[ 4]) << 0;
1933 l |= itoa64_to_int (buf[ 5]) << 6;
1934 l |= itoa64_to_int (buf[ 6]) << 12;
1935 l |= itoa64_to_int (buf[ 7]) << 18;
1936
1937 digest[21] = (l >> 16) & 0xff;
1938 digest[ 1] = (l >> 8) & 0xff;
1939 digest[11] = (l >> 0) & 0xff;
1940
1941 l = itoa64_to_int (buf[ 8]) << 0;
1942 l |= itoa64_to_int (buf[ 9]) << 6;
1943 l |= itoa64_to_int (buf[10]) << 12;
1944 l |= itoa64_to_int (buf[11]) << 18;
1945
1946 digest[12] = (l >> 16) & 0xff;
1947 digest[22] = (l >> 8) & 0xff;
1948 digest[ 2] = (l >> 0) & 0xff;
1949
1950 l = itoa64_to_int (buf[12]) << 0;
1951 l |= itoa64_to_int (buf[13]) << 6;
1952 l |= itoa64_to_int (buf[14]) << 12;
1953 l |= itoa64_to_int (buf[15]) << 18;
1954
1955 digest[ 3] = (l >> 16) & 0xff;
1956 digest[13] = (l >> 8) & 0xff;
1957 digest[23] = (l >> 0) & 0xff;
1958
1959 l = itoa64_to_int (buf[16]) << 0;
1960 l |= itoa64_to_int (buf[17]) << 6;
1961 l |= itoa64_to_int (buf[18]) << 12;
1962 l |= itoa64_to_int (buf[19]) << 18;
1963
1964 digest[24] = (l >> 16) & 0xff;
1965 digest[ 4] = (l >> 8) & 0xff;
1966 digest[14] = (l >> 0) & 0xff;
1967
1968 l = itoa64_to_int (buf[20]) << 0;
1969 l |= itoa64_to_int (buf[21]) << 6;
1970 l |= itoa64_to_int (buf[22]) << 12;
1971 l |= itoa64_to_int (buf[23]) << 18;
1972
1973 digest[15] = (l >> 16) & 0xff;
1974 digest[25] = (l >> 8) & 0xff;
1975 digest[ 5] = (l >> 0) & 0xff;
1976
1977 l = itoa64_to_int (buf[24]) << 0;
1978 l |= itoa64_to_int (buf[25]) << 6;
1979 l |= itoa64_to_int (buf[26]) << 12;
1980 l |= itoa64_to_int (buf[27]) << 18;
1981
1982 digest[ 6] = (l >> 16) & 0xff;
1983 digest[16] = (l >> 8) & 0xff;
1984 digest[26] = (l >> 0) & 0xff;
1985
1986 l = itoa64_to_int (buf[28]) << 0;
1987 l |= itoa64_to_int (buf[29]) << 6;
1988 l |= itoa64_to_int (buf[30]) << 12;
1989 l |= itoa64_to_int (buf[31]) << 18;
1990
1991 digest[27] = (l >> 16) & 0xff;
1992 digest[ 7] = (l >> 8) & 0xff;
1993 digest[17] = (l >> 0) & 0xff;
1994
1995 l = itoa64_to_int (buf[32]) << 0;
1996 l |= itoa64_to_int (buf[33]) << 6;
1997 l |= itoa64_to_int (buf[34]) << 12;
1998 l |= itoa64_to_int (buf[35]) << 18;
1999
2000 digest[18] = (l >> 16) & 0xff;
2001 digest[28] = (l >> 8) & 0xff;
2002 digest[ 8] = (l >> 0) & 0xff;
2003
2004 l = itoa64_to_int (buf[36]) << 0;
2005 l |= itoa64_to_int (buf[37]) << 6;
2006 l |= itoa64_to_int (buf[38]) << 12;
2007 l |= itoa64_to_int (buf[39]) << 18;
2008
2009 digest[ 9] = (l >> 16) & 0xff;
2010 digest[19] = (l >> 8) & 0xff;
2011 digest[29] = (l >> 0) & 0xff;
2012
2013 l = itoa64_to_int (buf[40]) << 0;
2014 l |= itoa64_to_int (buf[41]) << 6;
2015 l |= itoa64_to_int (buf[42]) << 12;
2016
2017 digest[31] = (l >> 8) & 0xff;
2018 digest[30] = (l >> 0) & 0xff;
2019 }
2020
2021 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2022 {
2023 int l;
2024
2025 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2026
2027 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2030 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2031
2032 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2033
2034 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2037 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2038
2039 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2040
2041 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2044 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2045
2046 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2047
2048 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2051 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2052
2053 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2054
2055 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2058 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2059
2060 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2061
2062 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2065 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2066
2067 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2068
2069 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2072 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2073
2074 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2075
2076 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2079 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2080
2081 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2082
2083 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2086 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2087
2088 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2089
2090 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2091 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2093 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2094
2095 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2096
2097 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2098 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2099 buf[42] = int_to_itoa64 (l & 0x3f);
2100 }
2101
2102 void drupal7_decode (u8 digest[64], u8 buf[44])
2103 {
2104 int l;
2105
2106 l = itoa64_to_int (buf[ 0]) << 0;
2107 l |= itoa64_to_int (buf[ 1]) << 6;
2108 l |= itoa64_to_int (buf[ 2]) << 12;
2109 l |= itoa64_to_int (buf[ 3]) << 18;
2110
2111 digest[ 0] = (l >> 0) & 0xff;
2112 digest[ 1] = (l >> 8) & 0xff;
2113 digest[ 2] = (l >> 16) & 0xff;
2114
2115 l = itoa64_to_int (buf[ 4]) << 0;
2116 l |= itoa64_to_int (buf[ 5]) << 6;
2117 l |= itoa64_to_int (buf[ 6]) << 12;
2118 l |= itoa64_to_int (buf[ 7]) << 18;
2119
2120 digest[ 3] = (l >> 0) & 0xff;
2121 digest[ 4] = (l >> 8) & 0xff;
2122 digest[ 5] = (l >> 16) & 0xff;
2123
2124 l = itoa64_to_int (buf[ 8]) << 0;
2125 l |= itoa64_to_int (buf[ 9]) << 6;
2126 l |= itoa64_to_int (buf[10]) << 12;
2127 l |= itoa64_to_int (buf[11]) << 18;
2128
2129 digest[ 6] = (l >> 0) & 0xff;
2130 digest[ 7] = (l >> 8) & 0xff;
2131 digest[ 8] = (l >> 16) & 0xff;
2132
2133 l = itoa64_to_int (buf[12]) << 0;
2134 l |= itoa64_to_int (buf[13]) << 6;
2135 l |= itoa64_to_int (buf[14]) << 12;
2136 l |= itoa64_to_int (buf[15]) << 18;
2137
2138 digest[ 9] = (l >> 0) & 0xff;
2139 digest[10] = (l >> 8) & 0xff;
2140 digest[11] = (l >> 16) & 0xff;
2141
2142 l = itoa64_to_int (buf[16]) << 0;
2143 l |= itoa64_to_int (buf[17]) << 6;
2144 l |= itoa64_to_int (buf[18]) << 12;
2145 l |= itoa64_to_int (buf[19]) << 18;
2146
2147 digest[12] = (l >> 0) & 0xff;
2148 digest[13] = (l >> 8) & 0xff;
2149 digest[14] = (l >> 16) & 0xff;
2150
2151 l = itoa64_to_int (buf[20]) << 0;
2152 l |= itoa64_to_int (buf[21]) << 6;
2153 l |= itoa64_to_int (buf[22]) << 12;
2154 l |= itoa64_to_int (buf[23]) << 18;
2155
2156 digest[15] = (l >> 0) & 0xff;
2157 digest[16] = (l >> 8) & 0xff;
2158 digest[17] = (l >> 16) & 0xff;
2159
2160 l = itoa64_to_int (buf[24]) << 0;
2161 l |= itoa64_to_int (buf[25]) << 6;
2162 l |= itoa64_to_int (buf[26]) << 12;
2163 l |= itoa64_to_int (buf[27]) << 18;
2164
2165 digest[18] = (l >> 0) & 0xff;
2166 digest[19] = (l >> 8) & 0xff;
2167 digest[20] = (l >> 16) & 0xff;
2168
2169 l = itoa64_to_int (buf[28]) << 0;
2170 l |= itoa64_to_int (buf[29]) << 6;
2171 l |= itoa64_to_int (buf[30]) << 12;
2172 l |= itoa64_to_int (buf[31]) << 18;
2173
2174 digest[21] = (l >> 0) & 0xff;
2175 digest[22] = (l >> 8) & 0xff;
2176 digest[23] = (l >> 16) & 0xff;
2177
2178 l = itoa64_to_int (buf[32]) << 0;
2179 l |= itoa64_to_int (buf[33]) << 6;
2180 l |= itoa64_to_int (buf[34]) << 12;
2181 l |= itoa64_to_int (buf[35]) << 18;
2182
2183 digest[24] = (l >> 0) & 0xff;
2184 digest[25] = (l >> 8) & 0xff;
2185 digest[26] = (l >> 16) & 0xff;
2186
2187 l = itoa64_to_int (buf[36]) << 0;
2188 l |= itoa64_to_int (buf[37]) << 6;
2189 l |= itoa64_to_int (buf[38]) << 12;
2190 l |= itoa64_to_int (buf[39]) << 18;
2191
2192 digest[27] = (l >> 0) & 0xff;
2193 digest[28] = (l >> 8) & 0xff;
2194 digest[29] = (l >> 16) & 0xff;
2195
2196 l = itoa64_to_int (buf[40]) << 0;
2197 l |= itoa64_to_int (buf[41]) << 6;
2198 l |= itoa64_to_int (buf[42]) << 12;
2199 l |= itoa64_to_int (buf[43]) << 18;
2200
2201 digest[30] = (l >> 0) & 0xff;
2202 digest[31] = (l >> 8) & 0xff;
2203 digest[32] = (l >> 16) & 0xff;
2204
2205 digest[33] = 0;
2206 digest[34] = 0;
2207 digest[35] = 0;
2208 digest[36] = 0;
2209 digest[37] = 0;
2210 digest[38] = 0;
2211 digest[39] = 0;
2212 digest[40] = 0;
2213 digest[41] = 0;
2214 digest[42] = 0;
2215 digest[43] = 0;
2216 digest[44] = 0;
2217 digest[45] = 0;
2218 digest[46] = 0;
2219 digest[47] = 0;
2220 digest[48] = 0;
2221 digest[49] = 0;
2222 digest[50] = 0;
2223 digest[51] = 0;
2224 digest[52] = 0;
2225 digest[53] = 0;
2226 digest[54] = 0;
2227 digest[55] = 0;
2228 digest[56] = 0;
2229 digest[57] = 0;
2230 digest[58] = 0;
2231 digest[59] = 0;
2232 digest[60] = 0;
2233 digest[61] = 0;
2234 digest[62] = 0;
2235 digest[63] = 0;
2236 }
2237
2238 void drupal7_encode (u8 digest[64], u8 buf[43])
2239 {
2240 int l;
2241
2242 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2243
2244 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2245 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2246 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2247 buf[ 3] = int_to_itoa64 (l & 0x3f);
2248
2249 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2250
2251 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2252 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2253 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2254 buf[ 7] = int_to_itoa64 (l & 0x3f);
2255
2256 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2257
2258 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2260 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2261 buf[11] = int_to_itoa64 (l & 0x3f);
2262
2263 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2264
2265 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2267 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2268 buf[15] = int_to_itoa64 (l & 0x3f);
2269
2270 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2271
2272 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2274 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2275 buf[19] = int_to_itoa64 (l & 0x3f);
2276
2277 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2278
2279 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2281 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2282 buf[23] = int_to_itoa64 (l & 0x3f);
2283
2284 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2285
2286 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2288 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2289 buf[27] = int_to_itoa64 (l & 0x3f);
2290
2291 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2292
2293 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2295 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2296 buf[31] = int_to_itoa64 (l & 0x3f);
2297
2298 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2299
2300 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2302 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2303 buf[35] = int_to_itoa64 (l & 0x3f);
2304
2305 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2306
2307 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2309 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2310 buf[39] = int_to_itoa64 (l & 0x3f);
2311
2312 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2313
2314 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2315 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2316 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2317 //buf[43] = int_to_itoa64 (l & 0x3f);
2318 }
2319
2320 /**
2321 * tty
2322 */
2323
2324 #ifdef LINUX
2325 static struct termio savemodes;
2326 static int havemodes = 0;
2327
2328 int tty_break()
2329 {
2330 struct termio modmodes;
2331
2332 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2333
2334 havemodes = 1;
2335
2336 modmodes = savemodes;
2337 modmodes.c_lflag &= ~ICANON;
2338 modmodes.c_cc[VMIN] = 1;
2339 modmodes.c_cc[VTIME] = 0;
2340
2341 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2342 }
2343
2344 int tty_getchar()
2345 {
2346 fd_set rfds;
2347
2348 FD_ZERO (&rfds);
2349
2350 FD_SET (fileno (stdin), &rfds);
2351
2352 struct timeval tv;
2353
2354 tv.tv_sec = 1;
2355 tv.tv_usec = 0;
2356
2357 int retval = select (1, &rfds, NULL, NULL, &tv);
2358
2359 if (retval == 0) return 0;
2360 if (retval == -1) return -1;
2361
2362 return getchar();
2363 }
2364
2365 int tty_fix()
2366 {
2367 if (!havemodes) return 0;
2368
2369 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2370 }
2371 #endif
2372
2373 #ifdef OSX
2374 static struct termios savemodes;
2375 static int havemodes = 0;
2376
2377 int tty_break()
2378 {
2379 struct termios modmodes;
2380
2381 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2382
2383 havemodes = 1;
2384
2385 modmodes = savemodes;
2386 modmodes.c_lflag &= ~ICANON;
2387 modmodes.c_cc[VMIN] = 1;
2388 modmodes.c_cc[VTIME] = 0;
2389
2390 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2391 }
2392
2393 int tty_getchar()
2394 {
2395 fd_set rfds;
2396
2397 FD_ZERO (&rfds);
2398
2399 FD_SET (fileno (stdin), &rfds);
2400
2401 struct timeval tv;
2402
2403 tv.tv_sec = 1;
2404 tv.tv_usec = 0;
2405
2406 int retval = select (1, &rfds, NULL, NULL, &tv);
2407
2408 if (retval == 0) return 0;
2409 if (retval == -1) return -1;
2410
2411 return getchar();
2412 }
2413
2414 int tty_fix()
2415 {
2416 if (!havemodes) return 0;
2417
2418 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2419 }
2420 #endif
2421
2422 #ifdef WIN
2423 static DWORD saveMode = 0;
2424
2425 int tty_break()
2426 {
2427 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2428
2429 GetConsoleMode (stdinHandle, &saveMode);
2430 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2431
2432 return 0;
2433 }
2434
2435 int tty_getchar()
2436 {
2437 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2438
2439 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2440
2441 if (rc == WAIT_TIMEOUT) return 0;
2442 if (rc == WAIT_ABANDONED) return -1;
2443 if (rc == WAIT_FAILED) return -1;
2444
2445 // The whole ReadConsoleInput () part is a workaround.
2446 // For some unknown reason, maybe a mingw bug, a random signal
2447 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2448 // Then it wants to read with getche () a keyboard input
2449 // which has never been made.
2450
2451 INPUT_RECORD buf[100];
2452
2453 DWORD num = 0;
2454
2455 ReadConsoleInput (stdinHandle, buf, 100, &num);
2456
2457 FlushConsoleInputBuffer (stdinHandle);
2458
2459 for (uint i = 0; i < num; i++)
2460 {
2461 if (buf[i].EventType != KEY_EVENT) continue;
2462
2463 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2464
2465 if (KeyEvent.bKeyDown != TRUE) continue;
2466
2467 return KeyEvent.uChar.AsciiChar;
2468 }
2469
2470 return 0;
2471 }
2472
2473 int tty_fix()
2474 {
2475 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2476
2477 SetConsoleMode (stdinHandle, saveMode);
2478
2479 return 0;
2480 }
2481 #endif
2482
2483 /**
2484 * mem alloc
2485 */
2486
2487 #define MSG_ENOMEM "Insufficient memory available"
2488
2489 void *mycalloc (size_t nmemb, size_t size)
2490 {
2491 void *p = calloc (nmemb, size);
2492
2493 if (p == NULL)
2494 {
2495 log_error ("ERROR: %s", MSG_ENOMEM);
2496
2497 exit (-1);
2498 }
2499
2500 return (p);
2501 }
2502
2503 void *mymalloc (size_t size)
2504 {
2505 void *p = malloc (size);
2506
2507 if (p == NULL)
2508 {
2509 log_error ("ERROR: %s", MSG_ENOMEM);
2510
2511 exit (-1);
2512 }
2513
2514 memset (p, 0, size);
2515
2516 return (p);
2517 }
2518
2519 void myfree (void *ptr)
2520 {
2521 if (ptr == NULL) return;
2522
2523 free (ptr);
2524 }
2525
2526 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2527 {
2528 void *p = realloc (ptr, oldsz + add);
2529
2530 if (p == NULL)
2531 {
2532 log_error ("ERROR: %s", MSG_ENOMEM);
2533
2534 exit (-1);
2535 }
2536
2537 memset ((char *) p + oldsz, 0, add);
2538
2539 return (p);
2540 }
2541
2542 char *mystrdup (const char *s)
2543 {
2544 const size_t len = strlen (s);
2545
2546 char *b = (char *) mymalloc (len + 1);
2547
2548 memcpy (b, s, len);
2549
2550 return (b);
2551 }
2552
2553 FILE *logfile_open (char *logfile)
2554 {
2555 FILE *fp = fopen (logfile, "ab");
2556
2557 if (fp == NULL)
2558 {
2559 fp = stdout;
2560 }
2561
2562 return fp;
2563 }
2564
2565 void logfile_close (FILE *fp)
2566 {
2567 if (fp == stdout) return;
2568
2569 fclose (fp);
2570 }
2571
2572 void logfile_append (const char *fmt, ...)
2573 {
2574 if (data.logfile_disable == 1) return;
2575
2576 FILE *fp = logfile_open (data.logfile);
2577
2578 va_list ap;
2579
2580 va_start (ap, fmt);
2581
2582 vfprintf (fp, fmt, ap);
2583
2584 va_end (ap);
2585
2586 fputc ('\n', fp);
2587
2588 fflush (fp);
2589
2590 logfile_close (fp);
2591 }
2592
2593 int logfile_generate_id ()
2594 {
2595 const int n = rand ();
2596
2597 time_t t;
2598
2599 time (&t);
2600
2601 return t + n;
2602 }
2603
2604 char *logfile_generate_topid ()
2605 {
2606 const int id = logfile_generate_id ();
2607
2608 char *topid = (char *) mymalloc (1 + 16 + 1);
2609
2610 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 memset (css_uniq, 0, css_uniq_sz);
3345
3346 size_t i;
3347
3348 for (i = 0; i < cs->cs_len; i++)
3349 {
3350 const uint u = cs->cs_buf[i];
3351
3352 css_uniq[u] = 1;
3353 }
3354
3355 for (i = 0; i < in_len; i++)
3356 {
3357 uint u = in_buf[i] & 0xff;
3358
3359 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3360
3361 if (css_uniq[u] == 1) continue;
3362
3363 css_uniq[u] = 1;
3364
3365 cs->cs_buf[cs->cs_len] = u;
3366
3367 cs->cs_len++;
3368 }
3369
3370 myfree (css_uniq);
3371 }
3372
3373 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3374 {
3375 size_t in_pos;
3376
3377 for (in_pos = 0; in_pos < in_len; in_pos++)
3378 {
3379 uint p0 = in_buf[in_pos] & 0xff;
3380
3381 if (interpret == 1 && p0 == '?')
3382 {
3383 in_pos++;
3384
3385 if (in_pos == in_len) break;
3386
3387 uint p1 = in_buf[in_pos] & 0xff;
3388
3389 switch (p1)
3390 {
3391 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3392 break;
3393 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3394 break;
3395 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3396 break;
3397 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3398 break;
3399 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3400 break;
3401 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3402 break;
3403 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3404 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3405 break;
3406 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3407 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3408 break;
3409 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3410 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3411 break;
3412 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3413 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3414 break;
3415 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3416 break;
3417 default: log_error ("Syntax error: %s", in_buf);
3418 exit (-1);
3419 }
3420 }
3421 else
3422 {
3423 if (data.hex_charset)
3424 {
3425 in_pos++;
3426
3427 if (in_pos == in_len)
3428 {
3429 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3430
3431 exit (-1);
3432 }
3433
3434 uint p1 = in_buf[in_pos] & 0xff;
3435
3436 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3437 {
3438 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3439
3440 exit (-1);
3441 }
3442
3443 uint chr = 0;
3444
3445 chr = hex_convert (p1) << 0;
3446 chr |= hex_convert (p0) << 4;
3447
3448 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3449 }
3450 else
3451 {
3452 uint chr = p0;
3453
3454 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3455 }
3456 }
3457 }
3458 }
3459
3460 u64 mp_get_sum (uint css_cnt, cs_t *css)
3461 {
3462 u64 sum = 1;
3463
3464 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3465 {
3466 sum *= css[css_pos].cs_len;
3467 }
3468
3469 return (sum);
3470 }
3471
3472 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3473 {
3474 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3475
3476 uint mask_pos;
3477 uint css_pos;
3478
3479 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3480 {
3481 char p0 = mask_buf[mask_pos];
3482
3483 if (p0 == '?')
3484 {
3485 mask_pos++;
3486
3487 if (mask_pos == mask_len) break;
3488
3489 char p1 = mask_buf[mask_pos];
3490
3491 uint chr = p1;
3492
3493 switch (p1)
3494 {
3495 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3496 break;
3497 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3498 break;
3499 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3500 break;
3501 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3502 break;
3503 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3504 break;
3505 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3506 break;
3507 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3508 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3509 break;
3510 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3511 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3512 break;
3513 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3514 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3515 break;
3516 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3517 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3518 break;
3519 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3520 break;
3521 default: log_error ("ERROR: syntax error: %s", mask_buf);
3522 exit (-1);
3523 }
3524 }
3525 else
3526 {
3527 if (data.hex_charset)
3528 {
3529 mask_pos++;
3530
3531 // if there is no 2nd hex character, show an error:
3532
3533 if (mask_pos == mask_len)
3534 {
3535 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3536
3537 exit (-1);
3538 }
3539
3540 char p1 = mask_buf[mask_pos];
3541
3542 // if they are not valid hex character, show an error:
3543
3544 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3545 {
3546 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3547
3548 exit (-1);
3549 }
3550
3551 uint chr = 0;
3552
3553 chr |= hex_convert (p1) << 0;
3554 chr |= hex_convert (p0) << 4;
3555
3556 mp_add_cs_buf (&chr, 1, css, css_pos);
3557 }
3558 else
3559 {
3560 uint chr = p0;
3561
3562 mp_add_cs_buf (&chr, 1, css, css_pos);
3563 }
3564 }
3565 }
3566
3567 if (css_pos == 0)
3568 {
3569 log_error ("ERROR: invalid mask length (0)");
3570
3571 exit (-1);
3572 }
3573
3574 *css_cnt = css_pos;
3575
3576 return (css);
3577 }
3578
3579 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3580 {
3581 for (int i = 0; i < css_cnt; i++)
3582 {
3583 uint len = css[i].cs_len;
3584 u64 next = val / len;
3585 uint pos = val % len;
3586 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3587 val = next;
3588 }
3589 }
3590
3591 void mp_cut_at (char *mask, uint max)
3592 {
3593 uint i;
3594 uint j;
3595 uint mask_len = strlen (mask);
3596
3597 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3598 {
3599 if (mask[i] == '?') i++;
3600 }
3601
3602 mask[i] = 0;
3603 }
3604
3605 void mp_setup_sys (cs_t *mp_sys)
3606 {
3607 uint pos;
3608 uint chr;
3609 uint donec[CHARSIZ];
3610
3611 memset (donec, 0, sizeof (donec));
3612
3613 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3614 mp_sys[0].cs_buf[pos++] = chr;
3615 mp_sys[0].cs_len = pos; }
3616
3617 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3618 mp_sys[1].cs_buf[pos++] = chr;
3619 mp_sys[1].cs_len = pos; }
3620
3621 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3622 mp_sys[2].cs_buf[pos++] = chr;
3623 mp_sys[2].cs_len = pos; }
3624
3625 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3626 mp_sys[3].cs_buf[pos++] = chr;
3627 mp_sys[3].cs_len = pos; }
3628
3629 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3630 mp_sys[4].cs_len = pos; }
3631
3632 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3633 mp_sys[5].cs_len = pos; }
3634 }
3635
3636 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3637 {
3638 FILE *fp = fopen (buf, "rb");
3639
3640 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3641 {
3642 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3643 }
3644 else
3645 {
3646 char mp_file[1024];
3647
3648 memset (mp_file, 0, sizeof (mp_file));
3649
3650 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3651
3652 fclose (fp);
3653
3654 len = in_superchop (mp_file);
3655
3656 if (len == 0)
3657 {
3658 log_info ("WARNING: charset file corrupted");
3659
3660 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3661 }
3662 else
3663 {
3664 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3665 }
3666 }
3667 }
3668
3669 void mp_reset_usr (cs_t *mp_usr, uint index)
3670 {
3671 mp_usr[index].cs_len = 0;
3672
3673 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3674 }
3675
3676 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3677 {
3678 char *new_mask_buf = (char *) mymalloc (256);
3679
3680 uint mask_pos;
3681
3682 uint css_pos;
3683
3684 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3685 {
3686 if (css_pos == len) break;
3687
3688 char p0 = mask_buf[mask_pos];
3689
3690 new_mask_buf[mask_pos] = p0;
3691
3692 if (p0 == '?')
3693 {
3694 mask_pos++;
3695
3696 if (mask_pos == mask_len) break;
3697
3698 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3699 }
3700 else
3701 {
3702 if (data.hex_charset)
3703 {
3704 mask_pos++;
3705
3706 if (mask_pos == mask_len)
3707 {
3708 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3709
3710 exit (-1);
3711 }
3712
3713 char p1 = mask_buf[mask_pos];
3714
3715 // if they are not valid hex character, show an error:
3716
3717 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3718 {
3719 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3720
3721 exit (-1);
3722 }
3723
3724 new_mask_buf[mask_pos] = p1;
3725 }
3726 }
3727 }
3728
3729 if (css_pos == len) return (new_mask_buf);
3730
3731 myfree (new_mask_buf);
3732
3733 return (NULL);
3734 }
3735
3736 /**
3737 * statprocessor
3738 */
3739
3740 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3741 {
3742 u64 sum = 1;
3743
3744 uint i;
3745
3746 for (i = start; i < stop; i++)
3747 {
3748 sum *= root_css_buf[i].cs_len;
3749 }
3750
3751 return (sum);
3752 }
3753
3754 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3755 {
3756 u64 v = ctx;
3757
3758 cs_t *cs = &root_css_buf[start];
3759
3760 uint i;
3761
3762 for (i = start; i < stop; i++)
3763 {
3764 const u64 m = v % cs->cs_len;
3765 const u64 d = v / cs->cs_len;
3766
3767 v = d;
3768
3769 const uint k = cs->cs_buf[m];
3770
3771 pw_buf[i - start] = (char) k;
3772
3773 cs = &markov_css_buf[(i * CHARSIZ) + k];
3774 }
3775 }
3776
3777 int sp_comp_val (const void *p1, const void *p2)
3778 {
3779 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3780 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3781
3782 return b2->val - b1->val;
3783 }
3784
3785 void sp_setup_tbl (const char *shared_dir, char *hcstat, uint disable, uint classic, hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf)
3786 {
3787 uint i;
3788 uint j;
3789 uint k;
3790
3791 /**
3792 * Initialize hcstats
3793 */
3794
3795 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3796
3797 u64 *root_stats_ptr = root_stats_buf;
3798
3799 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3800
3801 for (i = 0; i < SP_PW_MAX; i++)
3802 {
3803 root_stats_buf_by_pos[i] = root_stats_ptr;
3804
3805 root_stats_ptr += CHARSIZ;
3806 }
3807
3808 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3809
3810 u64 *markov_stats_ptr = markov_stats_buf;
3811
3812 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3813
3814 for (i = 0; i < SP_PW_MAX; i++)
3815 {
3816 for (j = 0; j < CHARSIZ; j++)
3817 {
3818 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3819
3820 markov_stats_ptr += CHARSIZ;
3821 }
3822 }
3823
3824 /**
3825 * Load hcstats File
3826 */
3827
3828 if (hcstat == NULL)
3829 {
3830 char hcstat_tmp[256];
3831
3832 memset (hcstat_tmp, 0, sizeof (hcstat_tmp));
3833
3834 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3835
3836 hcstat = hcstat_tmp;
3837 }
3838
3839 FILE *fd = fopen (hcstat, "rb");
3840
3841 if (fd == NULL)
3842 {
3843 log_error ("%s: %s", hcstat, strerror (errno));
3844
3845 exit (-1);
3846 }
3847
3848 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3849 {
3850 log_error ("%s: Could not load data", hcstat);
3851
3852 exit (-1);
3853 }
3854
3855 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3856 {
3857 log_error ("%s: Could not load data", hcstat);
3858
3859 exit (-1);
3860 }
3861
3862 fclose (fd);
3863
3864 /**
3865 * Markov modifier of hcstat_table on user request
3866 */
3867
3868 if (disable)
3869 {
3870 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3871 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3872 }
3873
3874 if (classic)
3875 {
3876 /* Add all stats to first position */
3877
3878 for (i = 1; i < SP_PW_MAX; i++)
3879 {
3880 u64 *out = root_stats_buf_by_pos[0];
3881 u64 *in = root_stats_buf_by_pos[i];
3882
3883 for (j = 0; j < CHARSIZ; j++)
3884 {
3885 *out++ += *in++;
3886 }
3887 }
3888
3889 for (i = 1; i < SP_PW_MAX; i++)
3890 {
3891 u64 *out = markov_stats_buf_by_key[0][0];
3892 u64 *in = markov_stats_buf_by_key[i][0];
3893
3894 for (j = 0; j < CHARSIZ; j++)
3895 {
3896 for (k = 0; k < CHARSIZ; k++)
3897 {
3898 *out++ += *in++;
3899 }
3900 }
3901 }
3902
3903 /* copy them to all pw_positions */
3904
3905 for (i = 1; i < SP_PW_MAX; i++)
3906 {
3907 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
3908 }
3909
3910 for (i = 1; i < SP_PW_MAX; i++)
3911 {
3912 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
3913 }
3914 }
3915
3916 /**
3917 * Initialize tables
3918 */
3919
3920 hcstat_table_t *root_table_ptr = root_table_buf;
3921
3922 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3923
3924 for (i = 0; i < SP_PW_MAX; i++)
3925 {
3926 root_table_buf_by_pos[i] = root_table_ptr;
3927
3928 root_table_ptr += CHARSIZ;
3929 }
3930
3931 hcstat_table_t *markov_table_ptr = markov_table_buf;
3932
3933 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3934
3935 for (i = 0; i < SP_PW_MAX; i++)
3936 {
3937 for (j = 0; j < CHARSIZ; j++)
3938 {
3939 markov_table_buf_by_key[i][j] = markov_table_ptr;
3940
3941 markov_table_ptr += CHARSIZ;
3942 }
3943 }
3944
3945 /**
3946 * Convert hcstat to tables
3947 */
3948
3949 for (i = 0; i < SP_ROOT_CNT; i++)
3950 {
3951 uint key = i % CHARSIZ;
3952
3953 root_table_buf[i].key = key;
3954 root_table_buf[i].val = root_stats_buf[i];
3955 }
3956
3957 for (i = 0; i < SP_MARKOV_CNT; i++)
3958 {
3959 uint key = i % CHARSIZ;
3960
3961 markov_table_buf[i].key = key;
3962 markov_table_buf[i].val = markov_stats_buf[i];
3963 }
3964
3965 myfree (root_stats_buf);
3966 myfree (markov_stats_buf);
3967
3968 /**
3969 * Finally sort them
3970 */
3971
3972 for (i = 0; i < SP_PW_MAX; i++)
3973 {
3974 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3975 }
3976
3977 for (i = 0; i < SP_PW_MAX; i++)
3978 {
3979 for (j = 0; j < CHARSIZ; j++)
3980 {
3981 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3982 }
3983 }
3984 }
3985
3986 void sp_tbl_to_css (hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint threshold, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3987 {
3988 /**
3989 * Convert tables to css
3990 */
3991
3992 for (uint i = 0; i < SP_ROOT_CNT; i++)
3993 {
3994 uint pw_pos = i / CHARSIZ;
3995
3996 cs_t *cs = &root_css_buf[pw_pos];
3997
3998 if (cs->cs_len == threshold) continue;
3999
4000 uint key = root_table_buf[i].key;
4001
4002 if (uniq_tbls[pw_pos][key] == 0) continue;
4003
4004 cs->cs_buf[cs->cs_len] = key;
4005
4006 cs->cs_len++;
4007 }
4008
4009 /**
4010 * Convert table to css
4011 */
4012
4013 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4014 {
4015 uint c = i / CHARSIZ;
4016
4017 cs_t *cs = &markov_css_buf[c];
4018
4019 if (cs->cs_len == threshold) continue;
4020
4021 uint pw_pos = c / CHARSIZ;
4022
4023 uint key = markov_table_buf[i].key;
4024
4025 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4026
4027 cs->cs_buf[cs->cs_len] = key;
4028
4029 cs->cs_len++;
4030 }
4031
4032 /*
4033 for (uint i = 0; i < 8; i++)
4034 {
4035 for (uint j = 0x20; j < 0x80; j++)
4036 {
4037 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4038
4039 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4040
4041 for (uint k = 0; k < 10; k++)
4042 {
4043 printf (" %u\n", ptr->cs_buf[k]);
4044 }
4045 }
4046 }
4047 */
4048 }
4049
4050 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4051 {
4052 for (uint i = 0; i < SP_PW_MAX; i += 2)
4053 {
4054 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4055
4056 out += CHARSIZ;
4057 in += CHARSIZ;
4058
4059 out->key = 0;
4060 out->val = 1;
4061
4062 out++;
4063
4064 for (uint j = 1; j < CHARSIZ; j++)
4065 {
4066 out->key = j;
4067 out->val = 0;
4068
4069 out++;
4070 }
4071 }
4072 }
4073
4074 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4075 {
4076 for (uint i = 0; i < SP_PW_MAX; i += 2)
4077 {
4078 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4079
4080 out += CHARSIZ * CHARSIZ;
4081 in += CHARSIZ * CHARSIZ;
4082
4083 for (uint j = 0; j < CHARSIZ; j++)
4084 {
4085 out->key = 0;
4086 out->val = 1;
4087
4088 out++;
4089
4090 for (uint k = 1; k < CHARSIZ; k++)
4091 {
4092 out->key = k;
4093 out->val = 0;
4094
4095 out++;
4096 }
4097 }
4098 }
4099 }
4100
4101 /**
4102 * mixed shared functions
4103 */
4104
4105 void dump_hex (const u8 *s, const int sz)
4106 {
4107 for (int i = 0; i < sz; i++)
4108 {
4109 log_info_nn ("%02x ", s[i]);
4110 }
4111
4112 log_info ("");
4113 }
4114
4115 void usage_mini_print (const char *progname)
4116 {
4117 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4118 }
4119
4120 void usage_big_print (const char *progname)
4121 {
4122 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4123 }
4124
4125 char *get_exec_path ()
4126 {
4127 int exec_path_len = 1024;
4128
4129 char *exec_path = (char *) mymalloc (exec_path_len);
4130
4131 #ifdef LINUX
4132
4133 char tmp[32] = { 0 };
4134
4135 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4136
4137 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4138
4139 #elif WIN
4140
4141 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4142
4143 #elif OSX
4144
4145 uint size = exec_path_len;
4146
4147 if (_NSGetExecutablePath (exec_path, &size) != 0)
4148 {
4149 log_error("! executable path buffer too small\n");
4150
4151 exit (-1);
4152 }
4153
4154 const int len = strlen (exec_path);
4155
4156 #else
4157 #error Your Operating System is not supported or detected
4158 #endif
4159
4160 exec_path[len] = 0;
4161
4162 return exec_path;
4163 }
4164
4165 char *get_install_dir (const char *progname)
4166 {
4167 char *install_dir = mystrdup (progname);
4168 char *last_slash = NULL;
4169
4170 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4171 {
4172 *last_slash = 0;
4173 }
4174 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4175 {
4176 *last_slash = 0;
4177 }
4178 else
4179 {
4180 install_dir[0] = '.';
4181 install_dir[1] = 0;
4182 }
4183
4184 return (install_dir);
4185 }
4186
4187 char *get_profile_dir (const char *homedir)
4188 {
4189 #define DOT_HASHCAT ".hashcat"
4190
4191 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT);
4192
4193 char *profile_dir = (char *) mymalloc (len + 1);
4194
4195 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4196
4197 return profile_dir;
4198 }
4199
4200 char *get_session_dir (const char *profile_dir)
4201 {
4202 #define SESSIONS_FOLDER "sessions"
4203
4204 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER);
4205
4206 char *session_dir = (char *) mymalloc (len + 1);
4207
4208 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4209
4210 return session_dir;
4211 }
4212
4213 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4214 {
4215 uint crc = ~0;
4216
4217 FILE *fd = fopen (filename, "rb");
4218
4219 if (fd == NULL)
4220 {
4221 log_error ("%s: %s", filename, strerror (errno));
4222
4223 exit (-1);
4224 }
4225
4226 #define MAX_KEY_SIZE (1024 * 1024)
4227
4228 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4229
4230 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4231
4232 fclose (fd);
4233
4234 int kpos = 0;
4235
4236 for (int fpos = 0; fpos < nread; fpos++)
4237 {
4238 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4239
4240 keytab[kpos++] += (crc >> 24) & 0xff;
4241 keytab[kpos++] += (crc >> 16) & 0xff;
4242 keytab[kpos++] += (crc >> 8) & 0xff;
4243 keytab[kpos++] += (crc >> 0) & 0xff;
4244
4245 if (kpos >= 64) kpos = 0;
4246 }
4247
4248 myfree (buf);
4249 }
4250
4251 void set_cpu_affinity (char *cpu_affinity)
4252 {
4253 #ifdef WIN
4254 DWORD_PTR aff_mask = 0;
4255 #elif LINUX
4256 cpu_set_t cpuset;
4257 CPU_ZERO (&cpuset);
4258 #endif
4259
4260 if (cpu_affinity)
4261 {
4262 char *devices = strdup (cpu_affinity);
4263
4264 char *next = strtok (devices, ",");
4265
4266 do
4267 {
4268 uint cpu_id = atoi (next);
4269
4270 if (cpu_id == 0)
4271 {
4272 #ifdef WIN
4273 aff_mask = 0;
4274 #elif LINUX
4275 CPU_ZERO (&cpuset);
4276 #endif
4277
4278 break;
4279 }
4280
4281 if (cpu_id > 32)
4282 {
4283 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4284
4285 exit (-1);
4286 }
4287
4288 #ifdef WIN
4289 aff_mask |= 1 << (cpu_id - 1);
4290 #elif LINUX
4291 CPU_SET ((cpu_id - 1), &cpuset);
4292 #endif
4293
4294 } while ((next = strtok (NULL, ",")) != NULL);
4295
4296 free (devices);
4297 }
4298
4299 #ifdef WIN
4300 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4301 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4302 #elif LINUX
4303 pthread_t thread = pthread_self ();
4304 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4305 #endif
4306 }
4307
4308 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4309 {
4310 char *element, *end;
4311
4312 end = (char *) base + nmemb * size;
4313
4314 for (element = (char *) base; element < end; element += size)
4315 if (!compar (element, key))
4316 return element;
4317
4318 return NULL;
4319 }
4320
4321 int sort_by_salt (const void *v1, const void *v2)
4322 {
4323 const salt_t *s1 = (const salt_t *) v1;
4324 const salt_t *s2 = (const salt_t *) v2;
4325
4326 const int res1 = s1->salt_len - s2->salt_len;
4327
4328 if (res1 != 0) return (res1);
4329
4330 const int res2 = s1->salt_iter - s2->salt_iter;
4331
4332 if (res2 != 0) return (res2);
4333
4334 uint n;
4335
4336 n = 12;
4337
4338 while (n--)
4339 {
4340 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4341 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4342 }
4343
4344 n = 8;
4345
4346 while (n--)
4347 {
4348 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4349 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4350 }
4351
4352 return (0);
4353 }
4354
4355 int sort_by_salt_buf (const void *v1, const void *v2)
4356 {
4357 const pot_t *p1 = (const pot_t *) v1;
4358 const pot_t *p2 = (const pot_t *) v2;
4359
4360 const hash_t *h1 = &p1->hash;
4361 const hash_t *h2 = &p2->hash;
4362
4363 const salt_t *s1 = h1->salt;
4364 const salt_t *s2 = h2->salt;
4365
4366 uint n = 12;
4367
4368 while (n--)
4369 {
4370 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4371 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4372 }
4373
4374 return 0;
4375 }
4376
4377 int sort_by_hash_t_salt (const void *v1, const void *v2)
4378 {
4379 const hash_t *h1 = (const hash_t *) v1;
4380 const hash_t *h2 = (const hash_t *) v2;
4381
4382 const salt_t *s1 = h1->salt;
4383 const salt_t *s2 = h2->salt;
4384
4385 // testphase: this should work
4386 uint n = 12;
4387
4388 while (n--)
4389 {
4390 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4391 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4392 }
4393
4394 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4395 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4396 if (s1->salt_len > s2->salt_len) return ( 1);
4397 if (s1->salt_len < s2->salt_len) return (-1);
4398
4399 uint n = s1->salt_len;
4400
4401 while (n--)
4402 {
4403 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4404 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4405 }
4406 */
4407
4408 return 0;
4409 }
4410
4411 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4412 {
4413 const hash_t *h1 = (const hash_t *) v1;
4414 const hash_t *h2 = (const hash_t *) v2;
4415
4416 const salt_t *s1 = h1->salt;
4417 const salt_t *s2 = h2->salt;
4418
4419 // 12 - 2 (since last 2 uints contain the digest)
4420 uint n = 10;
4421
4422 while (n--)
4423 {
4424 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4425 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4426 }
4427
4428 return 0;
4429 }
4430
4431 int sort_by_hash_no_salt (const void *v1, const void *v2)
4432 {
4433 const hash_t *h1 = (const hash_t *) v1;
4434 const hash_t *h2 = (const hash_t *) v2;
4435
4436 const void *d1 = h1->digest;
4437 const void *d2 = h2->digest;
4438
4439 return data.sort_by_digest (d1, d2);
4440 }
4441
4442 int sort_by_hash (const void *v1, const void *v2)
4443 {
4444 const hash_t *h1 = (const hash_t *) v1;
4445 const hash_t *h2 = (const hash_t *) v2;
4446
4447 if (data.isSalted)
4448 {
4449 const salt_t *s1 = h1->salt;
4450 const salt_t *s2 = h2->salt;
4451
4452 int res = sort_by_salt (s1, s2);
4453
4454 if (res != 0) return (res);
4455 }
4456
4457 const void *d1 = h1->digest;
4458 const void *d2 = h2->digest;
4459
4460 return data.sort_by_digest (d1, d2);
4461 }
4462
4463 int sort_by_pot (const void *v1, const void *v2)
4464 {
4465 const pot_t *p1 = (const pot_t *) v1;
4466 const pot_t *p2 = (const pot_t *) v2;
4467
4468 const hash_t *h1 = &p1->hash;
4469 const hash_t *h2 = &p2->hash;
4470
4471 return sort_by_hash (h1, h2);
4472 }
4473
4474 int sort_by_mtime (const void *p1, const void *p2)
4475 {
4476 const char **f1 = (const char **) p1;
4477 const char **f2 = (const char **) p2;
4478
4479 struct stat s1; stat (*f1, &s1);
4480 struct stat s2; stat (*f2, &s2);
4481
4482 return s2.st_mtime - s1.st_mtime;
4483 }
4484
4485 int sort_by_cpu_rule (const void *p1, const void *p2)
4486 {
4487 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4488 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4489
4490 return memcmp (r1, r2, sizeof (cpu_rule_t));
4491 }
4492
4493 int sort_by_kernel_rule (const void *p1, const void *p2)
4494 {
4495 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4496 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4497
4498 return memcmp (r1, r2, sizeof (kernel_rule_t));
4499 }
4500
4501 int sort_by_stringptr (const void *p1, const void *p2)
4502 {
4503 const char **s1 = (const char **) p1;
4504 const char **s2 = (const char **) p2;
4505
4506 return strcmp (*s1, *s2);
4507 }
4508
4509 int sort_by_dictstat (const void *s1, const void *s2)
4510 {
4511 dictstat_t *d1 = (dictstat_t *) s1;
4512 dictstat_t *d2 = (dictstat_t *) s2;
4513
4514 #ifdef LINUX
4515 d2->stat.st_atim = d1->stat.st_atim;
4516 #else
4517 d2->stat.st_atime = d1->stat.st_atime;
4518 #endif
4519
4520 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4521 }
4522
4523 int sort_by_bitmap (const void *p1, const void *p2)
4524 {
4525 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4526 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4527
4528 return b1->collisions - b2->collisions;
4529 }
4530
4531 int sort_by_digest_4_2 (const void *v1, const void *v2)
4532 {
4533 const u32 *d1 = (const u32 *) v1;
4534 const u32 *d2 = (const u32 *) v2;
4535
4536 uint n = 2;
4537
4538 while (n--)
4539 {
4540 if (d1[n] > d2[n]) return ( 1);
4541 if (d1[n] < d2[n]) return (-1);
4542 }
4543
4544 return (0);
4545 }
4546
4547 int sort_by_digest_4_4 (const void *v1, const void *v2)
4548 {
4549 const u32 *d1 = (const u32 *) v1;
4550 const u32 *d2 = (const u32 *) v2;
4551
4552 uint n = 4;
4553
4554 while (n--)
4555 {
4556 if (d1[n] > d2[n]) return ( 1);
4557 if (d1[n] < d2[n]) return (-1);
4558 }
4559
4560 return (0);
4561 }
4562
4563 int sort_by_digest_4_5 (const void *v1, const void *v2)
4564 {
4565 const u32 *d1 = (const u32 *) v1;
4566 const u32 *d2 = (const u32 *) v2;
4567
4568 uint n = 5;
4569
4570 while (n--)
4571 {
4572 if (d1[n] > d2[n]) return ( 1);
4573 if (d1[n] < d2[n]) return (-1);
4574 }
4575
4576 return (0);
4577 }
4578
4579 int sort_by_digest_4_6 (const void *v1, const void *v2)
4580 {
4581 const u32 *d1 = (const u32 *) v1;
4582 const u32 *d2 = (const u32 *) v2;
4583
4584 uint n = 6;
4585
4586 while (n--)
4587 {
4588 if (d1[n] > d2[n]) return ( 1);
4589 if (d1[n] < d2[n]) return (-1);
4590 }
4591
4592 return (0);
4593 }
4594
4595 int sort_by_digest_4_8 (const void *v1, const void *v2)
4596 {
4597 const u32 *d1 = (const u32 *) v1;
4598 const u32 *d2 = (const u32 *) v2;
4599
4600 uint n = 8;
4601
4602 while (n--)
4603 {
4604 if (d1[n] > d2[n]) return ( 1);
4605 if (d1[n] < d2[n]) return (-1);
4606 }
4607
4608 return (0);
4609 }
4610
4611 int sort_by_digest_4_16 (const void *v1, const void *v2)
4612 {
4613 const u32 *d1 = (const u32 *) v1;
4614 const u32 *d2 = (const u32 *) v2;
4615
4616 uint n = 16;
4617
4618 while (n--)
4619 {
4620 if (d1[n] > d2[n]) return ( 1);
4621 if (d1[n] < d2[n]) return (-1);
4622 }
4623
4624 return (0);
4625 }
4626
4627 int sort_by_digest_4_32 (const void *v1, const void *v2)
4628 {
4629 const u32 *d1 = (const u32 *) v1;
4630 const u32 *d2 = (const u32 *) v2;
4631
4632 uint n = 32;
4633
4634 while (n--)
4635 {
4636 if (d1[n] > d2[n]) return ( 1);
4637 if (d1[n] < d2[n]) return (-1);
4638 }
4639
4640 return (0);
4641 }
4642
4643 int sort_by_digest_4_64 (const void *v1, const void *v2)
4644 {
4645 const u32 *d1 = (const u32 *) v1;
4646 const u32 *d2 = (const u32 *) v2;
4647
4648 uint n = 64;
4649
4650 while (n--)
4651 {
4652 if (d1[n] > d2[n]) return ( 1);
4653 if (d1[n] < d2[n]) return (-1);
4654 }
4655
4656 return (0);
4657 }
4658
4659 int sort_by_digest_8_8 (const void *v1, const void *v2)
4660 {
4661 const u64 *d1 = (const u64 *) v1;
4662 const u64 *d2 = (const u64 *) v2;
4663
4664 uint n = 8;
4665
4666 while (n--)
4667 {
4668 if (d1[n] > d2[n]) return ( 1);
4669 if (d1[n] < d2[n]) return (-1);
4670 }
4671
4672 return (0);
4673 }
4674
4675 int sort_by_digest_8_16 (const void *v1, const void *v2)
4676 {
4677 const u64 *d1 = (const u64 *) v1;
4678 const u64 *d2 = (const u64 *) v2;
4679
4680 uint n = 16;
4681
4682 while (n--)
4683 {
4684 if (d1[n] > d2[n]) return ( 1);
4685 if (d1[n] < d2[n]) return (-1);
4686 }
4687
4688 return (0);
4689 }
4690
4691 int sort_by_digest_8_25 (const void *v1, const void *v2)
4692 {
4693 const u64 *d1 = (const u64 *) v1;
4694 const u64 *d2 = (const u64 *) v2;
4695
4696 uint n = 25;
4697
4698 while (n--)
4699 {
4700 if (d1[n] > d2[n]) return ( 1);
4701 if (d1[n] < d2[n]) return (-1);
4702 }
4703
4704 return (0);
4705 }
4706
4707 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4708 {
4709 const u32 *d1 = (const u32 *) v1;
4710 const u32 *d2 = (const u32 *) v2;
4711
4712 const uint dgst_pos0 = data.dgst_pos0;
4713 const uint dgst_pos1 = data.dgst_pos1;
4714 const uint dgst_pos2 = data.dgst_pos2;
4715 const uint dgst_pos3 = data.dgst_pos3;
4716
4717 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4718 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4719 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4720 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4721 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4722 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4723 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4724 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4725
4726 return (0);
4727 }
4728
4729 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)
4730 {
4731 uint outfile_autohex = data.outfile_autohex;
4732
4733 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4734
4735 FILE *debug_fp = NULL;
4736
4737 if (debug_file != NULL)
4738 {
4739 debug_fp = fopen (debug_file, "ab");
4740 }
4741 else
4742 {
4743 debug_fp = stderr;
4744 }
4745
4746 if (debug_fp == NULL)
4747 {
4748 log_info ("WARNING: Could not open debug-file for writing");
4749 }
4750 else
4751 {
4752 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4753 {
4754 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4755
4756 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4757 }
4758
4759 fwrite (rule_ptr, rule_len, 1, debug_fp);
4760
4761 if (debug_mode == 4)
4762 {
4763 fputc (':', debug_fp);
4764
4765 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4766 }
4767
4768 fputc ('\n', debug_fp);
4769
4770 if (debug_file != NULL) fclose (debug_fp);
4771 }
4772 }
4773
4774 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4775 {
4776 int needs_hexify = 0;
4777
4778 if (outfile_autohex == 1)
4779 {
4780 for (uint i = 0; i < plain_len; i++)
4781 {
4782 if (plain_ptr[i] < 0x20)
4783 {
4784 needs_hexify = 1;
4785
4786 break;
4787 }
4788
4789 if (plain_ptr[i] > 0x7f)
4790 {
4791 needs_hexify = 1;
4792
4793 break;
4794 }
4795 }
4796 }
4797
4798 if (needs_hexify == 1)
4799 {
4800 fprintf (fp, "$HEX[");
4801
4802 for (uint i = 0; i < plain_len; i++)
4803 {
4804 fprintf (fp, "%02x", plain_ptr[i]);
4805 }
4806
4807 fprintf (fp, "]");
4808 }
4809 else
4810 {
4811 fwrite (plain_ptr, plain_len, 1, fp);
4812 }
4813 }
4814
4815 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)
4816 {
4817 uint outfile_format = data.outfile_format;
4818
4819 char separator = data.separator;
4820
4821 if (outfile_format & OUTFILE_FMT_HASH)
4822 {
4823 fprintf (out_fp, "%s", out_buf);
4824
4825 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4826 {
4827 fputc (separator, out_fp);
4828 }
4829 }
4830 else if (data.username)
4831 {
4832 if (username != NULL)
4833 {
4834 for (uint i = 0; i < user_len; i++)
4835 {
4836 fprintf (out_fp, "%c", username[i]);
4837 }
4838
4839 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4840 {
4841 fputc (separator, out_fp);
4842 }
4843 }
4844 }
4845
4846 if (outfile_format & OUTFILE_FMT_PLAIN)
4847 {
4848 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4849
4850 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4851 {
4852 fputc (separator, out_fp);
4853 }
4854 }
4855
4856 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4857 {
4858 for (uint i = 0; i < plain_len; i++)
4859 {
4860 fprintf (out_fp, "%02x", plain_ptr[i]);
4861 }
4862
4863 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4864 {
4865 fputc (separator, out_fp);
4866 }
4867 }
4868
4869 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4870 {
4871 #ifdef _WIN
4872 __mingw_fprintf (out_fp, "%llu", crackpos);
4873 #endif
4874
4875 #ifdef _POSIX
4876 #ifdef __x86_64__
4877 fprintf (out_fp, "%lu", (unsigned long) crackpos);
4878 #else
4879 fprintf (out_fp, "%llu", crackpos);
4880 #endif
4881 #endif
4882 }
4883
4884 fputc ('\n', out_fp);
4885 }
4886
4887 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)
4888 {
4889 pot_t pot_key;
4890
4891 pot_key.hash.salt = hashes_buf->salt;
4892 pot_key.hash.digest = hashes_buf->digest;
4893
4894 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4895
4896 if (pot_ptr)
4897 {
4898 log_info_nn ("");
4899
4900 input_buf[input_len] = 0;
4901
4902 // user
4903 unsigned char *username = NULL;
4904 uint user_len = 0;
4905
4906 if (data.username)
4907 {
4908 user_t *user = hashes_buf->hash_info->user;
4909
4910 if (user)
4911 {
4912 username = (unsigned char *) (user->user_name);
4913
4914 user_len = user->user_len;
4915 }
4916 }
4917
4918 // do output the line
4919 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4920 }
4921 }
4922
4923 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4924 #define LM_MASKED_PLAIN "[notfound]"
4925
4926 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)
4927 {
4928 // left
4929
4930 pot_t pot_left_key;
4931
4932 pot_left_key.hash.salt = hash_left->salt;
4933 pot_left_key.hash.digest = hash_left->digest;
4934
4935 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4936
4937 // right
4938
4939 uint weak_hash_found = 0;
4940
4941 pot_t pot_right_key;
4942
4943 pot_right_key.hash.salt = hash_right->salt;
4944 pot_right_key.hash.digest = hash_right->digest;
4945
4946 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4947
4948 if (pot_right_ptr == NULL)
4949 {
4950 // special case, if "weak hash"
4951
4952 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4953 {
4954 weak_hash_found = 1;
4955
4956 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4957
4958 // in theory this is not needed, but we are paranoia:
4959
4960 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4961 pot_right_ptr->plain_len = 0;
4962 }
4963 }
4964
4965 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4966 {
4967 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
4968
4969 return;
4970 }
4971
4972 // at least one half was found:
4973
4974 log_info_nn ("");
4975
4976 input_buf[input_len] = 0;
4977
4978 // user
4979
4980 unsigned char *username = NULL;
4981 uint user_len = 0;
4982
4983 if (data.username)
4984 {
4985 user_t *user = hash_left->hash_info->user;
4986
4987 if (user)
4988 {
4989 username = (unsigned char *) (user->user_name);
4990
4991 user_len = user->user_len;
4992 }
4993 }
4994
4995 // mask the part which was not found
4996
4997 uint left_part_masked = 0;
4998 uint right_part_masked = 0;
4999
5000 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5001
5002 if (pot_left_ptr == NULL)
5003 {
5004 left_part_masked = 1;
5005
5006 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5007
5008 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5009
5010 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5011 pot_left_ptr->plain_len = mask_plain_len;
5012 }
5013
5014 if (pot_right_ptr == NULL)
5015 {
5016 right_part_masked = 1;
5017
5018 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5019
5020 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5021
5022 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5023 pot_right_ptr->plain_len = mask_plain_len;
5024 }
5025
5026 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5027
5028 pot_t pot_ptr;
5029
5030 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5031
5032 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5033
5034 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5035
5036 // do output the line
5037
5038 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5039
5040 if (weak_hash_found == 1) myfree (pot_right_ptr);
5041
5042 if (left_part_masked == 1) myfree (pot_left_ptr);
5043 if (right_part_masked == 1) myfree (pot_right_ptr);
5044 }
5045
5046 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)
5047 {
5048 pot_t pot_key;
5049
5050 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5051
5052 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5053
5054 if (pot_ptr == NULL)
5055 {
5056 log_info_nn ("");
5057
5058 input_buf[input_len] = 0;
5059
5060 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5061 }
5062 }
5063
5064 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)
5065 {
5066 // left
5067
5068 pot_t pot_left_key;
5069
5070 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5071
5072 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5073
5074 // right
5075
5076 pot_t pot_right_key;
5077
5078 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5079
5080 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5081
5082 uint weak_hash_found = 0;
5083
5084 if (pot_right_ptr == NULL)
5085 {
5086 // special case, if "weak hash"
5087
5088 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5089 {
5090 weak_hash_found = 1;
5091
5092 // we just need that pot_right_ptr is not a NULL pointer
5093
5094 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5095 }
5096 }
5097
5098 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5099 {
5100 if (weak_hash_found == 1) myfree (pot_right_ptr);
5101
5102 return;
5103 }
5104
5105 // ... at least one part was not cracked
5106
5107 log_info_nn ("");
5108
5109 input_buf[input_len] = 0;
5110
5111 // only show the hash part which is still not cracked
5112
5113 uint user_len = input_len - 32;
5114
5115 char *hash_output = (char *) mymalloc (33);
5116
5117 memcpy (hash_output, input_buf, input_len);
5118
5119 if (pot_left_ptr != NULL)
5120 {
5121 // only show right part (because left part was already found)
5122
5123 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5124
5125 hash_output[user_len + 16] = 0;
5126 }
5127
5128 if (pot_right_ptr != NULL)
5129 {
5130 // only show left part (because right part was already found)
5131
5132 memcpy (hash_output + user_len, input_buf + user_len, 16);
5133
5134 hash_output[user_len + 16] = 0;
5135 }
5136
5137 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5138
5139 myfree (hash_output);
5140
5141 if (weak_hash_found == 1) myfree (pot_right_ptr);
5142 }
5143
5144 uint setup_opencl_platforms_filter (char *opencl_platforms)
5145 {
5146 uint opencl_platforms_filter = 0;
5147
5148 if (opencl_platforms)
5149 {
5150 char *platforms = strdup (opencl_platforms);
5151
5152 char *next = strtok (platforms, ",");
5153
5154 do
5155 {
5156 int platform = atoi (next);
5157
5158 if (platform < 1 || platform > 32)
5159 {
5160 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5161
5162 exit (-1);
5163 }
5164
5165 opencl_platforms_filter |= 1 << (platform - 1);
5166
5167 } while ((next = strtok (NULL, ",")) != NULL);
5168
5169 free (platforms);
5170 }
5171 else
5172 {
5173 opencl_platforms_filter = -1;
5174 }
5175
5176 return opencl_platforms_filter;
5177 }
5178
5179 u32 setup_devices_filter (char *opencl_devices)
5180 {
5181 u32 devices_filter = 0;
5182
5183 if (opencl_devices)
5184 {
5185 char *devices = strdup (opencl_devices);
5186
5187 char *next = strtok (devices, ",");
5188
5189 do
5190 {
5191 int device_id = atoi (next);
5192
5193 if (device_id < 1 || device_id > 32)
5194 {
5195 log_error ("ERROR: invalid device_id %u specified", device_id);
5196
5197 exit (-1);
5198 }
5199
5200 devices_filter |= 1 << (device_id - 1);
5201
5202 } while ((next = strtok (NULL, ",")) != NULL);
5203
5204 free (devices);
5205 }
5206 else
5207 {
5208 devices_filter = -1;
5209 }
5210
5211 return devices_filter;
5212 }
5213
5214 cl_device_type setup_device_types_filter (char *opencl_device_types)
5215 {
5216 cl_device_type device_types_filter = 0;
5217
5218 if (opencl_device_types)
5219 {
5220 char *device_types = strdup (opencl_device_types);
5221
5222 char *next = strtok (device_types, ",");
5223
5224 do
5225 {
5226 int device_type = atoi (next);
5227
5228 if (device_type < 1 || device_type > 3)
5229 {
5230 log_error ("ERROR: invalid device_type %u specified", device_type);
5231
5232 exit (-1);
5233 }
5234
5235 device_types_filter |= 1 << device_type;
5236
5237 } while ((next = strtok (NULL, ",")) != NULL);
5238
5239 free (device_types);
5240 }
5241 else
5242 {
5243 // Do not use CPU by default, this often reduces GPU performance because
5244 // the CPU is too busy to handle GPU synchronization
5245
5246 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5247 }
5248
5249 return device_types_filter;
5250 }
5251
5252 u32 get_random_num (const u32 min, const u32 max)
5253 {
5254 if (min == max) return (min);
5255
5256 return ((rand () % (max - min)) + min);
5257 }
5258
5259 u32 mydivc32 (const u32 dividend, const u32 divisor)
5260 {
5261 u32 quotient = dividend / divisor;
5262
5263 if (dividend % divisor) quotient++;
5264
5265 return quotient;
5266 }
5267
5268 u64 mydivc64 (const u64 dividend, const u64 divisor)
5269 {
5270 u64 quotient = dividend / divisor;
5271
5272 if (dividend % divisor) quotient++;
5273
5274 return quotient;
5275 }
5276
5277 void format_timer_display (struct tm *tm, char *buf, size_t len)
5278 {
5279 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5280 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5281
5282 if (tm->tm_year - 70)
5283 {
5284 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5285 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5286
5287 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5288 }
5289 else if (tm->tm_yday)
5290 {
5291 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5292 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5293
5294 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5295 }
5296 else if (tm->tm_hour)
5297 {
5298 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5299 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5300
5301 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5302 }
5303 else if (tm->tm_min)
5304 {
5305 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5306 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5307
5308 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5309 }
5310 else
5311 {
5312 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5313
5314 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5315 }
5316 }
5317
5318 void format_speed_display (float val, char *buf, size_t len)
5319 {
5320 if (val <= 0)
5321 {
5322 buf[0] = '0';
5323 buf[1] = ' ';
5324 buf[2] = 0;
5325
5326 return;
5327 }
5328
5329 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5330
5331 uint level = 0;
5332
5333 while (val > 99999)
5334 {
5335 val /= 1000;
5336
5337 level++;
5338 }
5339
5340 /* generate output */
5341
5342 if (level == 0)
5343 {
5344 snprintf (buf, len - 1, "%.0f ", val);
5345 }
5346 else
5347 {
5348 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5349 }
5350 }
5351
5352 void lowercase (u8 *buf, int len)
5353 {
5354 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5355 }
5356
5357 void uppercase (u8 *buf, int len)
5358 {
5359 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5360 }
5361
5362 int fgetl (FILE *fp, char *line_buf)
5363 {
5364 int line_len = 0;
5365
5366 while (!feof (fp))
5367 {
5368 const int c = fgetc (fp);
5369
5370 if (c == EOF) break;
5371
5372 line_buf[line_len] = (char) c;
5373
5374 line_len++;
5375
5376 if (line_len == BUFSIZ) line_len--;
5377
5378 if (c == '\n') break;
5379 }
5380
5381 if (line_len == 0) return 0;
5382
5383 if (line_buf[line_len - 1] == '\n')
5384 {
5385 line_len--;
5386
5387 line_buf[line_len] = 0;
5388 }
5389
5390 if (line_len == 0) return 0;
5391
5392 if (line_buf[line_len - 1] == '\r')
5393 {
5394 line_len--;
5395
5396 line_buf[line_len] = 0;
5397 }
5398
5399 return (line_len);
5400 }
5401
5402 int in_superchop (char *buf)
5403 {
5404 int len = strlen (buf);
5405
5406 while (len)
5407 {
5408 if (buf[len - 1] == '\n')
5409 {
5410 len--;
5411
5412 continue;
5413 }
5414
5415 if (buf[len - 1] == '\r')
5416 {
5417 len--;
5418
5419 continue;
5420 }
5421
5422 break;
5423 }
5424
5425 buf[len] = 0;
5426
5427 return len;
5428 }
5429
5430 char **scan_directory (const char *path)
5431 {
5432 char *tmp_path = mystrdup (path);
5433
5434 size_t tmp_path_len = strlen (tmp_path);
5435
5436 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5437 {
5438 tmp_path[tmp_path_len - 1] = 0;
5439
5440 tmp_path_len = strlen (tmp_path);
5441 }
5442
5443 char **files = NULL;
5444
5445 int num_files = 0;
5446
5447 DIR *d = NULL;
5448
5449 if ((d = opendir (tmp_path)) != NULL)
5450 {
5451 #ifdef OSX
5452 struct dirent e;
5453
5454 for (;;) {
5455 memset (&e, 0, sizeof (e));
5456 struct dirent *de = NULL;
5457
5458 if (readdir_r (d, &e, &de) != 0)
5459 {
5460 log_error ("ERROR: readdir_r() failed");
5461
5462 break;
5463 }
5464
5465 if (de == NULL) break;
5466 #else
5467 struct dirent *de;
5468
5469 while ((de = readdir (d)) != NULL)
5470 {
5471 #endif
5472 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5473
5474 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5475
5476 char *path_file = (char *) mymalloc (path_size + 1);
5477
5478 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5479
5480 path_file[path_size] = 0;
5481
5482 DIR *d_test;
5483
5484 if ((d_test = opendir (path_file)) != NULL)
5485 {
5486 closedir (d_test);
5487
5488 myfree (path_file);
5489 }
5490 else
5491 {
5492 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5493
5494 num_files++;
5495
5496 files[num_files - 1] = path_file;
5497 }
5498 }
5499
5500 closedir (d);
5501 }
5502 else if (errno == ENOTDIR)
5503 {
5504 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5505
5506 num_files++;
5507
5508 files[num_files - 1] = mystrdup (path);
5509 }
5510
5511 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5512
5513 num_files++;
5514
5515 files[num_files - 1] = NULL;
5516
5517 myfree (tmp_path);
5518
5519 return (files);
5520 }
5521
5522 int count_dictionaries (char **dictionary_files)
5523 {
5524 if (dictionary_files == NULL) return 0;
5525
5526 int cnt = 0;
5527
5528 for (int d = 0; dictionary_files[d] != NULL; d++)
5529 {
5530 cnt++;
5531 }
5532
5533 return (cnt);
5534 }
5535
5536 char *stroptitype (const uint opti_type)
5537 {
5538 switch (opti_type)
5539 {
5540 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5541 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5542 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5543 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5544 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5545 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5546 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5547 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5548 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5549 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5550 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5551 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5552 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5553 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5554 }
5555
5556 return (NULL);
5557 }
5558
5559 char *strparser (const uint parser_status)
5560 {
5561 switch (parser_status)
5562 {
5563 case PARSER_OK: return ((char *) PA_000); break;
5564 case PARSER_COMMENT: return ((char *) PA_001); break;
5565 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5566 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5567 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5568 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5569 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5570 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5571 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5572 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5573 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5574 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5575 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5576 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5577 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5578 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5579 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5580 }
5581
5582 return ((char *) PA_255);
5583 }
5584
5585 char *strhashtype (const uint hash_mode)
5586 {
5587 switch (hash_mode)
5588 {
5589 case 0: return ((char *) HT_00000); break;
5590 case 10: return ((char *) HT_00010); break;
5591 case 11: return ((char *) HT_00011); break;
5592 case 12: return ((char *) HT_00012); break;
5593 case 20: return ((char *) HT_00020); break;
5594 case 21: return ((char *) HT_00021); break;
5595 case 22: return ((char *) HT_00022); break;
5596 case 23: return ((char *) HT_00023); break;
5597 case 30: return ((char *) HT_00030); break;
5598 case 40: return ((char *) HT_00040); break;
5599 case 50: return ((char *) HT_00050); break;
5600 case 60: return ((char *) HT_00060); break;
5601 case 100: return ((char *) HT_00100); break;
5602 case 101: return ((char *) HT_00101); break;
5603 case 110: return ((char *) HT_00110); break;
5604 case 111: return ((char *) HT_00111); break;
5605 case 112: return ((char *) HT_00112); break;
5606 case 120: return ((char *) HT_00120); break;
5607 case 121: return ((char *) HT_00121); break;
5608 case 122: return ((char *) HT_00122); break;
5609 case 124: return ((char *) HT_00124); break;
5610 case 130: return ((char *) HT_00130); break;
5611 case 131: return ((char *) HT_00131); break;
5612 case 132: return ((char *) HT_00132); break;
5613 case 133: return ((char *) HT_00133); break;
5614 case 140: return ((char *) HT_00140); break;
5615 case 141: return ((char *) HT_00141); break;
5616 case 150: return ((char *) HT_00150); break;
5617 case 160: return ((char *) HT_00160); break;
5618 case 190: return ((char *) HT_00190); break;
5619 case 200: return ((char *) HT_00200); break;
5620 case 300: return ((char *) HT_00300); break;
5621 case 400: return ((char *) HT_00400); break;
5622 case 500: return ((char *) HT_00500); break;
5623 case 501: return ((char *) HT_00501); break;
5624 case 900: return ((char *) HT_00900); break;
5625 case 910: return ((char *) HT_00910); break;
5626 case 1000: return ((char *) HT_01000); break;
5627 case 1100: return ((char *) HT_01100); break;
5628 case 1400: return ((char *) HT_01400); break;
5629 case 1410: return ((char *) HT_01410); break;
5630 case 1420: return ((char *) HT_01420); break;
5631 case 1421: return ((char *) HT_01421); break;
5632 case 1430: return ((char *) HT_01430); break;
5633 case 1440: return ((char *) HT_01440); break;
5634 case 1441: return ((char *) HT_01441); break;
5635 case 1450: return ((char *) HT_01450); break;
5636 case 1460: return ((char *) HT_01460); break;
5637 case 1500: return ((char *) HT_01500); break;
5638 case 1600: return ((char *) HT_01600); break;
5639 case 1700: return ((char *) HT_01700); break;
5640 case 1710: return ((char *) HT_01710); break;
5641 case 1711: return ((char *) HT_01711); break;
5642 case 1720: return ((char *) HT_01720); break;
5643 case 1722: return ((char *) HT_01722); break;
5644 case 1730: return ((char *) HT_01730); break;
5645 case 1731: return ((char *) HT_01731); break;
5646 case 1740: return ((char *) HT_01740); break;
5647 case 1750: return ((char *) HT_01750); break;
5648 case 1760: return ((char *) HT_01760); break;
5649 case 1800: return ((char *) HT_01800); break;
5650 case 2100: return ((char *) HT_02100); break;
5651 case 2400: return ((char *) HT_02400); break;
5652 case 2410: return ((char *) HT_02410); break;
5653 case 2500: return ((char *) HT_02500); break;
5654 case 2600: return ((char *) HT_02600); break;
5655 case 2611: return ((char *) HT_02611); break;
5656 case 2612: return ((char *) HT_02612); break;
5657 case 2711: return ((char *) HT_02711); break;
5658 case 2811: return ((char *) HT_02811); break;
5659 case 3000: return ((char *) HT_03000); break;
5660 case 3100: return ((char *) HT_03100); break;
5661 case 3200: return ((char *) HT_03200); break;
5662 case 3710: return ((char *) HT_03710); break;
5663 case 3711: return ((char *) HT_03711); break;
5664 case 3800: return ((char *) HT_03800); break;
5665 case 4300: return ((char *) HT_04300); break;
5666 case 4400: return ((char *) HT_04400); break;
5667 case 4500: return ((char *) HT_04500); break;
5668 case 4700: return ((char *) HT_04700); break;
5669 case 4800: return ((char *) HT_04800); break;
5670 case 4900: return ((char *) HT_04900); break;
5671 case 5000: return ((char *) HT_05000); break;
5672 case 5100: return ((char *) HT_05100); break;
5673 case 5200: return ((char *) HT_05200); break;
5674 case 5300: return ((char *) HT_05300); break;
5675 case 5400: return ((char *) HT_05400); break;
5676 case 5500: return ((char *) HT_05500); break;
5677 case 5600: return ((char *) HT_05600); break;
5678 case 5700: return ((char *) HT_05700); break;
5679 case 5800: return ((char *) HT_05800); break;
5680 case 6000: return ((char *) HT_06000); break;
5681 case 6100: return ((char *) HT_06100); break;
5682 case 6211: return ((char *) HT_06211); break;
5683 case 6212: return ((char *) HT_06212); break;
5684 case 6213: return ((char *) HT_06213); break;
5685 case 6221: return ((char *) HT_06221); break;
5686 case 6222: return ((char *) HT_06222); break;
5687 case 6223: return ((char *) HT_06223); break;
5688 case 6231: return ((char *) HT_06231); break;
5689 case 6232: return ((char *) HT_06232); break;
5690 case 6233: return ((char *) HT_06233); break;
5691 case 6241: return ((char *) HT_06241); break;
5692 case 6242: return ((char *) HT_06242); break;
5693 case 6243: return ((char *) HT_06243); break;
5694 case 6300: return ((char *) HT_06300); break;
5695 case 6400: return ((char *) HT_06400); break;
5696 case 6500: return ((char *) HT_06500); break;
5697 case 6600: return ((char *) HT_06600); break;
5698 case 6700: return ((char *) HT_06700); break;
5699 case 6800: return ((char *) HT_06800); break;
5700 case 6900: return ((char *) HT_06900); break;
5701 case 7100: return ((char *) HT_07100); break;
5702 case 7200: return ((char *) HT_07200); break;
5703 case 7300: return ((char *) HT_07300); break;
5704 case 7400: return ((char *) HT_07400); break;
5705 case 7500: return ((char *) HT_07500); break;
5706 case 7600: return ((char *) HT_07600); break;
5707 case 7700: return ((char *) HT_07700); break;
5708 case 7800: return ((char *) HT_07800); break;
5709 case 7900: return ((char *) HT_07900); break;
5710 case 8000: return ((char *) HT_08000); break;
5711 case 8100: return ((char *) HT_08100); break;
5712 case 8200: return ((char *) HT_08200); break;
5713 case 8300: return ((char *) HT_08300); break;
5714 case 8400: return ((char *) HT_08400); break;
5715 case 8500: return ((char *) HT_08500); break;
5716 case 8600: return ((char *) HT_08600); break;
5717 case 8700: return ((char *) HT_08700); break;
5718 case 8800: return ((char *) HT_08800); break;
5719 case 8900: return ((char *) HT_08900); break;
5720 case 9000: return ((char *) HT_09000); break;
5721 case 9100: return ((char *) HT_09100); break;
5722 case 9200: return ((char *) HT_09200); break;
5723 case 9300: return ((char *) HT_09300); break;
5724 case 9400: return ((char *) HT_09400); break;
5725 case 9500: return ((char *) HT_09500); break;
5726 case 9600: return ((char *) HT_09600); break;
5727 case 9700: return ((char *) HT_09700); break;
5728 case 9710: return ((char *) HT_09710); break;
5729 case 9720: return ((char *) HT_09720); break;
5730 case 9800: return ((char *) HT_09800); break;
5731 case 9810: return ((char *) HT_09810); break;
5732 case 9820: return ((char *) HT_09820); break;
5733 case 9900: return ((char *) HT_09900); break;
5734 case 10000: return ((char *) HT_10000); break;
5735 case 10100: return ((char *) HT_10100); break;
5736 case 10200: return ((char *) HT_10200); break;
5737 case 10300: return ((char *) HT_10300); break;
5738 case 10400: return ((char *) HT_10400); break;
5739 case 10410: return ((char *) HT_10410); break;
5740 case 10420: return ((char *) HT_10420); break;
5741 case 10500: return ((char *) HT_10500); break;
5742 case 10600: return ((char *) HT_10600); break;
5743 case 10700: return ((char *) HT_10700); break;
5744 case 10800: return ((char *) HT_10800); break;
5745 case 10900: return ((char *) HT_10900); break;
5746 case 11000: return ((char *) HT_11000); break;
5747 case 11100: return ((char *) HT_11100); break;
5748 case 11200: return ((char *) HT_11200); break;
5749 case 11300: return ((char *) HT_11300); break;
5750 case 11400: return ((char *) HT_11400); break;
5751 case 11500: return ((char *) HT_11500); break;
5752 case 11600: return ((char *) HT_11600); break;
5753 case 11700: return ((char *) HT_11700); break;
5754 case 11800: return ((char *) HT_11800); break;
5755 case 11900: return ((char *) HT_11900); break;
5756 case 12000: return ((char *) HT_12000); break;
5757 case 12100: return ((char *) HT_12100); break;
5758 case 12200: return ((char *) HT_12200); break;
5759 case 12300: return ((char *) HT_12300); break;
5760 case 12400: return ((char *) HT_12400); break;
5761 case 12500: return ((char *) HT_12500); break;
5762 case 12600: return ((char *) HT_12600); break;
5763 case 12700: return ((char *) HT_12700); break;
5764 case 12800: return ((char *) HT_12800); break;
5765 case 12900: return ((char *) HT_12900); break;
5766 case 13000: return ((char *) HT_13000); break;
5767 }
5768
5769 return ((char *) "Unknown");
5770 }
5771
5772 char *strstatus (const uint devices_status)
5773 {
5774 switch (devices_status)
5775 {
5776 case STATUS_INIT: return ((char *) ST_0000); break;
5777 case STATUS_STARTING: return ((char *) ST_0001); break;
5778 case STATUS_RUNNING: return ((char *) ST_0002); break;
5779 case STATUS_PAUSED: return ((char *) ST_0003); break;
5780 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5781 case STATUS_CRACKED: return ((char *) ST_0005); break;
5782 case STATUS_ABORTED: return ((char *) ST_0006); break;
5783 case STATUS_QUIT: return ((char *) ST_0007); break;
5784 case STATUS_BYPASS: return ((char *) ST_0008); break;
5785 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5786 }
5787
5788 return ((char *) "Unknown");
5789 }
5790
5791 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5792 {
5793 uint hash_type = data.hash_type;
5794 uint hash_mode = data.hash_mode;
5795 uint salt_type = data.salt_type;
5796 uint opts_type = data.opts_type;
5797 uint opti_type = data.opti_type;
5798 uint dgst_size = data.dgst_size;
5799
5800 char *hashfile = data.hashfile;
5801
5802 uint len = 4096;
5803
5804 uint digest_buf[64];
5805
5806 u64 *digest_buf64 = (u64 *) digest_buf;
5807
5808 char *digests_buf_ptr = (char *) data.digests_buf;
5809
5810 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5811
5812 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5813 {
5814 uint tt;
5815
5816 switch (hash_type)
5817 {
5818 case HASH_TYPE_DESCRYPT:
5819 FP (digest_buf[1], digest_buf[0], tt);
5820 break;
5821
5822 case HASH_TYPE_DESRACF:
5823 digest_buf[0] = rotl32 (digest_buf[0], 29);
5824 digest_buf[1] = rotl32 (digest_buf[1], 29);
5825
5826 FP (digest_buf[1], digest_buf[0], tt);
5827 break;
5828
5829 case HASH_TYPE_LM:
5830 FP (digest_buf[1], digest_buf[0], tt);
5831 break;
5832
5833 case HASH_TYPE_NETNTLM:
5834 digest_buf[0] = rotl32 (digest_buf[0], 29);
5835 digest_buf[1] = rotl32 (digest_buf[1], 29);
5836 digest_buf[2] = rotl32 (digest_buf[2], 29);
5837 digest_buf[3] = rotl32 (digest_buf[3], 29);
5838
5839 FP (digest_buf[1], digest_buf[0], tt);
5840 FP (digest_buf[3], digest_buf[2], tt);
5841 break;
5842
5843 case HASH_TYPE_BSDICRYPT:
5844 digest_buf[0] = rotl32 (digest_buf[0], 31);
5845 digest_buf[1] = rotl32 (digest_buf[1], 31);
5846
5847 FP (digest_buf[1], digest_buf[0], tt);
5848 break;
5849 }
5850 }
5851
5852 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5853 {
5854 switch (hash_type)
5855 {
5856 case HASH_TYPE_MD4:
5857 digest_buf[0] += MD4M_A;
5858 digest_buf[1] += MD4M_B;
5859 digest_buf[2] += MD4M_C;
5860 digest_buf[3] += MD4M_D;
5861 break;
5862
5863 case HASH_TYPE_MD5:
5864 digest_buf[0] += MD5M_A;
5865 digest_buf[1] += MD5M_B;
5866 digest_buf[2] += MD5M_C;
5867 digest_buf[3] += MD5M_D;
5868 break;
5869
5870 case HASH_TYPE_SHA1:
5871 digest_buf[0] += SHA1M_A;
5872 digest_buf[1] += SHA1M_B;
5873 digest_buf[2] += SHA1M_C;
5874 digest_buf[3] += SHA1M_D;
5875 digest_buf[4] += SHA1M_E;
5876 break;
5877
5878 case HASH_TYPE_SHA256:
5879 digest_buf[0] += SHA256M_A;
5880 digest_buf[1] += SHA256M_B;
5881 digest_buf[2] += SHA256M_C;
5882 digest_buf[3] += SHA256M_D;
5883 digest_buf[4] += SHA256M_E;
5884 digest_buf[5] += SHA256M_F;
5885 digest_buf[6] += SHA256M_G;
5886 digest_buf[7] += SHA256M_H;
5887 break;
5888
5889 case HASH_TYPE_SHA384:
5890 digest_buf64[0] += SHA384M_A;
5891 digest_buf64[1] += SHA384M_B;
5892 digest_buf64[2] += SHA384M_C;
5893 digest_buf64[3] += SHA384M_D;
5894 digest_buf64[4] += SHA384M_E;
5895 digest_buf64[5] += SHA384M_F;
5896 digest_buf64[6] += 0;
5897 digest_buf64[7] += 0;
5898 break;
5899
5900 case HASH_TYPE_SHA512:
5901 digest_buf64[0] += SHA512M_A;
5902 digest_buf64[1] += SHA512M_B;
5903 digest_buf64[2] += SHA512M_C;
5904 digest_buf64[3] += SHA512M_D;
5905 digest_buf64[4] += SHA512M_E;
5906 digest_buf64[5] += SHA512M_F;
5907 digest_buf64[6] += SHA512M_G;
5908 digest_buf64[7] += SHA512M_H;
5909 break;
5910 }
5911 }
5912
5913 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5914 {
5915 if (dgst_size == DGST_SIZE_4_2)
5916 {
5917 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5918 }
5919 else if (dgst_size == DGST_SIZE_4_4)
5920 {
5921 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5922 }
5923 else if (dgst_size == DGST_SIZE_4_5)
5924 {
5925 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5926 }
5927 else if (dgst_size == DGST_SIZE_4_6)
5928 {
5929 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5930 }
5931 else if (dgst_size == DGST_SIZE_4_8)
5932 {
5933 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5934 }
5935 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5936 {
5937 if (hash_type == HASH_TYPE_WHIRLPOOL)
5938 {
5939 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5940 }
5941 else if (hash_type == HASH_TYPE_SHA384)
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_SHA512)
5946 {
5947 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5948 }
5949 else if (hash_type == HASH_TYPE_GOST)
5950 {
5951 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5952 }
5953 }
5954 else if (dgst_size == DGST_SIZE_4_64)
5955 {
5956 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5957 }
5958 else if (dgst_size == DGST_SIZE_8_25)
5959 {
5960 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5961 }
5962 }
5963
5964 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5965 | (data.salt_type == SALT_TYPE_EXTERN)
5966 | (data.salt_type == SALT_TYPE_EMBEDDED));
5967
5968 salt_t salt;
5969
5970 if (isSalted)
5971 {
5972 memset (&salt, 0, sizeof (salt_t));
5973
5974 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5975
5976 char *ptr = (char *) salt.salt_buf;
5977
5978 uint len = salt.salt_len;
5979
5980 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5981 {
5982 uint tt;
5983
5984 switch (hash_type)
5985 {
5986 case HASH_TYPE_NETNTLM:
5987
5988 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
5989 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
5990
5991 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
5992
5993 break;
5994 }
5995 }
5996
5997 if (opts_type & OPTS_TYPE_ST_UNICODE)
5998 {
5999 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6000 {
6001 ptr[i] = ptr[j];
6002 }
6003
6004 len = len / 2;
6005 }
6006
6007 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6008 {
6009 uint max = salt.salt_len / 4;
6010
6011 if (len % 4) max++;
6012
6013 for (uint i = 0; i < max; i++)
6014 {
6015 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6016 }
6017 }
6018
6019 if (opts_type & OPTS_TYPE_ST_HEX)
6020 {
6021 char tmp[64];
6022
6023 memset (tmp, 0, sizeof (tmp));
6024
6025 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6026 {
6027 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6028 }
6029
6030 len = len * 2;
6031
6032 memcpy (ptr, tmp, len);
6033 }
6034
6035 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6036
6037 memset (ptr + len, 0, memset_size);
6038
6039 salt.salt_len = len;
6040 }
6041
6042 //
6043 // some modes require special encoding
6044 //
6045
6046 uint out_buf_plain[256];
6047 uint out_buf_salt[256];
6048
6049 char tmp_buf[1024];
6050
6051 memset (out_buf_plain, 0, sizeof (out_buf_plain));
6052 memset (out_buf_salt, 0, sizeof (out_buf_salt));
6053
6054 memset (tmp_buf, 0, sizeof (tmp_buf));
6055
6056 char *ptr_plain = (char *) out_buf_plain;
6057 char *ptr_salt = (char *) out_buf_salt;
6058
6059 if (hash_mode == 22)
6060 {
6061 char username[30];
6062
6063 memset (username, 0, sizeof (username));
6064
6065 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6066
6067 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6068
6069 u16 *ptr = (u16 *) digest_buf;
6070
6071 tmp_buf[ 0] = sig[0];
6072 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6073 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6074 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6075 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6076 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6077 tmp_buf[ 6] = sig[1];
6078 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6079 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6080 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6081 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6082 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6083 tmp_buf[12] = sig[2];
6084 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6085 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6086 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6087 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6088 tmp_buf[17] = sig[3];
6089 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6090 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6091 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6092 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6093 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6094 tmp_buf[23] = sig[4];
6095 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6096 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6097 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6098 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6099 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6100 tmp_buf[29] = sig[5];
6101
6102 snprintf (out_buf, len-1, "%s:%s",
6103 tmp_buf,
6104 username);
6105 }
6106 else if (hash_mode == 23)
6107 {
6108 // do not show the \nskyper\n part in output
6109
6110 char *salt_buf_ptr = (char *) salt.salt_buf;
6111
6112 salt_buf_ptr[salt.salt_len - 8] = 0;
6113
6114 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6115 digest_buf[0],
6116 digest_buf[1],
6117 digest_buf[2],
6118 digest_buf[3],
6119 salt_buf_ptr);
6120 }
6121 else if (hash_mode == 101)
6122 {
6123 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6124
6125 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6126 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6127 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6128 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6129 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6130
6131 memcpy (tmp_buf, digest_buf, 20);
6132
6133 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6134
6135 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6136 }
6137 else if (hash_mode == 111)
6138 {
6139 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6140
6141 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6142 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6143 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6144 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6145 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6146
6147 memcpy (tmp_buf, digest_buf, 20);
6148 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6149
6150 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6151
6152 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6153 }
6154 else if (hash_mode == 122)
6155 {
6156 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6157 (char *) salt.salt_buf,
6158 digest_buf[0],
6159 digest_buf[1],
6160 digest_buf[2],
6161 digest_buf[3],
6162 digest_buf[4]);
6163 }
6164 else if (hash_mode == 124)
6165 {
6166 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6167 (char *) salt.salt_buf,
6168 digest_buf[0],
6169 digest_buf[1],
6170 digest_buf[2],
6171 digest_buf[3],
6172 digest_buf[4]);
6173 }
6174 else if (hash_mode == 131)
6175 {
6176 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6177 (char *) salt.salt_buf,
6178 0, 0, 0, 0, 0,
6179 digest_buf[0],
6180 digest_buf[1],
6181 digest_buf[2],
6182 digest_buf[3],
6183 digest_buf[4]);
6184 }
6185 else if (hash_mode == 132)
6186 {
6187 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6188 (char *) salt.salt_buf,
6189 digest_buf[0],
6190 digest_buf[1],
6191 digest_buf[2],
6192 digest_buf[3],
6193 digest_buf[4]);
6194 }
6195 else if (hash_mode == 133)
6196 {
6197 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6198
6199 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6200 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6201 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6202 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6203 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6204
6205 memcpy (tmp_buf, digest_buf, 20);
6206
6207 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6208
6209 snprintf (out_buf, len-1, "%s", ptr_plain);
6210 }
6211 else if (hash_mode == 141)
6212 {
6213 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6214
6215 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6216
6217 memset (tmp_buf, 0, sizeof (tmp_buf));
6218
6219 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6220
6221 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6222 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6223 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6224 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6225 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6226
6227 memcpy (tmp_buf, digest_buf, 20);
6228
6229 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6230
6231 ptr_plain[27] = 0;
6232
6233 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6234 }
6235 else if (hash_mode == 400)
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 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6245
6246 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6247 }
6248 else if (hash_mode == 500)
6249 {
6250 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6251
6252 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6253 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6254 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6255 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6256
6257 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6258
6259 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6260 {
6261 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6262 }
6263 else
6264 {
6265 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6266 }
6267 }
6268 else if (hash_mode == 501)
6269 {
6270 uint digest_idx = salt.digests_offset + digest_pos;
6271
6272 hashinfo_t **hashinfo_ptr = data.hash_info;
6273 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6274
6275 snprintf (out_buf, len-1, "%s", hash_buf);
6276 }
6277 else if (hash_mode == 1421)
6278 {
6279 u8 *salt_ptr = (u8 *) salt.salt_buf;
6280
6281 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6282 salt_ptr[0],
6283 salt_ptr[1],
6284 salt_ptr[2],
6285 salt_ptr[3],
6286 salt_ptr[4],
6287 salt_ptr[5],
6288 digest_buf[0],
6289 digest_buf[1],
6290 digest_buf[2],
6291 digest_buf[3],
6292 digest_buf[4],
6293 digest_buf[5],
6294 digest_buf[6],
6295 digest_buf[7]);
6296 }
6297 else if (hash_mode == 1441)
6298 {
6299 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6300
6301 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6302
6303 memset (tmp_buf, 0, sizeof (tmp_buf));
6304
6305 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6306
6307 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6308 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6309 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6310 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6311 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6312 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6313 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6314 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6315
6316 memcpy (tmp_buf, digest_buf, 32);
6317
6318 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6319
6320 ptr_plain[43] = 0;
6321
6322 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6323 }
6324 else if (hash_mode == 1500)
6325 {
6326 out_buf[0] = salt.salt_sign[0] & 0xff;
6327 out_buf[1] = salt.salt_sign[1] & 0xff;
6328 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6329 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6330 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6331
6332 memset (tmp_buf, 0, sizeof (tmp_buf));
6333
6334 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6335
6336 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6337 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6338
6339 memcpy (tmp_buf, digest_buf, 8);
6340
6341 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6342
6343 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6344
6345 out_buf[13] = 0;
6346 }
6347 else if (hash_mode == 1600)
6348 {
6349 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6350
6351 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6352 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6353 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6354 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6355
6356 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6357
6358 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6359 {
6360 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6361 }
6362 else
6363 {
6364 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6365 }
6366 }
6367 else if (hash_mode == 1711)
6368 {
6369 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6370
6371 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6372 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6373 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6374 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6375 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6376 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6377 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6378 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6379
6380 memcpy (tmp_buf, digest_buf, 64);
6381 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6382
6383 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6384
6385 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6386 }
6387 else if (hash_mode == 1722)
6388 {
6389 uint *ptr = digest_buf;
6390
6391 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6392 (unsigned char *) salt.salt_buf,
6393 ptr[ 1], ptr[ 0],
6394 ptr[ 3], ptr[ 2],
6395 ptr[ 5], ptr[ 4],
6396 ptr[ 7], ptr[ 6],
6397 ptr[ 9], ptr[ 8],
6398 ptr[11], ptr[10],
6399 ptr[13], ptr[12],
6400 ptr[15], ptr[14]);
6401 }
6402 else if (hash_mode == 1731)
6403 {
6404 uint *ptr = digest_buf;
6405
6406 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6407 (unsigned char *) salt.salt_buf,
6408 ptr[ 1], ptr[ 0],
6409 ptr[ 3], ptr[ 2],
6410 ptr[ 5], ptr[ 4],
6411 ptr[ 7], ptr[ 6],
6412 ptr[ 9], ptr[ 8],
6413 ptr[11], ptr[10],
6414 ptr[13], ptr[12],
6415 ptr[15], ptr[14]);
6416 }
6417 else if (hash_mode == 1800)
6418 {
6419 // temp workaround
6420
6421 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6422 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6423 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6424 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6425 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6426 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6427 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6428 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6429
6430 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6431
6432 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6433 {
6434 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6435 }
6436 else
6437 {
6438 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6439 }
6440 }
6441 else if (hash_mode == 2100)
6442 {
6443 uint pos = 0;
6444
6445 snprintf (out_buf + pos, len-1, "%s%i#",
6446 SIGNATURE_DCC2,
6447 salt.salt_iter + 1);
6448
6449 uint signature_len = strlen (out_buf);
6450
6451 pos += signature_len;
6452 len -= signature_len;
6453
6454 char *salt_ptr = (char *) salt.salt_buf;
6455
6456 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6457
6458 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6459 byte_swap_32 (digest_buf[0]),
6460 byte_swap_32 (digest_buf[1]),
6461 byte_swap_32 (digest_buf[2]),
6462 byte_swap_32 (digest_buf[3]));
6463 }
6464 else if ((hash_mode == 2400) || (hash_mode == 2410))
6465 {
6466 memcpy (tmp_buf, digest_buf, 16);
6467
6468 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6469
6470 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6471 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6472 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6473 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6474
6475 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6476 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6477 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6478 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6479
6480 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6481 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6482 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6483 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6484
6485 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6486 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6487 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6488 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6489
6490 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6491 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6492 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6493 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6494
6495 out_buf[16] = 0;
6496 }
6497 else if (hash_mode == 2500)
6498 {
6499 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6500
6501 wpa_t *wpa = &wpas[salt_pos];
6502
6503 uint pke[25];
6504
6505 char *pke_ptr = (char *) pke;
6506
6507 for (uint i = 0; i < 25; i++)
6508 {
6509 pke[i] = byte_swap_32 (wpa->pke[i]);
6510 }
6511
6512 unsigned char mac1[6];
6513 unsigned char mac2[6];
6514
6515 memcpy (mac1, pke_ptr + 23, 6);
6516 memcpy (mac2, pke_ptr + 29, 6);
6517
6518 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6519 (char *) salt.salt_buf,
6520 mac1[0],
6521 mac1[1],
6522 mac1[2],
6523 mac1[3],
6524 mac1[4],
6525 mac1[5],
6526 mac2[0],
6527 mac2[1],
6528 mac2[2],
6529 mac2[3],
6530 mac2[4],
6531 mac2[5]);
6532 }
6533 else if (hash_mode == 4400)
6534 {
6535 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6536 byte_swap_32 (digest_buf[0]),
6537 byte_swap_32 (digest_buf[1]),
6538 byte_swap_32 (digest_buf[2]),
6539 byte_swap_32 (digest_buf[3]));
6540 }
6541 else if (hash_mode == 4700)
6542 {
6543 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6544 byte_swap_32 (digest_buf[0]),
6545 byte_swap_32 (digest_buf[1]),
6546 byte_swap_32 (digest_buf[2]),
6547 byte_swap_32 (digest_buf[3]),
6548 byte_swap_32 (digest_buf[4]));
6549 }
6550 else if (hash_mode == 4800)
6551 {
6552 u8 chap_id_byte = (u8) salt.salt_buf[4];
6553
6554 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6555 digest_buf[0],
6556 digest_buf[1],
6557 digest_buf[2],
6558 digest_buf[3],
6559 byte_swap_32 (salt.salt_buf[0]),
6560 byte_swap_32 (salt.salt_buf[1]),
6561 byte_swap_32 (salt.salt_buf[2]),
6562 byte_swap_32 (salt.salt_buf[3]),
6563 chap_id_byte);
6564 }
6565 else if (hash_mode == 4900)
6566 {
6567 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6568 byte_swap_32 (digest_buf[0]),
6569 byte_swap_32 (digest_buf[1]),
6570 byte_swap_32 (digest_buf[2]),
6571 byte_swap_32 (digest_buf[3]),
6572 byte_swap_32 (digest_buf[4]));
6573 }
6574 else if (hash_mode == 5100)
6575 {
6576 snprintf (out_buf, len-1, "%08x%08x",
6577 digest_buf[0],
6578 digest_buf[1]);
6579 }
6580 else if (hash_mode == 5200)
6581 {
6582 snprintf (out_buf, len-1, "%s", hashfile);
6583 }
6584 else if (hash_mode == 5300)
6585 {
6586 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6587
6588 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6589
6590 int buf_len = len -1;
6591
6592 // msg_buf
6593
6594 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6595
6596 for (uint i = 0; i < ikepsk_msg_len; i++)
6597 {
6598 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6599 {
6600 snprintf (out_buf, buf_len, ":");
6601
6602 buf_len--;
6603 out_buf++;
6604 }
6605
6606 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6607
6608 buf_len -= 8;
6609 out_buf += 8;
6610 }
6611
6612 // nr_buf
6613
6614 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6615
6616 for (uint i = 0; i < ikepsk_nr_len; i++)
6617 {
6618 if ((i == 0) || (i == 5))
6619 {
6620 snprintf (out_buf, buf_len, ":");
6621
6622 buf_len--;
6623 out_buf++;
6624 }
6625
6626 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6627
6628 buf_len -= 8;
6629 out_buf += 8;
6630 }
6631
6632 // digest_buf
6633
6634 for (uint i = 0; i < 4; i++)
6635 {
6636 if (i == 0)
6637 {
6638 snprintf (out_buf, buf_len, ":");
6639
6640 buf_len--;
6641 out_buf++;
6642 }
6643
6644 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6645
6646 buf_len -= 8;
6647 out_buf += 8;
6648 }
6649 }
6650 else if (hash_mode == 5400)
6651 {
6652 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6653
6654 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6655
6656 int buf_len = len -1;
6657
6658 // msg_buf
6659
6660 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6661
6662 for (uint i = 0; i < ikepsk_msg_len; i++)
6663 {
6664 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6665 {
6666 snprintf (out_buf, buf_len, ":");
6667
6668 buf_len--;
6669 out_buf++;
6670 }
6671
6672 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6673
6674 buf_len -= 8;
6675 out_buf += 8;
6676 }
6677
6678 // nr_buf
6679
6680 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6681
6682 for (uint i = 0; i < ikepsk_nr_len; i++)
6683 {
6684 if ((i == 0) || (i == 5))
6685 {
6686 snprintf (out_buf, buf_len, ":");
6687
6688 buf_len--;
6689 out_buf++;
6690 }
6691
6692 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6693
6694 buf_len -= 8;
6695 out_buf += 8;
6696 }
6697
6698 // digest_buf
6699
6700 for (uint i = 0; i < 5; i++)
6701 {
6702 if (i == 0)
6703 {
6704 snprintf (out_buf, buf_len, ":");
6705
6706 buf_len--;
6707 out_buf++;
6708 }
6709
6710 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6711
6712 buf_len -= 8;
6713 out_buf += 8;
6714 }
6715 }
6716 else if (hash_mode == 5500)
6717 {
6718 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6719
6720 netntlm_t *netntlm = &netntlms[salt_pos];
6721
6722 char user_buf[64];
6723 char domain_buf[64];
6724 char srvchall_buf[1024];
6725 char clichall_buf[1024];
6726
6727 memset (user_buf, 0, sizeof (user_buf));
6728 memset (domain_buf, 0, sizeof (domain_buf));
6729 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6730 memset (clichall_buf, 0, sizeof (clichall_buf));
6731
6732 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6733 {
6734 char *ptr = (char *) netntlm->userdomain_buf;
6735
6736 user_buf[i] = ptr[j];
6737 }
6738
6739 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6740 {
6741 char *ptr = (char *) netntlm->userdomain_buf;
6742
6743 domain_buf[i] = ptr[netntlm->user_len + j];
6744 }
6745
6746 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6747 {
6748 u8 *ptr = (u8 *) netntlm->chall_buf;
6749
6750 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6751 }
6752
6753 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6754 {
6755 u8 *ptr = (u8 *) netntlm->chall_buf;
6756
6757 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6758 }
6759
6760 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6761 user_buf,
6762 domain_buf,
6763 srvchall_buf,
6764 digest_buf[0],
6765 digest_buf[1],
6766 digest_buf[2],
6767 digest_buf[3],
6768 byte_swap_32 (salt.salt_buf_pc[0]),
6769 byte_swap_32 (salt.salt_buf_pc[1]),
6770 clichall_buf);
6771 }
6772 else if (hash_mode == 5600)
6773 {
6774 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6775
6776 netntlm_t *netntlm = &netntlms[salt_pos];
6777
6778 char user_buf[64];
6779 char domain_buf[64];
6780 char srvchall_buf[1024];
6781 char clichall_buf[1024];
6782
6783 memset (user_buf, 0, sizeof (user_buf));
6784 memset (domain_buf, 0, sizeof (domain_buf));
6785 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6786 memset (clichall_buf, 0, sizeof (clichall_buf));
6787
6788 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6789 {
6790 char *ptr = (char *) netntlm->userdomain_buf;
6791
6792 user_buf[i] = ptr[j];
6793 }
6794
6795 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6796 {
6797 char *ptr = (char *) netntlm->userdomain_buf;
6798
6799 domain_buf[i] = ptr[netntlm->user_len + j];
6800 }
6801
6802 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6803 {
6804 u8 *ptr = (u8 *) netntlm->chall_buf;
6805
6806 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6807 }
6808
6809 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6810 {
6811 u8 *ptr = (u8 *) netntlm->chall_buf;
6812
6813 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6814 }
6815
6816 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6817 user_buf,
6818 domain_buf,
6819 srvchall_buf,
6820 digest_buf[0],
6821 digest_buf[1],
6822 digest_buf[2],
6823 digest_buf[3],
6824 clichall_buf);
6825 }
6826 else if (hash_mode == 5700)
6827 {
6828 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6829
6830 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6831 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6832 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6833 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6834 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6835 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6836 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6837 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6838
6839 memcpy (tmp_buf, digest_buf, 32);
6840
6841 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6842
6843 ptr_plain[43] = 0;
6844
6845 snprintf (out_buf, len-1, "%s", ptr_plain);
6846 }
6847 else if (hash_mode == 5800)
6848 {
6849 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6850 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6851 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6852 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6853 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6854
6855 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6856 digest_buf[0],
6857 digest_buf[1],
6858 digest_buf[2],
6859 digest_buf[3],
6860 digest_buf[4]);
6861 }
6862 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6863 {
6864 snprintf (out_buf, len-1, "%s", hashfile);
6865 }
6866 else if (hash_mode == 6300)
6867 {
6868 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6869
6870 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6871 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6872 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6873 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6874
6875 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6876
6877 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6878 }
6879 else if (hash_mode == 6400)
6880 {
6881 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6882
6883 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6884 }
6885 else if (hash_mode == 6500)
6886 {
6887 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6888
6889 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6890 }
6891 else if (hash_mode == 6600)
6892 {
6893 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6894
6895 agilekey_t *agilekey = &agilekeys[salt_pos];
6896
6897 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6898 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6899
6900 uint buf_len = len - 1;
6901
6902 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6903 buf_len -= 22;
6904
6905 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6906 {
6907 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6908
6909 buf_len -= 2;
6910 }
6911 }
6912 else if (hash_mode == 6700)
6913 {
6914 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6915
6916 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6917 }
6918 else if (hash_mode == 6800)
6919 {
6920 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6921 }
6922 else if (hash_mode == 7100)
6923 {
6924 uint *ptr = digest_buf;
6925
6926 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6927
6928 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6929
6930 uint esalt[16];
6931
6932 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6933 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6934 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6935 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6936 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6937 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6938 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6939 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6940
6941 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",
6942 SIGNATURE_SHA512OSX,
6943 salt.salt_iter + 1,
6944 esalt[ 0], esalt[ 1],
6945 esalt[ 2], esalt[ 3],
6946 esalt[ 4], esalt[ 5],
6947 esalt[ 6], esalt[ 7],
6948 ptr [ 1], ptr [ 0],
6949 ptr [ 3], ptr [ 2],
6950 ptr [ 5], ptr [ 4],
6951 ptr [ 7], ptr [ 6],
6952 ptr [ 9], ptr [ 8],
6953 ptr [11], ptr [10],
6954 ptr [13], ptr [12],
6955 ptr [15], ptr [14]);
6956 }
6957 else if (hash_mode == 7200)
6958 {
6959 uint *ptr = digest_buf;
6960
6961 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6962
6963 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6964
6965 uint len_used = 0;
6966
6967 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6968
6969 len_used = strlen (out_buf);
6970
6971 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6972
6973 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6974 {
6975 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6976 }
6977
6978 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",
6979 ptr [ 1], ptr [ 0],
6980 ptr [ 3], ptr [ 2],
6981 ptr [ 5], ptr [ 4],
6982 ptr [ 7], ptr [ 6],
6983 ptr [ 9], ptr [ 8],
6984 ptr [11], ptr [10],
6985 ptr [13], ptr [12],
6986 ptr [15], ptr [14]);
6987 }
6988 else if (hash_mode == 7300)
6989 {
6990 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6991
6992 rakp_t *rakp = &rakps[salt_pos];
6993
6994 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6995 {
6996 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6997 }
6998
6999 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7000 digest_buf[0],
7001 digest_buf[1],
7002 digest_buf[2],
7003 digest_buf[3],
7004 digest_buf[4]);
7005 }
7006 else if (hash_mode == 7400)
7007 {
7008 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7009
7010 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7011 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7012 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7013 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7014 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7015 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7016 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7017 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7018
7019 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7020
7021 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7022 {
7023 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7024 }
7025 else
7026 {
7027 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7028 }
7029 }
7030 else if (hash_mode == 7500)
7031 {
7032 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7033
7034 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7035
7036 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7037 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7038
7039 char data[128];
7040
7041 char *ptr_data = data;
7042
7043 for (uint i = 0; i < 36; i++, ptr_data += 2)
7044 {
7045 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7046 }
7047
7048 for (uint i = 0; i < 16; i++, ptr_data += 2)
7049 {
7050 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7051 }
7052
7053 *ptr_data = 0;
7054
7055 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7056 SIGNATURE_KRB5PA,
7057 (char *) krb5pa->user,
7058 (char *) krb5pa->realm,
7059 (char *) krb5pa->salt,
7060 data);
7061 }
7062 else if (hash_mode == 7700)
7063 {
7064 snprintf (out_buf, len-1, "%s$%08X%08X",
7065 (char *) salt.salt_buf,
7066 digest_buf[0],
7067 digest_buf[1]);
7068 }
7069 else if (hash_mode == 7800)
7070 {
7071 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7072 (char *) salt.salt_buf,
7073 digest_buf[0],
7074 digest_buf[1],
7075 digest_buf[2],
7076 digest_buf[3],
7077 digest_buf[4]);
7078 }
7079 else if (hash_mode == 7900)
7080 {
7081 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7082
7083 // ugly hack start
7084
7085 char *tmp = (char *) salt.salt_buf_pc;
7086
7087 ptr_plain[42] = tmp[0];
7088
7089 // ugly hack end
7090
7091 ptr_plain[43] = 0;
7092
7093 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7094 }
7095 else if (hash_mode == 8000)
7096 {
7097 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7098 (unsigned char *) salt.salt_buf,
7099 digest_buf[0],
7100 digest_buf[1],
7101 digest_buf[2],
7102 digest_buf[3],
7103 digest_buf[4],
7104 digest_buf[5],
7105 digest_buf[6],
7106 digest_buf[7]);
7107 }
7108 else if (hash_mode == 8100)
7109 {
7110 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7111 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7112
7113 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7114 (unsigned char *) salt.salt_buf,
7115 digest_buf[0],
7116 digest_buf[1],
7117 digest_buf[2],
7118 digest_buf[3],
7119 digest_buf[4]);
7120 }
7121 else if (hash_mode == 8200)
7122 {
7123 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7124
7125 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7126
7127 char data_buf[4096];
7128
7129 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7130 {
7131 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7132 }
7133
7134 data_buf[cloudkey->data_len * 2] = 0;
7135
7136 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7137 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7138 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7139 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7140 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7141 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7142 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7143 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7144
7145 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7146 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7147 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7148 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7149
7150 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7151 digest_buf[0],
7152 digest_buf[1],
7153 digest_buf[2],
7154 digest_buf[3],
7155 digest_buf[4],
7156 digest_buf[5],
7157 digest_buf[6],
7158 digest_buf[7],
7159 salt.salt_buf[0],
7160 salt.salt_buf[1],
7161 salt.salt_buf[2],
7162 salt.salt_buf[3],
7163 salt.salt_iter + 1,
7164 data_buf);
7165 }
7166 else if (hash_mode == 8300)
7167 {
7168 char digest_buf_c[34] = { 0 };
7169
7170 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7171
7172 digest_buf_c[32] = 0;
7173
7174 // domain
7175
7176 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7177
7178 char domain_buf_c[33] = { 0 };
7179
7180 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7181
7182 for (uint i = 0; i < salt_pc_len; i++)
7183 {
7184 const char next = domain_buf_c[i];
7185
7186 domain_buf_c[i] = '.';
7187
7188 i += next;
7189 }
7190
7191 domain_buf_c[salt_pc_len] = 0;
7192
7193 // final
7194
7195 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7196 }
7197 else if (hash_mode == 8500)
7198 {
7199 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7200 }
7201 else if (hash_mode == 2612)
7202 {
7203 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7204 SIGNATURE_PHPS,
7205 (char *) salt.salt_buf,
7206 digest_buf[0],
7207 digest_buf[1],
7208 digest_buf[2],
7209 digest_buf[3]);
7210 }
7211 else if (hash_mode == 3711)
7212 {
7213 char *salt_ptr = (char *) salt.salt_buf;
7214
7215 salt_ptr[salt.salt_len - 1] = 0;
7216
7217 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7218 SIGNATURE_MEDIAWIKI_B,
7219 salt_ptr,
7220 digest_buf[0],
7221 digest_buf[1],
7222 digest_buf[2],
7223 digest_buf[3]);
7224 }
7225 else if (hash_mode == 8800)
7226 {
7227 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7228
7229 androidfde_t *androidfde = &androidfdes[salt_pos];
7230
7231 char tmp[3073];
7232
7233 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7234 {
7235 sprintf (tmp + j, "%08x", androidfde->data[i]);
7236 }
7237
7238 tmp[3072] = 0;
7239
7240 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7241 SIGNATURE_ANDROIDFDE,
7242 byte_swap_32 (salt.salt_buf[0]),
7243 byte_swap_32 (salt.salt_buf[1]),
7244 byte_swap_32 (salt.salt_buf[2]),
7245 byte_swap_32 (salt.salt_buf[3]),
7246 byte_swap_32 (digest_buf[0]),
7247 byte_swap_32 (digest_buf[1]),
7248 byte_swap_32 (digest_buf[2]),
7249 byte_swap_32 (digest_buf[3]),
7250 tmp);
7251 }
7252 else if (hash_mode == 8900)
7253 {
7254 uint N = salt.scrypt_N;
7255 uint r = salt.scrypt_r;
7256 uint p = salt.scrypt_p;
7257
7258 char base64_salt[32];
7259
7260 memset (base64_salt, 0, 32);
7261
7262 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7263
7264 memset (tmp_buf, 0, 46);
7265
7266 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7267 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7268 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7269 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7270 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7271 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7272 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7273 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7274 digest_buf[8] = 0; // needed for base64_encode ()
7275
7276 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7277
7278 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7279 SIGNATURE_SCRYPT,
7280 N,
7281 r,
7282 p,
7283 base64_salt,
7284 tmp_buf);
7285 }
7286 else if (hash_mode == 9000)
7287 {
7288 snprintf (out_buf, len-1, "%s", hashfile);
7289 }
7290 else if (hash_mode == 9200)
7291 {
7292 // salt
7293
7294 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7295
7296 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7297
7298 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7299
7300 // hash
7301
7302 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7303 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7304 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7305 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7306 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7307 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7308 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7309 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7310 digest_buf[8] = 0; // needed for base64_encode ()
7311
7312 char tmp_buf[64];
7313 memset (tmp_buf, 0, sizeof (tmp_buf));
7314
7315 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7316 tmp_buf[43] = 0; // cut it here
7317
7318 // output
7319
7320 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7321 }
7322 else if (hash_mode == 9300)
7323 {
7324 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7325 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7326 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7327 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7328 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7329 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7330 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7331 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7332 digest_buf[8] = 0; // needed for base64_encode ()
7333
7334 char tmp_buf[64];
7335 memset (tmp_buf, 0, sizeof (tmp_buf));
7336
7337 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7338 tmp_buf[43] = 0; // cut it here
7339
7340 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7341
7342 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7343 }
7344 else if (hash_mode == 9400)
7345 {
7346 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7347
7348 office2007_t *office2007 = &office2007s[salt_pos];
7349
7350 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7351 SIGNATURE_OFFICE2007,
7352 2007,
7353 20,
7354 office2007->keySize,
7355 16,
7356 salt.salt_buf[0],
7357 salt.salt_buf[1],
7358 salt.salt_buf[2],
7359 salt.salt_buf[3],
7360 office2007->encryptedVerifier[0],
7361 office2007->encryptedVerifier[1],
7362 office2007->encryptedVerifier[2],
7363 office2007->encryptedVerifier[3],
7364 office2007->encryptedVerifierHash[0],
7365 office2007->encryptedVerifierHash[1],
7366 office2007->encryptedVerifierHash[2],
7367 office2007->encryptedVerifierHash[3],
7368 office2007->encryptedVerifierHash[4]);
7369 }
7370 else if (hash_mode == 9500)
7371 {
7372 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7373
7374 office2010_t *office2010 = &office2010s[salt_pos];
7375
7376 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,
7377
7378 salt.salt_buf[0],
7379 salt.salt_buf[1],
7380 salt.salt_buf[2],
7381 salt.salt_buf[3],
7382 office2010->encryptedVerifier[0],
7383 office2010->encryptedVerifier[1],
7384 office2010->encryptedVerifier[2],
7385 office2010->encryptedVerifier[3],
7386 office2010->encryptedVerifierHash[0],
7387 office2010->encryptedVerifierHash[1],
7388 office2010->encryptedVerifierHash[2],
7389 office2010->encryptedVerifierHash[3],
7390 office2010->encryptedVerifierHash[4],
7391 office2010->encryptedVerifierHash[5],
7392 office2010->encryptedVerifierHash[6],
7393 office2010->encryptedVerifierHash[7]);
7394 }
7395 else if (hash_mode == 9600)
7396 {
7397 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7398
7399 office2013_t *office2013 = &office2013s[salt_pos];
7400
7401 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,
7402
7403 salt.salt_buf[0],
7404 salt.salt_buf[1],
7405 salt.salt_buf[2],
7406 salt.salt_buf[3],
7407 office2013->encryptedVerifier[0],
7408 office2013->encryptedVerifier[1],
7409 office2013->encryptedVerifier[2],
7410 office2013->encryptedVerifier[3],
7411 office2013->encryptedVerifierHash[0],
7412 office2013->encryptedVerifierHash[1],
7413 office2013->encryptedVerifierHash[2],
7414 office2013->encryptedVerifierHash[3],
7415 office2013->encryptedVerifierHash[4],
7416 office2013->encryptedVerifierHash[5],
7417 office2013->encryptedVerifierHash[6],
7418 office2013->encryptedVerifierHash[7]);
7419 }
7420 else if (hash_mode == 9700)
7421 {
7422 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7423
7424 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7425
7426 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7427 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7428 byte_swap_32 (salt.salt_buf[0]),
7429 byte_swap_32 (salt.salt_buf[1]),
7430 byte_swap_32 (salt.salt_buf[2]),
7431 byte_swap_32 (salt.salt_buf[3]),
7432 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7433 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7434 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7435 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7436 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7437 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7438 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7439 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7440 }
7441 else if (hash_mode == 9710)
7442 {
7443 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7444
7445 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7446
7447 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7448 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7449 byte_swap_32 (salt.salt_buf[0]),
7450 byte_swap_32 (salt.salt_buf[1]),
7451 byte_swap_32 (salt.salt_buf[2]),
7452 byte_swap_32 (salt.salt_buf[3]),
7453 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7454 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7455 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7456 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7457 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7458 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7459 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7460 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7461 }
7462 else if (hash_mode == 9720)
7463 {
7464 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7465
7466 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7467
7468 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7469
7470 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7471 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7472 byte_swap_32 (salt.salt_buf[0]),
7473 byte_swap_32 (salt.salt_buf[1]),
7474 byte_swap_32 (salt.salt_buf[2]),
7475 byte_swap_32 (salt.salt_buf[3]),
7476 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7477 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7478 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7479 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7480 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7481 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7482 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7483 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7484 rc4key[0],
7485 rc4key[1],
7486 rc4key[2],
7487 rc4key[3],
7488 rc4key[4]);
7489 }
7490 else if (hash_mode == 9800)
7491 {
7492 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7493
7494 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7495
7496 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7497 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7498 salt.salt_buf[0],
7499 salt.salt_buf[1],
7500 salt.salt_buf[2],
7501 salt.salt_buf[3],
7502 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7503 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7504 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7505 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7506 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7507 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7508 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7509 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7510 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7511 }
7512 else if (hash_mode == 9810)
7513 {
7514 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7515
7516 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7517
7518 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7519 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7520 salt.salt_buf[0],
7521 salt.salt_buf[1],
7522 salt.salt_buf[2],
7523 salt.salt_buf[3],
7524 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7525 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7526 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7527 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7528 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7529 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7530 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7531 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7532 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7533 }
7534 else if (hash_mode == 9820)
7535 {
7536 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7537
7538 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7539
7540 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7541
7542 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7543 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7544 salt.salt_buf[0],
7545 salt.salt_buf[1],
7546 salt.salt_buf[2],
7547 salt.salt_buf[3],
7548 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7549 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7550 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7551 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7552 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7553 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7554 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7555 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7556 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7557 rc4key[0],
7558 rc4key[1],
7559 rc4key[2],
7560 rc4key[3],
7561 rc4key[4]);
7562 }
7563 else if (hash_mode == 10000)
7564 {
7565 // salt
7566
7567 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7568
7569 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7570
7571 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7572
7573 // hash
7574
7575 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7576 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7577 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7578 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7579 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7580 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7581 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7582 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7583 digest_buf[8] = 0; // needed for base64_encode ()
7584
7585 char tmp_buf[64];
7586 memset (tmp_buf, 0, sizeof (tmp_buf));
7587
7588 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7589
7590 // output
7591
7592 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7593 }
7594 else if (hash_mode == 10100)
7595 {
7596 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7597 digest_buf[0],
7598 digest_buf[1],
7599 2,
7600 4,
7601 byte_swap_32 (salt.salt_buf[0]),
7602 byte_swap_32 (salt.salt_buf[1]),
7603 byte_swap_32 (salt.salt_buf[2]),
7604 byte_swap_32 (salt.salt_buf[3]));
7605 }
7606 else if (hash_mode == 10200)
7607 {
7608 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7609
7610 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7611
7612 // challenge
7613
7614 char challenge[100];
7615
7616 memset (challenge, 0, sizeof (challenge));
7617
7618 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7619
7620 // response
7621
7622 char tmp_buf[100];
7623
7624 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7625 (char *) cram_md5->user,
7626 digest_buf[0],
7627 digest_buf[1],
7628 digest_buf[2],
7629 digest_buf[3]);
7630
7631 char response[100];
7632
7633 memset (response, 0, sizeof (response));
7634
7635 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7636
7637 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7638 }
7639 else if (hash_mode == 10300)
7640 {
7641 char tmp_buf[100];
7642
7643 memset (tmp_buf, 0, sizeof (tmp_buf));
7644
7645 memcpy (tmp_buf + 0, digest_buf, 20);
7646 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7647
7648 uint tmp_len = 20 + salt.salt_len;
7649
7650 // base64 encode it
7651
7652 char base64_encoded[100];
7653
7654 memset (base64_encoded, 0, sizeof (base64_encoded));
7655
7656 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7657
7658 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7659 }
7660 else if (hash_mode == 10400)
7661 {
7662 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7663
7664 pdf_t *pdf = &pdfs[salt_pos];
7665
7666 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",
7667
7668 pdf->V,
7669 pdf->R,
7670 40,
7671 pdf->P,
7672 pdf->enc_md,
7673 pdf->id_len,
7674 byte_swap_32 (pdf->id_buf[0]),
7675 byte_swap_32 (pdf->id_buf[1]),
7676 byte_swap_32 (pdf->id_buf[2]),
7677 byte_swap_32 (pdf->id_buf[3]),
7678 pdf->u_len,
7679 byte_swap_32 (pdf->u_buf[0]),
7680 byte_swap_32 (pdf->u_buf[1]),
7681 byte_swap_32 (pdf->u_buf[2]),
7682 byte_swap_32 (pdf->u_buf[3]),
7683 byte_swap_32 (pdf->u_buf[4]),
7684 byte_swap_32 (pdf->u_buf[5]),
7685 byte_swap_32 (pdf->u_buf[6]),
7686 byte_swap_32 (pdf->u_buf[7]),
7687 pdf->o_len,
7688 byte_swap_32 (pdf->o_buf[0]),
7689 byte_swap_32 (pdf->o_buf[1]),
7690 byte_swap_32 (pdf->o_buf[2]),
7691 byte_swap_32 (pdf->o_buf[3]),
7692 byte_swap_32 (pdf->o_buf[4]),
7693 byte_swap_32 (pdf->o_buf[5]),
7694 byte_swap_32 (pdf->o_buf[6]),
7695 byte_swap_32 (pdf->o_buf[7])
7696 );
7697 }
7698 else if (hash_mode == 10410)
7699 {
7700 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7701
7702 pdf_t *pdf = &pdfs[salt_pos];
7703
7704 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",
7705
7706 pdf->V,
7707 pdf->R,
7708 40,
7709 pdf->P,
7710 pdf->enc_md,
7711 pdf->id_len,
7712 byte_swap_32 (pdf->id_buf[0]),
7713 byte_swap_32 (pdf->id_buf[1]),
7714 byte_swap_32 (pdf->id_buf[2]),
7715 byte_swap_32 (pdf->id_buf[3]),
7716 pdf->u_len,
7717 byte_swap_32 (pdf->u_buf[0]),
7718 byte_swap_32 (pdf->u_buf[1]),
7719 byte_swap_32 (pdf->u_buf[2]),
7720 byte_swap_32 (pdf->u_buf[3]),
7721 byte_swap_32 (pdf->u_buf[4]),
7722 byte_swap_32 (pdf->u_buf[5]),
7723 byte_swap_32 (pdf->u_buf[6]),
7724 byte_swap_32 (pdf->u_buf[7]),
7725 pdf->o_len,
7726 byte_swap_32 (pdf->o_buf[0]),
7727 byte_swap_32 (pdf->o_buf[1]),
7728 byte_swap_32 (pdf->o_buf[2]),
7729 byte_swap_32 (pdf->o_buf[3]),
7730 byte_swap_32 (pdf->o_buf[4]),
7731 byte_swap_32 (pdf->o_buf[5]),
7732 byte_swap_32 (pdf->o_buf[6]),
7733 byte_swap_32 (pdf->o_buf[7])
7734 );
7735 }
7736 else if (hash_mode == 10420)
7737 {
7738 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7739
7740 pdf_t *pdf = &pdfs[salt_pos];
7741
7742 u8 *rc4key = (u8 *) pdf->rc4key;
7743
7744 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",
7745
7746 pdf->V,
7747 pdf->R,
7748 40,
7749 pdf->P,
7750 pdf->enc_md,
7751 pdf->id_len,
7752 byte_swap_32 (pdf->id_buf[0]),
7753 byte_swap_32 (pdf->id_buf[1]),
7754 byte_swap_32 (pdf->id_buf[2]),
7755 byte_swap_32 (pdf->id_buf[3]),
7756 pdf->u_len,
7757 byte_swap_32 (pdf->u_buf[0]),
7758 byte_swap_32 (pdf->u_buf[1]),
7759 byte_swap_32 (pdf->u_buf[2]),
7760 byte_swap_32 (pdf->u_buf[3]),
7761 byte_swap_32 (pdf->u_buf[4]),
7762 byte_swap_32 (pdf->u_buf[5]),
7763 byte_swap_32 (pdf->u_buf[6]),
7764 byte_swap_32 (pdf->u_buf[7]),
7765 pdf->o_len,
7766 byte_swap_32 (pdf->o_buf[0]),
7767 byte_swap_32 (pdf->o_buf[1]),
7768 byte_swap_32 (pdf->o_buf[2]),
7769 byte_swap_32 (pdf->o_buf[3]),
7770 byte_swap_32 (pdf->o_buf[4]),
7771 byte_swap_32 (pdf->o_buf[5]),
7772 byte_swap_32 (pdf->o_buf[6]),
7773 byte_swap_32 (pdf->o_buf[7]),
7774 rc4key[0],
7775 rc4key[1],
7776 rc4key[2],
7777 rc4key[3],
7778 rc4key[4]
7779 );
7780 }
7781 else if (hash_mode == 10500)
7782 {
7783 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7784
7785 pdf_t *pdf = &pdfs[salt_pos];
7786
7787 if (pdf->id_len == 32)
7788 {
7789 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",
7790
7791 pdf->V,
7792 pdf->R,
7793 128,
7794 pdf->P,
7795 pdf->enc_md,
7796 pdf->id_len,
7797 byte_swap_32 (pdf->id_buf[0]),
7798 byte_swap_32 (pdf->id_buf[1]),
7799 byte_swap_32 (pdf->id_buf[2]),
7800 byte_swap_32 (pdf->id_buf[3]),
7801 byte_swap_32 (pdf->id_buf[4]),
7802 byte_swap_32 (pdf->id_buf[5]),
7803 byte_swap_32 (pdf->id_buf[6]),
7804 byte_swap_32 (pdf->id_buf[7]),
7805 pdf->u_len,
7806 byte_swap_32 (pdf->u_buf[0]),
7807 byte_swap_32 (pdf->u_buf[1]),
7808 byte_swap_32 (pdf->u_buf[2]),
7809 byte_swap_32 (pdf->u_buf[3]),
7810 byte_swap_32 (pdf->u_buf[4]),
7811 byte_swap_32 (pdf->u_buf[5]),
7812 byte_swap_32 (pdf->u_buf[6]),
7813 byte_swap_32 (pdf->u_buf[7]),
7814 pdf->o_len,
7815 byte_swap_32 (pdf->o_buf[0]),
7816 byte_swap_32 (pdf->o_buf[1]),
7817 byte_swap_32 (pdf->o_buf[2]),
7818 byte_swap_32 (pdf->o_buf[3]),
7819 byte_swap_32 (pdf->o_buf[4]),
7820 byte_swap_32 (pdf->o_buf[5]),
7821 byte_swap_32 (pdf->o_buf[6]),
7822 byte_swap_32 (pdf->o_buf[7])
7823 );
7824 }
7825 else
7826 {
7827 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",
7828
7829 pdf->V,
7830 pdf->R,
7831 128,
7832 pdf->P,
7833 pdf->enc_md,
7834 pdf->id_len,
7835 byte_swap_32 (pdf->id_buf[0]),
7836 byte_swap_32 (pdf->id_buf[1]),
7837 byte_swap_32 (pdf->id_buf[2]),
7838 byte_swap_32 (pdf->id_buf[3]),
7839 pdf->u_len,
7840 byte_swap_32 (pdf->u_buf[0]),
7841 byte_swap_32 (pdf->u_buf[1]),
7842 byte_swap_32 (pdf->u_buf[2]),
7843 byte_swap_32 (pdf->u_buf[3]),
7844 byte_swap_32 (pdf->u_buf[4]),
7845 byte_swap_32 (pdf->u_buf[5]),
7846 byte_swap_32 (pdf->u_buf[6]),
7847 byte_swap_32 (pdf->u_buf[7]),
7848 pdf->o_len,
7849 byte_swap_32 (pdf->o_buf[0]),
7850 byte_swap_32 (pdf->o_buf[1]),
7851 byte_swap_32 (pdf->o_buf[2]),
7852 byte_swap_32 (pdf->o_buf[3]),
7853 byte_swap_32 (pdf->o_buf[4]),
7854 byte_swap_32 (pdf->o_buf[5]),
7855 byte_swap_32 (pdf->o_buf[6]),
7856 byte_swap_32 (pdf->o_buf[7])
7857 );
7858 }
7859 }
7860 else if (hash_mode == 10600)
7861 {
7862 uint digest_idx = salt.digests_offset + digest_pos;
7863
7864 hashinfo_t **hashinfo_ptr = data.hash_info;
7865 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7866
7867 snprintf (out_buf, len-1, "%s", hash_buf);
7868 }
7869 else if (hash_mode == 10700)
7870 {
7871 uint digest_idx = salt.digests_offset + digest_pos;
7872
7873 hashinfo_t **hashinfo_ptr = data.hash_info;
7874 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7875
7876 snprintf (out_buf, len-1, "%s", hash_buf);
7877 }
7878 else if (hash_mode == 10900)
7879 {
7880 uint digest_idx = salt.digests_offset + digest_pos;
7881
7882 hashinfo_t **hashinfo_ptr = data.hash_info;
7883 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7884
7885 snprintf (out_buf, len-1, "%s", hash_buf);
7886 }
7887 else if (hash_mode == 11100)
7888 {
7889 u32 salt_challenge = salt.salt_buf[0];
7890
7891 salt_challenge = byte_swap_32 (salt_challenge);
7892
7893 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7894
7895 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7896 SIGNATURE_POSTGRESQL_AUTH,
7897 user_name,
7898 salt_challenge,
7899 digest_buf[0],
7900 digest_buf[1],
7901 digest_buf[2],
7902 digest_buf[3]);
7903 }
7904 else if (hash_mode == 11200)
7905 {
7906 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7907 SIGNATURE_MYSQL_AUTH,
7908 (unsigned char *) salt.salt_buf,
7909 digest_buf[0],
7910 digest_buf[1],
7911 digest_buf[2],
7912 digest_buf[3],
7913 digest_buf[4]);
7914 }
7915 else if (hash_mode == 11300)
7916 {
7917 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7918
7919 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7920
7921 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7922 const uint ckey_len = bitcoin_wallet->ckey_len;
7923 const uint public_key_len = bitcoin_wallet->public_key_len;
7924
7925 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7926 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7927 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7928
7929 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7930 {
7931 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7932
7933 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7934 }
7935
7936 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7937 {
7938 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7939
7940 sprintf (ckey_buf + j, "%02x", ptr[i]);
7941 }
7942
7943 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7944 {
7945 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
7946
7947 sprintf (public_key_buf + j, "%02x", ptr[i]);
7948 }
7949
7950 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7951 SIGNATURE_BITCOIN_WALLET,
7952 cry_master_len * 2,
7953 cry_master_buf,
7954 salt.salt_len,
7955 (unsigned char *) salt.salt_buf,
7956 salt.salt_iter + 1,
7957 ckey_len * 2,
7958 ckey_buf,
7959 public_key_len * 2,
7960 public_key_buf
7961 );
7962
7963 free (cry_master_buf);
7964 free (ckey_buf);
7965 free (public_key_buf);
7966 }
7967 else if (hash_mode == 11400)
7968 {
7969 uint digest_idx = salt.digests_offset + digest_pos;
7970
7971 hashinfo_t **hashinfo_ptr = data.hash_info;
7972 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7973
7974 snprintf (out_buf, len-1, "%s", hash_buf);
7975 }
7976 else if (hash_mode == 11600)
7977 {
7978 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7979
7980 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7981
7982 const uint data_len = seven_zip->data_len;
7983
7984 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7985
7986 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7987 {
7988 const u8 *ptr = (const u8 *) seven_zip->data_buf;
7989
7990 sprintf (data_buf + j, "%02x", ptr[i]);
7991 }
7992
7993 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7994 SIGNATURE_SEVEN_ZIP,
7995 0,
7996 salt.salt_sign[0],
7997 0,
7998 (char *) seven_zip->salt_buf,
7999 seven_zip->iv_len,
8000 seven_zip->iv_buf[0],
8001 seven_zip->iv_buf[1],
8002 seven_zip->iv_buf[2],
8003 seven_zip->iv_buf[3],
8004 seven_zip->crc,
8005 seven_zip->data_len,
8006 seven_zip->unpack_size,
8007 data_buf);
8008
8009 free (data_buf);
8010 }
8011 else if (hash_mode == 11700)
8012 {
8013 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8014 digest_buf[0],
8015 digest_buf[1],
8016 digest_buf[2],
8017 digest_buf[3],
8018 digest_buf[4],
8019 digest_buf[5],
8020 digest_buf[6],
8021 digest_buf[7]);
8022 }
8023 else if (hash_mode == 11800)
8024 {
8025 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8026 digest_buf[ 0],
8027 digest_buf[ 1],
8028 digest_buf[ 2],
8029 digest_buf[ 3],
8030 digest_buf[ 4],
8031 digest_buf[ 5],
8032 digest_buf[ 6],
8033 digest_buf[ 7],
8034 digest_buf[ 8],
8035 digest_buf[ 9],
8036 digest_buf[10],
8037 digest_buf[11],
8038 digest_buf[12],
8039 digest_buf[13],
8040 digest_buf[14],
8041 digest_buf[15]);
8042 }
8043 else if (hash_mode == 11900)
8044 {
8045 uint digest_idx = salt.digests_offset + digest_pos;
8046
8047 hashinfo_t **hashinfo_ptr = data.hash_info;
8048 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8049
8050 snprintf (out_buf, len-1, "%s", hash_buf);
8051 }
8052 else if (hash_mode == 12000)
8053 {
8054 uint digest_idx = salt.digests_offset + digest_pos;
8055
8056 hashinfo_t **hashinfo_ptr = data.hash_info;
8057 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8058
8059 snprintf (out_buf, len-1, "%s", hash_buf);
8060 }
8061 else if (hash_mode == 12100)
8062 {
8063 uint digest_idx = salt.digests_offset + digest_pos;
8064
8065 hashinfo_t **hashinfo_ptr = data.hash_info;
8066 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8067
8068 snprintf (out_buf, len-1, "%s", hash_buf);
8069 }
8070 else if (hash_mode == 12200)
8071 {
8072 uint *ptr_digest = digest_buf;
8073 uint *ptr_salt = salt.salt_buf;
8074
8075 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8076 SIGNATURE_ECRYPTFS,
8077 ptr_salt[0],
8078 ptr_salt[1],
8079 ptr_digest[0],
8080 ptr_digest[1]);
8081 }
8082 else if (hash_mode == 12300)
8083 {
8084 uint *ptr_digest = digest_buf;
8085 uint *ptr_salt = salt.salt_buf;
8086
8087 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",
8088 ptr_digest[ 0], ptr_digest[ 1],
8089 ptr_digest[ 2], ptr_digest[ 3],
8090 ptr_digest[ 4], ptr_digest[ 5],
8091 ptr_digest[ 6], ptr_digest[ 7],
8092 ptr_digest[ 8], ptr_digest[ 9],
8093 ptr_digest[10], ptr_digest[11],
8094 ptr_digest[12], ptr_digest[13],
8095 ptr_digest[14], ptr_digest[15],
8096 ptr_salt[0],
8097 ptr_salt[1],
8098 ptr_salt[2],
8099 ptr_salt[3]);
8100 }
8101 else if (hash_mode == 12400)
8102 {
8103 // encode iteration count
8104
8105 char salt_iter[5];
8106
8107 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8108 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8109 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8110 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8111 salt_iter[4] = 0;
8112
8113 // encode salt
8114
8115 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8116 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8117 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8118 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8119 ptr_salt[4] = 0;
8120
8121 // encode digest
8122
8123 memset (tmp_buf, 0, sizeof (tmp_buf));
8124
8125 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8126 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8127
8128 memcpy (tmp_buf, digest_buf, 8);
8129
8130 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8131
8132 ptr_plain[11] = 0;
8133
8134 // fill the resulting buffer
8135
8136 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8137 }
8138 else if (hash_mode == 12500)
8139 {
8140 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8141 SIGNATURE_RAR3,
8142 byte_swap_32 (salt.salt_buf[0]),
8143 byte_swap_32 (salt.salt_buf[1]),
8144 salt.salt_buf[2],
8145 salt.salt_buf[3],
8146 salt.salt_buf[4],
8147 salt.salt_buf[5]);
8148 }
8149 else if (hash_mode == 12600)
8150 {
8151 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8152 digest_buf[0] + salt.salt_buf_pc[0],
8153 digest_buf[1] + salt.salt_buf_pc[1],
8154 digest_buf[2] + salt.salt_buf_pc[2],
8155 digest_buf[3] + salt.salt_buf_pc[3],
8156 digest_buf[4] + salt.salt_buf_pc[4],
8157 digest_buf[5] + salt.salt_buf_pc[5],
8158 digest_buf[6] + salt.salt_buf_pc[6],
8159 digest_buf[7] + salt.salt_buf_pc[7]);
8160 }
8161 else if (hash_mode == 12700)
8162 {
8163 uint digest_idx = salt.digests_offset + digest_pos;
8164
8165 hashinfo_t **hashinfo_ptr = data.hash_info;
8166 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8167
8168 snprintf (out_buf, len-1, "%s", hash_buf);
8169 }
8170 else if (hash_mode == 12800)
8171 {
8172 const u8 *ptr = (const u8 *) salt.salt_buf;
8173
8174 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",
8175 SIGNATURE_MS_DRSR,
8176 ptr[0],
8177 ptr[1],
8178 ptr[2],
8179 ptr[3],
8180 ptr[4],
8181 ptr[5],
8182 ptr[6],
8183 ptr[7],
8184 ptr[8],
8185 ptr[9],
8186 salt.salt_iter + 1,
8187 byte_swap_32 (digest_buf[0]),
8188 byte_swap_32 (digest_buf[1]),
8189 byte_swap_32 (digest_buf[2]),
8190 byte_swap_32 (digest_buf[3]),
8191 byte_swap_32 (digest_buf[4]),
8192 byte_swap_32 (digest_buf[5]),
8193 byte_swap_32 (digest_buf[6]),
8194 byte_swap_32 (digest_buf[7])
8195 );
8196 }
8197 else if (hash_mode == 12900)
8198 {
8199 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",
8200 salt.salt_buf[ 4],
8201 salt.salt_buf[ 5],
8202 salt.salt_buf[ 6],
8203 salt.salt_buf[ 7],
8204 salt.salt_buf[ 8],
8205 salt.salt_buf[ 9],
8206 salt.salt_buf[10],
8207 salt.salt_buf[11],
8208 byte_swap_32 (digest_buf[0]),
8209 byte_swap_32 (digest_buf[1]),
8210 byte_swap_32 (digest_buf[2]),
8211 byte_swap_32 (digest_buf[3]),
8212 byte_swap_32 (digest_buf[4]),
8213 byte_swap_32 (digest_buf[5]),
8214 byte_swap_32 (digest_buf[6]),
8215 byte_swap_32 (digest_buf[7]),
8216 salt.salt_buf[ 0],
8217 salt.salt_buf[ 1],
8218 salt.salt_buf[ 2],
8219 salt.salt_buf[ 3]
8220 );
8221 }
8222 else if (hash_mode == 13000)
8223 {
8224 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8225
8226 rar5_t *rar5 = &rar5s[salt_pos];
8227
8228 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8229 salt.salt_buf[0],
8230 salt.salt_buf[1],
8231 salt.salt_buf[2],
8232 salt.salt_buf[3],
8233 salt.salt_sign[0],
8234 rar5->iv[0],
8235 rar5->iv[1],
8236 rar5->iv[2],
8237 rar5->iv[3],
8238 byte_swap_32 (digest_buf[0]),
8239 byte_swap_32 (digest_buf[1])
8240 );
8241 }
8242 else
8243 {
8244 if (hash_type == HASH_TYPE_MD4)
8245 {
8246 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8247 digest_buf[0],
8248 digest_buf[1],
8249 digest_buf[2],
8250 digest_buf[3]);
8251 }
8252 else if (hash_type == HASH_TYPE_MD5)
8253 {
8254 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8255 digest_buf[0],
8256 digest_buf[1],
8257 digest_buf[2],
8258 digest_buf[3]);
8259 }
8260 else if (hash_type == HASH_TYPE_SHA1)
8261 {
8262 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8263 digest_buf[0],
8264 digest_buf[1],
8265 digest_buf[2],
8266 digest_buf[3],
8267 digest_buf[4]);
8268 }
8269 else if (hash_type == HASH_TYPE_SHA256)
8270 {
8271 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8272 digest_buf[0],
8273 digest_buf[1],
8274 digest_buf[2],
8275 digest_buf[3],
8276 digest_buf[4],
8277 digest_buf[5],
8278 digest_buf[6],
8279 digest_buf[7]);
8280 }
8281 else if (hash_type == HASH_TYPE_SHA384)
8282 {
8283 uint *ptr = digest_buf;
8284
8285 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8286 ptr[ 1], ptr[ 0],
8287 ptr[ 3], ptr[ 2],
8288 ptr[ 5], ptr[ 4],
8289 ptr[ 7], ptr[ 6],
8290 ptr[ 9], ptr[ 8],
8291 ptr[11], ptr[10]);
8292 }
8293 else if (hash_type == HASH_TYPE_SHA512)
8294 {
8295 uint *ptr = digest_buf;
8296
8297 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8298 ptr[ 1], ptr[ 0],
8299 ptr[ 3], ptr[ 2],
8300 ptr[ 5], ptr[ 4],
8301 ptr[ 7], ptr[ 6],
8302 ptr[ 9], ptr[ 8],
8303 ptr[11], ptr[10],
8304 ptr[13], ptr[12],
8305 ptr[15], ptr[14]);
8306 }
8307 else if (hash_type == HASH_TYPE_LM)
8308 {
8309 snprintf (out_buf, len-1, "%08x%08x",
8310 digest_buf[0],
8311 digest_buf[1]);
8312 }
8313 else if (hash_type == HASH_TYPE_ORACLEH)
8314 {
8315 snprintf (out_buf, len-1, "%08X%08X",
8316 digest_buf[0],
8317 digest_buf[1]);
8318 }
8319 else if (hash_type == HASH_TYPE_BCRYPT)
8320 {
8321 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8322 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8323
8324 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8325
8326 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8327 }
8328 else if (hash_type == HASH_TYPE_KECCAK)
8329 {
8330 uint *ptr = digest_buf;
8331
8332 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",
8333 ptr[ 1], ptr[ 0],
8334 ptr[ 3], ptr[ 2],
8335 ptr[ 5], ptr[ 4],
8336 ptr[ 7], ptr[ 6],
8337 ptr[ 9], ptr[ 8],
8338 ptr[11], ptr[10],
8339 ptr[13], ptr[12],
8340 ptr[15], ptr[14],
8341 ptr[17], ptr[16],
8342 ptr[19], ptr[18],
8343 ptr[21], ptr[20],
8344 ptr[23], ptr[22],
8345 ptr[25], ptr[24],
8346 ptr[27], ptr[26],
8347 ptr[29], ptr[28],
8348 ptr[31], ptr[30],
8349 ptr[33], ptr[32],
8350 ptr[35], ptr[34],
8351 ptr[37], ptr[36],
8352 ptr[39], ptr[38],
8353 ptr[41], ptr[30],
8354 ptr[43], ptr[42],
8355 ptr[45], ptr[44],
8356 ptr[47], ptr[46],
8357 ptr[49], ptr[48]
8358 );
8359
8360 out_buf[salt.keccak_mdlen * 2] = 0;
8361 }
8362 else if (hash_type == HASH_TYPE_RIPEMD160)
8363 {
8364 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8365 digest_buf[0],
8366 digest_buf[1],
8367 digest_buf[2],
8368 digest_buf[3],
8369 digest_buf[4]);
8370 }
8371 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8372 {
8373 digest_buf[ 0] = digest_buf[ 0];
8374 digest_buf[ 1] = digest_buf[ 1];
8375 digest_buf[ 2] = digest_buf[ 2];
8376 digest_buf[ 3] = digest_buf[ 3];
8377 digest_buf[ 4] = digest_buf[ 4];
8378 digest_buf[ 5] = digest_buf[ 5];
8379 digest_buf[ 6] = digest_buf[ 6];
8380 digest_buf[ 7] = digest_buf[ 7];
8381 digest_buf[ 8] = digest_buf[ 8];
8382 digest_buf[ 9] = digest_buf[ 9];
8383 digest_buf[10] = digest_buf[10];
8384 digest_buf[11] = digest_buf[11];
8385 digest_buf[12] = digest_buf[12];
8386 digest_buf[13] = digest_buf[13];
8387 digest_buf[14] = digest_buf[14];
8388 digest_buf[15] = digest_buf[15];
8389
8390 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8391 digest_buf[ 0],
8392 digest_buf[ 1],
8393 digest_buf[ 2],
8394 digest_buf[ 3],
8395 digest_buf[ 4],
8396 digest_buf[ 5],
8397 digest_buf[ 6],
8398 digest_buf[ 7],
8399 digest_buf[ 8],
8400 digest_buf[ 9],
8401 digest_buf[10],
8402 digest_buf[11],
8403 digest_buf[12],
8404 digest_buf[13],
8405 digest_buf[14],
8406 digest_buf[15]);
8407 }
8408 else if (hash_type == HASH_TYPE_GOST)
8409 {
8410 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8411 digest_buf[0],
8412 digest_buf[1],
8413 digest_buf[2],
8414 digest_buf[3],
8415 digest_buf[4],
8416 digest_buf[5],
8417 digest_buf[6],
8418 digest_buf[7]);
8419 }
8420 else if (hash_type == HASH_TYPE_MYSQL)
8421 {
8422 snprintf (out_buf, len-1, "%08x%08x",
8423 digest_buf[0],
8424 digest_buf[1]);
8425 }
8426 else if (hash_type == HASH_TYPE_LOTUS5)
8427 {
8428 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8429 digest_buf[0],
8430 digest_buf[1],
8431 digest_buf[2],
8432 digest_buf[3]);
8433 }
8434 else if (hash_type == HASH_TYPE_LOTUS6)
8435 {
8436 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8437 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8438 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8439 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8440
8441 char buf[16];
8442
8443 memcpy (buf + 0, salt.salt_buf, 5);
8444 memcpy (buf + 5, digest_buf, 9);
8445
8446 buf[3] -= -4;
8447
8448 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8449
8450 tmp_buf[18] = salt.salt_buf_pc[7];
8451 tmp_buf[19] = 0;
8452
8453 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8454 }
8455 else if (hash_type == HASH_TYPE_LOTUS8)
8456 {
8457 char buf[52];
8458
8459 memset (buf, 0, sizeof (buf));
8460
8461 // salt
8462
8463 memcpy (buf + 0, salt.salt_buf, 16);
8464
8465 buf[3] -= -4;
8466
8467 // iteration
8468
8469 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8470
8471 // chars
8472
8473 buf[26] = salt.salt_buf_pc[0];
8474 buf[27] = salt.salt_buf_pc[1];
8475
8476 // digest
8477
8478 memcpy (buf + 28, digest_buf, 8);
8479
8480 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8481
8482 tmp_buf[49] = 0;
8483
8484 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8485 }
8486 else if (hash_type == HASH_TYPE_CRC32)
8487 {
8488 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8489 }
8490 }
8491
8492 if (salt_type == SALT_TYPE_INTERN)
8493 {
8494 size_t pos = strlen (out_buf);
8495
8496 out_buf[pos] = data.separator;
8497
8498 char *ptr = (char *) salt.salt_buf;
8499
8500 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8501
8502 out_buf[pos + 1 + salt.salt_len] = 0;
8503 }
8504 }
8505
8506 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8507 {
8508 memset (hccap, 0, sizeof (hccap_t));
8509
8510 salt_t *salt = &data.salts_buf[salt_pos];
8511
8512 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8513
8514 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8515 wpa_t *wpa = &wpas[salt_pos];
8516
8517 hccap->keyver = wpa->keyver;
8518
8519 hccap->eapol_size = wpa->eapol_size;
8520
8521 if (wpa->keyver != 1)
8522 {
8523 uint eapol_tmp[64];
8524
8525 for (uint i = 0; i < 64; i++)
8526 {
8527 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8528 }
8529
8530 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8531 }
8532 else
8533 {
8534 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8535 }
8536
8537 uint pke_tmp[25];
8538
8539 for (int i = 5; i < 25; i++)
8540 {
8541 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8542 }
8543
8544 char *pke_ptr = (char *) pke_tmp;
8545
8546 memcpy (hccap->mac1, pke_ptr + 23, 6);
8547 memcpy (hccap->mac2, pke_ptr + 29, 6);
8548 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8549 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8550
8551 char *digests_buf_ptr = (char *) data.digests_buf;
8552
8553 uint dgst_size = data.dgst_size;
8554
8555 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8556
8557 if (wpa->keyver != 1)
8558 {
8559 uint digest_tmp[4];
8560
8561 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8562 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8563 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8564 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8565
8566 memcpy (hccap->keymic, digest_tmp, 16);
8567 }
8568 else
8569 {
8570 memcpy (hccap->keymic, digest_ptr, 16);
8571 }
8572 }
8573
8574 void SuspendThreads ()
8575 {
8576 if (data.devices_status == STATUS_RUNNING)
8577 {
8578 hc_timer_set (&data.timer_paused);
8579
8580 data.devices_status = STATUS_PAUSED;
8581
8582 log_info ("Paused");
8583 }
8584 }
8585
8586 void ResumeThreads ()
8587 {
8588 if (data.devices_status == STATUS_PAUSED)
8589 {
8590 float ms_paused;
8591
8592 hc_timer_get (data.timer_paused, ms_paused);
8593
8594 data.ms_paused += ms_paused;
8595
8596 data.devices_status = STATUS_RUNNING;
8597
8598 log_info ("Resumed");
8599 }
8600 }
8601
8602 void bypass ()
8603 {
8604 if (data.devices_status != STATUS_RUNNING) return;
8605
8606 data.devices_status = STATUS_BYPASS;
8607
8608 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8609 }
8610
8611 void stop_at_checkpoint ()
8612 {
8613 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8614 {
8615 if (data.devices_status != STATUS_RUNNING) return;
8616 }
8617
8618 // this feature only makes sense if --restore-disable was not specified
8619
8620 if (data.restore_disable == 1)
8621 {
8622 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8623
8624 return;
8625 }
8626
8627 // check if monitoring of Restore Point updates should be enabled or disabled
8628
8629 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8630 {
8631 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8632
8633 // save the current restore point value
8634
8635 data.checkpoint_cur_words = get_lowest_words_done ();
8636
8637 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8638 }
8639 else
8640 {
8641 data.devices_status = STATUS_RUNNING;
8642
8643 // reset the global value for checkpoint checks
8644
8645 data.checkpoint_cur_words = 0;
8646
8647 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8648 }
8649 }
8650
8651 void myabort ()
8652 {
8653 if (data.devices_status == STATUS_INIT) return;
8654 if (data.devices_status == STATUS_STARTING) return;
8655
8656 data.devices_status = STATUS_ABORTED;
8657 }
8658
8659 void myquit ()
8660 {
8661 if (data.devices_status == STATUS_INIT) return;
8662 if (data.devices_status == STATUS_STARTING) return;
8663
8664 data.devices_status = STATUS_QUIT;
8665 }
8666
8667 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8668 {
8669 FILE *fp;
8670
8671 if ((fp = fopen (kernel_file, "rb")) != NULL)
8672 {
8673 struct stat st;
8674
8675 memset (&st, 0, sizeof (st));
8676
8677 stat (kernel_file, &st);
8678
8679 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8680
8681 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8682
8683 if (num_read != (size_t) st.st_size)
8684 {
8685 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8686
8687 exit (-1);
8688 }
8689
8690 fclose (fp);
8691
8692 buf[st.st_size] = 0;
8693
8694 for (int i = 0; i < num_devices; i++)
8695 {
8696 kernel_lengths[i] = (size_t) st.st_size;
8697
8698 kernel_sources[i] = buf;
8699 }
8700 }
8701 else
8702 {
8703 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8704
8705 exit (-1);
8706 }
8707
8708 return;
8709 }
8710
8711 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8712 {
8713 FILE *fp = fopen (dst, "wb");
8714
8715 fwrite (binary, sizeof (u8), binary_size, fp);
8716
8717 fflush (fp);
8718 fclose (fp);
8719 }
8720
8721 /**
8722 * restore
8723 */
8724
8725 restore_data_t *init_restore (int argc, char **argv)
8726 {
8727 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8728
8729 if (data.restore_disable == 0)
8730 {
8731 FILE *fp = fopen (data.eff_restore_file, "rb");
8732
8733 if (fp)
8734 {
8735 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8736
8737 if (nread != 1)
8738 {
8739 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8740
8741 exit (-1);
8742 }
8743
8744 fclose (fp);
8745
8746 if (rd->pid)
8747 {
8748 char pidbin[BUFSIZ];
8749
8750 int pidbin_len;
8751
8752 #ifdef _POSIX
8753 memset (pidbin, 0, sizeof (pidbin));
8754
8755 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8756
8757 FILE *fd = fopen (pidbin, "rb");
8758
8759 if (fd)
8760 {
8761 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8762
8763 pidbin[pidbin_len] = 0;
8764
8765 fclose (fd);
8766
8767 char *argv0_r = strrchr (argv[0], '/');
8768
8769 char *pidbin_r = strrchr (pidbin, '/');
8770
8771 if (argv0_r == NULL) argv0_r = argv[0];
8772
8773 if (pidbin_r == NULL) pidbin_r = pidbin;
8774
8775 if (strcmp (argv0_r, pidbin_r) == 0)
8776 {
8777 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8778
8779 exit (-1);
8780 }
8781 }
8782
8783 #elif _WIN
8784 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8785
8786 char pidbin2[BUFSIZ];
8787
8788 int pidbin2_len;
8789
8790 memset (pidbin2, 0, sizeof (pidbin2));
8791
8792 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8793 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8794
8795 pidbin[pidbin_len] = 0;
8796 pidbin2[pidbin2_len] = 0;
8797
8798 if (pidbin2_len)
8799 {
8800 if (strcmp (pidbin, pidbin2) == 0)
8801 {
8802 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8803
8804 exit (-1);
8805 }
8806 }
8807 #endif
8808 }
8809
8810 if (rd->version_bin < RESTORE_MIN)
8811 {
8812 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8813
8814 exit (-1);
8815 }
8816 }
8817 }
8818
8819 memset (rd, 0, sizeof (restore_data_t));
8820
8821 rd->version_bin = VERSION_BIN;
8822
8823 #ifdef _POSIX
8824 rd->pid = getpid ();
8825 #elif _WIN
8826 rd->pid = GetCurrentProcessId ();
8827 #endif
8828
8829 if (getcwd (rd->cwd, 255) == NULL)
8830 {
8831 myfree (rd);
8832
8833 return (NULL);
8834 }
8835
8836 rd->argc = argc;
8837 rd->argv = argv;
8838
8839 return (rd);
8840 }
8841
8842 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8843 {
8844 FILE *fp = fopen (eff_restore_file, "rb");
8845
8846 if (fp == NULL)
8847 {
8848 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8849
8850 exit (-1);
8851 }
8852
8853 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8854 {
8855 log_error ("ERROR: cannot read %s", eff_restore_file);
8856
8857 exit (-1);
8858 }
8859
8860 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8861
8862 for (uint i = 0; i < rd->argc; i++)
8863 {
8864 char buf[BUFSIZ];
8865
8866 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8867 {
8868 log_error ("ERROR: cannot read %s", eff_restore_file);
8869
8870 exit (-1);
8871 }
8872
8873 size_t len = strlen (buf);
8874
8875 if (len) buf[len - 1] = 0;
8876
8877 rd->argv[i] = mystrdup (buf);
8878 }
8879
8880 fclose (fp);
8881
8882 char new_cwd[256];
8883
8884 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8885
8886 if (nwd == NULL)
8887 {
8888 log_error ("Restore file is corrupted");
8889 }
8890
8891 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8892 {
8893 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8894 {
8895 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8896
8897 exit (-1);
8898 }
8899
8900 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8901 }
8902
8903
8904 if (chdir (rd->cwd))
8905 {
8906 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8907
8908 exit (-1);
8909 }
8910 }
8911
8912 u64 get_lowest_words_done ()
8913 {
8914 u64 words_cur = -1;
8915
8916 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8917 {
8918 hc_device_param_t *device_param = &data.devices_param[device_id];
8919
8920 if (device_param->skipped) continue;
8921
8922 const u64 words_done = device_param->words_done;
8923
8924 if (words_done < words_cur) words_cur = words_done;
8925 }
8926
8927 // It's possible that a device's workload isn't finished right after a restore-case.
8928 // In that case, this function would return 0 and overwrite the real restore point
8929 // There's also data.words_cur which is set to rd->words_cur but it changes while
8930 // the attack is running therefore we should stick to rd->words_cur.
8931 // Note that -s influences rd->words_cur we should keep a close look on that.
8932
8933 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8934
8935 return words_cur;
8936 }
8937
8938 void write_restore (const char *new_restore_file, restore_data_t *rd)
8939 {
8940 u64 words_cur = get_lowest_words_done ();
8941
8942 rd->words_cur = words_cur;
8943
8944 FILE *fp = fopen (new_restore_file, "wb");
8945
8946 if (fp == NULL)
8947 {
8948 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8949
8950 exit (-1);
8951 }
8952
8953 if (setvbuf (fp, NULL, _IONBF, 0))
8954 {
8955 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8956
8957 exit (-1);
8958 }
8959
8960 fwrite (rd, sizeof (restore_data_t), 1, fp);
8961
8962 for (uint i = 0; i < rd->argc; i++)
8963 {
8964 fprintf (fp, "%s", rd->argv[i]);
8965 fputc ('\n', fp);
8966 }
8967
8968 fflush (fp);
8969
8970 fsync (fileno (fp));
8971
8972 fclose (fp);
8973 }
8974
8975 void cycle_restore ()
8976 {
8977 const char *eff_restore_file = data.eff_restore_file;
8978 const char *new_restore_file = data.new_restore_file;
8979
8980 restore_data_t *rd = data.rd;
8981
8982 write_restore (new_restore_file, rd);
8983
8984 struct stat st;
8985
8986 memset (&st, 0, sizeof(st));
8987
8988 if (stat (eff_restore_file, &st) == 0)
8989 {
8990 if (unlink (eff_restore_file))
8991 {
8992 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8993 }
8994 }
8995
8996 if (rename (new_restore_file, eff_restore_file))
8997 {
8998 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8999 }
9000 }
9001
9002 void check_checkpoint ()
9003 {
9004 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9005
9006 u64 words_cur = get_lowest_words_done ();
9007
9008 if (words_cur != data.checkpoint_cur_words)
9009 {
9010 myabort ();
9011 }
9012 }
9013
9014 /**
9015 * adjustments
9016 */
9017
9018 uint set_kernel_accel (uint hash_mode)
9019 {
9020 switch (hash_mode)
9021 {
9022 case 0: return GET_ACCEL (0);
9023 case 10: return GET_ACCEL (10);
9024 case 11: return GET_ACCEL (11);
9025 case 12: return GET_ACCEL (12);
9026 case 20: return GET_ACCEL (20);
9027 case 21: return GET_ACCEL (21);
9028 case 22: return GET_ACCEL (22);
9029 case 23: return GET_ACCEL (23);
9030 case 30: return GET_ACCEL (30);
9031 case 40: return GET_ACCEL (40);
9032 case 50: return GET_ACCEL (50);
9033 case 60: return GET_ACCEL (60);
9034 case 100: return GET_ACCEL (100);
9035 case 101: return GET_ACCEL (101);
9036 case 110: return GET_ACCEL (110);
9037 case 111: return GET_ACCEL (111);
9038 case 112: return GET_ACCEL (112);
9039 case 120: return GET_ACCEL (120);
9040 case 121: return GET_ACCEL (121);
9041 case 122: return GET_ACCEL (122);
9042 case 124: return GET_ACCEL (124);
9043 case 130: return GET_ACCEL (130);
9044 case 131: return GET_ACCEL (131);
9045 case 132: return GET_ACCEL (132);
9046 case 133: return GET_ACCEL (133);
9047 case 140: return GET_ACCEL (140);
9048 case 141: return GET_ACCEL (141);
9049 case 150: return GET_ACCEL (150);
9050 case 160: return GET_ACCEL (160);
9051 case 190: return GET_ACCEL (190);
9052 case 200: return GET_ACCEL (200);
9053 case 300: return GET_ACCEL (300);
9054 case 400: return GET_ACCEL (400);
9055 case 500: return GET_ACCEL (500);
9056 case 501: return GET_ACCEL (501);
9057 case 900: return GET_ACCEL (900);
9058 case 910: return GET_ACCEL (910);
9059 case 1000: return GET_ACCEL (1000);
9060 case 1100: return GET_ACCEL (1100);
9061 case 1400: return GET_ACCEL (1400);
9062 case 1410: return GET_ACCEL (1410);
9063 case 1420: return GET_ACCEL (1420);
9064 case 1421: return GET_ACCEL (1421);
9065 case 1430: return GET_ACCEL (1430);
9066 case 1440: return GET_ACCEL (1440);
9067 case 1441: return GET_ACCEL (1441);
9068 case 1450: return GET_ACCEL (1450);
9069 case 1460: return GET_ACCEL (1460);
9070 case 1500: return GET_ACCEL (1500);
9071 case 1600: return GET_ACCEL (1600);
9072 case 1700: return GET_ACCEL (1700);
9073 case 1710: return GET_ACCEL (1710);
9074 case 1711: return GET_ACCEL (1711);
9075 case 1720: return GET_ACCEL (1720);
9076 case 1722: return GET_ACCEL (1722);
9077 case 1730: return GET_ACCEL (1730);
9078 case 1731: return GET_ACCEL (1731);
9079 case 1740: return GET_ACCEL (1740);
9080 case 1750: return GET_ACCEL (1750);
9081 case 1760: return GET_ACCEL (1760);
9082 case 1800: return GET_ACCEL (1800);
9083 case 2100: return GET_ACCEL (2100);
9084 case 2400: return GET_ACCEL (2400);
9085 case 2410: return GET_ACCEL (2410);
9086 case 2500: return GET_ACCEL (2500);
9087 case 2600: return GET_ACCEL (2600);
9088 case 2611: return GET_ACCEL (2611);
9089 case 2612: return GET_ACCEL (2612);
9090 case 2711: return GET_ACCEL (2711);
9091 case 2811: return GET_ACCEL (2811);
9092 case 3000: return GET_ACCEL (3000);
9093 case 3100: return GET_ACCEL (3100);
9094 case 3200: return GET_ACCEL (3200);
9095 case 3710: return GET_ACCEL (3710);
9096 case 3711: return GET_ACCEL (3711);
9097 case 3800: return GET_ACCEL (3800);
9098 case 4300: return GET_ACCEL (4300);
9099 case 4400: return GET_ACCEL (4400);
9100 case 4500: return GET_ACCEL (4500);
9101 case 4700: return GET_ACCEL (4700);
9102 case 4800: return GET_ACCEL (4800);
9103 case 4900: return GET_ACCEL (4900);
9104 case 5000: return GET_ACCEL (5000);
9105 case 5100: return GET_ACCEL (5100);
9106 case 5200: return GET_ACCEL (5200);
9107 case 5300: return GET_ACCEL (5300);
9108 case 5400: return GET_ACCEL (5400);
9109 case 5500: return GET_ACCEL (5500);
9110 case 5600: return GET_ACCEL (5600);
9111 case 5700: return GET_ACCEL (5700);
9112 case 5800: return GET_ACCEL (5800);
9113 case 6000: return GET_ACCEL (6000);
9114 case 6100: return GET_ACCEL (6100);
9115 case 6211: return GET_ACCEL (6211);
9116 case 6212: return GET_ACCEL (6212);
9117 case 6213: return GET_ACCEL (6213);
9118 case 6221: return GET_ACCEL (6221);
9119 case 6222: return GET_ACCEL (6222);
9120 case 6223: return GET_ACCEL (6223);
9121 case 6231: return GET_ACCEL (6231);
9122 case 6232: return GET_ACCEL (6232);
9123 case 6233: return GET_ACCEL (6233);
9124 case 6241: return GET_ACCEL (6241);
9125 case 6242: return GET_ACCEL (6242);
9126 case 6243: return GET_ACCEL (6243);
9127 case 6300: return GET_ACCEL (6300);
9128 case 6400: return GET_ACCEL (6400);
9129 case 6500: return GET_ACCEL (6500);
9130 case 6600: return GET_ACCEL (6600);
9131 case 6700: return GET_ACCEL (6700);
9132 case 6800: return GET_ACCEL (6800);
9133 case 6900: return GET_ACCEL (6900);
9134 case 7100: return GET_ACCEL (7100);
9135 case 7200: return GET_ACCEL (7200);
9136 case 7300: return GET_ACCEL (7300);
9137 case 7400: return GET_ACCEL (7400);
9138 case 7500: return GET_ACCEL (7500);
9139 case 7600: return GET_ACCEL (7600);
9140 case 7700: return GET_ACCEL (7700);
9141 case 7800: return GET_ACCEL (7800);
9142 case 7900: return GET_ACCEL (7900);
9143 case 8000: return GET_ACCEL (8000);
9144 case 8100: return GET_ACCEL (8100);
9145 case 8200: return GET_ACCEL (8200);
9146 case 8300: return GET_ACCEL (8300);
9147 case 8400: return GET_ACCEL (8400);
9148 case 8500: return GET_ACCEL (8500);
9149 case 8600: return GET_ACCEL (8600);
9150 case 8700: return GET_ACCEL (8700);
9151 case 8800: return GET_ACCEL (8800);
9152 case 8900: return GET_ACCEL (8900);
9153 case 9000: return GET_ACCEL (9000);
9154 case 9100: return GET_ACCEL (9100);
9155 case 9200: return GET_ACCEL (9200);
9156 case 9300: return GET_ACCEL (9300);
9157 case 9400: return GET_ACCEL (9400);
9158 case 9500: return GET_ACCEL (9500);
9159 case 9600: return GET_ACCEL (9600);
9160 case 9700: return GET_ACCEL (9700);
9161 case 9710: return GET_ACCEL (9710);
9162 case 9720: return GET_ACCEL (9720);
9163 case 9800: return GET_ACCEL (9800);
9164 case 9810: return GET_ACCEL (9810);
9165 case 9820: return GET_ACCEL (9820);
9166 case 9900: return GET_ACCEL (9900);
9167 case 10000: return GET_ACCEL (10000);
9168 case 10100: return GET_ACCEL (10100);
9169 case 10200: return GET_ACCEL (10200);
9170 case 10300: return GET_ACCEL (10300);
9171 case 10400: return GET_ACCEL (10400);
9172 case 10410: return GET_ACCEL (10410);
9173 case 10420: return GET_ACCEL (10420);
9174 case 10500: return GET_ACCEL (10500);
9175 case 10600: return GET_ACCEL (10600);
9176 case 10700: return GET_ACCEL (10700);
9177 case 10800: return GET_ACCEL (10800);
9178 case 10900: return GET_ACCEL (10900);
9179 case 11000: return GET_ACCEL (11000);
9180 case 11100: return GET_ACCEL (11100);
9181 case 11200: return GET_ACCEL (11200);
9182 case 11300: return GET_ACCEL (11300);
9183 case 11400: return GET_ACCEL (11400);
9184 case 11500: return GET_ACCEL (11500);
9185 case 11600: return GET_ACCEL (11600);
9186 case 11700: return GET_ACCEL (11700);
9187 case 11800: return GET_ACCEL (11800);
9188 case 11900: return GET_ACCEL (11900);
9189 case 12000: return GET_ACCEL (12000);
9190 case 12100: return GET_ACCEL (12100);
9191 case 12200: return GET_ACCEL (12200);
9192 case 12300: return GET_ACCEL (12300);
9193 case 12400: return GET_ACCEL (12400);
9194 case 12500: return GET_ACCEL (12500);
9195 case 12600: return GET_ACCEL (12600);
9196 case 12700: return GET_ACCEL (12700);
9197 case 12800: return GET_ACCEL (12800);
9198 case 12900: return GET_ACCEL (12900);
9199 case 13000: return GET_ACCEL (13000);
9200 }
9201
9202 return 0;
9203 }
9204
9205 uint set_kernel_loops (uint hash_mode)
9206 {
9207 switch (hash_mode)
9208 {
9209 case 0: return GET_LOOPS (0);
9210 case 10: return GET_LOOPS (10);
9211 case 11: return GET_LOOPS (11);
9212 case 12: return GET_LOOPS (12);
9213 case 20: return GET_LOOPS (20);
9214 case 21: return GET_LOOPS (21);
9215 case 22: return GET_LOOPS (22);
9216 case 23: return GET_LOOPS (23);
9217 case 30: return GET_LOOPS (30);
9218 case 40: return GET_LOOPS (40);
9219 case 50: return GET_LOOPS (50);
9220 case 60: return GET_LOOPS (60);
9221 case 100: return GET_LOOPS (100);
9222 case 101: return GET_LOOPS (101);
9223 case 110: return GET_LOOPS (110);
9224 case 111: return GET_LOOPS (111);
9225 case 112: return GET_LOOPS (112);
9226 case 120: return GET_LOOPS (120);
9227 case 121: return GET_LOOPS (121);
9228 case 122: return GET_LOOPS (122);
9229 case 124: return GET_LOOPS (124);
9230 case 130: return GET_LOOPS (130);
9231 case 131: return GET_LOOPS (131);
9232 case 132: return GET_LOOPS (132);
9233 case 133: return GET_LOOPS (133);
9234 case 140: return GET_LOOPS (140);
9235 case 141: return GET_LOOPS (141);
9236 case 150: return GET_LOOPS (150);
9237 case 160: return GET_LOOPS (160);
9238 case 190: return GET_LOOPS (190);
9239 case 200: return GET_LOOPS (200);
9240 case 300: return GET_LOOPS (300);
9241 case 400: return GET_LOOPS (400);
9242 case 500: return GET_LOOPS (500);
9243 case 501: return GET_LOOPS (501);
9244 case 900: return GET_LOOPS (900);
9245 case 910: return GET_LOOPS (910);
9246 case 1000: return GET_LOOPS (1000);
9247 case 1100: return GET_LOOPS (1100);
9248 case 1400: return GET_LOOPS (1400);
9249 case 1410: return GET_LOOPS (1410);
9250 case 1420: return GET_LOOPS (1420);
9251 case 1421: return GET_LOOPS (1421);
9252 case 1430: return GET_LOOPS (1430);
9253 case 1440: return GET_LOOPS (1440);
9254 case 1441: return GET_LOOPS (1441);
9255 case 1450: return GET_LOOPS (1450);
9256 case 1460: return GET_LOOPS (1460);
9257 case 1500: return GET_LOOPS (1500);
9258 case 1600: return GET_LOOPS (1600);
9259 case 1700: return GET_LOOPS (1700);
9260 case 1710: return GET_LOOPS (1710);
9261 case 1711: return GET_LOOPS (1711);
9262 case 1720: return GET_LOOPS (1720);
9263 case 1722: return GET_LOOPS (1722);
9264 case 1730: return GET_LOOPS (1730);
9265 case 1731: return GET_LOOPS (1731);
9266 case 1740: return GET_LOOPS (1740);
9267 case 1750: return GET_LOOPS (1750);
9268 case 1760: return GET_LOOPS (1760);
9269 case 1800: return GET_LOOPS (1800);
9270 case 2100: return GET_LOOPS (2100);
9271 case 2400: return GET_LOOPS (2400);
9272 case 2410: return GET_LOOPS (2410);
9273 case 2500: return GET_LOOPS (2500);
9274 case 2600: return GET_LOOPS (2600);
9275 case 2611: return GET_LOOPS (2611);
9276 case 2612: return GET_LOOPS (2612);
9277 case 2711: return GET_LOOPS (2711);
9278 case 2811: return GET_LOOPS (2811);
9279 case 3000: return GET_LOOPS (3000);
9280 case 3100: return GET_LOOPS (3100);
9281 case 3200: return GET_LOOPS (3200);
9282 case 3710: return GET_LOOPS (3710);
9283 case 3711: return GET_LOOPS (3711);
9284 case 3800: return GET_LOOPS (3800);
9285 case 4300: return GET_LOOPS (4300);
9286 case 4400: return GET_LOOPS (4400);
9287 case 4500: return GET_LOOPS (4500);
9288 case 4700: return GET_LOOPS (4700);
9289 case 4800: return GET_LOOPS (4800);
9290 case 4900: return GET_LOOPS (4900);
9291 case 5000: return GET_LOOPS (5000);
9292 case 5100: return GET_LOOPS (5100);
9293 case 5200: return GET_LOOPS (5200);
9294 case 5300: return GET_LOOPS (5300);
9295 case 5400: return GET_LOOPS (5400);
9296 case 5500: return GET_LOOPS (5500);
9297 case 5600: return GET_LOOPS (5600);
9298 case 5700: return GET_LOOPS (5700);
9299 case 5800: return GET_LOOPS (5800);
9300 case 6000: return GET_LOOPS (6000);
9301 case 6100: return GET_LOOPS (6100);
9302 case 6211: return GET_LOOPS (6211);
9303 case 6212: return GET_LOOPS (6212);
9304 case 6213: return GET_LOOPS (6213);
9305 case 6221: return GET_LOOPS (6221);
9306 case 6222: return GET_LOOPS (6222);
9307 case 6223: return GET_LOOPS (6223);
9308 case 6231: return GET_LOOPS (6231);
9309 case 6232: return GET_LOOPS (6232);
9310 case 6233: return GET_LOOPS (6233);
9311 case 6241: return GET_LOOPS (6241);
9312 case 6242: return GET_LOOPS (6242);
9313 case 6243: return GET_LOOPS (6243);
9314 case 6300: return GET_LOOPS (6300);
9315 case 6400: return GET_LOOPS (6400);
9316 case 6500: return GET_LOOPS (6500);
9317 case 6600: return GET_LOOPS (6600);
9318 case 6700: return GET_LOOPS (6700);
9319 case 6800: return GET_LOOPS (6800);
9320 case 6900: return GET_LOOPS (6900);
9321 case 7100: return GET_LOOPS (7100);
9322 case 7200: return GET_LOOPS (7200);
9323 case 7300: return GET_LOOPS (7300);
9324 case 7400: return GET_LOOPS (7400);
9325 case 7500: return GET_LOOPS (7500);
9326 case 7600: return GET_LOOPS (7600);
9327 case 7700: return GET_LOOPS (7700);
9328 case 7800: return GET_LOOPS (7800);
9329 case 7900: return GET_LOOPS (7900);
9330 case 8000: return GET_LOOPS (8000);
9331 case 8100: return GET_LOOPS (8100);
9332 case 8200: return GET_LOOPS (8200);
9333 case 8300: return GET_LOOPS (8300);
9334 case 8400: return GET_LOOPS (8400);
9335 case 8500: return GET_LOOPS (8500);
9336 case 8600: return GET_LOOPS (8600);
9337 case 8700: return GET_LOOPS (8700);
9338 case 8800: return GET_LOOPS (8800);
9339 case 8900: return GET_LOOPS (8900);
9340 case 9000: return GET_LOOPS (9000);
9341 case 9100: return GET_LOOPS (9100);
9342 case 9200: return GET_LOOPS (9200);
9343 case 9300: return GET_LOOPS (9300);
9344 case 9400: return GET_LOOPS (9400);
9345 case 9500: return GET_LOOPS (9500);
9346 case 9600: return GET_LOOPS (9600);
9347 case 9700: return GET_LOOPS (9700);
9348 case 9710: return GET_LOOPS (9710);
9349 case 9720: return GET_LOOPS (9720);
9350 case 9800: return GET_LOOPS (9800);
9351 case 9810: return GET_LOOPS (9810);
9352 case 9820: return GET_LOOPS (9820);
9353 case 9900: return GET_LOOPS (9900);
9354 case 10000: return GET_LOOPS (10000);
9355 case 10100: return GET_LOOPS (10100);
9356 case 10200: return GET_LOOPS (10200);
9357 case 10300: return GET_LOOPS (10300);
9358 case 10400: return GET_LOOPS (10400);
9359 case 10410: return GET_LOOPS (10410);
9360 case 10420: return GET_LOOPS (10420);
9361 case 10500: return GET_LOOPS (10500);
9362 case 10600: return GET_LOOPS (10600);
9363 case 10700: return GET_LOOPS (10700);
9364 case 10800: return GET_LOOPS (10800);
9365 case 10900: return GET_LOOPS (10900);
9366 case 11000: return GET_LOOPS (11000);
9367 case 11100: return GET_LOOPS (11100);
9368 case 11200: return GET_LOOPS (11200);
9369 case 11300: return GET_LOOPS (11300);
9370 case 11400: return GET_LOOPS (11400);
9371 case 11500: return GET_LOOPS (11500);
9372 case 11600: return GET_LOOPS (11600);
9373 case 11700: return GET_LOOPS (11700);
9374 case 11800: return GET_LOOPS (11800);
9375 case 11900: return GET_LOOPS (11900);
9376 case 12000: return GET_LOOPS (12000);
9377 case 12100: return GET_LOOPS (12100);
9378 case 12200: return GET_LOOPS (12200);
9379 case 12300: return GET_LOOPS (12300);
9380 case 12400: return GET_LOOPS (12400);
9381 case 12500: return GET_LOOPS (12500);
9382 case 12600: return GET_LOOPS (12600);
9383 case 12700: return GET_LOOPS (12700);
9384 case 12800: return GET_LOOPS (12800);
9385 case 12900: return GET_LOOPS (12900);
9386 case 13000: return GET_LOOPS (13000);
9387 }
9388
9389 return 0;
9390 }
9391
9392 /**
9393 * parser
9394 */
9395
9396 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9397 {
9398 u8 tmp[256];
9399
9400 if (salt_len > sizeof (tmp))
9401 {
9402 return UINT_MAX;
9403 }
9404
9405 memset (tmp, 0, sizeof (tmp));
9406 memcpy (tmp, in, salt_len);
9407
9408 if (data.opts_type & OPTS_TYPE_ST_HEX)
9409 {
9410 if ((salt_len % 2) == 0)
9411 {
9412 u32 new_salt_len = salt_len / 2;
9413
9414 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9415 {
9416 u8 p0 = tmp[j + 0];
9417 u8 p1 = tmp[j + 1];
9418
9419 tmp[i] = hex_convert (p1) << 0;
9420 tmp[i] |= hex_convert (p0) << 4;
9421 }
9422
9423 salt_len = new_salt_len;
9424 }
9425 else
9426 {
9427 return UINT_MAX;
9428 }
9429 }
9430 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9431 {
9432 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9433 }
9434
9435 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9436
9437 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9438 {
9439 if (salt_len < 20)
9440 {
9441 u32 *tmp_uint = (u32 *) tmp;
9442
9443 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9444 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9445 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9446 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9447 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9448 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9449 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9450 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9451 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9452 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9453
9454 salt_len = salt_len * 2;
9455 }
9456 else
9457 {
9458 return UINT_MAX;
9459 }
9460 }
9461
9462 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9463 {
9464 lowercase (tmp, salt_len);
9465 }
9466
9467 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9468 {
9469 uppercase (tmp, salt_len);
9470 }
9471
9472 u32 len = salt_len;
9473
9474 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9475 {
9476 tmp[len++] = 0x80;
9477 }
9478
9479 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9480 {
9481 tmp[len++] = 0x01;
9482 }
9483
9484 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9485 {
9486 u32 *tmp_uint = (uint *) tmp;
9487
9488 u32 max = len / 4;
9489
9490 if (len % 4) max++;
9491
9492 for (u32 i = 0; i < max; i++)
9493 {
9494 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9495 }
9496
9497 // Important: we may need to increase the length of memcpy since
9498 // we don't want to "loose" some swapped bytes (could happen if
9499 // they do not perfectly fit in the 4-byte blocks)
9500 // Memcpy does always copy the bytes in the BE order, but since
9501 // we swapped them, some important bytes could be in positions
9502 // we normally skip with the original len
9503
9504 if (len % 4) len += 4 - (len % 4);
9505 }
9506
9507 memcpy (out, tmp, len);
9508
9509 return (salt_len);
9510 }
9511
9512 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9513 {
9514 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9515
9516 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9517
9518 u32 *digest = (u32 *) hash_buf->digest;
9519
9520 salt_t *salt = hash_buf->salt;
9521
9522 memcpy ((char *) salt->salt_sign, input_buf, 6);
9523
9524 char *iter_pos = input_buf + 4;
9525
9526 salt->salt_iter = 1 << atoi (iter_pos);
9527
9528 char *salt_pos = strchr (iter_pos, '$');
9529
9530 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9531
9532 salt_pos++;
9533
9534 uint salt_len = 16;
9535
9536 salt->salt_len = salt_len;
9537
9538 u8 tmp_buf[100];
9539
9540 memset (tmp_buf, 0, sizeof (tmp_buf));
9541
9542 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9543
9544 char *salt_buf_ptr = (char *) salt->salt_buf;
9545
9546 memcpy (salt_buf_ptr, tmp_buf, 16);
9547
9548 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9549 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9550 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9551 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9552
9553 char *hash_pos = salt_pos + 22;
9554
9555 memset (tmp_buf, 0, sizeof (tmp_buf));
9556
9557 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9558
9559 memcpy (digest, tmp_buf, 24);
9560
9561 digest[0] = byte_swap_32 (digest[0]);
9562 digest[1] = byte_swap_32 (digest[1]);
9563 digest[2] = byte_swap_32 (digest[2]);
9564 digest[3] = byte_swap_32 (digest[3]);
9565 digest[4] = byte_swap_32 (digest[4]);
9566 digest[5] = byte_swap_32 (digest[5]);
9567
9568 digest[5] &= ~0xff; // its just 23 not 24 !
9569
9570 return (PARSER_OK);
9571 }
9572
9573 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9574 {
9575 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9576
9577 u32 *digest = (u32 *) hash_buf->digest;
9578
9579 u8 tmp_buf[100];
9580
9581 memset (tmp_buf, 0, sizeof (tmp_buf));
9582
9583 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9584
9585 memcpy (digest, tmp_buf, 32);
9586
9587 digest[0] = byte_swap_32 (digest[0]);
9588 digest[1] = byte_swap_32 (digest[1]);
9589 digest[2] = byte_swap_32 (digest[2]);
9590 digest[3] = byte_swap_32 (digest[3]);
9591 digest[4] = byte_swap_32 (digest[4]);
9592 digest[5] = byte_swap_32 (digest[5]);
9593 digest[6] = byte_swap_32 (digest[6]);
9594 digest[7] = byte_swap_32 (digest[7]);
9595
9596 digest[0] -= SHA256M_A;
9597 digest[1] -= SHA256M_B;
9598 digest[2] -= SHA256M_C;
9599 digest[3] -= SHA256M_D;
9600 digest[4] -= SHA256M_E;
9601 digest[5] -= SHA256M_F;
9602 digest[6] -= SHA256M_G;
9603 digest[7] -= SHA256M_H;
9604
9605 return (PARSER_OK);
9606 }
9607
9608 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9609 {
9610 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9611
9612 u32 *digest = (u32 *) hash_buf->digest;
9613
9614 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9615 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9616
9617 digest[0] = byte_swap_32 (digest[0]);
9618 digest[1] = byte_swap_32 (digest[1]);
9619
9620 uint tt;
9621
9622 IP (digest[0], digest[1], tt);
9623
9624 digest[0] = digest[0];
9625 digest[1] = digest[1];
9626 digest[2] = 0;
9627 digest[3] = 0;
9628
9629 return (PARSER_OK);
9630 }
9631
9632 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9633 {
9634 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9635
9636 u32 *digest = (u32 *) hash_buf->digest;
9637
9638 salt_t *salt = hash_buf->salt;
9639
9640 char *hash_pos = input_buf + 8;
9641
9642 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9643 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9644 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9645 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9646 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9647
9648 digest[0] -= SHA1M_A;
9649 digest[1] -= SHA1M_B;
9650 digest[2] -= SHA1M_C;
9651 digest[3] -= SHA1M_D;
9652 digest[4] -= SHA1M_E;
9653
9654 uint salt_len = 8;
9655
9656 char *salt_buf_ptr = (char *) salt->salt_buf;
9657
9658 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9659
9660 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9661
9662 salt->salt_len = salt_len;
9663
9664 return (PARSER_OK);
9665 }
9666
9667 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9668 {
9669 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9670
9671 u64 *digest = (u64 *) hash_buf->digest;
9672
9673 salt_t *salt = hash_buf->salt;
9674
9675 char *hash_pos = input_buf + 8;
9676
9677 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9678 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9679 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9680 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9681 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9682 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9683 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9684 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9685
9686 digest[0] -= SHA512M_A;
9687 digest[1] -= SHA512M_B;
9688 digest[2] -= SHA512M_C;
9689 digest[3] -= SHA512M_D;
9690 digest[4] -= SHA512M_E;
9691 digest[5] -= SHA512M_F;
9692 digest[6] -= SHA512M_G;
9693 digest[7] -= SHA512M_H;
9694
9695 uint salt_len = 8;
9696
9697 char *salt_buf_ptr = (char *) salt->salt_buf;
9698
9699 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9700
9701 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9702
9703 salt->salt_len = salt_len;
9704
9705 return (PARSER_OK);
9706 }
9707
9708 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9709 {
9710 if (data.opts_type & OPTS_TYPE_ST_HEX)
9711 {
9712 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9713 }
9714 else
9715 {
9716 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9717 }
9718
9719 u32 *digest = (u32 *) hash_buf->digest;
9720
9721 salt_t *salt = hash_buf->salt;
9722
9723 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9724 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9725 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9726 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9727
9728 digest[0] = byte_swap_32 (digest[0]);
9729 digest[1] = byte_swap_32 (digest[1]);
9730 digest[2] = byte_swap_32 (digest[2]);
9731 digest[3] = byte_swap_32 (digest[3]);
9732
9733 digest[0] -= MD5M_A;
9734 digest[1] -= MD5M_B;
9735 digest[2] -= MD5M_C;
9736 digest[3] -= MD5M_D;
9737
9738 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9739
9740 uint salt_len = input_len - 32 - 1;
9741
9742 char *salt_buf = input_buf + 32 + 1;
9743
9744 char *salt_buf_ptr = (char *) salt->salt_buf;
9745
9746 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9747
9748 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9749
9750 salt->salt_len = salt_len;
9751
9752 return (PARSER_OK);
9753 }
9754
9755 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9756 {
9757 if (data.opts_type & OPTS_TYPE_ST_HEX)
9758 {
9759 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9760 }
9761 else
9762 {
9763 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9764 }
9765
9766 // unscramble
9767
9768 char clean_input_buf[32];
9769
9770 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9771 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9772
9773 for (int i = 0, j = 0, k = 0; i < 30; i++)
9774 {
9775 if (i == pos[j])
9776 {
9777 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9778
9779 j++;
9780 }
9781 else
9782 {
9783 clean_input_buf[k] = input_buf[i];
9784
9785 k++;
9786 }
9787 }
9788
9789 // base64 decode
9790
9791 u32 *digest = (u32 *) hash_buf->digest;
9792
9793 salt_t *salt = hash_buf->salt;
9794
9795 u32 a, b, c, d, e, f;
9796
9797 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9798 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9799 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9800 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9801 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9802 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9803
9804 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9805 | (((d << 12) | (e << 6) | (f)) << 0);
9806
9807 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9808 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9809 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9810 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9811 e = base64_to_int (clean_input_buf[10] & 0x7f);
9812 f = base64_to_int (clean_input_buf[11] & 0x7f);
9813
9814 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9815 | (((d << 12) | (e << 6) | (f)) << 0);
9816
9817 a = base64_to_int (clean_input_buf[12] & 0x7f);
9818 b = base64_to_int (clean_input_buf[13] & 0x7f);
9819 c = base64_to_int (clean_input_buf[14] & 0x7f);
9820 d = base64_to_int (clean_input_buf[15] & 0x7f);
9821 e = base64_to_int (clean_input_buf[16] & 0x7f);
9822 f = base64_to_int (clean_input_buf[17] & 0x7f);
9823
9824 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9825 | (((d << 12) | (e << 6) | (f)) << 0);
9826
9827 a = base64_to_int (clean_input_buf[18] & 0x7f);
9828 b = base64_to_int (clean_input_buf[19] & 0x7f);
9829 c = base64_to_int (clean_input_buf[20] & 0x7f);
9830 d = base64_to_int (clean_input_buf[21] & 0x7f);
9831 e = base64_to_int (clean_input_buf[22] & 0x7f);
9832 f = base64_to_int (clean_input_buf[23] & 0x7f);
9833
9834 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9835 | (((d << 12) | (e << 6) | (f)) << 0);
9836
9837 digest[0] = byte_swap_32 (digest[0]);
9838 digest[1] = byte_swap_32 (digest[1]);
9839 digest[2] = byte_swap_32 (digest[2]);
9840 digest[3] = byte_swap_32 (digest[3]);
9841
9842 digest[0] -= MD5M_A;
9843 digest[1] -= MD5M_B;
9844 digest[2] -= MD5M_C;
9845 digest[3] -= MD5M_D;
9846
9847 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9848
9849 uint salt_len = input_len - 30 - 1;
9850
9851 char *salt_buf = input_buf + 30 + 1;
9852
9853 char *salt_buf_ptr = (char *) salt->salt_buf;
9854
9855 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9856
9857 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9858 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9859
9860 salt->salt_len = salt_len;
9861
9862 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9863
9864 salt->salt_len += 22;
9865
9866 return (PARSER_OK);
9867 }
9868
9869 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9870 {
9871 if (data.opts_type & OPTS_TYPE_ST_HEX)
9872 {
9873 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9874 }
9875 else
9876 {
9877 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9878 }
9879
9880 u32 *digest = (u32 *) hash_buf->digest;
9881
9882 salt_t *salt = hash_buf->salt;
9883
9884 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9885 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9886 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9887 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9888 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
9889
9890 digest[0] -= SHA1M_A;
9891 digest[1] -= SHA1M_B;
9892 digest[2] -= SHA1M_C;
9893 digest[3] -= SHA1M_D;
9894 digest[4] -= SHA1M_E;
9895
9896 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9897
9898 uint salt_len = input_len - 40 - 1;
9899
9900 char *salt_buf = input_buf + 40 + 1;
9901
9902 char *salt_buf_ptr = (char *) salt->salt_buf;
9903
9904 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9905
9906 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9907
9908 salt->salt_len = salt_len;
9909
9910 return (PARSER_OK);
9911 }
9912
9913 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9914 {
9915 if (data.opts_type & OPTS_TYPE_ST_HEX)
9916 {
9917 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9918 }
9919 else
9920 {
9921 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9922 }
9923
9924 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9925
9926 char *iter_pos = input_buf + 6;
9927
9928 salt_t *salt = hash_buf->salt;
9929
9930 uint iter = atoi (iter_pos);
9931
9932 if (iter < 1)
9933 {
9934 iter = ROUNDS_DCC2;
9935 }
9936
9937 salt->salt_iter = iter - 1;
9938
9939 char *salt_pos = strchr (iter_pos, '#');
9940
9941 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9942
9943 salt_pos++;
9944
9945 char *digest_pos = strchr (salt_pos, '#');
9946
9947 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9948
9949 digest_pos++;
9950
9951 uint salt_len = digest_pos - salt_pos - 1;
9952
9953 u32 *digest = (u32 *) hash_buf->digest;
9954
9955 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
9956 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
9957 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
9958 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
9959
9960 char *salt_buf_ptr = (char *) salt->salt_buf;
9961
9962 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9963
9964 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9965
9966 salt->salt_len = salt_len;
9967
9968 return (PARSER_OK);
9969 }
9970
9971 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9972 {
9973 u32 *digest = (u32 *) hash_buf->digest;
9974
9975 salt_t *salt = hash_buf->salt;
9976
9977 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9978
9979 hccap_t in;
9980
9981 memcpy (&in, input_buf, input_len);
9982
9983 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9984
9985 memcpy (digest, in.keymic, 16);
9986
9987 /*
9988 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9989 The phrase "Pairwise key expansion"
9990 Access Point Address (referred to as Authenticator Address AA)
9991 Supplicant Address (referred to as Supplicant Address SA)
9992 Access Point Nonce (referred to as Authenticator Anonce)
9993 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9994 */
9995
9996 uint salt_len = strlen (in.essid);
9997
9998 memcpy (salt->salt_buf, in.essid, salt_len);
9999
10000 salt->salt_len = salt_len;
10001
10002 salt->salt_iter = ROUNDS_WPA2 - 1;
10003
10004 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10005
10006 memcpy (pke_ptr, "Pairwise key expansion", 23);
10007
10008 if (memcmp (in.mac1, in.mac2, 6) < 0)
10009 {
10010 memcpy (pke_ptr + 23, in.mac1, 6);
10011 memcpy (pke_ptr + 29, in.mac2, 6);
10012 }
10013 else
10014 {
10015 memcpy (pke_ptr + 23, in.mac2, 6);
10016 memcpy (pke_ptr + 29, in.mac1, 6);
10017 }
10018
10019 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10020 {
10021 memcpy (pke_ptr + 35, in.nonce1, 32);
10022 memcpy (pke_ptr + 67, in.nonce2, 32);
10023 }
10024 else
10025 {
10026 memcpy (pke_ptr + 35, in.nonce2, 32);
10027 memcpy (pke_ptr + 67, in.nonce1, 32);
10028 }
10029
10030 for (int i = 0; i < 25; i++)
10031 {
10032 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10033 }
10034
10035 wpa->keyver = in.keyver;
10036
10037 if (wpa->keyver > 255)
10038 {
10039 log_info ("ATTENTION!");
10040 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10041 log_info (" This could be due to a recent aircrack-ng bug.");
10042 log_info (" The key version was automatically reset to a reasonable value.");
10043 log_info ("");
10044
10045 wpa->keyver &= 0xff;
10046 }
10047
10048 wpa->eapol_size = in.eapol_size;
10049
10050 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10051
10052 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10053
10054 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10055
10056 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10057
10058 if (wpa->keyver == 1)
10059 {
10060 // nothing to do
10061 }
10062 else
10063 {
10064 digest[0] = byte_swap_32 (digest[0]);
10065 digest[1] = byte_swap_32 (digest[1]);
10066 digest[2] = byte_swap_32 (digest[2]);
10067 digest[3] = byte_swap_32 (digest[3]);
10068
10069 for (int i = 0; i < 64; i++)
10070 {
10071 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10072 }
10073 }
10074
10075 salt->salt_buf[10] = digest[1];
10076 salt->salt_buf[11] = digest[2];
10077
10078 return (PARSER_OK);
10079 }
10080
10081 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10082 {
10083 u32 *digest = (u32 *) hash_buf->digest;
10084
10085 salt_t *salt = hash_buf->salt;
10086
10087 if (input_len == 0)
10088 {
10089 log_error ("Password Safe v2 container not specified");
10090
10091 exit (-1);
10092 }
10093
10094 FILE *fp = fopen (input_buf, "rb");
10095
10096 if (fp == NULL)
10097 {
10098 log_error ("%s: %s", input_buf, strerror (errno));
10099
10100 exit (-1);
10101 }
10102
10103 psafe2_hdr buf;
10104
10105 memset (&buf, 0, sizeof (psafe2_hdr));
10106
10107 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10108
10109 fclose (fp);
10110
10111 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10112
10113 salt->salt_buf[0] = buf.random[0];
10114 salt->salt_buf[1] = buf.random[1];
10115
10116 salt->salt_len = 8;
10117 salt->salt_iter = 1000;
10118
10119 digest[0] = byte_swap_32 (buf.hash[0]);
10120 digest[1] = byte_swap_32 (buf.hash[1]);
10121 digest[2] = byte_swap_32 (buf.hash[2]);
10122 digest[3] = byte_swap_32 (buf.hash[3]);
10123 digest[4] = byte_swap_32 (buf.hash[4]);
10124
10125 return (PARSER_OK);
10126 }
10127
10128 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10129 {
10130 u32 *digest = (u32 *) hash_buf->digest;
10131
10132 salt_t *salt = hash_buf->salt;
10133
10134 if (input_len == 0)
10135 {
10136 log_error (".psafe3 not specified");
10137
10138 exit (-1);
10139 }
10140
10141 FILE *fp = fopen (input_buf, "rb");
10142
10143 if (fp == NULL)
10144 {
10145 log_error ("%s: %s", input_buf, strerror (errno));
10146
10147 exit (-1);
10148 }
10149
10150 psafe3_t in;
10151
10152 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10153
10154 fclose (fp);
10155
10156 data.hashfile = input_buf; // we will need this in case it gets cracked
10157
10158 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10159
10160 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10161
10162 salt->salt_iter = in.iterations + 1;
10163
10164 salt->salt_buf[0] = in.salt_buf[0];
10165 salt->salt_buf[1] = in.salt_buf[1];
10166 salt->salt_buf[2] = in.salt_buf[2];
10167 salt->salt_buf[3] = in.salt_buf[3];
10168 salt->salt_buf[4] = in.salt_buf[4];
10169 salt->salt_buf[5] = in.salt_buf[5];
10170 salt->salt_buf[6] = in.salt_buf[6];
10171 salt->salt_buf[7] = in.salt_buf[7];
10172
10173 salt->salt_len = 32;
10174
10175 digest[0] = in.hash_buf[0];
10176 digest[1] = in.hash_buf[1];
10177 digest[2] = in.hash_buf[2];
10178 digest[3] = in.hash_buf[3];
10179 digest[4] = in.hash_buf[4];
10180 digest[5] = in.hash_buf[5];
10181 digest[6] = in.hash_buf[6];
10182 digest[7] = in.hash_buf[7];
10183
10184 digest[0] = byte_swap_32 (digest[0]);
10185 digest[1] = byte_swap_32 (digest[1]);
10186 digest[2] = byte_swap_32 (digest[2]);
10187 digest[3] = byte_swap_32 (digest[3]);
10188 digest[4] = byte_swap_32 (digest[4]);
10189 digest[5] = byte_swap_32 (digest[5]);
10190 digest[6] = byte_swap_32 (digest[6]);
10191 digest[7] = byte_swap_32 (digest[7]);
10192
10193 return (PARSER_OK);
10194 }
10195
10196 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10197 {
10198 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10199
10200 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10201
10202 u32 *digest = (u32 *) hash_buf->digest;
10203
10204 salt_t *salt = hash_buf->salt;
10205
10206 char *iter_pos = input_buf + 3;
10207
10208 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10209
10210 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10211
10212 memcpy ((char *) salt->salt_sign, input_buf, 4);
10213
10214 salt->salt_iter = salt_iter;
10215
10216 char *salt_pos = iter_pos + 1;
10217
10218 uint salt_len = 8;
10219
10220 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10221
10222 salt->salt_len = salt_len;
10223
10224 char *hash_pos = salt_pos + salt_len;
10225
10226 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10227
10228 return (PARSER_OK);
10229 }
10230
10231 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10232 {
10233 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10234
10235 u32 *digest = (u32 *) hash_buf->digest;
10236
10237 salt_t *salt = hash_buf->salt;
10238
10239 char *salt_pos = input_buf + 3;
10240
10241 uint iterations_len = 0;
10242
10243 if (memcmp (salt_pos, "rounds=", 7) == 0)
10244 {
10245 salt_pos += 7;
10246
10247 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10248
10249 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10250 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10251
10252 salt_pos[0] = 0x0;
10253
10254 salt->salt_iter = atoi (salt_pos - iterations_len);
10255
10256 salt_pos += 1;
10257
10258 iterations_len += 8;
10259 }
10260 else
10261 {
10262 salt->salt_iter = ROUNDS_MD5CRYPT;
10263 }
10264
10265 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10266
10267 char *hash_pos = strchr (salt_pos, '$');
10268
10269 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10270
10271 uint salt_len = hash_pos - salt_pos;
10272
10273 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10274
10275 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10276
10277 salt->salt_len = salt_len;
10278
10279 hash_pos++;
10280
10281 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10282
10283 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10284
10285 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10286
10287 return (PARSER_OK);
10288 }
10289
10290 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10291 {
10292 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10293
10294 u32 *digest = (u32 *) hash_buf->digest;
10295
10296 salt_t *salt = hash_buf->salt;
10297
10298 char *salt_pos = input_buf + 6;
10299
10300 uint iterations_len = 0;
10301
10302 if (memcmp (salt_pos, "rounds=", 7) == 0)
10303 {
10304 salt_pos += 7;
10305
10306 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10307
10308 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10309 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10310
10311 salt_pos[0] = 0x0;
10312
10313 salt->salt_iter = atoi (salt_pos - iterations_len);
10314
10315 salt_pos += 1;
10316
10317 iterations_len += 8;
10318 }
10319 else
10320 {
10321 salt->salt_iter = ROUNDS_MD5CRYPT;
10322 }
10323
10324 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10325
10326 char *hash_pos = strchr (salt_pos, '$');
10327
10328 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10329
10330 uint salt_len = hash_pos - salt_pos;
10331
10332 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10333
10334 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10335
10336 salt->salt_len = salt_len;
10337
10338 hash_pos++;
10339
10340 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10341
10342 return (PARSER_OK);
10343 }
10344
10345 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10346 {
10347 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10348
10349 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10350
10351 u32 *digest = (u32 *) hash_buf->digest;
10352
10353 salt_t *salt = hash_buf->salt;
10354
10355 char *salt_pos = input_buf + 14;
10356
10357 char *hash_pos = strchr (salt_pos, '*');
10358
10359 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10360
10361 hash_pos++;
10362
10363 uint salt_len = hash_pos - salt_pos - 1;
10364
10365 char *salt_buf_ptr = (char *) salt->salt_buf;
10366
10367 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10368
10369 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10370
10371 salt->salt_len = salt_len;
10372
10373 u8 tmp_buf[100];
10374
10375 memset (tmp_buf, 0, sizeof (tmp_buf));
10376
10377 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10378
10379 memcpy (digest, tmp_buf, 20);
10380
10381 digest[0] = byte_swap_32 (digest[0]);
10382 digest[1] = byte_swap_32 (digest[1]);
10383 digest[2] = byte_swap_32 (digest[2]);
10384 digest[3] = byte_swap_32 (digest[3]);
10385 digest[4] = byte_swap_32 (digest[4]);
10386
10387 digest[0] -= SHA1M_A;
10388 digest[1] -= SHA1M_B;
10389 digest[2] -= SHA1M_C;
10390 digest[3] -= SHA1M_D;
10391 digest[4] -= SHA1M_E;
10392
10393 return (PARSER_OK);
10394 }
10395
10396 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10397 {
10398 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10399
10400 unsigned char c12 = itoa64_to_int (input_buf[12]);
10401
10402 if (c12 & 3) return (PARSER_HASH_VALUE);
10403
10404 u32 *digest = (u32 *) hash_buf->digest;
10405
10406 salt_t *salt = hash_buf->salt;
10407
10408 // for ascii_digest
10409 salt->salt_sign[0] = input_buf[0];
10410 salt->salt_sign[1] = input_buf[1];
10411
10412 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10413 | itoa64_to_int (input_buf[1]) << 6;
10414
10415 salt->salt_len = 2;
10416
10417 u8 tmp_buf[100];
10418
10419 memset (tmp_buf, 0, sizeof (tmp_buf));
10420
10421 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10422
10423 memcpy (digest, tmp_buf, 8);
10424
10425 uint tt;
10426
10427 IP (digest[0], digest[1], tt);
10428
10429 digest[2] = 0;
10430 digest[3] = 0;
10431
10432 return (PARSER_OK);
10433 }
10434
10435 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10436 {
10437 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10438
10439 u32 *digest = (u32 *) hash_buf->digest;
10440
10441 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10442 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10443 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10444 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10445
10446 digest[0] = byte_swap_32 (digest[0]);
10447 digest[1] = byte_swap_32 (digest[1]);
10448 digest[2] = byte_swap_32 (digest[2]);
10449 digest[3] = byte_swap_32 (digest[3]);
10450
10451 digest[0] -= MD4M_A;
10452 digest[1] -= MD4M_B;
10453 digest[2] -= MD4M_C;
10454 digest[3] -= MD4M_D;
10455
10456 return (PARSER_OK);
10457 }
10458
10459 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10460 {
10461 if (data.opts_type & OPTS_TYPE_ST_HEX)
10462 {
10463 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10464 }
10465 else
10466 {
10467 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10468 }
10469
10470 u32 *digest = (u32 *) hash_buf->digest;
10471
10472 salt_t *salt = hash_buf->salt;
10473
10474 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10475 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10476 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10477 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10478
10479 digest[0] = byte_swap_32 (digest[0]);
10480 digest[1] = byte_swap_32 (digest[1]);
10481 digest[2] = byte_swap_32 (digest[2]);
10482 digest[3] = byte_swap_32 (digest[3]);
10483
10484 digest[0] -= MD4M_A;
10485 digest[1] -= MD4M_B;
10486 digest[2] -= MD4M_C;
10487 digest[3] -= MD4M_D;
10488
10489 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10490
10491 uint salt_len = input_len - 32 - 1;
10492
10493 char *salt_buf = input_buf + 32 + 1;
10494
10495 char *salt_buf_ptr = (char *) salt->salt_buf;
10496
10497 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10498
10499 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10500
10501 salt->salt_len = salt_len;
10502
10503 return (PARSER_OK);
10504 }
10505
10506 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10507 {
10508 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10509
10510 u32 *digest = (u32 *) hash_buf->digest;
10511
10512 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10513 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10514 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10515 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10516
10517 digest[0] = byte_swap_32 (digest[0]);
10518 digest[1] = byte_swap_32 (digest[1]);
10519 digest[2] = byte_swap_32 (digest[2]);
10520 digest[3] = byte_swap_32 (digest[3]);
10521
10522 digest[0] -= MD5M_A;
10523 digest[1] -= MD5M_B;
10524 digest[2] -= MD5M_C;
10525 digest[3] -= MD5M_D;
10526
10527 return (PARSER_OK);
10528 }
10529
10530 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10531 {
10532 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10533
10534 u32 *digest = (u32 *) hash_buf->digest;
10535
10536 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10537 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10538 digest[2] = 0;
10539 digest[3] = 0;
10540
10541 digest[0] = byte_swap_32 (digest[0]);
10542 digest[1] = byte_swap_32 (digest[1]);
10543
10544 return (PARSER_OK);
10545 }
10546
10547 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10548 {
10549 if (data.opts_type & OPTS_TYPE_ST_HEX)
10550 {
10551 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10552 }
10553 else
10554 {
10555 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10556 }
10557
10558 u32 *digest = (u32 *) hash_buf->digest;
10559
10560 salt_t *salt = hash_buf->salt;
10561
10562 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10563 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10564 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10565 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10566
10567 digest[0] = byte_swap_32 (digest[0]);
10568 digest[1] = byte_swap_32 (digest[1]);
10569 digest[2] = byte_swap_32 (digest[2]);
10570 digest[3] = byte_swap_32 (digest[3]);
10571
10572 digest[0] -= MD5M_A;
10573 digest[1] -= MD5M_B;
10574 digest[2] -= MD5M_C;
10575 digest[3] -= MD5M_D;
10576
10577 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10578
10579 uint salt_len = input_len - 32 - 1;
10580
10581 char *salt_buf = input_buf + 32 + 1;
10582
10583 char *salt_buf_ptr = (char *) salt->salt_buf;
10584
10585 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10586
10587 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10588
10589 salt->salt_len = salt_len;
10590
10591 return (PARSER_OK);
10592 }
10593
10594 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10595 {
10596 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10597
10598 u32 *digest = (u32 *) hash_buf->digest;
10599
10600 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10601 | itoa64_to_int (input_buf[ 1]) << 6
10602 | itoa64_to_int (input_buf[ 2]) << 12
10603 | itoa64_to_int (input_buf[ 3]) << 18;
10604 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10605 | itoa64_to_int (input_buf[ 5]) << 6
10606 | itoa64_to_int (input_buf[ 6]) << 12
10607 | itoa64_to_int (input_buf[ 7]) << 18;
10608 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10609 | itoa64_to_int (input_buf[ 9]) << 6
10610 | itoa64_to_int (input_buf[10]) << 12
10611 | itoa64_to_int (input_buf[11]) << 18;
10612 digest[3] = itoa64_to_int (input_buf[12]) << 0
10613 | itoa64_to_int (input_buf[13]) << 6
10614 | itoa64_to_int (input_buf[14]) << 12
10615 | itoa64_to_int (input_buf[15]) << 18;
10616
10617 digest[0] -= MD5M_A;
10618 digest[1] -= MD5M_B;
10619 digest[2] -= MD5M_C;
10620 digest[3] -= MD5M_D;
10621
10622 digest[0] &= 0x00ffffff;
10623 digest[1] &= 0x00ffffff;
10624 digest[2] &= 0x00ffffff;
10625 digest[3] &= 0x00ffffff;
10626
10627 return (PARSER_OK);
10628 }
10629
10630 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10631 {
10632 if (data.opts_type & OPTS_TYPE_ST_HEX)
10633 {
10634 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10635 }
10636 else
10637 {
10638 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10639 }
10640
10641 u32 *digest = (u32 *) hash_buf->digest;
10642
10643 salt_t *salt = hash_buf->salt;
10644
10645 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10646 | itoa64_to_int (input_buf[ 1]) << 6
10647 | itoa64_to_int (input_buf[ 2]) << 12
10648 | itoa64_to_int (input_buf[ 3]) << 18;
10649 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10650 | itoa64_to_int (input_buf[ 5]) << 6
10651 | itoa64_to_int (input_buf[ 6]) << 12
10652 | itoa64_to_int (input_buf[ 7]) << 18;
10653 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10654 | itoa64_to_int (input_buf[ 9]) << 6
10655 | itoa64_to_int (input_buf[10]) << 12
10656 | itoa64_to_int (input_buf[11]) << 18;
10657 digest[3] = itoa64_to_int (input_buf[12]) << 0
10658 | itoa64_to_int (input_buf[13]) << 6
10659 | itoa64_to_int (input_buf[14]) << 12
10660 | itoa64_to_int (input_buf[15]) << 18;
10661
10662 digest[0] -= MD5M_A;
10663 digest[1] -= MD5M_B;
10664 digest[2] -= MD5M_C;
10665 digest[3] -= MD5M_D;
10666
10667 digest[0] &= 0x00ffffff;
10668 digest[1] &= 0x00ffffff;
10669 digest[2] &= 0x00ffffff;
10670 digest[3] &= 0x00ffffff;
10671
10672 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10673
10674 uint salt_len = input_len - 16 - 1;
10675
10676 char *salt_buf = input_buf + 16 + 1;
10677
10678 char *salt_buf_ptr = (char *) salt->salt_buf;
10679
10680 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10681
10682 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10683
10684 salt->salt_len = salt_len;
10685
10686 return (PARSER_OK);
10687 }
10688
10689 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10690 {
10691 key[0] = (nthash[0] >> 0);
10692 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10693 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10694 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10695 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10696 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10697 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10698 key[7] = (nthash[6] << 1);
10699
10700 key[0] |= 0x01;
10701 key[1] |= 0x01;
10702 key[2] |= 0x01;
10703 key[3] |= 0x01;
10704 key[4] |= 0x01;
10705 key[5] |= 0x01;
10706 key[6] |= 0x01;
10707 key[7] |= 0x01;
10708 }
10709
10710 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10711 {
10712 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10713
10714 u32 *digest = (u32 *) hash_buf->digest;
10715
10716 salt_t *salt = hash_buf->salt;
10717
10718 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10719
10720 /**
10721 * parse line
10722 */
10723
10724 char *user_pos = input_buf;
10725
10726 char *unused_pos = strchr (user_pos, ':');
10727
10728 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10729
10730 uint user_len = unused_pos - user_pos;
10731
10732 if (user_len > 60) return (PARSER_SALT_LENGTH);
10733
10734 unused_pos++;
10735
10736 char *domain_pos = strchr (unused_pos, ':');
10737
10738 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10739
10740 uint unused_len = domain_pos - unused_pos;
10741
10742 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10743
10744 domain_pos++;
10745
10746 char *srvchall_pos = strchr (domain_pos, ':');
10747
10748 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10749
10750 uint domain_len = srvchall_pos - domain_pos;
10751
10752 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10753
10754 srvchall_pos++;
10755
10756 char *hash_pos = strchr (srvchall_pos, ':');
10757
10758 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10759
10760 uint srvchall_len = hash_pos - srvchall_pos;
10761
10762 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10763
10764 hash_pos++;
10765
10766 char *clichall_pos = strchr (hash_pos, ':');
10767
10768 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10769
10770 uint hash_len = clichall_pos - hash_pos;
10771
10772 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10773
10774 clichall_pos++;
10775
10776 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10777
10778 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10779
10780 /**
10781 * store some data for later use
10782 */
10783
10784 netntlm->user_len = user_len * 2;
10785 netntlm->domain_len = domain_len * 2;
10786 netntlm->srvchall_len = srvchall_len / 2;
10787 netntlm->clichall_len = clichall_len / 2;
10788
10789 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10790 char *chall_ptr = (char *) netntlm->chall_buf;
10791
10792 /**
10793 * handle username and domainname
10794 */
10795
10796 for (uint i = 0; i < user_len; i++)
10797 {
10798 *userdomain_ptr++ = user_pos[i];
10799 *userdomain_ptr++ = 0;
10800 }
10801
10802 for (uint i = 0; i < domain_len; i++)
10803 {
10804 *userdomain_ptr++ = domain_pos[i];
10805 *userdomain_ptr++ = 0;
10806 }
10807
10808 /**
10809 * handle server challenge encoding
10810 */
10811
10812 for (uint i = 0; i < srvchall_len; i += 2)
10813 {
10814 const char p0 = srvchall_pos[i + 0];
10815 const char p1 = srvchall_pos[i + 1];
10816
10817 *chall_ptr++ = hex_convert (p1) << 0
10818 | hex_convert (p0) << 4;
10819 }
10820
10821 /**
10822 * handle client challenge encoding
10823 */
10824
10825 for (uint i = 0; i < clichall_len; i += 2)
10826 {
10827 const char p0 = clichall_pos[i + 0];
10828 const char p1 = clichall_pos[i + 1];
10829
10830 *chall_ptr++ = hex_convert (p1) << 0
10831 | hex_convert (p0) << 4;
10832 }
10833
10834 /**
10835 * store data
10836 */
10837
10838 char *salt_buf_ptr = (char *) salt->salt_buf;
10839
10840 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10841
10842 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10843
10844 salt->salt_len = salt_len;
10845
10846 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10847 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10848 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10849 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10850
10851 digest[0] = byte_swap_32 (digest[0]);
10852 digest[1] = byte_swap_32 (digest[1]);
10853 digest[2] = byte_swap_32 (digest[2]);
10854 digest[3] = byte_swap_32 (digest[3]);
10855
10856 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10857
10858 uint digest_tmp[2];
10859
10860 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10861 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
10862
10863 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10864 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10865
10866 /* special case 2: ESS */
10867
10868 if (srvchall_len == 48)
10869 {
10870 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10871 {
10872 uint w[16];
10873
10874 w[ 0] = netntlm->chall_buf[6];
10875 w[ 1] = netntlm->chall_buf[7];
10876 w[ 2] = netntlm->chall_buf[0];
10877 w[ 3] = netntlm->chall_buf[1];
10878 w[ 4] = 0x80;
10879 w[ 5] = 0;
10880 w[ 6] = 0;
10881 w[ 7] = 0;
10882 w[ 8] = 0;
10883 w[ 9] = 0;
10884 w[10] = 0;
10885 w[11] = 0;
10886 w[12] = 0;
10887 w[13] = 0;
10888 w[14] = 16 * 8;
10889 w[15] = 0;
10890
10891 uint dgst[4];
10892
10893 dgst[0] = MAGIC_A;
10894 dgst[1] = MAGIC_B;
10895 dgst[2] = MAGIC_C;
10896 dgst[3] = MAGIC_D;
10897
10898 md5_64 (w, dgst);
10899
10900 salt->salt_buf[0] = dgst[0];
10901 salt->salt_buf[1] = dgst[1];
10902 }
10903 }
10904
10905 /* precompute netntlmv1 exploit start */
10906
10907 for (uint i = 0; i < 0x10000; i++)
10908 {
10909 uint key_md4[2] = { i, 0 };
10910 uint key_des[2] = { 0, 0 };
10911
10912 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
10913
10914 uint Kc[16];
10915 uint Kd[16];
10916
10917 _des_keysetup (key_des, Kc, Kd, c_skb);
10918
10919 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10920
10921 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10922
10923 if (data3[0] != digest_tmp[0]) continue;
10924 if (data3[1] != digest_tmp[1]) continue;
10925
10926 salt->salt_buf[2] = i;
10927
10928 salt->salt_len = 24;
10929
10930 break;
10931 }
10932
10933 salt->salt_buf_pc[0] = digest_tmp[0];
10934 salt->salt_buf_pc[1] = digest_tmp[1];
10935
10936 /* precompute netntlmv1 exploit stop */
10937
10938 u32 tt;
10939
10940 IP (digest[0], digest[1], tt);
10941 IP (digest[2], digest[3], tt);
10942
10943 digest[0] = rotr32 (digest[0], 29);
10944 digest[1] = rotr32 (digest[1], 29);
10945 digest[2] = rotr32 (digest[2], 29);
10946 digest[3] = rotr32 (digest[3], 29);
10947
10948 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10949
10950 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
10951 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
10952
10953 return (PARSER_OK);
10954 }
10955
10956 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10957 {
10958 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10959
10960 u32 *digest = (u32 *) hash_buf->digest;
10961
10962 salt_t *salt = hash_buf->salt;
10963
10964 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10965
10966 /**
10967 * parse line
10968 */
10969
10970 char *user_pos = input_buf;
10971
10972 char *unused_pos = strchr (user_pos, ':');
10973
10974 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10975
10976 uint user_len = unused_pos - user_pos;
10977
10978 if (user_len > 60) return (PARSER_SALT_LENGTH);
10979
10980 unused_pos++;
10981
10982 char *domain_pos = strchr (unused_pos, ':');
10983
10984 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10985
10986 uint unused_len = domain_pos - unused_pos;
10987
10988 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10989
10990 domain_pos++;
10991
10992 char *srvchall_pos = strchr (domain_pos, ':');
10993
10994 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10995
10996 uint domain_len = srvchall_pos - domain_pos;
10997
10998 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10999
11000 srvchall_pos++;
11001
11002 char *hash_pos = strchr (srvchall_pos, ':');
11003
11004 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11005
11006 uint srvchall_len = hash_pos - srvchall_pos;
11007
11008 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11009
11010 hash_pos++;
11011
11012 char *clichall_pos = strchr (hash_pos, ':');
11013
11014 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11015
11016 uint hash_len = clichall_pos - hash_pos;
11017
11018 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11019
11020 clichall_pos++;
11021
11022 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11023
11024 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11025
11026 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11027
11028 /**
11029 * store some data for later use
11030 */
11031
11032 netntlm->user_len = user_len * 2;
11033 netntlm->domain_len = domain_len * 2;
11034 netntlm->srvchall_len = srvchall_len / 2;
11035 netntlm->clichall_len = clichall_len / 2;
11036
11037 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11038 char *chall_ptr = (char *) netntlm->chall_buf;
11039
11040 /**
11041 * handle username and domainname
11042 */
11043
11044 for (uint i = 0; i < user_len; i++)
11045 {
11046 *userdomain_ptr++ = toupper (user_pos[i]);
11047 *userdomain_ptr++ = 0;
11048 }
11049
11050 for (uint i = 0; i < domain_len; i++)
11051 {
11052 *userdomain_ptr++ = domain_pos[i];
11053 *userdomain_ptr++ = 0;
11054 }
11055
11056 *userdomain_ptr++ = 0x80;
11057
11058 /**
11059 * handle server challenge encoding
11060 */
11061
11062 for (uint i = 0; i < srvchall_len; i += 2)
11063 {
11064 const char p0 = srvchall_pos[i + 0];
11065 const char p1 = srvchall_pos[i + 1];
11066
11067 *chall_ptr++ = hex_convert (p1) << 0
11068 | hex_convert (p0) << 4;
11069 }
11070
11071 /**
11072 * handle client challenge encoding
11073 */
11074
11075 for (uint i = 0; i < clichall_len; i += 2)
11076 {
11077 const char p0 = clichall_pos[i + 0];
11078 const char p1 = clichall_pos[i + 1];
11079
11080 *chall_ptr++ = hex_convert (p1) << 0
11081 | hex_convert (p0) << 4;
11082 }
11083
11084 *chall_ptr++ = 0x80;
11085
11086 /**
11087 * handle hash itself
11088 */
11089
11090 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11091 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11092 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11093 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[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 /**
11101 * reuse challange data as salt_buf, its the buffer that is most likely unique
11102 */
11103
11104 salt->salt_buf[0] = 0;
11105 salt->salt_buf[1] = 0;
11106 salt->salt_buf[2] = 0;
11107 salt->salt_buf[3] = 0;
11108 salt->salt_buf[4] = 0;
11109 salt->salt_buf[5] = 0;
11110 salt->salt_buf[6] = 0;
11111 salt->salt_buf[7] = 0;
11112
11113 uint *uptr;
11114
11115 uptr = (uint *) netntlm->userdomain_buf;
11116
11117 for (uint i = 0; i < 16; i += 16)
11118 {
11119 md5_64 (uptr, salt->salt_buf);
11120 }
11121
11122 uptr = (uint *) netntlm->chall_buf;
11123
11124 for (uint i = 0; i < 256; i += 16)
11125 {
11126 md5_64 (uptr, salt->salt_buf);
11127 }
11128
11129 salt->salt_len = 16;
11130
11131 return (PARSER_OK);
11132 }
11133
11134 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11135 {
11136 if (data.opts_type & OPTS_TYPE_ST_HEX)
11137 {
11138 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11139 }
11140 else
11141 {
11142 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11143 }
11144
11145 u32 *digest = (u32 *) hash_buf->digest;
11146
11147 salt_t *salt = hash_buf->salt;
11148
11149 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11150 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11151 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11152 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11153
11154 digest[0] = byte_swap_32 (digest[0]);
11155 digest[1] = byte_swap_32 (digest[1]);
11156 digest[2] = byte_swap_32 (digest[2]);
11157 digest[3] = byte_swap_32 (digest[3]);
11158
11159 digest[0] -= MD5M_A;
11160 digest[1] -= MD5M_B;
11161 digest[2] -= MD5M_C;
11162 digest[3] -= MD5M_D;
11163
11164 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11165
11166 uint salt_len = input_len - 32 - 1;
11167
11168 char *salt_buf = input_buf + 32 + 1;
11169
11170 char *salt_buf_ptr = (char *) salt->salt_buf;
11171
11172 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11173
11174 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11175
11176 salt->salt_len = salt_len;
11177
11178 return (PARSER_OK);
11179 }
11180
11181 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11182 {
11183 if (data.opts_type & OPTS_TYPE_ST_HEX)
11184 {
11185 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11186 }
11187 else
11188 {
11189 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11190 }
11191
11192 u32 *digest = (u32 *) hash_buf->digest;
11193
11194 salt_t *salt = hash_buf->salt;
11195
11196 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11197 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11198 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11199 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11200
11201 digest[0] = byte_swap_32 (digest[0]);
11202 digest[1] = byte_swap_32 (digest[1]);
11203 digest[2] = byte_swap_32 (digest[2]);
11204 digest[3] = byte_swap_32 (digest[3]);
11205
11206 digest[0] -= MD5M_A;
11207 digest[1] -= MD5M_B;
11208 digest[2] -= MD5M_C;
11209 digest[3] -= MD5M_D;
11210
11211 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11212
11213 uint salt_len = input_len - 32 - 1;
11214
11215 char *salt_buf = input_buf + 32 + 1;
11216
11217 char *salt_buf_ptr = (char *) salt->salt_buf;
11218
11219 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11220
11221 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11222
11223 salt->salt_len = salt_len;
11224
11225 return (PARSER_OK);
11226 }
11227
11228 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11229 {
11230 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11231
11232 u32 *digest = (u32 *) hash_buf->digest;
11233
11234 salt_t *salt = hash_buf->salt;
11235
11236 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11237 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11238 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11239 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11240
11241 digest[0] = byte_swap_32 (digest[0]);
11242 digest[1] = byte_swap_32 (digest[1]);
11243 digest[2] = byte_swap_32 (digest[2]);
11244 digest[3] = byte_swap_32 (digest[3]);
11245
11246 digest[0] -= MD5M_A;
11247 digest[1] -= MD5M_B;
11248 digest[2] -= MD5M_C;
11249 digest[3] -= MD5M_D;
11250
11251 /**
11252 * This is a virtual salt. While the algorithm is basically not salted
11253 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11254 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11255 */
11256
11257 char *salt_buf_ptr = (char *) salt->salt_buf;
11258
11259 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11260
11261 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11262
11263 salt->salt_len = salt_len;
11264
11265 return (PARSER_OK);
11266 }
11267
11268 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11269 {
11270 if (data.opts_type & OPTS_TYPE_ST_HEX)
11271 {
11272 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11273 }
11274 else
11275 {
11276 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11277 }
11278
11279 u32 *digest = (u32 *) hash_buf->digest;
11280
11281 salt_t *salt = hash_buf->salt;
11282
11283 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11284 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11285 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11286 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11287
11288 digest[0] = byte_swap_32 (digest[0]);
11289 digest[1] = byte_swap_32 (digest[1]);
11290 digest[2] = byte_swap_32 (digest[2]);
11291 digest[3] = byte_swap_32 (digest[3]);
11292
11293 digest[0] -= MD5M_A;
11294 digest[1] -= MD5M_B;
11295 digest[2] -= MD5M_C;
11296 digest[3] -= MD5M_D;
11297
11298 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11299
11300 uint salt_len = input_len - 32 - 1;
11301
11302 char *salt_buf = input_buf + 32 + 1;
11303
11304 char *salt_buf_ptr = (char *) salt->salt_buf;
11305
11306 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11307
11308 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11309
11310 salt->salt_len = salt_len;
11311
11312 return (PARSER_OK);
11313 }
11314
11315 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11316 {
11317 if (data.opts_type & OPTS_TYPE_ST_HEX)
11318 {
11319 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11320 }
11321 else
11322 {
11323 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11324 }
11325
11326 u32 *digest = (u32 *) hash_buf->digest;
11327
11328 salt_t *salt = hash_buf->salt;
11329
11330 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11331 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11332 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11333 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11334
11335 digest[0] = byte_swap_32 (digest[0]);
11336 digest[1] = byte_swap_32 (digest[1]);
11337 digest[2] = byte_swap_32 (digest[2]);
11338 digest[3] = byte_swap_32 (digest[3]);
11339
11340 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11341
11342 uint salt_len = input_len - 32 - 1;
11343
11344 char *salt_buf = input_buf + 32 + 1;
11345
11346 char *salt_buf_ptr = (char *) salt->salt_buf;
11347
11348 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11349
11350 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11351
11352 salt->salt_len = salt_len;
11353
11354 return (PARSER_OK);
11355 }
11356
11357 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11358 {
11359 if (data.opts_type & OPTS_TYPE_ST_HEX)
11360 {
11361 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11362 }
11363 else
11364 {
11365 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11366 }
11367
11368 u32 *digest = (u32 *) hash_buf->digest;
11369
11370 salt_t *salt = hash_buf->salt;
11371
11372 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11373 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11374 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11375 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11376
11377 digest[0] = byte_swap_32 (digest[0]);
11378 digest[1] = byte_swap_32 (digest[1]);
11379 digest[2] = byte_swap_32 (digest[2]);
11380 digest[3] = byte_swap_32 (digest[3]);
11381
11382 digest[0] -= MD4M_A;
11383 digest[1] -= MD4M_B;
11384 digest[2] -= MD4M_C;
11385 digest[3] -= MD4M_D;
11386
11387 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11388
11389 uint salt_len = input_len - 32 - 1;
11390
11391 char *salt_buf = input_buf + 32 + 1;
11392
11393 char *salt_buf_ptr = (char *) salt->salt_buf;
11394
11395 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11396
11397 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11398
11399 salt->salt_len = salt_len;
11400
11401 return (PARSER_OK);
11402 }
11403
11404 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11405 {
11406 if (data.opts_type & OPTS_TYPE_ST_HEX)
11407 {
11408 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11409 }
11410 else
11411 {
11412 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11413 }
11414
11415 u32 *digest = (u32 *) hash_buf->digest;
11416
11417 salt_t *salt = hash_buf->salt;
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
11424 digest[0] = byte_swap_32 (digest[0]);
11425 digest[1] = byte_swap_32 (digest[1]);
11426 digest[2] = byte_swap_32 (digest[2]);
11427 digest[3] = byte_swap_32 (digest[3]);
11428
11429 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11430
11431 uint salt_len = input_len - 32 - 1;
11432
11433 char *salt_buf = input_buf + 32 + 1;
11434
11435 uint salt_pc_block[16];
11436
11437 memset (salt_pc_block, 0, sizeof (salt_pc_block));
11438
11439 char *salt_pc_block_ptr = (char *) salt_pc_block;
11440
11441 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11442
11443 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11444
11445 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11446
11447 salt_pc_block[14] = salt_len * 8;
11448
11449 uint salt_pc_digest[4];
11450
11451 salt_pc_digest[0] = MAGIC_A;
11452 salt_pc_digest[1] = MAGIC_B;
11453 salt_pc_digest[2] = MAGIC_C;
11454 salt_pc_digest[3] = MAGIC_D;
11455
11456 md5_64 (salt_pc_block, salt_pc_digest);
11457
11458 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11459 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11460 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11461 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11462
11463 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11464
11465 memcpy (salt_buf_ptr, salt_buf, salt_len);
11466
11467 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11468
11469 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11470 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11471 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11472 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11473
11474 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11475
11476 return (PARSER_OK);
11477 }
11478
11479 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11480 {
11481 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11482
11483 u32 *digest = (u32 *) hash_buf->digest;
11484
11485 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11486 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11487 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11488 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11489 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11490
11491 digest[0] -= SHA1M_A;
11492 digest[1] -= SHA1M_B;
11493 digest[2] -= SHA1M_C;
11494 digest[3] -= SHA1M_D;
11495 digest[4] -= SHA1M_E;
11496
11497 return (PARSER_OK);
11498 }
11499
11500 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11501 {
11502 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11503
11504 u32 *digest = (u32 *) hash_buf->digest;
11505
11506 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11507 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11508 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11509 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11510 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11511
11512 return (PARSER_OK);
11513 }
11514
11515 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11516 {
11517 if (data.opts_type & OPTS_TYPE_ST_HEX)
11518 {
11519 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11520 }
11521 else
11522 {
11523 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11524 }
11525
11526 u32 *digest = (u32 *) hash_buf->digest;
11527
11528 salt_t *salt = hash_buf->salt;
11529
11530 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11531 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11532 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11533 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11534 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11535
11536 digest[0] -= SHA1M_A;
11537 digest[1] -= SHA1M_B;
11538 digest[2] -= SHA1M_C;
11539 digest[3] -= SHA1M_D;
11540 digest[4] -= SHA1M_E;
11541
11542 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11543
11544 uint salt_len = input_len - 40 - 1;
11545
11546 char *salt_buf = input_buf + 40 + 1;
11547
11548 char *salt_buf_ptr = (char *) salt->salt_buf;
11549
11550 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11551
11552 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11553
11554 salt->salt_len = salt_len;
11555
11556 return (PARSER_OK);
11557 }
11558
11559 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11560 {
11561 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11562
11563 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11564
11565 u32 *digest = (u32 *) hash_buf->digest;
11566
11567 u8 tmp_buf[100];
11568
11569 memset (tmp_buf, 0, sizeof (tmp_buf));
11570
11571 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11572
11573 memcpy (digest, tmp_buf, 20);
11574
11575 digest[0] = byte_swap_32 (digest[0]);
11576 digest[1] = byte_swap_32 (digest[1]);
11577 digest[2] = byte_swap_32 (digest[2]);
11578 digest[3] = byte_swap_32 (digest[3]);
11579 digest[4] = byte_swap_32 (digest[4]);
11580
11581 digest[0] -= SHA1M_A;
11582 digest[1] -= SHA1M_B;
11583 digest[2] -= SHA1M_C;
11584 digest[3] -= SHA1M_D;
11585 digest[4] -= SHA1M_E;
11586
11587 return (PARSER_OK);
11588 }
11589
11590 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11591 {
11592 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11593
11594 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11595
11596 u32 *digest = (u32 *) hash_buf->digest;
11597
11598 salt_t *salt = hash_buf->salt;
11599
11600 u8 tmp_buf[100];
11601
11602 memset (tmp_buf, 0, sizeof (tmp_buf));
11603
11604 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11605
11606 memcpy (digest, tmp_buf, 20);
11607
11608 salt->salt_len = tmp_len - 20;
11609
11610 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11611
11612 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11613 {
11614 char *ptr = (char *) salt->salt_buf;
11615
11616 ptr[salt->salt_len] = 0x80;
11617 }
11618
11619 digest[0] = byte_swap_32 (digest[0]);
11620 digest[1] = byte_swap_32 (digest[1]);
11621 digest[2] = byte_swap_32 (digest[2]);
11622 digest[3] = byte_swap_32 (digest[3]);
11623 digest[4] = byte_swap_32 (digest[4]);
11624
11625 digest[0] -= SHA1M_A;
11626 digest[1] -= SHA1M_B;
11627 digest[2] -= SHA1M_C;
11628 digest[3] -= SHA1M_D;
11629 digest[4] -= SHA1M_E;
11630
11631 return (PARSER_OK);
11632 }
11633
11634 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11635 {
11636 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11637
11638 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11639
11640 u32 *digest = (u32 *) hash_buf->digest;
11641
11642 salt_t *salt = hash_buf->salt;
11643
11644 char *salt_buf = input_buf + 6;
11645
11646 uint salt_len = 8;
11647
11648 char *salt_buf_ptr = (char *) salt->salt_buf;
11649
11650 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11651
11652 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11653
11654 salt->salt_len = salt_len;
11655
11656 char *hash_pos = input_buf + 6 + 8 + 40;
11657
11658 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11659 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11660 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11661 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11662 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11663
11664 digest[0] -= SHA1M_A;
11665 digest[1] -= SHA1M_B;
11666 digest[2] -= SHA1M_C;
11667 digest[3] -= SHA1M_D;
11668 digest[4] -= SHA1M_E;
11669
11670 return (PARSER_OK);
11671 }
11672
11673 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11674 {
11675 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11676
11677 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11678
11679 u32 *digest = (u32 *) hash_buf->digest;
11680
11681 salt_t *salt = hash_buf->salt;
11682
11683 char *salt_buf = input_buf + 6;
11684
11685 uint salt_len = 8;
11686
11687 char *salt_buf_ptr = (char *) salt->salt_buf;
11688
11689 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11690
11691 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11692
11693 salt->salt_len = salt_len;
11694
11695 char *hash_pos = input_buf + 6 + 8;
11696
11697 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11698 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11699 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11700 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11701 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11702
11703 digest[0] -= SHA1M_A;
11704 digest[1] -= SHA1M_B;
11705 digest[2] -= SHA1M_C;
11706 digest[3] -= SHA1M_D;
11707 digest[4] -= SHA1M_E;
11708
11709 return (PARSER_OK);
11710 }
11711
11712 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11713 {
11714 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11715
11716 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11717
11718 u64 *digest = (u64 *) hash_buf->digest;
11719
11720 salt_t *salt = hash_buf->salt;
11721
11722 char *salt_buf = input_buf + 6;
11723
11724 uint salt_len = 8;
11725
11726 char *salt_buf_ptr = (char *) salt->salt_buf;
11727
11728 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11729
11730 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11731
11732 salt->salt_len = salt_len;
11733
11734 char *hash_pos = input_buf + 6 + 8;
11735
11736 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11737 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11738 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11739 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11740 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11741 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11742 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11743 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11744
11745 digest[0] -= SHA512M_A;
11746 digest[1] -= SHA512M_B;
11747 digest[2] -= SHA512M_C;
11748 digest[3] -= SHA512M_D;
11749 digest[4] -= SHA512M_E;
11750 digest[5] -= SHA512M_F;
11751 digest[6] -= SHA512M_G;
11752 digest[7] -= SHA512M_H;
11753
11754 return (PARSER_OK);
11755 }
11756
11757 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11758 {
11759 if (data.opts_type & OPTS_TYPE_ST_HEX)
11760 {
11761 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11762 }
11763 else
11764 {
11765 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11766 }
11767
11768 u32 *digest = (u32 *) hash_buf->digest;
11769
11770 salt_t *salt = hash_buf->salt;
11771
11772 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11773 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11774 digest[2] = 0;
11775 digest[3] = 0;
11776
11777 digest[0] = byte_swap_32 (digest[0]);
11778 digest[1] = byte_swap_32 (digest[1]);
11779
11780 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11781
11782 uint salt_len = input_len - 16 - 1;
11783
11784 char *salt_buf = input_buf + 16 + 1;
11785
11786 char *salt_buf_ptr = (char *) salt->salt_buf;
11787
11788 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11789
11790 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11791
11792 salt->salt_len = salt_len;
11793
11794 return (PARSER_OK);
11795 }
11796
11797 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11798 {
11799 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11800
11801 u32 *digest = (u32 *) hash_buf->digest;
11802
11803 salt_t *salt = hash_buf->salt;
11804
11805 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11806 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11807 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11808 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11809 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11810
11811 digest[0] -= SHA1M_A;
11812 digest[1] -= SHA1M_B;
11813 digest[2] -= SHA1M_C;
11814 digest[3] -= SHA1M_D;
11815 digest[4] -= SHA1M_E;
11816
11817 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11818
11819 uint salt_len = input_len - 40 - 1;
11820
11821 char *salt_buf = input_buf + 40 + 1;
11822
11823 char *salt_buf_ptr = (char *) salt->salt_buf;
11824
11825 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11826
11827 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11828
11829 salt->salt_len = salt_len;
11830
11831 return (PARSER_OK);
11832 }
11833
11834 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11835 {
11836 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11837
11838 u32 *digest = (u32 *) hash_buf->digest;
11839
11840 salt_t *salt = hash_buf->salt;
11841
11842 char *hash_pos = input_buf;
11843
11844 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11845 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11846 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11847 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11848 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
11849 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
11850 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
11851 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
11852 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
11853 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
11854 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
11855 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
11856 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
11857 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
11858 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
11859 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
11860
11861 char *salt_pos = input_buf + 128;
11862
11863 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
11864 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
11865 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
11866 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
11867
11868 salt->salt_iter = ROUNDS_ORACLET - 1;
11869 salt->salt_len = 16;
11870
11871 return (PARSER_OK);
11872 }
11873
11874 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11875 {
11876 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11877
11878 u32 *digest = (u32 *) hash_buf->digest;
11879
11880 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11881 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11882 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11883 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11884 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11885 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11886 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11887 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11888
11889 digest[0] -= SHA256M_A;
11890 digest[1] -= SHA256M_B;
11891 digest[2] -= SHA256M_C;
11892 digest[3] -= SHA256M_D;
11893 digest[4] -= SHA256M_E;
11894 digest[5] -= SHA256M_F;
11895 digest[6] -= SHA256M_G;
11896 digest[7] -= SHA256M_H;
11897
11898 return (PARSER_OK);
11899 }
11900
11901 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11902 {
11903 if (data.opts_type & OPTS_TYPE_ST_HEX)
11904 {
11905 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11906 }
11907 else
11908 {
11909 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11910 }
11911
11912 u32 *digest = (u32 *) hash_buf->digest;
11913
11914 salt_t *salt = hash_buf->salt;
11915
11916 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11917 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11918 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11919 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11920 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11921 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11922 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11923 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11924
11925 digest[0] -= SHA256M_A;
11926 digest[1] -= SHA256M_B;
11927 digest[2] -= SHA256M_C;
11928 digest[3] -= SHA256M_D;
11929 digest[4] -= SHA256M_E;
11930 digest[5] -= SHA256M_F;
11931 digest[6] -= SHA256M_G;
11932 digest[7] -= SHA256M_H;
11933
11934 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11935
11936 uint salt_len = input_len - 64 - 1;
11937
11938 char *salt_buf = input_buf + 64 + 1;
11939
11940 char *salt_buf_ptr = (char *) salt->salt_buf;
11941
11942 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11943
11944 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11945
11946 salt->salt_len = salt_len;
11947
11948 return (PARSER_OK);
11949 }
11950
11951 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11952 {
11953 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11954
11955 u64 *digest = (u64 *) hash_buf->digest;
11956
11957 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11958 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11959 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11960 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11961 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11962 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11963 digest[6] = 0;
11964 digest[7] = 0;
11965
11966 digest[0] -= SHA384M_A;
11967 digest[1] -= SHA384M_B;
11968 digest[2] -= SHA384M_C;
11969 digest[3] -= SHA384M_D;
11970 digest[4] -= SHA384M_E;
11971 digest[5] -= SHA384M_F;
11972 digest[6] -= 0;
11973 digest[7] -= 0;
11974
11975 return (PARSER_OK);
11976 }
11977
11978 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11979 {
11980 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11981
11982 u64 *digest = (u64 *) hash_buf->digest;
11983
11984 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11985 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11986 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11987 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11988 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11989 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11990 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11991 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11992
11993 digest[0] -= SHA512M_A;
11994 digest[1] -= SHA512M_B;
11995 digest[2] -= SHA512M_C;
11996 digest[3] -= SHA512M_D;
11997 digest[4] -= SHA512M_E;
11998 digest[5] -= SHA512M_F;
11999 digest[6] -= SHA512M_G;
12000 digest[7] -= SHA512M_H;
12001
12002 return (PARSER_OK);
12003 }
12004
12005 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12006 {
12007 if (data.opts_type & OPTS_TYPE_ST_HEX)
12008 {
12009 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12010 }
12011 else
12012 {
12013 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12014 }
12015
12016 u64 *digest = (u64 *) hash_buf->digest;
12017
12018 salt_t *salt = hash_buf->salt;
12019
12020 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12021 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12022 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12023 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12024 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12025 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12026 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12027 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12028
12029 digest[0] -= SHA512M_A;
12030 digest[1] -= SHA512M_B;
12031 digest[2] -= SHA512M_C;
12032 digest[3] -= SHA512M_D;
12033 digest[4] -= SHA512M_E;
12034 digest[5] -= SHA512M_F;
12035 digest[6] -= SHA512M_G;
12036 digest[7] -= SHA512M_H;
12037
12038 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12039
12040 uint salt_len = input_len - 128 - 1;
12041
12042 char *salt_buf = input_buf + 128 + 1;
12043
12044 char *salt_buf_ptr = (char *) salt->salt_buf;
12045
12046 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12047
12048 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12049
12050 salt->salt_len = salt_len;
12051
12052 return (PARSER_OK);
12053 }
12054
12055 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12056 {
12057 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12058
12059 u64 *digest = (u64 *) hash_buf->digest;
12060
12061 salt_t *salt = hash_buf->salt;
12062
12063 char *salt_pos = input_buf + 3;
12064
12065 uint iterations_len = 0;
12066
12067 if (memcmp (salt_pos, "rounds=", 7) == 0)
12068 {
12069 salt_pos += 7;
12070
12071 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12072
12073 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12074 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12075
12076 salt_pos[0] = 0x0;
12077
12078 salt->salt_iter = atoi (salt_pos - iterations_len);
12079
12080 salt_pos += 1;
12081
12082 iterations_len += 8;
12083 }
12084 else
12085 {
12086 salt->salt_iter = ROUNDS_SHA512CRYPT;
12087 }
12088
12089 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12090
12091 char *hash_pos = strchr (salt_pos, '$');
12092
12093 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12094
12095 uint salt_len = hash_pos - salt_pos;
12096
12097 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12098
12099 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12100
12101 salt->salt_len = salt_len;
12102
12103 hash_pos++;
12104
12105 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12106
12107 return (PARSER_OK);
12108 }
12109
12110 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12111 {
12112 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12113
12114 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12115
12116 u64 *digest = (u64 *) hash_buf->digest;
12117
12118 salt_t *salt = hash_buf->salt;
12119
12120 uint keccak_mdlen = input_len / 2;
12121
12122 for (uint i = 0; i < keccak_mdlen / 8; i++)
12123 {
12124 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12125
12126 digest[i] = byte_swap_64 (digest[i]);
12127 }
12128
12129 salt->keccak_mdlen = keccak_mdlen;
12130
12131 return (PARSER_OK);
12132 }
12133
12134 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12135 {
12136 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12137
12138 u32 *digest = (u32 *) hash_buf->digest;
12139
12140 salt_t *salt = hash_buf->salt;
12141
12142 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12143
12144 /**
12145 * Parse that strange long line
12146 */
12147
12148 char *in_off[9];
12149
12150 size_t in_len[9];
12151
12152 in_off[0] = strtok (input_buf, ":");
12153
12154 in_len[0] = strlen (in_off[0]);
12155
12156 size_t i;
12157
12158 for (i = 1; i < 9; i++)
12159 {
12160 in_off[i] = strtok (NULL, ":");
12161
12162 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12163
12164 in_len[i] = strlen (in_off[i]);
12165 }
12166
12167 char *ptr;
12168
12169 ptr = (char *) ikepsk->msg_buf;
12170
12171 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12172 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12173 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12174 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12175 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12176 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12177
12178 *ptr = 0x80;
12179
12180 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12181
12182 ptr = (char *) ikepsk->nr_buf;
12183
12184 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12185 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12186
12187 *ptr = 0x80;
12188
12189 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12190
12191 /**
12192 * Store to database
12193 */
12194
12195 ptr = in_off[8];
12196
12197 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12198 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12199 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12200 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12201
12202 digest[0] = byte_swap_32 (digest[0]);
12203 digest[1] = byte_swap_32 (digest[1]);
12204 digest[2] = byte_swap_32 (digest[2]);
12205 digest[3] = byte_swap_32 (digest[3]);
12206
12207 salt->salt_len = 32;
12208
12209 salt->salt_buf[0] = ikepsk->nr_buf[0];
12210 salt->salt_buf[1] = ikepsk->nr_buf[1];
12211 salt->salt_buf[2] = ikepsk->nr_buf[2];
12212 salt->salt_buf[3] = ikepsk->nr_buf[3];
12213 salt->salt_buf[4] = ikepsk->nr_buf[4];
12214 salt->salt_buf[5] = ikepsk->nr_buf[5];
12215 salt->salt_buf[6] = ikepsk->nr_buf[6];
12216 salt->salt_buf[7] = ikepsk->nr_buf[7];
12217
12218 return (PARSER_OK);
12219 }
12220
12221 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12222 {
12223 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12224
12225 u32 *digest = (u32 *) hash_buf->digest;
12226
12227 salt_t *salt = hash_buf->salt;
12228
12229 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12230
12231 /**
12232 * Parse that strange long line
12233 */
12234
12235 char *in_off[9];
12236
12237 size_t in_len[9];
12238
12239 in_off[0] = strtok (input_buf, ":");
12240
12241 in_len[0] = strlen (in_off[0]);
12242
12243 size_t i;
12244
12245 for (i = 1; i < 9; i++)
12246 {
12247 in_off[i] = strtok (NULL, ":");
12248
12249 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12250
12251 in_len[i] = strlen (in_off[i]);
12252 }
12253
12254 char *ptr;
12255
12256 ptr = (char *) ikepsk->msg_buf;
12257
12258 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12259 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12260 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12261 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12262 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12263 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12264
12265 *ptr = 0x80;
12266
12267 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12268
12269 ptr = (char *) ikepsk->nr_buf;
12270
12271 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12272 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12273
12274 *ptr = 0x80;
12275
12276 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12277
12278 /**
12279 * Store to database
12280 */
12281
12282 ptr = in_off[8];
12283
12284 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12285 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12286 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12287 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12288 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12289
12290 salt->salt_len = 32;
12291
12292 salt->salt_buf[0] = ikepsk->nr_buf[0];
12293 salt->salt_buf[1] = ikepsk->nr_buf[1];
12294 salt->salt_buf[2] = ikepsk->nr_buf[2];
12295 salt->salt_buf[3] = ikepsk->nr_buf[3];
12296 salt->salt_buf[4] = ikepsk->nr_buf[4];
12297 salt->salt_buf[5] = ikepsk->nr_buf[5];
12298 salt->salt_buf[6] = ikepsk->nr_buf[6];
12299 salt->salt_buf[7] = ikepsk->nr_buf[7];
12300
12301 return (PARSER_OK);
12302 }
12303
12304 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12305 {
12306 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12307
12308 u32 *digest = (u32 *) hash_buf->digest;
12309
12310 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12311 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12312 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12313 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12314 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12315
12316 digest[0] = byte_swap_32 (digest[0]);
12317 digest[1] = byte_swap_32 (digest[1]);
12318 digest[2] = byte_swap_32 (digest[2]);
12319 digest[3] = byte_swap_32 (digest[3]);
12320 digest[4] = byte_swap_32 (digest[4]);
12321
12322 return (PARSER_OK);
12323 }
12324
12325 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12326 {
12327 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12328
12329 u32 *digest = (u32 *) hash_buf->digest;
12330
12331 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12332 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12333 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12334 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12335 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12336 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12337 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12338 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12339 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12340 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12341 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12342 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12343 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12344 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12345 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12346 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12347
12348 return (PARSER_OK);
12349 }
12350
12351 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12352 {
12353 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12354
12355 u32 *digest = (u32 *) hash_buf->digest;
12356
12357 salt_t *salt = hash_buf->salt;
12358
12359 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12360 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12361 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12362 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12363 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12364
12365 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12366
12367 uint salt_len = input_len - 40 - 1;
12368
12369 char *salt_buf = input_buf + 40 + 1;
12370
12371 char *salt_buf_ptr = (char *) salt->salt_buf;
12372
12373 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12374
12375 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12376
12377 salt->salt_len = salt_len;
12378
12379 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12380
12381 return (PARSER_OK);
12382 }
12383
12384 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12385 {
12386 u32 *digest = (u32 *) hash_buf->digest;
12387
12388 salt_t *salt = hash_buf->salt;
12389
12390 tc_t *tc = (tc_t *) hash_buf->esalt;
12391
12392 if (input_len == 0)
12393 {
12394 log_error ("TrueCrypt container not specified");
12395
12396 exit (-1);
12397 }
12398
12399 FILE *fp = fopen (input_buf, "rb");
12400
12401 if (fp == NULL)
12402 {
12403 log_error ("%s: %s", input_buf, strerror (errno));
12404
12405 exit (-1);
12406 }
12407
12408 char buf[512];
12409
12410 int n = fread (buf, 1, sizeof (buf), fp);
12411
12412 fclose (fp);
12413
12414 if (n != 512) return (PARSER_TC_FILE_SIZE);
12415
12416 memcpy (tc->salt_buf, buf, 64);
12417
12418 memcpy (tc->data_buf, buf + 64, 512 - 64);
12419
12420 salt->salt_buf[0] = tc->salt_buf[0];
12421
12422 salt->salt_len = 4;
12423
12424 salt->salt_iter = 1000 - 1;
12425
12426 digest[0] = tc->data_buf[0];
12427
12428 return (PARSER_OK);
12429 }
12430
12431 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12432 {
12433 u32 *digest = (u32 *) hash_buf->digest;
12434
12435 salt_t *salt = hash_buf->salt;
12436
12437 tc_t *tc = (tc_t *) hash_buf->esalt;
12438
12439 if (input_len == 0)
12440 {
12441 log_error ("TrueCrypt container not specified");
12442
12443 exit (-1);
12444 }
12445
12446 FILE *fp = fopen (input_buf, "rb");
12447
12448 if (fp == NULL)
12449 {
12450 log_error ("%s: %s", input_buf, strerror (errno));
12451
12452 exit (-1);
12453 }
12454
12455 char buf[512];
12456
12457 int n = fread (buf, 1, sizeof (buf), fp);
12458
12459 fclose (fp);
12460
12461 if (n != 512) return (PARSER_TC_FILE_SIZE);
12462
12463 memcpy (tc->salt_buf, buf, 64);
12464
12465 memcpy (tc->data_buf, buf + 64, 512 - 64);
12466
12467 salt->salt_buf[0] = tc->salt_buf[0];
12468
12469 salt->salt_len = 4;
12470
12471 salt->salt_iter = 2000 - 1;
12472
12473 digest[0] = tc->data_buf[0];
12474
12475 return (PARSER_OK);
12476 }
12477
12478 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12479 {
12480 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12481
12482 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12483
12484 u32 *digest = (u32 *) hash_buf->digest;
12485
12486 salt_t *salt = hash_buf->salt;
12487
12488 char *salt_pos = input_buf + 6;
12489
12490 char *hash_pos = strchr (salt_pos, '$');
12491
12492 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12493
12494 uint salt_len = hash_pos - salt_pos;
12495
12496 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12497
12498 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12499
12500 salt->salt_len = salt_len;
12501
12502 salt->salt_iter = 1000;
12503
12504 hash_pos++;
12505
12506 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12507
12508 return (PARSER_OK);
12509 }
12510
12511 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12512 {
12513 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12514
12515 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12516
12517 u32 *digest = (u32 *) hash_buf->digest;
12518
12519 salt_t *salt = hash_buf->salt;
12520
12521 char *iter_pos = input_buf + 7;
12522
12523 char *salt_pos = strchr (iter_pos, '$');
12524
12525 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12526
12527 salt_pos++;
12528
12529 char *hash_pos = strchr (salt_pos, '$');
12530
12531 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12532
12533 uint salt_len = hash_pos - salt_pos;
12534
12535 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12536
12537 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12538
12539 salt->salt_len = salt_len;
12540
12541 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12542
12543 salt->salt_sign[0] = atoi (salt_iter);
12544
12545 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12546
12547 hash_pos++;
12548
12549 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12550
12551 digest[0] = byte_swap_32 (digest[0]);
12552 digest[1] = byte_swap_32 (digest[1]);
12553 digest[2] = byte_swap_32 (digest[2]);
12554 digest[3] = byte_swap_32 (digest[3]);
12555 digest[4] = byte_swap_32 (digest[4]);
12556
12557 return (PARSER_OK);
12558 }
12559
12560 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12561 {
12562 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12563
12564 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12565
12566 u32 *digest = (u32 *) hash_buf->digest;
12567
12568 salt_t *salt = hash_buf->salt;
12569
12570 char *iter_pos = input_buf + 9;
12571
12572 char *salt_pos = strchr (iter_pos, '$');
12573
12574 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12575
12576 salt_pos++;
12577
12578 char *hash_pos = strchr (salt_pos, '$');
12579
12580 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12581
12582 uint salt_len = hash_pos - salt_pos;
12583
12584 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12585
12586 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12587
12588 salt->salt_len = salt_len;
12589
12590 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12591
12592 salt->salt_sign[0] = atoi (salt_iter);
12593
12594 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12595
12596 hash_pos++;
12597
12598 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12599
12600 digest[0] = byte_swap_32 (digest[0]);
12601 digest[1] = byte_swap_32 (digest[1]);
12602 digest[2] = byte_swap_32 (digest[2]);
12603 digest[3] = byte_swap_32 (digest[3]);
12604 digest[4] = byte_swap_32 (digest[4]);
12605 digest[5] = byte_swap_32 (digest[5]);
12606 digest[6] = byte_swap_32 (digest[6]);
12607 digest[7] = byte_swap_32 (digest[7]);
12608
12609 return (PARSER_OK);
12610 }
12611
12612 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12613 {
12614 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12615
12616 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12617
12618 u64 *digest = (u64 *) hash_buf->digest;
12619
12620 salt_t *salt = hash_buf->salt;
12621
12622 char *iter_pos = input_buf + 9;
12623
12624 char *salt_pos = strchr (iter_pos, '$');
12625
12626 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12627
12628 salt_pos++;
12629
12630 char *hash_pos = strchr (salt_pos, '$');
12631
12632 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12633
12634 uint salt_len = hash_pos - salt_pos;
12635
12636 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12637
12638 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12639
12640 salt->salt_len = salt_len;
12641
12642 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12643
12644 salt->salt_sign[0] = atoi (salt_iter);
12645
12646 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12647
12648 hash_pos++;
12649
12650 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12651
12652 digest[0] = byte_swap_64 (digest[0]);
12653 digest[1] = byte_swap_64 (digest[1]);
12654 digest[2] = byte_swap_64 (digest[2]);
12655 digest[3] = byte_swap_64 (digest[3]);
12656 digest[4] = byte_swap_64 (digest[4]);
12657 digest[5] = byte_swap_64 (digest[5]);
12658 digest[6] = byte_swap_64 (digest[6]);
12659 digest[7] = byte_swap_64 (digest[7]);
12660
12661 return (PARSER_OK);
12662 }
12663
12664 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12665 {
12666 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12667
12668 u32 *digest = (u32 *) hash_buf->digest;
12669
12670 salt_t *salt = hash_buf->salt;
12671
12672 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12673
12674 /**
12675 * parse line
12676 */
12677
12678 char *iterations_pos = input_buf;
12679
12680 char *saltbuf_pos = strchr (iterations_pos, ':');
12681
12682 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12683
12684 uint iterations_len = saltbuf_pos - iterations_pos;
12685
12686 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12687
12688 saltbuf_pos++;
12689
12690 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12691
12692 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12693
12694 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12695
12696 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12697
12698 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12699
12700 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12701
12702 cipherbuf_pos++;
12703
12704 /**
12705 * pbkdf2 iterations
12706 */
12707
12708 salt->salt_iter = atoi (iterations_pos) - 1;
12709
12710 /**
12711 * handle salt encoding
12712 */
12713
12714 char *saltbuf_ptr = (char *) salt->salt_buf;
12715
12716 for (uint i = 0; i < saltbuf_len; i += 2)
12717 {
12718 const char p0 = saltbuf_pos[i + 0];
12719 const char p1 = saltbuf_pos[i + 1];
12720
12721 *saltbuf_ptr++ = hex_convert (p1) << 0
12722 | hex_convert (p0) << 4;
12723 }
12724
12725 salt->salt_len = saltbuf_len / 2;
12726
12727 /**
12728 * handle cipher encoding
12729 */
12730
12731 uint *tmp = (uint *) mymalloc (32);
12732
12733 char *cipherbuf_ptr = (char *) tmp;
12734
12735 for (uint i = 2016; i < cipherbuf_len; i += 2)
12736 {
12737 const char p0 = cipherbuf_pos[i + 0];
12738 const char p1 = cipherbuf_pos[i + 1];
12739
12740 *cipherbuf_ptr++ = hex_convert (p1) << 0
12741 | hex_convert (p0) << 4;
12742 }
12743
12744 // iv is stored at salt_buf 4 (length 16)
12745 // data is stored at salt_buf 8 (length 16)
12746
12747 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12748 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12749 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12750 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12751
12752 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12753 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12754 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12755 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12756
12757 free (tmp);
12758
12759 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12760 {
12761 const char p0 = cipherbuf_pos[j + 0];
12762 const char p1 = cipherbuf_pos[j + 1];
12763
12764 agilekey->cipher[i] = hex_convert (p1) << 0
12765 | hex_convert (p0) << 4;
12766 }
12767
12768 /**
12769 * digest buf
12770 */
12771
12772 digest[0] = 0x10101010;
12773 digest[1] = 0x10101010;
12774 digest[2] = 0x10101010;
12775 digest[3] = 0x10101010;
12776
12777 return (PARSER_OK);
12778 }
12779
12780 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12781 {
12782 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12783
12784 u32 *digest = (u32 *) hash_buf->digest;
12785
12786 salt_t *salt = hash_buf->salt;
12787
12788 char *hashbuf_pos = input_buf;
12789
12790 char *iterations_pos = strchr (hashbuf_pos, ':');
12791
12792 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12793
12794 uint hash_len = iterations_pos - hashbuf_pos;
12795
12796 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12797
12798 iterations_pos++;
12799
12800 char *saltbuf_pos = strchr (iterations_pos, ':');
12801
12802 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12803
12804 uint iterations_len = saltbuf_pos - iterations_pos;
12805
12806 saltbuf_pos++;
12807
12808 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12809
12810 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12811
12812 char *salt_buf_ptr = (char *) salt->salt_buf;
12813
12814 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12815
12816 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12817
12818 salt->salt_len = salt_len;
12819
12820 salt->salt_iter = atoi (iterations_pos) - 1;
12821
12822 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12823 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12824 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12825 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12826
12827 return (PARSER_OK);
12828 }
12829
12830 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12831 {
12832 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12833
12834 u32 *digest = (u32 *) hash_buf->digest;
12835
12836 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12837 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12838 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12839 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12840 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12841 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12842 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12843 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12844
12845 digest[0] = byte_swap_32 (digest[0]);
12846 digest[1] = byte_swap_32 (digest[1]);
12847 digest[2] = byte_swap_32 (digest[2]);
12848 digest[3] = byte_swap_32 (digest[3]);
12849 digest[4] = byte_swap_32 (digest[4]);
12850 digest[5] = byte_swap_32 (digest[5]);
12851 digest[6] = byte_swap_32 (digest[6]);
12852 digest[7] = byte_swap_32 (digest[7]);
12853
12854 return (PARSER_OK);
12855 }
12856
12857 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12858 {
12859 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12860
12861 u32 *digest = (u32 *) hash_buf->digest;
12862
12863 salt_t *salt = hash_buf->salt;
12864
12865 char *salt_pos = input_buf + 3;
12866
12867 uint iterations_len = 0;
12868
12869 if (memcmp (salt_pos, "rounds=", 7) == 0)
12870 {
12871 salt_pos += 7;
12872
12873 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12874
12875 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12876 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12877
12878 salt_pos[0] = 0x0;
12879
12880 salt->salt_iter = atoi (salt_pos - iterations_len);
12881
12882 salt_pos += 1;
12883
12884 iterations_len += 8;
12885 }
12886 else
12887 {
12888 salt->salt_iter = ROUNDS_SHA256CRYPT;
12889 }
12890
12891 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12892
12893 char *hash_pos = strchr (salt_pos, '$');
12894
12895 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12896
12897 uint salt_len = hash_pos - salt_pos;
12898
12899 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12900
12901 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12902
12903 salt->salt_len = salt_len;
12904
12905 hash_pos++;
12906
12907 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12908
12909 return (PARSER_OK);
12910 }
12911
12912 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12913 {
12914 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12915
12916 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12917
12918 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12919
12920 u64 *digest = (u64 *) hash_buf->digest;
12921
12922 salt_t *salt = hash_buf->salt;
12923
12924 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12925
12926 char *iter_pos = input_buf + 4;
12927
12928 char *salt_pos = strchr (iter_pos, '$');
12929
12930 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12931
12932 salt_pos++;
12933
12934 char *hash_pos = strchr (salt_pos, '$');
12935
12936 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12937
12938 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12939
12940 hash_pos++;
12941
12942 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12943 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12944 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12945 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12946 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12947 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12948 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12949 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12950
12951 uint salt_len = hash_pos - salt_pos - 1;
12952
12953 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12954
12955 salt->salt_len = salt_len / 2;
12956
12957 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12958 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12959 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12960 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12961 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
12962 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
12963 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
12964 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
12965
12966 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12967 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12968 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12969 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12970 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12971 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12972 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12973 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12974 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12975 pbkdf2_sha512->salt_buf[9] = 0x80;
12976
12977 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12978
12979 salt->salt_iter = atoi (iter_pos) - 1;
12980
12981 return (PARSER_OK);
12982 }
12983
12984 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12985 {
12986 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12987
12988 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12989
12990 u32 *digest = (u32 *) hash_buf->digest;
12991
12992 salt_t *salt = hash_buf->salt;
12993
12994 char *salt_pos = input_buf + 14;
12995
12996 char *hash_pos = strchr (salt_pos, '*');
12997
12998 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12999
13000 hash_pos++;
13001
13002 uint salt_len = hash_pos - salt_pos - 1;
13003
13004 char *salt_buf_ptr = (char *) salt->salt_buf;
13005
13006 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13007
13008 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13009
13010 salt->salt_len = salt_len;
13011
13012 u8 tmp_buf[100];
13013
13014 memset (tmp_buf, 0, sizeof (tmp_buf));
13015
13016 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13017
13018 memcpy (digest, tmp_buf, 32);
13019
13020 digest[0] = byte_swap_32 (digest[0]);
13021 digest[1] = byte_swap_32 (digest[1]);
13022 digest[2] = byte_swap_32 (digest[2]);
13023 digest[3] = byte_swap_32 (digest[3]);
13024 digest[4] = byte_swap_32 (digest[4]);
13025 digest[5] = byte_swap_32 (digest[5]);
13026 digest[6] = byte_swap_32 (digest[6]);
13027 digest[7] = byte_swap_32 (digest[7]);
13028
13029 digest[0] -= SHA256M_A;
13030 digest[1] -= SHA256M_B;
13031 digest[2] -= SHA256M_C;
13032 digest[3] -= SHA256M_D;
13033 digest[4] -= SHA256M_E;
13034 digest[5] -= SHA256M_F;
13035 digest[6] -= SHA256M_G;
13036 digest[7] -= SHA256M_H;
13037
13038 return (PARSER_OK);
13039 }
13040
13041 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13042 {
13043 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13044
13045 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13046
13047 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13048
13049 u64 *digest = (u64 *) hash_buf->digest;
13050
13051 salt_t *salt = hash_buf->salt;
13052
13053 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13054
13055 char *iter_pos = input_buf + 19;
13056
13057 char *salt_pos = strchr (iter_pos, '.');
13058
13059 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13060
13061 salt_pos++;
13062
13063 char *hash_pos = strchr (salt_pos, '.');
13064
13065 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13066
13067 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13068
13069 hash_pos++;
13070
13071 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13072 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13073 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13074 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13075 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13076 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13077 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13078 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13079
13080 uint salt_len = hash_pos - salt_pos - 1;
13081
13082 salt_len /= 2;
13083
13084 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13085
13086 uint i;
13087
13088 for (i = 0; i < salt_len; i++)
13089 {
13090 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13091 }
13092
13093 salt_buf_ptr[salt_len + 3] = 0x01;
13094 salt_buf_ptr[salt_len + 4] = 0x80;
13095
13096 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13097
13098 salt->salt_len = salt_len;
13099
13100 salt->salt_iter = atoi (iter_pos) - 1;
13101
13102 return (PARSER_OK);
13103 }
13104
13105 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13106 {
13107 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13108
13109 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13110
13111 u64 *digest = (u64 *) hash_buf->digest;
13112
13113 salt_t *salt = hash_buf->salt;
13114
13115 u8 tmp_buf[120];
13116
13117 memset (tmp_buf, 0, sizeof (tmp_buf));
13118
13119 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13120
13121 memcpy (digest, tmp_buf, 64);
13122
13123 digest[0] = byte_swap_64 (digest[0]);
13124 digest[1] = byte_swap_64 (digest[1]);
13125 digest[2] = byte_swap_64 (digest[2]);
13126 digest[3] = byte_swap_64 (digest[3]);
13127 digest[4] = byte_swap_64 (digest[4]);
13128 digest[5] = byte_swap_64 (digest[5]);
13129 digest[6] = byte_swap_64 (digest[6]);
13130 digest[7] = byte_swap_64 (digest[7]);
13131
13132 digest[0] -= SHA512M_A;
13133 digest[1] -= SHA512M_B;
13134 digest[2] -= SHA512M_C;
13135 digest[3] -= SHA512M_D;
13136 digest[4] -= SHA512M_E;
13137 digest[5] -= SHA512M_F;
13138 digest[6] -= SHA512M_G;
13139 digest[7] -= SHA512M_H;
13140
13141 salt->salt_len = tmp_len - 64;
13142
13143 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13144
13145 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13146 {
13147 char *ptr = (char *) salt->salt_buf;
13148
13149 ptr[salt->salt_len] = 0x80;
13150 }
13151
13152 return (PARSER_OK);
13153 }
13154
13155 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13156 {
13157 if (data.opts_type & OPTS_TYPE_ST_HEX)
13158 {
13159 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13160 }
13161 else
13162 {
13163 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13164 }
13165
13166 u32 *digest = (u32 *) hash_buf->digest;
13167
13168 salt_t *salt = hash_buf->salt;
13169
13170 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13171 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13172 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13173 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13174
13175 digest[0] = byte_swap_32 (digest[0]);
13176 digest[1] = byte_swap_32 (digest[1]);
13177 digest[2] = byte_swap_32 (digest[2]);
13178 digest[3] = byte_swap_32 (digest[3]);
13179
13180 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13181
13182 uint salt_len = input_len - 32 - 1;
13183
13184 char *salt_buf = input_buf + 32 + 1;
13185
13186 char *salt_buf_ptr = (char *) salt->salt_buf;
13187
13188 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13189
13190 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13191
13192 salt->salt_len = salt_len;
13193
13194 return (PARSER_OK);
13195 }
13196
13197 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13198 {
13199 if (data.opts_type & OPTS_TYPE_ST_HEX)
13200 {
13201 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13202 }
13203 else
13204 {
13205 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13206 }
13207
13208 u32 *digest = (u32 *) hash_buf->digest;
13209
13210 salt_t *salt = hash_buf->salt;
13211
13212 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13213 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13214 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13215 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13216 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13217
13218 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13219
13220 uint salt_len = input_len - 40 - 1;
13221
13222 char *salt_buf = input_buf + 40 + 1;
13223
13224 char *salt_buf_ptr = (char *) salt->salt_buf;
13225
13226 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13227
13228 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13229
13230 salt->salt_len = salt_len;
13231
13232 return (PARSER_OK);
13233 }
13234
13235 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13236 {
13237 if (data.opts_type & OPTS_TYPE_ST_HEX)
13238 {
13239 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13240 }
13241 else
13242 {
13243 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13244 }
13245
13246 u32 *digest = (u32 *) hash_buf->digest;
13247
13248 salt_t *salt = hash_buf->salt;
13249
13250 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13251 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13252 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13253 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13254 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13255 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13256 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13257 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13258
13259 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13260
13261 uint salt_len = input_len - 64 - 1;
13262
13263 char *salt_buf = input_buf + 64 + 1;
13264
13265 char *salt_buf_ptr = (char *) salt->salt_buf;
13266
13267 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13268
13269 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13270
13271 salt->salt_len = salt_len;
13272
13273 return (PARSER_OK);
13274 }
13275
13276 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13277 {
13278 if (data.opts_type & OPTS_TYPE_ST_HEX)
13279 {
13280 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13281 }
13282 else
13283 {
13284 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13285 }
13286
13287 u64 *digest = (u64 *) hash_buf->digest;
13288
13289 salt_t *salt = hash_buf->salt;
13290
13291 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13292 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13293 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13294 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13295 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13296 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13297 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13298 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13299
13300 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13301
13302 uint salt_len = input_len - 128 - 1;
13303
13304 char *salt_buf = input_buf + 128 + 1;
13305
13306 char *salt_buf_ptr = (char *) salt->salt_buf;
13307
13308 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13309
13310 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13311
13312 salt->salt_len = salt_len;
13313
13314 return (PARSER_OK);
13315 }
13316
13317 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13318 {
13319 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13320
13321 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13322
13323 u32 *digest = (u32 *) hash_buf->digest;
13324
13325 salt_t *salt = hash_buf->salt;
13326
13327 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13328
13329 /**
13330 * parse line
13331 */
13332
13333 char *user_pos = input_buf + 10 + 1;
13334
13335 char *realm_pos = strchr (user_pos, '$');
13336
13337 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13338
13339 uint user_len = realm_pos - user_pos;
13340
13341 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13342
13343 realm_pos++;
13344
13345 char *salt_pos = strchr (realm_pos, '$');
13346
13347 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13348
13349 uint realm_len = salt_pos - realm_pos;
13350
13351 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13352
13353 salt_pos++;
13354
13355 char *data_pos = strchr (salt_pos, '$');
13356
13357 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13358
13359 uint salt_len = data_pos - salt_pos;
13360
13361 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13362
13363 data_pos++;
13364
13365 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13366
13367 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13368
13369 /**
13370 * copy data
13371 */
13372
13373 memcpy (krb5pa->user, user_pos, user_len);
13374 memcpy (krb5pa->realm, realm_pos, realm_len);
13375 memcpy (krb5pa->salt, salt_pos, salt_len);
13376
13377 char *timestamp_ptr = (char *) krb5pa->timestamp;
13378
13379 for (uint i = 0; i < (36 * 2); i += 2)
13380 {
13381 const char p0 = data_pos[i + 0];
13382 const char p1 = data_pos[i + 1];
13383
13384 *timestamp_ptr++ = hex_convert (p1) << 0
13385 | hex_convert (p0) << 4;
13386 }
13387
13388 char *checksum_ptr = (char *) krb5pa->checksum;
13389
13390 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13391 {
13392 const char p0 = data_pos[i + 0];
13393 const char p1 = data_pos[i + 1];
13394
13395 *checksum_ptr++ = hex_convert (p1) << 0
13396 | hex_convert (p0) << 4;
13397 }
13398
13399 /**
13400 * copy some data to generic buffers to make sorting happy
13401 */
13402
13403 salt->salt_buf[0] = krb5pa->timestamp[0];
13404 salt->salt_buf[1] = krb5pa->timestamp[1];
13405 salt->salt_buf[2] = krb5pa->timestamp[2];
13406 salt->salt_buf[3] = krb5pa->timestamp[3];
13407 salt->salt_buf[4] = krb5pa->timestamp[4];
13408 salt->salt_buf[5] = krb5pa->timestamp[5];
13409 salt->salt_buf[6] = krb5pa->timestamp[6];
13410 salt->salt_buf[7] = krb5pa->timestamp[7];
13411 salt->salt_buf[8] = krb5pa->timestamp[8];
13412
13413 salt->salt_len = 36;
13414
13415 digest[0] = krb5pa->checksum[0];
13416 digest[1] = krb5pa->checksum[1];
13417 digest[2] = krb5pa->checksum[2];
13418 digest[3] = krb5pa->checksum[3];
13419
13420 return (PARSER_OK);
13421 }
13422
13423 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13424 {
13425 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13426
13427 u32 *digest = (u32 *) hash_buf->digest;
13428
13429 salt_t *salt = hash_buf->salt;
13430
13431 /**
13432 * parse line
13433 */
13434
13435 char *salt_pos = input_buf;
13436
13437 char *hash_pos = strchr (salt_pos, '$');
13438
13439 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13440
13441 uint salt_len = hash_pos - salt_pos;
13442
13443 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13444
13445 hash_pos++;
13446
13447 uint hash_len = input_len - 1 - salt_len;
13448
13449 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13450
13451 /**
13452 * valid some data
13453 */
13454
13455 uint user_len = 0;
13456
13457 for (uint i = 0; i < salt_len; i++)
13458 {
13459 if (salt_pos[i] == ' ') continue;
13460
13461 user_len++;
13462 }
13463
13464 // SAP user names cannot be longer than 12 characters
13465 if (user_len > 12) return (PARSER_SALT_LENGTH);
13466
13467 // SAP user name cannot start with ! or ?
13468 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13469
13470 /**
13471 * copy data
13472 */
13473
13474 char *salt_buf_ptr = (char *) salt->salt_buf;
13475
13476 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13477
13478 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13479
13480 salt->salt_len = salt_len;
13481
13482 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13483 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13484 digest[2] = 0;
13485 digest[3] = 0;
13486
13487 digest[0] = byte_swap_32 (digest[0]);
13488 digest[1] = byte_swap_32 (digest[1]);
13489
13490 return (PARSER_OK);
13491 }
13492
13493 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13494 {
13495 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13496
13497 u32 *digest = (u32 *) hash_buf->digest;
13498
13499 salt_t *salt = hash_buf->salt;
13500
13501 /**
13502 * parse line
13503 */
13504
13505 char *salt_pos = input_buf;
13506
13507 char *hash_pos = strchr (salt_pos, '$');
13508
13509 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13510
13511 uint salt_len = hash_pos - salt_pos;
13512
13513 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13514
13515 hash_pos++;
13516
13517 uint hash_len = input_len - 1 - salt_len;
13518
13519 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13520
13521 /**
13522 * valid some data
13523 */
13524
13525 uint user_len = 0;
13526
13527 for (uint i = 0; i < salt_len; i++)
13528 {
13529 if (salt_pos[i] == ' ') continue;
13530
13531 user_len++;
13532 }
13533
13534 // SAP user names cannot be longer than 12 characters
13535 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13536 // so far nobody complained so we stay with this because it helps in optimization
13537 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13538
13539 if (user_len > 12) return (PARSER_SALT_LENGTH);
13540
13541 // SAP user name cannot start with ! or ?
13542 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13543
13544 /**
13545 * copy data
13546 */
13547
13548 char *salt_buf_ptr = (char *) salt->salt_buf;
13549
13550 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13551
13552 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13553
13554 salt->salt_len = salt_len;
13555
13556 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13557 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13558 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13559 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13560 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13561
13562 return (PARSER_OK);
13563 }
13564
13565 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13566 {
13567 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13568
13569 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13570
13571 u64 *digest = (u64 *) hash_buf->digest;
13572
13573 salt_t *salt = hash_buf->salt;
13574
13575 char *iter_pos = input_buf + 3;
13576
13577 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13578
13579 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13580
13581 memcpy ((char *) salt->salt_sign, input_buf, 4);
13582
13583 salt->salt_iter = salt_iter;
13584
13585 char *salt_pos = iter_pos + 1;
13586
13587 uint salt_len = 8;
13588
13589 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13590
13591 salt->salt_len = salt_len;
13592
13593 char *hash_pos = salt_pos + salt_len;
13594
13595 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13596
13597 // ugly hack start
13598
13599 char *tmp = (char *) salt->salt_buf_pc;
13600
13601 tmp[0] = hash_pos[42];
13602
13603 // ugly hack end
13604
13605 digest[ 0] = byte_swap_64 (digest[ 0]);
13606 digest[ 1] = byte_swap_64 (digest[ 1]);
13607 digest[ 2] = byte_swap_64 (digest[ 2]);
13608 digest[ 3] = byte_swap_64 (digest[ 3]);
13609 digest[ 4] = 0;
13610 digest[ 5] = 0;
13611 digest[ 6] = 0;
13612 digest[ 7] = 0;
13613
13614 return (PARSER_OK);
13615 }
13616
13617 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13618 {
13619 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13620
13621 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13622
13623 u32 *digest = (u32 *) hash_buf->digest;
13624
13625 salt_t *salt = hash_buf->salt;
13626
13627 char *salt_buf = input_buf + 6;
13628
13629 uint salt_len = 16;
13630
13631 char *salt_buf_ptr = (char *) salt->salt_buf;
13632
13633 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13634
13635 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13636
13637 salt->salt_len = salt_len;
13638
13639 char *hash_pos = input_buf + 6 + 16;
13640
13641 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13642 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13643 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13644 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13645 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13646 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13647 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13648 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13649
13650 return (PARSER_OK);
13651 }
13652
13653 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13654 {
13655 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13656
13657 u32 *digest = (u32 *) hash_buf->digest;
13658
13659 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13660 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13661 digest[2] = 0;
13662 digest[3] = 0;
13663
13664 return (PARSER_OK);
13665 }
13666
13667 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13668 {
13669 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13670
13671 u32 *digest = (u32 *) hash_buf->digest;
13672
13673 salt_t *salt = hash_buf->salt;
13674
13675 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13676
13677 char *saltbuf_pos = input_buf;
13678
13679 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13680
13681 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13682
13683 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13684
13685 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13686 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13687
13688 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13689
13690 hashbuf_pos++;
13691
13692 uint hashbuf_len = input_len - saltbuf_len - 1;
13693
13694 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13695
13696 char *salt_ptr = (char *) saltbuf_pos;
13697 char *rakp_ptr = (char *) rakp->salt_buf;
13698
13699 uint i;
13700 uint j;
13701
13702 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13703 {
13704 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13705 }
13706
13707 rakp_ptr[j] = 0x80;
13708
13709 rakp->salt_len = j;
13710
13711 for (i = 0; i < 64; i++)
13712 {
13713 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13714 }
13715
13716 salt->salt_buf[0] = rakp->salt_buf[0];
13717 salt->salt_buf[1] = rakp->salt_buf[1];
13718 salt->salt_buf[2] = rakp->salt_buf[2];
13719 salt->salt_buf[3] = rakp->salt_buf[3];
13720 salt->salt_buf[4] = rakp->salt_buf[4];
13721 salt->salt_buf[5] = rakp->salt_buf[5];
13722 salt->salt_buf[6] = rakp->salt_buf[6];
13723 salt->salt_buf[7] = rakp->salt_buf[7];
13724
13725 salt->salt_len = 32; // muss min. 32 haben
13726
13727 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13728 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13729 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13730 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13731 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13732
13733 return (PARSER_OK);
13734 }
13735
13736 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13737 {
13738 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13739
13740 u32 *digest = (u32 *) hash_buf->digest;
13741
13742 salt_t *salt = hash_buf->salt;
13743
13744 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13745
13746 char *salt_pos = input_buf + 1;
13747
13748 memcpy (salt->salt_buf, salt_pos, 8);
13749
13750 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13751 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13752
13753 salt->salt_len = 8;
13754
13755 char *hash_pos = salt_pos + 8;
13756
13757 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13758 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13759 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13760 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13761 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13762
13763 digest[0] -= SHA1M_A;
13764 digest[1] -= SHA1M_B;
13765 digest[2] -= SHA1M_C;
13766 digest[3] -= SHA1M_D;
13767 digest[4] -= SHA1M_E;
13768
13769 return (PARSER_OK);
13770 }
13771
13772 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13773 {
13774 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13775
13776 u32 *digest = (u32 *) hash_buf->digest;
13777
13778 salt_t *salt = hash_buf->salt;
13779
13780 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13781 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13782 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13783 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13784
13785 digest[0] = byte_swap_32 (digest[0]);
13786 digest[1] = byte_swap_32 (digest[1]);
13787 digest[2] = byte_swap_32 (digest[2]);
13788 digest[3] = byte_swap_32 (digest[3]);
13789
13790 digest[0] -= MD5M_A;
13791 digest[1] -= MD5M_B;
13792 digest[2] -= MD5M_C;
13793 digest[3] -= MD5M_D;
13794
13795 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13796
13797 char *salt_buf_ptr = input_buf + 32 + 1;
13798
13799 u32 *salt_buf = salt->salt_buf;
13800
13801 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13802 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13803 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13804 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13805
13806 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13807 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13808 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13809 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13810
13811 salt->salt_len = 16 + 1;
13812
13813 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13814
13815 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13816
13817 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13818
13819 return (PARSER_OK);
13820 }
13821
13822 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13823 {
13824 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13825
13826 u32 *digest = (u32 *) hash_buf->digest;
13827
13828 salt_t *salt = hash_buf->salt;
13829
13830 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13831
13832 /**
13833 * parse line
13834 */
13835
13836 char *hashbuf_pos = input_buf;
13837
13838 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13839
13840 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13841
13842 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13843
13844 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13845
13846 saltbuf_pos++;
13847
13848 char *iteration_pos = strchr (saltbuf_pos, ':');
13849
13850 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13851
13852 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13853
13854 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13855
13856 iteration_pos++;
13857
13858 char *databuf_pos = strchr (iteration_pos, ':');
13859
13860 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13861
13862 const uint iteration_len = databuf_pos - iteration_pos;
13863
13864 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13865 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13866
13867 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13868
13869 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13870 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13871
13872 databuf_pos++;
13873
13874 // digest
13875
13876 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13877 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13878 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13879 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13880 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13881 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
13882 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
13883 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
13884
13885 // salt
13886
13887 char *saltbuf_ptr = (char *) salt->salt_buf;
13888
13889 for (uint i = 0; i < saltbuf_len; i += 2)
13890 {
13891 const char p0 = saltbuf_pos[i + 0];
13892 const char p1 = saltbuf_pos[i + 1];
13893
13894 *saltbuf_ptr++ = hex_convert (p1) << 0
13895 | hex_convert (p0) << 4;
13896 }
13897
13898 salt->salt_buf[4] = 0x01000000;
13899 salt->salt_buf[5] = 0x80;
13900
13901 salt->salt_len = saltbuf_len / 2;
13902
13903 // iteration
13904
13905 salt->salt_iter = atoi (iteration_pos) - 1;
13906
13907 // data
13908
13909 char *databuf_ptr = (char *) cloudkey->data_buf;
13910
13911 for (uint i = 0; i < databuf_len; i += 2)
13912 {
13913 const char p0 = databuf_pos[i + 0];
13914 const char p1 = databuf_pos[i + 1];
13915
13916 *databuf_ptr++ = hex_convert (p1) << 0
13917 | hex_convert (p0) << 4;
13918 }
13919
13920 *databuf_ptr++ = 0x80;
13921
13922 for (uint i = 0; i < 512; i++)
13923 {
13924 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13925 }
13926
13927 cloudkey->data_len = databuf_len / 2;
13928
13929 return (PARSER_OK);
13930 }
13931
13932 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13933 {
13934 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13935
13936 u32 *digest = (u32 *) hash_buf->digest;
13937
13938 salt_t *salt = hash_buf->salt;
13939
13940 /**
13941 * parse line
13942 */
13943
13944 char *hashbuf_pos = input_buf;
13945
13946 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13947
13948 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13949
13950 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13951
13952 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13953
13954 domainbuf_pos++;
13955
13956 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13957
13958 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13959
13960 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13961
13962 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13963
13964 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13965
13966 saltbuf_pos++;
13967
13968 char *iteration_pos = strchr (saltbuf_pos, ':');
13969
13970 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13971
13972 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13973
13974 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13975
13976 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13977
13978 iteration_pos++;
13979
13980 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13981
13982 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13983 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13984
13985 // ok, the plan for this algorithm is the following:
13986 // we have 2 salts here, the domain-name and a random salt
13987 // while both are used in the initial transformation,
13988 // only the random salt is used in the following iterations
13989 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13990 // and one that includes only the real salt (stored into salt_buf[]).
13991 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13992
13993 u8 tmp_buf[100];
13994
13995 memset (tmp_buf, 0, sizeof (tmp_buf));
13996
13997 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
13998
13999 memcpy (digest, tmp_buf, 20);
14000
14001 digest[0] = byte_swap_32 (digest[0]);
14002 digest[1] = byte_swap_32 (digest[1]);
14003 digest[2] = byte_swap_32 (digest[2]);
14004 digest[3] = byte_swap_32 (digest[3]);
14005 digest[4] = byte_swap_32 (digest[4]);
14006
14007 // domain
14008
14009 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14010
14011 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14012
14013 char *len_ptr = NULL;
14014
14015 for (uint i = 0; i < domainbuf_len; i++)
14016 {
14017 if (salt_buf_pc_ptr[i] == '.')
14018 {
14019 len_ptr = &salt_buf_pc_ptr[i];
14020
14021 *len_ptr = 0;
14022 }
14023 else
14024 {
14025 *len_ptr += 1;
14026 }
14027 }
14028
14029 salt->salt_buf_pc[7] = domainbuf_len;
14030
14031 // "real" salt
14032
14033 char *salt_buf_ptr = (char *) salt->salt_buf;
14034
14035 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14036
14037 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14038
14039 salt->salt_len = salt_len;
14040
14041 // iteration
14042
14043 salt->salt_iter = atoi (iteration_pos);
14044
14045 return (PARSER_OK);
14046 }
14047
14048 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14049 {
14050 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14051
14052 u32 *digest = (u32 *) hash_buf->digest;
14053
14054 salt_t *salt = hash_buf->salt;
14055
14056 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14057 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14058 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14059 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14060 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14061
14062 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14063
14064 uint salt_len = input_len - 40 - 1;
14065
14066 char *salt_buf = input_buf + 40 + 1;
14067
14068 char *salt_buf_ptr = (char *) salt->salt_buf;
14069
14070 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14071
14072 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14073
14074 salt->salt_len = salt_len;
14075
14076 return (PARSER_OK);
14077 }
14078
14079 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14080 {
14081 const u8 ascii_to_ebcdic[] =
14082 {
14083 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14084 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14085 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14086 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14087 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14088 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14089 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14090 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14091 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14092 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14093 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14094 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14095 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14096 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14097 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14098 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14099 };
14100
14101 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14102
14103 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14104
14105 u32 *digest = (u32 *) hash_buf->digest;
14106
14107 salt_t *salt = hash_buf->salt;
14108
14109 char *salt_pos = input_buf + 6 + 1;
14110
14111 char *digest_pos = strchr (salt_pos, '*');
14112
14113 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14114
14115 uint salt_len = digest_pos - salt_pos;
14116
14117 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14118
14119 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14120
14121 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14122
14123 digest_pos++;
14124
14125 char *salt_buf_ptr = (char *) salt->salt_buf;
14126 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14127
14128 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14129
14130 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14131
14132 salt->salt_len = salt_len;
14133
14134 for (uint i = 0; i < salt_len; i++)
14135 {
14136 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14137 }
14138 for (uint i = salt_len; i < 8; i++)
14139 {
14140 salt_buf_pc_ptr[i] = 0x40;
14141 }
14142
14143 uint tt;
14144
14145 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14146
14147 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14148 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14149
14150 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14151 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14152
14153 digest[0] = byte_swap_32 (digest[0]);
14154 digest[1] = byte_swap_32 (digest[1]);
14155
14156 IP (digest[0], digest[1], tt);
14157
14158 digest[0] = rotr32 (digest[0], 29);
14159 digest[1] = rotr32 (digest[1], 29);
14160 digest[2] = 0;
14161 digest[3] = 0;
14162
14163 return (PARSER_OK);
14164 }
14165
14166 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14167 {
14168 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14169
14170 u32 *digest = (u32 *) hash_buf->digest;
14171
14172 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14173 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14174 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14175 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14176
14177 digest[0] = byte_swap_32 (digest[0]);
14178 digest[1] = byte_swap_32 (digest[1]);
14179 digest[2] = byte_swap_32 (digest[2]);
14180 digest[3] = byte_swap_32 (digest[3]);
14181
14182 return (PARSER_OK);
14183 }
14184
14185 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14186 {
14187 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14188
14189 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14190
14191 u32 *digest = (u32 *) hash_buf->digest;
14192
14193 salt_t *salt = hash_buf->salt;
14194
14195 u8 tmp_buf[120];
14196
14197 memset (tmp_buf, 0, sizeof (tmp_buf));
14198
14199 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14200
14201 tmp_buf[3] += -4; // dont ask!
14202
14203 memcpy (salt->salt_buf, tmp_buf, 5);
14204
14205 salt->salt_len = 5;
14206
14207 memcpy (digest, tmp_buf + 5, 9);
14208
14209 // yes, only 9 byte are needed to crack, but 10 to display
14210
14211 salt->salt_buf_pc[7] = input_buf[20];
14212
14213 return (PARSER_OK);
14214 }
14215
14216 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14217 {
14218 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14219
14220 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14221
14222 u32 *digest = (u32 *) hash_buf->digest;
14223
14224 salt_t *salt = hash_buf->salt;
14225
14226 u8 tmp_buf[120];
14227
14228 memset (tmp_buf, 0, sizeof (tmp_buf));
14229
14230 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14231
14232 tmp_buf[3] += -4; // dont ask!
14233
14234 // salt
14235
14236 memcpy (salt->salt_buf, tmp_buf, 16);
14237
14238 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)
14239
14240 // iteration
14241
14242 char tmp_iter_buf[11];
14243
14244 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14245
14246 tmp_iter_buf[10] = 0;
14247
14248 salt->salt_iter = atoi (tmp_iter_buf);
14249
14250 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14251 {
14252 return (PARSER_SALT_ITERATION);
14253 }
14254
14255 salt->salt_iter--; // first round in init
14256
14257 // 2 additional bytes for display only
14258
14259 salt->salt_buf_pc[0] = tmp_buf[26];
14260 salt->salt_buf_pc[1] = tmp_buf[27];
14261
14262 // digest
14263
14264 memcpy (digest, tmp_buf + 28, 8);
14265
14266 digest[0] = byte_swap_32 (digest[0]);
14267 digest[1] = byte_swap_32 (digest[1]);
14268 digest[2] = 0;
14269 digest[3] = 0;
14270
14271 return (PARSER_OK);
14272 }
14273
14274 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14275 {
14276 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14277
14278 u32 *digest = (u32 *) hash_buf->digest;
14279
14280 salt_t *salt = hash_buf->salt;
14281
14282 char *salt_buf_pos = input_buf;
14283
14284 char *hash_buf_pos = salt_buf_pos + 6;
14285
14286 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14287 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14288 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14289 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14290 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14291 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14292 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14293 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14294
14295 digest[0] -= SHA256M_A;
14296 digest[1] -= SHA256M_B;
14297 digest[2] -= SHA256M_C;
14298 digest[3] -= SHA256M_D;
14299 digest[4] -= SHA256M_E;
14300 digest[5] -= SHA256M_F;
14301 digest[6] -= SHA256M_G;
14302 digest[7] -= SHA256M_H;
14303
14304 char *salt_buf_ptr = (char *) salt->salt_buf;
14305
14306 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14307
14308 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14309
14310 salt->salt_len = salt_len;
14311
14312 return (PARSER_OK);
14313 }
14314
14315 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14316 {
14317 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14318
14319 u32 *digest = (u32 *) hash_buf->digest;
14320
14321 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14322
14323 salt_t *salt = hash_buf->salt;
14324
14325 char *salt_buf = input_buf + 6;
14326
14327 char *digest_buf = strchr (salt_buf, '$');
14328
14329 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14330
14331 uint salt_len = digest_buf - salt_buf;
14332
14333 digest_buf++; // skip the '$' symbol
14334
14335 char *salt_buf_ptr = (char *) salt->salt_buf;
14336
14337 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14338
14339 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14340
14341 salt->salt_len = salt_len;
14342
14343 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14344 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14345 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14346 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14347
14348 digest[0] = byte_swap_32 (digest[0]);
14349 digest[1] = byte_swap_32 (digest[1]);
14350 digest[2] = byte_swap_32 (digest[2]);
14351 digest[3] = byte_swap_32 (digest[3]);
14352
14353 digest[0] -= MD5M_A;
14354 digest[1] -= MD5M_B;
14355 digest[2] -= MD5M_C;
14356 digest[3] -= MD5M_D;
14357
14358 return (PARSER_OK);
14359 }
14360
14361 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14362 {
14363 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14364
14365 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14366
14367 u32 *digest = (u32 *) hash_buf->digest;
14368
14369 salt_t *salt = hash_buf->salt;
14370
14371 char *salt_buf = input_buf + 3;
14372
14373 char *digest_buf = strchr (salt_buf, '$');
14374
14375 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14376
14377 uint salt_len = digest_buf - salt_buf;
14378
14379 digest_buf++; // skip the '$' symbol
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 salt_buf_ptr[salt_len] = 0x2d;
14388
14389 salt->salt_len = salt_len + 1;
14390
14391 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14392 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14393 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14394 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14395
14396 digest[0] = byte_swap_32 (digest[0]);
14397 digest[1] = byte_swap_32 (digest[1]);
14398 digest[2] = byte_swap_32 (digest[2]);
14399 digest[3] = byte_swap_32 (digest[3]);
14400
14401 digest[0] -= MD5M_A;
14402 digest[1] -= MD5M_B;
14403 digest[2] -= MD5M_C;
14404 digest[3] -= MD5M_D;
14405
14406 return (PARSER_OK);
14407 }
14408
14409 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14410 {
14411 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14412
14413 u32 *digest = (u32 *) hash_buf->digest;
14414
14415 u8 tmp_buf[100];
14416
14417 memset (tmp_buf, 0, sizeof (tmp_buf));
14418
14419 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14420
14421 memcpy (digest, tmp_buf, 20);
14422
14423 digest[0] = byte_swap_32 (digest[0]);
14424 digest[1] = byte_swap_32 (digest[1]);
14425 digest[2] = byte_swap_32 (digest[2]);
14426 digest[3] = byte_swap_32 (digest[3]);
14427 digest[4] = byte_swap_32 (digest[4]);
14428
14429 digest[0] -= SHA1M_A;
14430 digest[1] -= SHA1M_B;
14431 digest[2] -= SHA1M_C;
14432 digest[3] -= SHA1M_D;
14433 digest[4] -= SHA1M_E;
14434
14435 return (PARSER_OK);
14436 }
14437
14438 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14439 {
14440 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14441
14442 u32 *digest = (u32 *) hash_buf->digest;
14443
14444 salt_t *salt = hash_buf->salt;
14445
14446 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14447 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14448 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14449 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14450
14451 digest[0] = byte_swap_32 (digest[0]);
14452 digest[1] = byte_swap_32 (digest[1]);
14453 digest[2] = byte_swap_32 (digest[2]);
14454 digest[3] = byte_swap_32 (digest[3]);
14455
14456 digest[0] -= MD5M_A;
14457 digest[1] -= MD5M_B;
14458 digest[2] -= MD5M_C;
14459 digest[3] -= MD5M_D;
14460
14461 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14462
14463 uint salt_len = input_len - 32 - 1;
14464
14465 char *salt_buf = input_buf + 32 + 1;
14466
14467 char *salt_buf_ptr = (char *) salt->salt_buf;
14468
14469 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14470
14471 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14472
14473 /*
14474 * add static "salt" part
14475 */
14476
14477 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14478
14479 salt_len += 8;
14480
14481 salt->salt_len = salt_len;
14482
14483 return (PARSER_OK);
14484 }
14485
14486 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14487 {
14488 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14489
14490 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14491
14492 u32 *digest = (u32 *) hash_buf->digest;
14493
14494 salt_t *salt = hash_buf->salt;
14495
14496 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14497
14498 /**
14499 * parse line
14500 */
14501
14502 char *saltlen_pos = input_buf + 1 + 3 + 1;
14503
14504 char *saltbuf_pos = strchr (saltlen_pos, '$');
14505
14506 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14507
14508 uint saltlen_len = saltbuf_pos - saltlen_pos;
14509
14510 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14511
14512 saltbuf_pos++;
14513
14514 char *keylen_pos = strchr (saltbuf_pos, '$');
14515
14516 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14517
14518 uint saltbuf_len = keylen_pos - saltbuf_pos;
14519
14520 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14521
14522 keylen_pos++;
14523
14524 char *keybuf_pos = strchr (keylen_pos, '$');
14525
14526 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14527
14528 uint keylen_len = keybuf_pos - keylen_pos;
14529
14530 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14531
14532 keybuf_pos++;
14533
14534 char *databuf_pos = strchr (keybuf_pos, '$');
14535
14536 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14537
14538 uint keybuf_len = databuf_pos - keybuf_pos;
14539
14540 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14541
14542 databuf_pos++;
14543
14544 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14545
14546 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14547
14548 /**
14549 * copy data
14550 */
14551
14552 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14553 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14554 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14555 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14556
14557 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14558 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14559 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14560 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14561
14562 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14563 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14564 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14565 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14566
14567 salt->salt_len = 16;
14568 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14569
14570 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14571 {
14572 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14573 }
14574
14575 return (PARSER_OK);
14576 }
14577
14578 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14579 {
14580 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14581
14582 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14583
14584 u32 *digest = (u32 *) hash_buf->digest;
14585
14586 salt_t *salt = hash_buf->salt;
14587
14588 /**
14589 * parse line
14590 */
14591
14592 // first is the N salt parameter
14593
14594 char *N_pos = input_buf + 6;
14595
14596 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14597
14598 N_pos++;
14599
14600 salt->scrypt_N = atoi (N_pos);
14601
14602 // r
14603
14604 char *r_pos = strchr (N_pos, ':');
14605
14606 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14607
14608 r_pos++;
14609
14610 salt->scrypt_r = atoi (r_pos);
14611
14612 // p
14613
14614 char *p_pos = strchr (r_pos, ':');
14615
14616 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14617
14618 p_pos++;
14619
14620 salt->scrypt_p = atoi (p_pos);
14621
14622 // salt
14623
14624 char *saltbuf_pos = strchr (p_pos, ':');
14625
14626 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14627
14628 saltbuf_pos++;
14629
14630 char *hash_pos = strchr (saltbuf_pos, ':');
14631
14632 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14633
14634 hash_pos++;
14635
14636 // base64 decode
14637
14638 u8 tmp_buf[33];
14639
14640 memset (tmp_buf, 0, sizeof (tmp_buf));
14641
14642 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14643
14644 char *salt_buf_ptr = (char *) salt->salt_buf;
14645
14646 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14647
14648 salt->salt_len = tmp_len;
14649 salt->salt_iter = 1;
14650
14651 // digest - base64 decode
14652
14653 memset (tmp_buf, 0, sizeof (tmp_buf));
14654
14655 tmp_len = input_len - (hash_pos - input_buf);
14656
14657 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14658
14659 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14660
14661 memcpy (digest, tmp_buf, 32);
14662
14663 return (PARSER_OK);
14664 }
14665
14666 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14667 {
14668 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14669
14670 u32 *digest = (u32 *) hash_buf->digest;
14671
14672 salt_t *salt = hash_buf->salt;
14673
14674 /**
14675 * parse line
14676 */
14677
14678 char decrypted[76]; // iv + hash
14679
14680 juniper_decrypt_hash (input_buf, decrypted);
14681
14682 char *md5crypt_hash = decrypted + 12;
14683
14684 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14685
14686 salt->salt_iter = ROUNDS_MD5CRYPT;
14687
14688 char *salt_pos = md5crypt_hash + 3;
14689
14690 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14691
14692 salt->salt_len = hash_pos - salt_pos; // should be 8
14693
14694 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14695
14696 hash_pos++;
14697
14698 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14699
14700 return (PARSER_OK);
14701 }
14702
14703 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14704 {
14705 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14706
14707 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14708
14709 u32 *digest = (u32 *) hash_buf->digest;
14710
14711 salt_t *salt = hash_buf->salt;
14712
14713 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14714
14715 /**
14716 * parse line
14717 */
14718
14719 // first is *raw* salt
14720
14721 char *salt_pos = input_buf + 3;
14722
14723 char *hash_pos = strchr (salt_pos, '$');
14724
14725 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14726
14727 uint salt_len = hash_pos - salt_pos;
14728
14729 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14730
14731 hash_pos++;
14732
14733 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14734
14735 memcpy (salt_buf_ptr, salt_pos, 14);
14736
14737 salt_buf_ptr[17] = 0x01;
14738 salt_buf_ptr[18] = 0x80;
14739
14740 // add some stuff to normal salt to make sorted happy
14741
14742 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14743 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14744 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14745 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14746
14747 salt->salt_len = salt_len;
14748 salt->salt_iter = ROUNDS_CISCO8 - 1;
14749
14750 // base64 decode hash
14751
14752 u8 tmp_buf[100];
14753
14754 memset (tmp_buf, 0, sizeof (tmp_buf));
14755
14756 uint hash_len = input_len - 3 - salt_len - 1;
14757
14758 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14759
14760 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14761
14762 memcpy (digest, tmp_buf, 32);
14763
14764 digest[0] = byte_swap_32 (digest[0]);
14765 digest[1] = byte_swap_32 (digest[1]);
14766 digest[2] = byte_swap_32 (digest[2]);
14767 digest[3] = byte_swap_32 (digest[3]);
14768 digest[4] = byte_swap_32 (digest[4]);
14769 digest[5] = byte_swap_32 (digest[5]);
14770 digest[6] = byte_swap_32 (digest[6]);
14771 digest[7] = byte_swap_32 (digest[7]);
14772
14773 return (PARSER_OK);
14774 }
14775
14776 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14777 {
14778 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14779
14780 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14781
14782 u32 *digest = (u32 *) hash_buf->digest;
14783
14784 salt_t *salt = hash_buf->salt;
14785
14786 /**
14787 * parse line
14788 */
14789
14790 // first is *raw* salt
14791
14792 char *salt_pos = input_buf + 3;
14793
14794 char *hash_pos = strchr (salt_pos, '$');
14795
14796 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14797
14798 uint salt_len = hash_pos - salt_pos;
14799
14800 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14801
14802 salt->salt_len = salt_len;
14803 hash_pos++;
14804
14805 char *salt_buf_ptr = (char *) salt->salt_buf;
14806
14807 memcpy (salt_buf_ptr, salt_pos, salt_len);
14808 salt_buf_ptr[salt_len] = 0;
14809
14810 // base64 decode hash
14811
14812 u8 tmp_buf[100];
14813
14814 memset (tmp_buf, 0, sizeof (tmp_buf));
14815
14816 uint hash_len = input_len - 3 - salt_len - 1;
14817
14818 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14819
14820 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14821
14822 memcpy (digest, tmp_buf, 32);
14823
14824 // fixed:
14825 salt->scrypt_N = 16384;
14826 salt->scrypt_r = 1;
14827 salt->scrypt_p = 1;
14828 salt->salt_iter = 1;
14829
14830 return (PARSER_OK);
14831 }
14832
14833 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14834 {
14835 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14836
14837 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14838
14839 u32 *digest = (u32 *) hash_buf->digest;
14840
14841 salt_t *salt = hash_buf->salt;
14842
14843 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14844
14845 /**
14846 * parse line
14847 */
14848
14849 char *version_pos = input_buf + 8 + 1;
14850
14851 char *verifierHashSize_pos = strchr (version_pos, '*');
14852
14853 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14854
14855 u32 version_len = verifierHashSize_pos - version_pos;
14856
14857 if (version_len != 4) return (PARSER_SALT_LENGTH);
14858
14859 verifierHashSize_pos++;
14860
14861 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14862
14863 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14864
14865 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14866
14867 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14868
14869 keySize_pos++;
14870
14871 char *saltSize_pos = strchr (keySize_pos, '*');
14872
14873 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14874
14875 u32 keySize_len = saltSize_pos - keySize_pos;
14876
14877 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14878
14879 saltSize_pos++;
14880
14881 char *osalt_pos = strchr (saltSize_pos, '*');
14882
14883 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14884
14885 u32 saltSize_len = osalt_pos - saltSize_pos;
14886
14887 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14888
14889 osalt_pos++;
14890
14891 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14892
14893 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14894
14895 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14896
14897 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14898
14899 encryptedVerifier_pos++;
14900
14901 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14902
14903 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14904
14905 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14906
14907 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14908
14909 encryptedVerifierHash_pos++;
14910
14911 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;
14912
14913 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14914
14915 const uint version = atoi (version_pos);
14916
14917 if (version != 2007) return (PARSER_SALT_VALUE);
14918
14919 const uint verifierHashSize = atoi (verifierHashSize_pos);
14920
14921 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14922
14923 const uint keySize = atoi (keySize_pos);
14924
14925 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14926
14927 office2007->keySize = keySize;
14928
14929 const uint saltSize = atoi (saltSize_pos);
14930
14931 if (saltSize != 16) return (PARSER_SALT_VALUE);
14932
14933 /**
14934 * salt
14935 */
14936
14937 salt->salt_len = 16;
14938 salt->salt_iter = ROUNDS_OFFICE2007;
14939
14940 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14941 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14942 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14943 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14944
14945 /**
14946 * esalt
14947 */
14948
14949 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14950 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14951 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14952 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14953
14954 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14955 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14956 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14957 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14958 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14959
14960 /**
14961 * digest
14962 */
14963
14964 digest[0] = office2007->encryptedVerifierHash[0];
14965 digest[1] = office2007->encryptedVerifierHash[1];
14966 digest[2] = office2007->encryptedVerifierHash[2];
14967 digest[3] = office2007->encryptedVerifierHash[3];
14968
14969 return (PARSER_OK);
14970 }
14971
14972 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14973 {
14974 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14975
14976 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14977
14978 u32 *digest = (u32 *) hash_buf->digest;
14979
14980 salt_t *salt = hash_buf->salt;
14981
14982 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14983
14984 /**
14985 * parse line
14986 */
14987
14988 char *version_pos = input_buf + 8 + 1;
14989
14990 char *spinCount_pos = strchr (version_pos, '*');
14991
14992 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14993
14994 u32 version_len = spinCount_pos - version_pos;
14995
14996 if (version_len != 4) return (PARSER_SALT_LENGTH);
14997
14998 spinCount_pos++;
14999
15000 char *keySize_pos = strchr (spinCount_pos, '*');
15001
15002 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15003
15004 u32 spinCount_len = keySize_pos - spinCount_pos;
15005
15006 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15007
15008 keySize_pos++;
15009
15010 char *saltSize_pos = strchr (keySize_pos, '*');
15011
15012 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15013
15014 u32 keySize_len = saltSize_pos - keySize_pos;
15015
15016 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15017
15018 saltSize_pos++;
15019
15020 char *osalt_pos = strchr (saltSize_pos, '*');
15021
15022 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15023
15024 u32 saltSize_len = osalt_pos - saltSize_pos;
15025
15026 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15027
15028 osalt_pos++;
15029
15030 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15031
15032 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15033
15034 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15035
15036 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15037
15038 encryptedVerifier_pos++;
15039
15040 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15041
15042 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15043
15044 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15045
15046 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15047
15048 encryptedVerifierHash_pos++;
15049
15050 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;
15051
15052 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15053
15054 const uint version = atoi (version_pos);
15055
15056 if (version != 2010) return (PARSER_SALT_VALUE);
15057
15058 const uint spinCount = atoi (spinCount_pos);
15059
15060 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15061
15062 const uint keySize = atoi (keySize_pos);
15063
15064 if (keySize != 128) return (PARSER_SALT_VALUE);
15065
15066 const uint saltSize = atoi (saltSize_pos);
15067
15068 if (saltSize != 16) return (PARSER_SALT_VALUE);
15069
15070 /**
15071 * salt
15072 */
15073
15074 salt->salt_len = 16;
15075 salt->salt_iter = spinCount;
15076
15077 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15078 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15079 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15080 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15081
15082 /**
15083 * esalt
15084 */
15085
15086 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15087 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15088 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15089 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15090
15091 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15092 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15093 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15094 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15095 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15096 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15097 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15098 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15099
15100 /**
15101 * digest
15102 */
15103
15104 digest[0] = office2010->encryptedVerifierHash[0];
15105 digest[1] = office2010->encryptedVerifierHash[1];
15106 digest[2] = office2010->encryptedVerifierHash[2];
15107 digest[3] = office2010->encryptedVerifierHash[3];
15108
15109 return (PARSER_OK);
15110 }
15111
15112 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15113 {
15114 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15115
15116 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15117
15118 u32 *digest = (u32 *) hash_buf->digest;
15119
15120 salt_t *salt = hash_buf->salt;
15121
15122 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15123
15124 /**
15125 * parse line
15126 */
15127
15128 char *version_pos = input_buf + 8 + 1;
15129
15130 char *spinCount_pos = strchr (version_pos, '*');
15131
15132 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15133
15134 u32 version_len = spinCount_pos - version_pos;
15135
15136 if (version_len != 4) return (PARSER_SALT_LENGTH);
15137
15138 spinCount_pos++;
15139
15140 char *keySize_pos = strchr (spinCount_pos, '*');
15141
15142 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15143
15144 u32 spinCount_len = keySize_pos - spinCount_pos;
15145
15146 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15147
15148 keySize_pos++;
15149
15150 char *saltSize_pos = strchr (keySize_pos, '*');
15151
15152 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15153
15154 u32 keySize_len = saltSize_pos - keySize_pos;
15155
15156 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15157
15158 saltSize_pos++;
15159
15160 char *osalt_pos = strchr (saltSize_pos, '*');
15161
15162 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15163
15164 u32 saltSize_len = osalt_pos - saltSize_pos;
15165
15166 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15167
15168 osalt_pos++;
15169
15170 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15171
15172 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15173
15174 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15175
15176 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15177
15178 encryptedVerifier_pos++;
15179
15180 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15181
15182 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15183
15184 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15185
15186 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15187
15188 encryptedVerifierHash_pos++;
15189
15190 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;
15191
15192 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15193
15194 const uint version = atoi (version_pos);
15195
15196 if (version != 2013) return (PARSER_SALT_VALUE);
15197
15198 const uint spinCount = atoi (spinCount_pos);
15199
15200 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15201
15202 const uint keySize = atoi (keySize_pos);
15203
15204 if (keySize != 256) return (PARSER_SALT_VALUE);
15205
15206 const uint saltSize = atoi (saltSize_pos);
15207
15208 if (saltSize != 16) return (PARSER_SALT_VALUE);
15209
15210 /**
15211 * salt
15212 */
15213
15214 salt->salt_len = 16;
15215 salt->salt_iter = spinCount;
15216
15217 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15218 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15219 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15220 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15221
15222 /**
15223 * esalt
15224 */
15225
15226 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15227 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15228 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15229 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15230
15231 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15232 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15233 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15234 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15235 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15236 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15237 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15238 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15239
15240 /**
15241 * digest
15242 */
15243
15244 digest[0] = office2013->encryptedVerifierHash[0];
15245 digest[1] = office2013->encryptedVerifierHash[1];
15246 digest[2] = office2013->encryptedVerifierHash[2];
15247 digest[3] = office2013->encryptedVerifierHash[3];
15248
15249 return (PARSER_OK);
15250 }
15251
15252 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15253 {
15254 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15255
15256 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15257
15258 u32 *digest = (u32 *) hash_buf->digest;
15259
15260 salt_t *salt = hash_buf->salt;
15261
15262 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15263
15264 /**
15265 * parse line
15266 */
15267
15268 char *version_pos = input_buf + 11;
15269
15270 char *osalt_pos = strchr (version_pos, '*');
15271
15272 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15273
15274 u32 version_len = osalt_pos - version_pos;
15275
15276 if (version_len != 1) return (PARSER_SALT_LENGTH);
15277
15278 osalt_pos++;
15279
15280 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15281
15282 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15283
15284 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15285
15286 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15287
15288 encryptedVerifier_pos++;
15289
15290 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15291
15292 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15293
15294 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15295
15296 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15297
15298 encryptedVerifierHash_pos++;
15299
15300 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15301
15302 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15303
15304 const uint version = *version_pos - 0x30;
15305
15306 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15307
15308 /**
15309 * esalt
15310 */
15311
15312 oldoffice01->version = version;
15313
15314 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15315 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15316 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15317 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15318
15319 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15320 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15321 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15322 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15323
15324 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15325 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15326 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15327 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15328
15329 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15330 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15331 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15332 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15333
15334 /**
15335 * salt
15336 */
15337
15338 salt->salt_len = 16;
15339
15340 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15341 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15342 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15343 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15344
15345 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15346 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15347 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15348 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15349
15350 // this is a workaround as office produces multiple documents with the same salt
15351
15352 salt->salt_len += 32;
15353
15354 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15355 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15356 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15357 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15358 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15359 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15360 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15361 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15362
15363 /**
15364 * digest
15365 */
15366
15367 digest[0] = oldoffice01->encryptedVerifierHash[0];
15368 digest[1] = oldoffice01->encryptedVerifierHash[1];
15369 digest[2] = oldoffice01->encryptedVerifierHash[2];
15370 digest[3] = oldoffice01->encryptedVerifierHash[3];
15371
15372 return (PARSER_OK);
15373 }
15374
15375 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15376 {
15377 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15378 }
15379
15380 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15381 {
15382 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15383
15384 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15385
15386 u32 *digest = (u32 *) hash_buf->digest;
15387
15388 salt_t *salt = hash_buf->salt;
15389
15390 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15391
15392 /**
15393 * parse line
15394 */
15395
15396 char *version_pos = input_buf + 11;
15397
15398 char *osalt_pos = strchr (version_pos, '*');
15399
15400 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15401
15402 u32 version_len = osalt_pos - version_pos;
15403
15404 if (version_len != 1) return (PARSER_SALT_LENGTH);
15405
15406 osalt_pos++;
15407
15408 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15409
15410 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15411
15412 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15413
15414 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15415
15416 encryptedVerifier_pos++;
15417
15418 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15419
15420 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15421
15422 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15423
15424 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15425
15426 encryptedVerifierHash_pos++;
15427
15428 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15429
15430 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15431
15432 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15433
15434 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15435
15436 rc4key_pos++;
15437
15438 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15439
15440 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15441
15442 const uint version = *version_pos - 0x30;
15443
15444 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15445
15446 /**
15447 * esalt
15448 */
15449
15450 oldoffice01->version = version;
15451
15452 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15453 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15454 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15455 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15456
15457 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15458 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15459 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15460 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15461
15462 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15463 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15464 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15465 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15466
15467 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15468 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15469 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15470 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15471
15472 oldoffice01->rc4key[1] = 0;
15473 oldoffice01->rc4key[0] = 0;
15474
15475 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15476 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15477 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15478 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15479 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15480 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15481 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15482 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15483 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15484 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15485
15486 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15487 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15488
15489 /**
15490 * salt
15491 */
15492
15493 salt->salt_len = 16;
15494
15495 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15496 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15497 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15498 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15499
15500 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15501 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15502 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15503 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15504
15505 // this is a workaround as office produces multiple documents with the same salt
15506
15507 salt->salt_len += 32;
15508
15509 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15510 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15511 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15512 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15513 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15514 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15515 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15516 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15517
15518 /**
15519 * digest
15520 */
15521
15522 digest[0] = oldoffice01->rc4key[0];
15523 digest[1] = oldoffice01->rc4key[1];
15524 digest[2] = 0;
15525 digest[3] = 0;
15526
15527 return (PARSER_OK);
15528 }
15529
15530 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15531 {
15532 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15533
15534 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15535
15536 u32 *digest = (u32 *) hash_buf->digest;
15537
15538 salt_t *salt = hash_buf->salt;
15539
15540 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15541
15542 /**
15543 * parse line
15544 */
15545
15546 char *version_pos = input_buf + 11;
15547
15548 char *osalt_pos = strchr (version_pos, '*');
15549
15550 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15551
15552 u32 version_len = osalt_pos - version_pos;
15553
15554 if (version_len != 1) return (PARSER_SALT_LENGTH);
15555
15556 osalt_pos++;
15557
15558 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15559
15560 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15561
15562 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15563
15564 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15565
15566 encryptedVerifier_pos++;
15567
15568 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15569
15570 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15571
15572 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15573
15574 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15575
15576 encryptedVerifierHash_pos++;
15577
15578 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15579
15580 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15581
15582 const uint version = *version_pos - 0x30;
15583
15584 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15585
15586 /**
15587 * esalt
15588 */
15589
15590 oldoffice34->version = version;
15591
15592 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15593 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15594 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15595 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15596
15597 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15598 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15599 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15600 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15601
15602 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15603 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15604 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15605 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15606 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15607
15608 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15609 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15610 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15611 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15612 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15613
15614 /**
15615 * salt
15616 */
15617
15618 salt->salt_len = 16;
15619
15620 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15621 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15622 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15623 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15624
15625 // this is a workaround as office produces multiple documents with the same salt
15626
15627 salt->salt_len += 32;
15628
15629 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15630 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15631 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15632 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15633 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15634 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15635 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15636 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15637
15638 /**
15639 * digest
15640 */
15641
15642 digest[0] = oldoffice34->encryptedVerifierHash[0];
15643 digest[1] = oldoffice34->encryptedVerifierHash[1];
15644 digest[2] = oldoffice34->encryptedVerifierHash[2];
15645 digest[3] = oldoffice34->encryptedVerifierHash[3];
15646
15647 return (PARSER_OK);
15648 }
15649
15650 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15651 {
15652 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15653
15654 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15655 }
15656
15657 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15658 {
15659 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15660
15661 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15662
15663 u32 *digest = (u32 *) hash_buf->digest;
15664
15665 salt_t *salt = hash_buf->salt;
15666
15667 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15668
15669 /**
15670 * parse line
15671 */
15672
15673 char *version_pos = input_buf + 11;
15674
15675 char *osalt_pos = strchr (version_pos, '*');
15676
15677 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15678
15679 u32 version_len = osalt_pos - version_pos;
15680
15681 if (version_len != 1) return (PARSER_SALT_LENGTH);
15682
15683 osalt_pos++;
15684
15685 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15686
15687 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15688
15689 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15690
15691 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15692
15693 encryptedVerifier_pos++;
15694
15695 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15696
15697 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15698
15699 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15700
15701 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15702
15703 encryptedVerifierHash_pos++;
15704
15705 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15706
15707 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15708
15709 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15710
15711 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15712
15713 rc4key_pos++;
15714
15715 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15716
15717 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15718
15719 const uint version = *version_pos - 0x30;
15720
15721 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15722
15723 /**
15724 * esalt
15725 */
15726
15727 oldoffice34->version = version;
15728
15729 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15730 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15731 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15732 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15733
15734 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15735 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15736 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15737 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15738
15739 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15740 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15741 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15742 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15743 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15744
15745 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15746 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15747 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15748 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15749 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15750
15751 oldoffice34->rc4key[1] = 0;
15752 oldoffice34->rc4key[0] = 0;
15753
15754 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15755 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15756 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15757 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15758 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15759 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15760 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15761 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15762 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15763 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15764
15765 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15766 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15767
15768 /**
15769 * salt
15770 */
15771
15772 salt->salt_len = 16;
15773
15774 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15775 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15776 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15777 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15778
15779 // this is a workaround as office produces multiple documents with the same salt
15780
15781 salt->salt_len += 32;
15782
15783 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15784 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15785 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15786 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15787 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15788 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15789 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15790 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15791
15792 /**
15793 * digest
15794 */
15795
15796 digest[0] = oldoffice34->rc4key[0];
15797 digest[1] = oldoffice34->rc4key[1];
15798 digest[2] = 0;
15799 digest[3] = 0;
15800
15801 return (PARSER_OK);
15802 }
15803
15804 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15805 {
15806 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15807
15808 u32 *digest = (u32 *) hash_buf->digest;
15809
15810 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15811 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15812 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15813 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15814
15815 digest[0] = byte_swap_32 (digest[0]);
15816 digest[1] = byte_swap_32 (digest[1]);
15817 digest[2] = byte_swap_32 (digest[2]);
15818 digest[3] = byte_swap_32 (digest[3]);
15819
15820 return (PARSER_OK);
15821 }
15822
15823 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15824 {
15825 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15826
15827 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15828
15829 u32 *digest = (u32 *) hash_buf->digest;
15830
15831 salt_t *salt = hash_buf->salt;
15832
15833 char *signature_pos = input_buf;
15834
15835 char *salt_pos = strchr (signature_pos, '$');
15836
15837 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15838
15839 u32 signature_len = salt_pos - signature_pos;
15840
15841 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15842
15843 salt_pos++;
15844
15845 char *hash_pos = strchr (salt_pos, '$');
15846
15847 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15848
15849 u32 salt_len = hash_pos - salt_pos;
15850
15851 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15852
15853 hash_pos++;
15854
15855 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15856
15857 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15858
15859 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15860 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15861 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15862 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15863 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15864
15865 digest[0] -= SHA1M_A;
15866 digest[1] -= SHA1M_B;
15867 digest[2] -= SHA1M_C;
15868 digest[3] -= SHA1M_D;
15869 digest[4] -= SHA1M_E;
15870
15871 char *salt_buf_ptr = (char *) salt->salt_buf;
15872
15873 memcpy (salt_buf_ptr, salt_pos, salt_len);
15874
15875 salt->salt_len = salt_len;
15876
15877 return (PARSER_OK);
15878 }
15879
15880 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15881 {
15882 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15883
15884 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15885
15886 u32 *digest = (u32 *) hash_buf->digest;
15887
15888 salt_t *salt = hash_buf->salt;
15889
15890 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15891
15892 /**
15893 * parse line
15894 */
15895
15896 char *iter_pos = input_buf + 14;
15897
15898 const int iter = atoi (iter_pos);
15899
15900 if (iter < 1) return (PARSER_SALT_ITERATION);
15901
15902 salt->salt_iter = iter - 1;
15903
15904 char *salt_pos = strchr (iter_pos, '$');
15905
15906 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15907
15908 salt_pos++;
15909
15910 char *hash_pos = strchr (salt_pos, '$');
15911
15912 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15913
15914 const uint salt_len = hash_pos - salt_pos;
15915
15916 hash_pos++;
15917
15918 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15919
15920 memcpy (salt_buf_ptr, salt_pos, salt_len);
15921
15922 salt->salt_len = salt_len;
15923
15924 salt_buf_ptr[salt_len + 3] = 0x01;
15925 salt_buf_ptr[salt_len + 4] = 0x80;
15926
15927 // add some stuff to normal salt to make sorted happy
15928
15929 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15930 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15931 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15932 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15933 salt->salt_buf[4] = salt->salt_iter;
15934
15935 // base64 decode hash
15936
15937 u8 tmp_buf[100];
15938
15939 memset (tmp_buf, 0, sizeof (tmp_buf));
15940
15941 uint hash_len = input_len - (hash_pos - input_buf);
15942
15943 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15944
15945 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15946
15947 memcpy (digest, tmp_buf, 32);
15948
15949 digest[0] = byte_swap_32 (digest[0]);
15950 digest[1] = byte_swap_32 (digest[1]);
15951 digest[2] = byte_swap_32 (digest[2]);
15952 digest[3] = byte_swap_32 (digest[3]);
15953 digest[4] = byte_swap_32 (digest[4]);
15954 digest[5] = byte_swap_32 (digest[5]);
15955 digest[6] = byte_swap_32 (digest[6]);
15956 digest[7] = byte_swap_32 (digest[7]);
15957
15958 return (PARSER_OK);
15959 }
15960
15961 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15962 {
15963 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15964
15965 u32 *digest = (u32 *) hash_buf->digest;
15966
15967 salt_t *salt = hash_buf->salt;
15968
15969 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15970 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15971 digest[2] = 0;
15972 digest[3] = 0;
15973
15974 digest[0] = byte_swap_32 (digest[0]);
15975 digest[1] = byte_swap_32 (digest[1]);
15976
15977 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15978 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15979 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15980
15981 char iter_c = input_buf[17];
15982 char iter_d = input_buf[19];
15983
15984 // atm only defaults, let's see if there's more request
15985 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15986 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15987
15988 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15989
15990 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
15991 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
15992 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
15993 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
15994
15995 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15996 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15997 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15998 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15999
16000 salt->salt_len = 16;
16001
16002 return (PARSER_OK);
16003 }
16004
16005 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16006 {
16007 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16008
16009 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16010
16011 u32 *digest = (u32 *) hash_buf->digest;
16012
16013 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16014
16015 salt_t *salt = hash_buf->salt;
16016
16017 char *salt_pos = input_buf + 10;
16018
16019 char *hash_pos = strchr (salt_pos, '$');
16020
16021 uint salt_len = hash_pos - salt_pos;
16022
16023 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16024
16025 hash_pos++;
16026
16027 uint hash_len = input_len - 10 - salt_len - 1;
16028
16029 // base64 decode salt
16030
16031 u8 tmp_buf[100];
16032
16033 memset (tmp_buf, 0, sizeof (tmp_buf));
16034
16035 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16036
16037 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16038
16039 tmp_buf[salt_len] = 0x80;
16040
16041 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16042
16043 salt->salt_len = salt_len;
16044
16045 // base64 decode salt
16046
16047 memset (tmp_buf, 0, sizeof (tmp_buf));
16048
16049 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16050
16051 uint user_len = hash_len - 32;
16052
16053 const u8 *tmp_hash = tmp_buf + user_len;
16054
16055 user_len--; // skip the trailing space
16056
16057 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16058 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16059 digest[2] = hex_to_u32 (&tmp_hash[16]);
16060 digest[3] = hex_to_u32 (&tmp_hash[24]);
16061
16062 digest[0] = byte_swap_32 (digest[0]);
16063 digest[1] = byte_swap_32 (digest[1]);
16064 digest[2] = byte_swap_32 (digest[2]);
16065 digest[3] = byte_swap_32 (digest[3]);
16066
16067 // store username for host only (output hash if cracked)
16068
16069 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16070 memcpy (cram_md5->user, tmp_buf, user_len);
16071
16072 return (PARSER_OK);
16073 }
16074
16075 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16076 {
16077 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16078
16079 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16080
16081 u32 *digest = (u32 *) hash_buf->digest;
16082
16083 salt_t *salt = hash_buf->salt;
16084
16085 char *iter_pos = input_buf + 10;
16086
16087 u32 iter = atoi (iter_pos);
16088
16089 if (iter < 1)
16090 {
16091 return (PARSER_SALT_ITERATION);
16092 }
16093
16094 iter--; // first iteration is special
16095
16096 salt->salt_iter = iter;
16097
16098 char *base64_pos = strchr (iter_pos, '}');
16099
16100 if (base64_pos == NULL)
16101 {
16102 return (PARSER_SIGNATURE_UNMATCHED);
16103 }
16104
16105 base64_pos++;
16106
16107 // base64 decode salt
16108
16109 u32 base64_len = input_len - (base64_pos - input_buf);
16110
16111 u8 tmp_buf[100];
16112
16113 memset (tmp_buf, 0, sizeof (tmp_buf));
16114
16115 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16116
16117 if (decoded_len < 24)
16118 {
16119 return (PARSER_SALT_LENGTH);
16120 }
16121
16122 // copy the salt
16123
16124 uint salt_len = decoded_len - 20;
16125
16126 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16127 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16128
16129 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16130
16131 salt->salt_len = salt_len;
16132
16133 // set digest
16134
16135 u32 *digest_ptr = (u32*) tmp_buf;
16136
16137 digest[0] = byte_swap_32 (digest_ptr[0]);
16138 digest[1] = byte_swap_32 (digest_ptr[1]);
16139 digest[2] = byte_swap_32 (digest_ptr[2]);
16140 digest[3] = byte_swap_32 (digest_ptr[3]);
16141 digest[4] = byte_swap_32 (digest_ptr[4]);
16142
16143 return (PARSER_OK);
16144 }
16145
16146 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16147 {
16148 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16149
16150 u32 *digest = (u32 *) hash_buf->digest;
16151
16152 salt_t *salt = hash_buf->salt;
16153
16154 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16155 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16156 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16157 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16158 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16159
16160 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16161
16162 uint salt_len = input_len - 40 - 1;
16163
16164 char *salt_buf = input_buf + 40 + 1;
16165
16166 char *salt_buf_ptr = (char *) salt->salt_buf;
16167
16168 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16169
16170 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16171
16172 salt->salt_len = salt_len;
16173
16174 return (PARSER_OK);
16175 }
16176
16177 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16178 {
16179 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16180
16181 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16182
16183 u32 *digest = (u32 *) hash_buf->digest;
16184
16185 salt_t *salt = hash_buf->salt;
16186
16187 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16188
16189 /**
16190 * parse line
16191 */
16192
16193 char *V_pos = input_buf + 5;
16194
16195 char *R_pos = strchr (V_pos, '*');
16196
16197 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16198
16199 u32 V_len = R_pos - V_pos;
16200
16201 R_pos++;
16202
16203 char *bits_pos = strchr (R_pos, '*');
16204
16205 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16206
16207 u32 R_len = bits_pos - R_pos;
16208
16209 bits_pos++;
16210
16211 char *P_pos = strchr (bits_pos, '*');
16212
16213 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16214
16215 u32 bits_len = P_pos - bits_pos;
16216
16217 P_pos++;
16218
16219 char *enc_md_pos = strchr (P_pos, '*');
16220
16221 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16222
16223 u32 P_len = enc_md_pos - P_pos;
16224
16225 enc_md_pos++;
16226
16227 char *id_len_pos = strchr (enc_md_pos, '*');
16228
16229 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16230
16231 u32 enc_md_len = id_len_pos - enc_md_pos;
16232
16233 id_len_pos++;
16234
16235 char *id_buf_pos = strchr (id_len_pos, '*');
16236
16237 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16238
16239 u32 id_len_len = id_buf_pos - id_len_pos;
16240
16241 id_buf_pos++;
16242
16243 char *u_len_pos = strchr (id_buf_pos, '*');
16244
16245 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16246
16247 u32 id_buf_len = u_len_pos - id_buf_pos;
16248
16249 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16250
16251 u_len_pos++;
16252
16253 char *u_buf_pos = strchr (u_len_pos, '*');
16254
16255 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16256
16257 u32 u_len_len = u_buf_pos - u_len_pos;
16258
16259 u_buf_pos++;
16260
16261 char *o_len_pos = strchr (u_buf_pos, '*');
16262
16263 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16264
16265 u32 u_buf_len = o_len_pos - u_buf_pos;
16266
16267 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16268
16269 o_len_pos++;
16270
16271 char *o_buf_pos = strchr (o_len_pos, '*');
16272
16273 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16274
16275 u32 o_len_len = o_buf_pos - o_len_pos;
16276
16277 o_buf_pos++;
16278
16279 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;
16280
16281 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16282
16283 // validate data
16284
16285 const int V = atoi (V_pos);
16286 const int R = atoi (R_pos);
16287 const int P = atoi (P_pos);
16288
16289 if (V != 1) return (PARSER_SALT_VALUE);
16290 if (R != 2) return (PARSER_SALT_VALUE);
16291
16292 const int enc_md = atoi (enc_md_pos);
16293
16294 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16295
16296 const int id_len = atoi (id_len_pos);
16297 const int u_len = atoi (u_len_pos);
16298 const int o_len = atoi (o_len_pos);
16299
16300 if (id_len != 16) return (PARSER_SALT_VALUE);
16301 if (u_len != 32) return (PARSER_SALT_VALUE);
16302 if (o_len != 32) return (PARSER_SALT_VALUE);
16303
16304 const int bits = atoi (bits_pos);
16305
16306 if (bits != 40) return (PARSER_SALT_VALUE);
16307
16308 // copy data to esalt
16309
16310 pdf->V = V;
16311 pdf->R = R;
16312 pdf->P = P;
16313
16314 pdf->enc_md = enc_md;
16315
16316 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16317 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16318 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16319 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16320 pdf->id_len = id_len;
16321
16322 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16323 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16324 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16325 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16326 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16327 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16328 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16329 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16330 pdf->u_len = u_len;
16331
16332 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16333 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16334 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16335 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16336 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16337 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16338 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16339 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16340 pdf->o_len = o_len;
16341
16342 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16343 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16344 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16345 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16346
16347 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16348 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16349 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16350 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16351 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16352 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16353 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16354 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16355
16356 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16357 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16358 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16359 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16360 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16361 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16362 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16363 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16364
16365 // we use ID for salt, maybe needs to change, we will see...
16366
16367 salt->salt_buf[0] = pdf->id_buf[0];
16368 salt->salt_buf[1] = pdf->id_buf[1];
16369 salt->salt_buf[2] = pdf->id_buf[2];
16370 salt->salt_buf[3] = pdf->id_buf[3];
16371 salt->salt_len = pdf->id_len;
16372
16373 digest[0] = pdf->u_buf[0];
16374 digest[1] = pdf->u_buf[1];
16375 digest[2] = pdf->u_buf[2];
16376 digest[3] = pdf->u_buf[3];
16377
16378 return (PARSER_OK);
16379 }
16380
16381 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16382 {
16383 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16384 }
16385
16386 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16387 {
16388 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16389
16390 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16391
16392 u32 *digest = (u32 *) hash_buf->digest;
16393
16394 salt_t *salt = hash_buf->salt;
16395
16396 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16397
16398 /**
16399 * parse line
16400 */
16401
16402 char *V_pos = input_buf + 5;
16403
16404 char *R_pos = strchr (V_pos, '*');
16405
16406 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16407
16408 u32 V_len = R_pos - V_pos;
16409
16410 R_pos++;
16411
16412 char *bits_pos = strchr (R_pos, '*');
16413
16414 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16415
16416 u32 R_len = bits_pos - R_pos;
16417
16418 bits_pos++;
16419
16420 char *P_pos = strchr (bits_pos, '*');
16421
16422 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16423
16424 u32 bits_len = P_pos - bits_pos;
16425
16426 P_pos++;
16427
16428 char *enc_md_pos = strchr (P_pos, '*');
16429
16430 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16431
16432 u32 P_len = enc_md_pos - P_pos;
16433
16434 enc_md_pos++;
16435
16436 char *id_len_pos = strchr (enc_md_pos, '*');
16437
16438 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16439
16440 u32 enc_md_len = id_len_pos - enc_md_pos;
16441
16442 id_len_pos++;
16443
16444 char *id_buf_pos = strchr (id_len_pos, '*');
16445
16446 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16447
16448 u32 id_len_len = id_buf_pos - id_len_pos;
16449
16450 id_buf_pos++;
16451
16452 char *u_len_pos = strchr (id_buf_pos, '*');
16453
16454 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16455
16456 u32 id_buf_len = u_len_pos - id_buf_pos;
16457
16458 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16459
16460 u_len_pos++;
16461
16462 char *u_buf_pos = strchr (u_len_pos, '*');
16463
16464 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16465
16466 u32 u_len_len = u_buf_pos - u_len_pos;
16467
16468 u_buf_pos++;
16469
16470 char *o_len_pos = strchr (u_buf_pos, '*');
16471
16472 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16473
16474 u32 u_buf_len = o_len_pos - u_buf_pos;
16475
16476 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16477
16478 o_len_pos++;
16479
16480 char *o_buf_pos = strchr (o_len_pos, '*');
16481
16482 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16483
16484 u32 o_len_len = o_buf_pos - o_len_pos;
16485
16486 o_buf_pos++;
16487
16488 char *rc4key_pos = strchr (o_buf_pos, ':');
16489
16490 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16491
16492 u32 o_buf_len = rc4key_pos - o_buf_pos;
16493
16494 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16495
16496 rc4key_pos++;
16497
16498 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;
16499
16500 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16501
16502 // validate data
16503
16504 const int V = atoi (V_pos);
16505 const int R = atoi (R_pos);
16506 const int P = atoi (P_pos);
16507
16508 if (V != 1) return (PARSER_SALT_VALUE);
16509 if (R != 2) return (PARSER_SALT_VALUE);
16510
16511 const int enc_md = atoi (enc_md_pos);
16512
16513 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16514
16515 const int id_len = atoi (id_len_pos);
16516 const int u_len = atoi (u_len_pos);
16517 const int o_len = atoi (o_len_pos);
16518
16519 if (id_len != 16) return (PARSER_SALT_VALUE);
16520 if (u_len != 32) return (PARSER_SALT_VALUE);
16521 if (o_len != 32) return (PARSER_SALT_VALUE);
16522
16523 const int bits = atoi (bits_pos);
16524
16525 if (bits != 40) return (PARSER_SALT_VALUE);
16526
16527 // copy data to esalt
16528
16529 pdf->V = V;
16530 pdf->R = R;
16531 pdf->P = P;
16532
16533 pdf->enc_md = enc_md;
16534
16535 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16536 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16537 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16538 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16539 pdf->id_len = id_len;
16540
16541 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16542 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16543 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16544 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16545 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16546 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16547 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16548 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16549 pdf->u_len = u_len;
16550
16551 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16552 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16553 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16554 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16555 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16556 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16557 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16558 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16559 pdf->o_len = o_len;
16560
16561 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16562 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16563 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16564 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16565
16566 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16567 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16568 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16569 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16570 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16571 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16572 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16573 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16574
16575 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16576 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16577 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16578 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16579 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16580 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16581 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16582 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16583
16584 pdf->rc4key[1] = 0;
16585 pdf->rc4key[0] = 0;
16586
16587 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16588 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16589 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16590 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16591 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16592 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16593 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16594 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16595 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16596 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16597
16598 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16599 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16600
16601 // we use ID for salt, maybe needs to change, we will see...
16602
16603 salt->salt_buf[0] = pdf->id_buf[0];
16604 salt->salt_buf[1] = pdf->id_buf[1];
16605 salt->salt_buf[2] = pdf->id_buf[2];
16606 salt->salt_buf[3] = pdf->id_buf[3];
16607 salt->salt_buf[4] = pdf->u_buf[0];
16608 salt->salt_buf[5] = pdf->u_buf[1];
16609 salt->salt_buf[6] = pdf->o_buf[0];
16610 salt->salt_buf[7] = pdf->o_buf[1];
16611 salt->salt_len = pdf->id_len + 16;
16612
16613 digest[0] = pdf->rc4key[0];
16614 digest[1] = pdf->rc4key[1];
16615 digest[2] = 0;
16616 digest[3] = 0;
16617
16618 return (PARSER_OK);
16619 }
16620
16621 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16622 {
16623 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16624
16625 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16626
16627 u32 *digest = (u32 *) hash_buf->digest;
16628
16629 salt_t *salt = hash_buf->salt;
16630
16631 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16632
16633 /**
16634 * parse line
16635 */
16636
16637 char *V_pos = input_buf + 5;
16638
16639 char *R_pos = strchr (V_pos, '*');
16640
16641 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16642
16643 u32 V_len = R_pos - V_pos;
16644
16645 R_pos++;
16646
16647 char *bits_pos = strchr (R_pos, '*');
16648
16649 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16650
16651 u32 R_len = bits_pos - R_pos;
16652
16653 bits_pos++;
16654
16655 char *P_pos = strchr (bits_pos, '*');
16656
16657 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16658
16659 u32 bits_len = P_pos - bits_pos;
16660
16661 P_pos++;
16662
16663 char *enc_md_pos = strchr (P_pos, '*');
16664
16665 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16666
16667 u32 P_len = enc_md_pos - P_pos;
16668
16669 enc_md_pos++;
16670
16671 char *id_len_pos = strchr (enc_md_pos, '*');
16672
16673 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16674
16675 u32 enc_md_len = id_len_pos - enc_md_pos;
16676
16677 id_len_pos++;
16678
16679 char *id_buf_pos = strchr (id_len_pos, '*');
16680
16681 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16682
16683 u32 id_len_len = id_buf_pos - id_len_pos;
16684
16685 id_buf_pos++;
16686
16687 char *u_len_pos = strchr (id_buf_pos, '*');
16688
16689 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16690
16691 u32 id_buf_len = u_len_pos - id_buf_pos;
16692
16693 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16694
16695 u_len_pos++;
16696
16697 char *u_buf_pos = strchr (u_len_pos, '*');
16698
16699 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16700
16701 u32 u_len_len = u_buf_pos - u_len_pos;
16702
16703 u_buf_pos++;
16704
16705 char *o_len_pos = strchr (u_buf_pos, '*');
16706
16707 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16708
16709 u32 u_buf_len = o_len_pos - u_buf_pos;
16710
16711 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16712
16713 o_len_pos++;
16714
16715 char *o_buf_pos = strchr (o_len_pos, '*');
16716
16717 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16718
16719 u32 o_len_len = o_buf_pos - o_len_pos;
16720
16721 o_buf_pos++;
16722
16723 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;
16724
16725 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16726
16727 // validate data
16728
16729 const int V = atoi (V_pos);
16730 const int R = atoi (R_pos);
16731 const int P = atoi (P_pos);
16732
16733 int vr_ok = 0;
16734
16735 if ((V == 2) && (R == 3)) vr_ok = 1;
16736 if ((V == 4) && (R == 4)) vr_ok = 1;
16737
16738 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16739
16740 const int id_len = atoi (id_len_pos);
16741 const int u_len = atoi (u_len_pos);
16742 const int o_len = atoi (o_len_pos);
16743
16744 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16745
16746 if (u_len != 32) return (PARSER_SALT_VALUE);
16747 if (o_len != 32) return (PARSER_SALT_VALUE);
16748
16749 const int bits = atoi (bits_pos);
16750
16751 if (bits != 128) return (PARSER_SALT_VALUE);
16752
16753 int enc_md = 1;
16754
16755 if (R >= 4)
16756 {
16757 enc_md = atoi (enc_md_pos);
16758 }
16759
16760 // copy data to esalt
16761
16762 pdf->V = V;
16763 pdf->R = R;
16764 pdf->P = P;
16765
16766 pdf->enc_md = enc_md;
16767
16768 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16769 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16770 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16771 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16772
16773 if (id_len == 32)
16774 {
16775 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16776 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16777 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16778 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16779 }
16780
16781 pdf->id_len = id_len;
16782
16783 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16784 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16785 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16786 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16787 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16788 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16789 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16790 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16791 pdf->u_len = u_len;
16792
16793 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16794 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16795 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16796 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16797 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16798 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16799 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16800 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16801 pdf->o_len = o_len;
16802
16803 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16804 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16805 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16806 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16807
16808 if (id_len == 32)
16809 {
16810 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16811 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16812 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16813 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16814 }
16815
16816 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16817 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16818 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16819 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16820 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16821 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16822 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16823 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16824
16825 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16826 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16827 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16828 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16829 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16830 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16831 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16832 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16833
16834 // precompute rc4 data for later use
16835
16836 uint padding[8] =
16837 {
16838 0x5e4ebf28,
16839 0x418a754e,
16840 0x564e0064,
16841 0x0801faff,
16842 0xb6002e2e,
16843 0x803e68d0,
16844 0xfea90c2f,
16845 0x7a695364
16846 };
16847
16848 // md5
16849
16850 uint salt_pc_block[32];
16851
16852 char *salt_pc_ptr = (char *) salt_pc_block;
16853
16854 memcpy (salt_pc_ptr, padding, 32);
16855 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16856
16857 uint salt_pc_digest[4];
16858
16859 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16860
16861 pdf->rc4data[0] = salt_pc_digest[0];
16862 pdf->rc4data[1] = salt_pc_digest[1];
16863
16864 // we use ID for salt, maybe needs to change, we will see...
16865
16866 salt->salt_buf[0] = pdf->id_buf[0];
16867 salt->salt_buf[1] = pdf->id_buf[1];
16868 salt->salt_buf[2] = pdf->id_buf[2];
16869 salt->salt_buf[3] = pdf->id_buf[3];
16870 salt->salt_buf[4] = pdf->u_buf[0];
16871 salt->salt_buf[5] = pdf->u_buf[1];
16872 salt->salt_buf[6] = pdf->o_buf[0];
16873 salt->salt_buf[7] = pdf->o_buf[1];
16874 salt->salt_len = pdf->id_len + 16;
16875
16876 salt->salt_iter = ROUNDS_PDF14;
16877
16878 digest[0] = pdf->u_buf[0];
16879 digest[1] = pdf->u_buf[1];
16880 digest[2] = 0;
16881 digest[3] = 0;
16882
16883 return (PARSER_OK);
16884 }
16885
16886 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16887 {
16888 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16889
16890 if (ret != PARSER_OK)
16891 {
16892 return ret;
16893 }
16894
16895 u32 *digest = (u32 *) hash_buf->digest;
16896
16897 salt_t *salt = hash_buf->salt;
16898
16899 digest[0] -= SHA256M_A;
16900 digest[1] -= SHA256M_B;
16901 digest[2] -= SHA256M_C;
16902 digest[3] -= SHA256M_D;
16903 digest[4] -= SHA256M_E;
16904 digest[5] -= SHA256M_F;
16905 digest[6] -= SHA256M_G;
16906 digest[7] -= SHA256M_H;
16907
16908 salt->salt_buf[2] = 0x80;
16909
16910 return (PARSER_OK);
16911 }
16912
16913 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16914 {
16915 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16916
16917 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16918
16919 u32 *digest = (u32 *) hash_buf->digest;
16920
16921 salt_t *salt = hash_buf->salt;
16922
16923 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16924
16925 /**
16926 * parse line
16927 */
16928
16929 char *V_pos = input_buf + 5;
16930
16931 char *R_pos = strchr (V_pos, '*');
16932
16933 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16934
16935 u32 V_len = R_pos - V_pos;
16936
16937 R_pos++;
16938
16939 char *bits_pos = strchr (R_pos, '*');
16940
16941 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16942
16943 u32 R_len = bits_pos - R_pos;
16944
16945 bits_pos++;
16946
16947 char *P_pos = strchr (bits_pos, '*');
16948
16949 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16950
16951 u32 bits_len = P_pos - bits_pos;
16952
16953 P_pos++;
16954
16955 char *enc_md_pos = strchr (P_pos, '*');
16956
16957 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16958
16959 u32 P_len = enc_md_pos - P_pos;
16960
16961 enc_md_pos++;
16962
16963 char *id_len_pos = strchr (enc_md_pos, '*');
16964
16965 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16966
16967 u32 enc_md_len = id_len_pos - enc_md_pos;
16968
16969 id_len_pos++;
16970
16971 char *id_buf_pos = strchr (id_len_pos, '*');
16972
16973 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16974
16975 u32 id_len_len = id_buf_pos - id_len_pos;
16976
16977 id_buf_pos++;
16978
16979 char *u_len_pos = strchr (id_buf_pos, '*');
16980
16981 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16982
16983 u32 id_buf_len = u_len_pos - id_buf_pos;
16984
16985 u_len_pos++;
16986
16987 char *u_buf_pos = strchr (u_len_pos, '*');
16988
16989 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16990
16991 u32 u_len_len = u_buf_pos - u_len_pos;
16992
16993 u_buf_pos++;
16994
16995 char *o_len_pos = strchr (u_buf_pos, '*');
16996
16997 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16998
16999 u32 u_buf_len = o_len_pos - u_buf_pos;
17000
17001 o_len_pos++;
17002
17003 char *o_buf_pos = strchr (o_len_pos, '*');
17004
17005 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17006
17007 u32 o_len_len = o_buf_pos - o_len_pos;
17008
17009 o_buf_pos++;
17010
17011 char *last = strchr (o_buf_pos, '*');
17012
17013 if (last == NULL) last = input_buf + input_len;
17014
17015 u32 o_buf_len = last - o_buf_pos;
17016
17017 // validate data
17018
17019 const int V = atoi (V_pos);
17020 const int R = atoi (R_pos);
17021
17022 int vr_ok = 0;
17023
17024 if ((V == 5) && (R == 5)) vr_ok = 1;
17025 if ((V == 5) && (R == 6)) vr_ok = 1;
17026
17027 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17028
17029 const int bits = atoi (bits_pos);
17030
17031 if (bits != 256) return (PARSER_SALT_VALUE);
17032
17033 int enc_md = atoi (enc_md_pos);
17034
17035 if (enc_md != 1) return (PARSER_SALT_VALUE);
17036
17037 const uint id_len = atoi (id_len_pos);
17038 const uint u_len = atoi (u_len_pos);
17039 const uint o_len = atoi (o_len_pos);
17040
17041 if (V_len > 6) return (PARSER_SALT_LENGTH);
17042 if (R_len > 6) return (PARSER_SALT_LENGTH);
17043 if (P_len > 6) return (PARSER_SALT_LENGTH);
17044 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17045 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17046 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17047 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17048 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17049
17050 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17051 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17052 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17053
17054 // copy data to esalt
17055
17056 if (u_len < 40) return (PARSER_SALT_VALUE);
17057
17058 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17059 {
17060 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17061 }
17062
17063 salt->salt_buf[0] = pdf->u_buf[8];
17064 salt->salt_buf[1] = pdf->u_buf[9];
17065
17066 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17067 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17068
17069 salt->salt_len = 8;
17070 salt->salt_iter = ROUNDS_PDF17L8;
17071
17072 digest[0] = pdf->u_buf[0];
17073 digest[1] = pdf->u_buf[1];
17074 digest[2] = pdf->u_buf[2];
17075 digest[3] = pdf->u_buf[3];
17076 digest[4] = pdf->u_buf[4];
17077 digest[5] = pdf->u_buf[5];
17078 digest[6] = pdf->u_buf[6];
17079 digest[7] = pdf->u_buf[7];
17080
17081 return (PARSER_OK);
17082 }
17083
17084 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17085 {
17086 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17087
17088 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17089
17090 u32 *digest = (u32 *) hash_buf->digest;
17091
17092 salt_t *salt = hash_buf->salt;
17093
17094 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17095
17096 /**
17097 * parse line
17098 */
17099
17100 // iterations
17101
17102 char *iter_pos = input_buf + 7;
17103
17104 u32 iter = atoi (iter_pos);
17105
17106 if (iter < 1) return (PARSER_SALT_ITERATION);
17107 if (iter > 999999) return (PARSER_SALT_ITERATION);
17108
17109 // first is *raw* salt
17110
17111 char *salt_pos = strchr (iter_pos, ':');
17112
17113 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17114
17115 salt_pos++;
17116
17117 char *hash_pos = strchr (salt_pos, ':');
17118
17119 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17120
17121 u32 salt_len = hash_pos - salt_pos;
17122
17123 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17124
17125 hash_pos++;
17126
17127 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17128
17129 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17130
17131 // decode salt
17132
17133 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17134
17135 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17136
17137 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17138
17139 salt_buf_ptr[salt_len + 3] = 0x01;
17140 salt_buf_ptr[salt_len + 4] = 0x80;
17141
17142 salt->salt_len = salt_len;
17143 salt->salt_iter = iter - 1;
17144
17145 // decode hash
17146
17147 u8 tmp_buf[100];
17148
17149 memset (tmp_buf, 0, sizeof (tmp_buf));
17150
17151 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17152
17153 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17154
17155 memcpy (digest, tmp_buf, 16);
17156
17157 digest[0] = byte_swap_32 (digest[0]);
17158 digest[1] = byte_swap_32 (digest[1]);
17159 digest[2] = byte_swap_32 (digest[2]);
17160 digest[3] = byte_swap_32 (digest[3]);
17161
17162 // add some stuff to normal salt to make sorted happy
17163
17164 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17165 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17166 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17167 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17168 salt->salt_buf[4] = salt->salt_iter;
17169
17170 return (PARSER_OK);
17171 }
17172
17173 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17174 {
17175 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17176
17177 u32 *digest = (u32 *) hash_buf->digest;
17178
17179 salt_t *salt = hash_buf->salt;
17180
17181 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17182 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17183 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17184 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17185
17186 digest[0] = byte_swap_32 (digest[0]);
17187 digest[1] = byte_swap_32 (digest[1]);
17188 digest[2] = byte_swap_32 (digest[2]);
17189 digest[3] = byte_swap_32 (digest[3]);
17190
17191 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17192
17193 uint salt_len = input_len - 32 - 1;
17194
17195 char *salt_buf = input_buf + 32 + 1;
17196
17197 char *salt_buf_ptr = (char *) salt->salt_buf;
17198
17199 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17200
17201 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17202
17203 salt->salt_len = salt_len;
17204
17205 return (PARSER_OK);
17206 }
17207
17208 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17209 {
17210 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17211
17212 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17213
17214 u32 *digest = (u32 *) hash_buf->digest;
17215
17216 salt_t *salt = hash_buf->salt;
17217
17218 char *user_pos = input_buf + 10;
17219
17220 char *salt_pos = strchr (user_pos, '*');
17221
17222 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17223
17224 salt_pos++;
17225
17226 char *hash_pos = strchr (salt_pos, '*');
17227
17228 hash_pos++;
17229
17230 uint hash_len = input_len - (hash_pos - input_buf);
17231
17232 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17233
17234 uint user_len = salt_pos - user_pos - 1;
17235
17236 uint salt_len = hash_pos - salt_pos - 1;
17237
17238 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17239
17240 /*
17241 * store digest
17242 */
17243
17244 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17245 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17246 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17247 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17248
17249 digest[0] = byte_swap_32 (digest[0]);
17250 digest[1] = byte_swap_32 (digest[1]);
17251 digest[2] = byte_swap_32 (digest[2]);
17252 digest[3] = byte_swap_32 (digest[3]);
17253
17254 digest[0] -= MD5M_A;
17255 digest[1] -= MD5M_B;
17256 digest[2] -= MD5M_C;
17257 digest[3] -= MD5M_D;
17258
17259 /*
17260 * store salt
17261 */
17262
17263 char *salt_buf_ptr = (char *) salt->salt_buf;
17264
17265 // first 4 bytes are the "challenge"
17266
17267 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17268 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17269 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17270 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17271
17272 // append the user name
17273
17274 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17275
17276 salt->salt_len = 4 + user_len;
17277
17278 return (PARSER_OK);
17279 }
17280
17281 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17282 {
17283 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17284
17285 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17286
17287 u32 *digest = (u32 *) hash_buf->digest;
17288
17289 salt_t *salt = hash_buf->salt;
17290
17291 char *salt_pos = input_buf + 9;
17292
17293 char *hash_pos = strchr (salt_pos, '*');
17294
17295 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17296
17297 hash_pos++;
17298
17299 uint hash_len = input_len - (hash_pos - input_buf);
17300
17301 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17302
17303 uint salt_len = hash_pos - salt_pos - 1;
17304
17305 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17306
17307 /*
17308 * store digest
17309 */
17310
17311 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17312 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17313 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17314 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17315 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17316
17317 /*
17318 * store salt
17319 */
17320
17321 char *salt_buf_ptr = (char *) salt->salt_buf;
17322
17323 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17324
17325 salt->salt_len = salt_len;
17326
17327 return (PARSER_OK);
17328 }
17329
17330 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17331 {
17332 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17333
17334 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17335
17336 u32 *digest = (u32 *) hash_buf->digest;
17337
17338 salt_t *salt = hash_buf->salt;
17339
17340 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17341
17342 /**
17343 * parse line
17344 */
17345
17346 char *cry_master_len_pos = input_buf + 9;
17347
17348 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17349
17350 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17351
17352 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17353
17354 cry_master_buf_pos++;
17355
17356 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17357
17358 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17359
17360 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17361
17362 cry_salt_len_pos++;
17363
17364 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17365
17366 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17367
17368 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17369
17370 cry_salt_buf_pos++;
17371
17372 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17373
17374 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17375
17376 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17377
17378 cry_rounds_pos++;
17379
17380 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17381
17382 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17383
17384 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17385
17386 ckey_len_pos++;
17387
17388 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17389
17390 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17391
17392 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17393
17394 ckey_buf_pos++;
17395
17396 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17397
17398 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17399
17400 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17401
17402 public_key_len_pos++;
17403
17404 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17405
17406 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17407
17408 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17409
17410 public_key_buf_pos++;
17411
17412 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;
17413
17414 const uint cry_master_len = atoi (cry_master_len_pos);
17415 const uint cry_salt_len = atoi (cry_salt_len_pos);
17416 const uint ckey_len = atoi (ckey_len_pos);
17417 const uint public_key_len = atoi (public_key_len_pos);
17418
17419 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17420 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17421 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17422 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17423
17424 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17425 {
17426 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17427
17428 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17429 }
17430
17431 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17432 {
17433 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17434
17435 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17436 }
17437
17438 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17439 {
17440 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17441
17442 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17443 }
17444
17445 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17446 bitcoin_wallet->ckey_len = ckey_len / 2;
17447 bitcoin_wallet->public_key_len = public_key_len / 2;
17448
17449 /*
17450 * store digest (should be unique enought, hopefully)
17451 */
17452
17453 digest[0] = bitcoin_wallet->cry_master_buf[0];
17454 digest[1] = bitcoin_wallet->cry_master_buf[1];
17455 digest[2] = bitcoin_wallet->cry_master_buf[2];
17456 digest[3] = bitcoin_wallet->cry_master_buf[3];
17457
17458 /*
17459 * store salt
17460 */
17461
17462 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17463
17464 const uint cry_rounds = atoi (cry_rounds_pos);
17465
17466 salt->salt_iter = cry_rounds - 1;
17467
17468 char *salt_buf_ptr = (char *) salt->salt_buf;
17469
17470 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17471
17472 salt->salt_len = salt_len;
17473
17474 return (PARSER_OK);
17475 }
17476
17477 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17478 {
17479 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17480
17481 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17482
17483 u32 *digest = (u32 *) hash_buf->digest;
17484
17485 salt_t *salt = hash_buf->salt;
17486
17487 sip_t *sip = (sip_t *) hash_buf->esalt;
17488
17489 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17490
17491 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17492
17493 memcpy (temp_input_buf, input_buf, input_len);
17494
17495 // URI_server:
17496
17497 char *URI_server_pos = temp_input_buf + 6;
17498
17499 char *URI_client_pos = strchr (URI_server_pos, '*');
17500
17501 if (URI_client_pos == NULL)
17502 {
17503 myfree (temp_input_buf);
17504
17505 return (PARSER_SEPARATOR_UNMATCHED);
17506 }
17507
17508 URI_client_pos[0] = 0;
17509 URI_client_pos++;
17510
17511 uint URI_server_len = strlen (URI_server_pos);
17512
17513 if (URI_server_len > 512)
17514 {
17515 myfree (temp_input_buf);
17516
17517 return (PARSER_SALT_LENGTH);
17518 }
17519
17520 // URI_client:
17521
17522 char *user_pos = strchr (URI_client_pos, '*');
17523
17524 if (user_pos == NULL)
17525 {
17526 myfree (temp_input_buf);
17527
17528 return (PARSER_SEPARATOR_UNMATCHED);
17529 }
17530
17531 user_pos[0] = 0;
17532 user_pos++;
17533
17534 uint URI_client_len = strlen (URI_client_pos);
17535
17536 if (URI_client_len > 512)
17537 {
17538 myfree (temp_input_buf);
17539
17540 return (PARSER_SALT_LENGTH);
17541 }
17542
17543 // user:
17544
17545 char *realm_pos = strchr (user_pos, '*');
17546
17547 if (realm_pos == NULL)
17548 {
17549 myfree (temp_input_buf);
17550
17551 return (PARSER_SEPARATOR_UNMATCHED);
17552 }
17553
17554 realm_pos[0] = 0;
17555 realm_pos++;
17556
17557 uint user_len = strlen (user_pos);
17558
17559 if (user_len > 116)
17560 {
17561 myfree (temp_input_buf);
17562
17563 return (PARSER_SALT_LENGTH);
17564 }
17565
17566 // realm:
17567
17568 char *method_pos = strchr (realm_pos, '*');
17569
17570 if (method_pos == NULL)
17571 {
17572 myfree (temp_input_buf);
17573
17574 return (PARSER_SEPARATOR_UNMATCHED);
17575 }
17576
17577 method_pos[0] = 0;
17578 method_pos++;
17579
17580 uint realm_len = strlen (realm_pos);
17581
17582 if (realm_len > 116)
17583 {
17584 myfree (temp_input_buf);
17585
17586 return (PARSER_SALT_LENGTH);
17587 }
17588
17589 // method:
17590
17591 char *URI_prefix_pos = strchr (method_pos, '*');
17592
17593 if (URI_prefix_pos == NULL)
17594 {
17595 myfree (temp_input_buf);
17596
17597 return (PARSER_SEPARATOR_UNMATCHED);
17598 }
17599
17600 URI_prefix_pos[0] = 0;
17601 URI_prefix_pos++;
17602
17603 uint method_len = strlen (method_pos);
17604
17605 if (method_len > 246)
17606 {
17607 myfree (temp_input_buf);
17608
17609 return (PARSER_SALT_LENGTH);
17610 }
17611
17612 // URI_prefix:
17613
17614 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17615
17616 if (URI_resource_pos == NULL)
17617 {
17618 myfree (temp_input_buf);
17619
17620 return (PARSER_SEPARATOR_UNMATCHED);
17621 }
17622
17623 URI_resource_pos[0] = 0;
17624 URI_resource_pos++;
17625
17626 uint URI_prefix_len = strlen (URI_prefix_pos);
17627
17628 if (URI_prefix_len > 245)
17629 {
17630 myfree (temp_input_buf);
17631
17632 return (PARSER_SALT_LENGTH);
17633 }
17634
17635 // URI_resource:
17636
17637 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17638
17639 if (URI_suffix_pos == NULL)
17640 {
17641 myfree (temp_input_buf);
17642
17643 return (PARSER_SEPARATOR_UNMATCHED);
17644 }
17645
17646 URI_suffix_pos[0] = 0;
17647 URI_suffix_pos++;
17648
17649 uint URI_resource_len = strlen (URI_resource_pos);
17650
17651 if (URI_resource_len < 1 || URI_resource_len > 246)
17652 {
17653 myfree (temp_input_buf);
17654
17655 return (PARSER_SALT_LENGTH);
17656 }
17657
17658 // URI_suffix:
17659
17660 char *nonce_pos = strchr (URI_suffix_pos, '*');
17661
17662 if (nonce_pos == NULL)
17663 {
17664 myfree (temp_input_buf);
17665
17666 return (PARSER_SEPARATOR_UNMATCHED);
17667 }
17668
17669 nonce_pos[0] = 0;
17670 nonce_pos++;
17671
17672 uint URI_suffix_len = strlen (URI_suffix_pos);
17673
17674 if (URI_suffix_len > 245)
17675 {
17676 myfree (temp_input_buf);
17677
17678 return (PARSER_SALT_LENGTH);
17679 }
17680
17681 // nonce:
17682
17683 char *nonce_client_pos = strchr (nonce_pos, '*');
17684
17685 if (nonce_client_pos == NULL)
17686 {
17687 myfree (temp_input_buf);
17688
17689 return (PARSER_SEPARATOR_UNMATCHED);
17690 }
17691
17692 nonce_client_pos[0] = 0;
17693 nonce_client_pos++;
17694
17695 uint nonce_len = strlen (nonce_pos);
17696
17697 if (nonce_len < 1 || nonce_len > 50)
17698 {
17699 myfree (temp_input_buf);
17700
17701 return (PARSER_SALT_LENGTH);
17702 }
17703
17704 // nonce_client:
17705
17706 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17707
17708 if (nonce_count_pos == NULL)
17709 {
17710 myfree (temp_input_buf);
17711
17712 return (PARSER_SEPARATOR_UNMATCHED);
17713 }
17714
17715 nonce_count_pos[0] = 0;
17716 nonce_count_pos++;
17717
17718 uint nonce_client_len = strlen (nonce_client_pos);
17719
17720 if (nonce_client_len > 50)
17721 {
17722 myfree (temp_input_buf);
17723
17724 return (PARSER_SALT_LENGTH);
17725 }
17726
17727 // nonce_count:
17728
17729 char *qop_pos = strchr (nonce_count_pos, '*');
17730
17731 if (qop_pos == NULL)
17732 {
17733 myfree (temp_input_buf);
17734
17735 return (PARSER_SEPARATOR_UNMATCHED);
17736 }
17737
17738 qop_pos[0] = 0;
17739 qop_pos++;
17740
17741 uint nonce_count_len = strlen (nonce_count_pos);
17742
17743 if (nonce_count_len > 50)
17744 {
17745 myfree (temp_input_buf);
17746
17747 return (PARSER_SALT_LENGTH);
17748 }
17749
17750 // qop:
17751
17752 char *directive_pos = strchr (qop_pos, '*');
17753
17754 if (directive_pos == NULL)
17755 {
17756 myfree (temp_input_buf);
17757
17758 return (PARSER_SEPARATOR_UNMATCHED);
17759 }
17760
17761 directive_pos[0] = 0;
17762 directive_pos++;
17763
17764 uint qop_len = strlen (qop_pos);
17765
17766 if (qop_len > 50)
17767 {
17768 myfree (temp_input_buf);
17769
17770 return (PARSER_SALT_LENGTH);
17771 }
17772
17773 // directive
17774
17775 char *digest_pos = strchr (directive_pos, '*');
17776
17777 if (digest_pos == NULL)
17778 {
17779 myfree (temp_input_buf);
17780
17781 return (PARSER_SEPARATOR_UNMATCHED);
17782 }
17783
17784 digest_pos[0] = 0;
17785 digest_pos++;
17786
17787 uint directive_len = strlen (directive_pos);
17788
17789 if (directive_len != 3)
17790 {
17791 myfree (temp_input_buf);
17792
17793 return (PARSER_SALT_LENGTH);
17794 }
17795
17796 if (memcmp (directive_pos, "MD5", 3))
17797 {
17798 log_info ("ERROR: only the MD5 directive is currently supported\n");
17799
17800 myfree (temp_input_buf);
17801
17802 return (PARSER_SIP_AUTH_DIRECTIVE);
17803 }
17804
17805 /*
17806 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17807 */
17808
17809 uint md5_len = 0;
17810
17811 uint md5_max_len = 4 * 64;
17812
17813 uint md5_remaining_len = md5_max_len;
17814
17815 uint tmp_md5_buf[64] = { 0 };
17816
17817 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17818
17819 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17820
17821 md5_len += method_len + 1;
17822 tmp_md5_ptr += method_len + 1;
17823
17824 if (URI_prefix_len > 0)
17825 {
17826 md5_remaining_len = md5_max_len - md5_len;
17827
17828 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17829
17830 md5_len += URI_prefix_len + 1;
17831 tmp_md5_ptr += URI_prefix_len + 1;
17832 }
17833
17834 md5_remaining_len = md5_max_len - md5_len;
17835
17836 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17837
17838 md5_len += URI_resource_len;
17839 tmp_md5_ptr += URI_resource_len;
17840
17841 if (URI_suffix_len > 0)
17842 {
17843 md5_remaining_len = md5_max_len - md5_len;
17844
17845 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17846
17847 md5_len += 1 + URI_suffix_len;
17848 }
17849
17850 uint tmp_digest[4] = { 0 };
17851
17852 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17853
17854 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17855 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17856 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17857 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17858
17859 /*
17860 * esalt
17861 */
17862
17863 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17864
17865 uint esalt_len = 0;
17866
17867 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17868
17869 // there are 2 possibilities for the esalt:
17870
17871 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17872 {
17873 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17874
17875 if (esalt_len > max_esalt_len)
17876 {
17877 myfree (temp_input_buf);
17878
17879 return (PARSER_SALT_LENGTH);
17880 }
17881
17882 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17883 nonce_pos,
17884 nonce_count_pos,
17885 nonce_client_pos,
17886 qop_pos,
17887 tmp_digest[0],
17888 tmp_digest[1],
17889 tmp_digest[2],
17890 tmp_digest[3]);
17891 }
17892 else
17893 {
17894 esalt_len = 1 + nonce_len + 1 + 32;
17895
17896 if (esalt_len > max_esalt_len)
17897 {
17898 myfree (temp_input_buf);
17899
17900 return (PARSER_SALT_LENGTH);
17901 }
17902
17903 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17904 nonce_pos,
17905 tmp_digest[0],
17906 tmp_digest[1],
17907 tmp_digest[2],
17908 tmp_digest[3]);
17909 }
17910
17911 // add 0x80 to esalt
17912
17913 esalt_buf_ptr[esalt_len] = 0x80;
17914
17915 sip->esalt_len = esalt_len;
17916
17917 /*
17918 * actual salt
17919 */
17920
17921 char *sip_salt_ptr = (char *) sip->salt_buf;
17922
17923 uint salt_len = user_len + 1 + realm_len + 1;
17924
17925 uint max_salt_len = 119;
17926
17927 if (salt_len > max_salt_len)
17928 {
17929 myfree (temp_input_buf);
17930
17931 return (PARSER_SALT_LENGTH);
17932 }
17933
17934 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17935
17936 sip->salt_len = salt_len;
17937
17938 /*
17939 * fake salt (for sorting)
17940 */
17941
17942 char *salt_buf_ptr = (char *) salt->salt_buf;
17943
17944 max_salt_len = 55;
17945
17946 uint fake_salt_len = salt_len;
17947
17948 if (fake_salt_len > max_salt_len)
17949 {
17950 fake_salt_len = max_salt_len;
17951 }
17952
17953 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17954
17955 salt->salt_len = fake_salt_len;
17956
17957 /*
17958 * digest
17959 */
17960
17961 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
17962 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
17963 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
17964 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
17965
17966 digest[0] = byte_swap_32 (digest[0]);
17967 digest[1] = byte_swap_32 (digest[1]);
17968 digest[2] = byte_swap_32 (digest[2]);
17969 digest[3] = byte_swap_32 (digest[3]);
17970
17971 myfree (temp_input_buf);
17972
17973 return (PARSER_OK);
17974 }
17975
17976 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17977 {
17978 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17979
17980 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17981
17982 u32 *digest = (u32 *) hash_buf->digest;
17983
17984 salt_t *salt = hash_buf->salt;
17985
17986 // digest
17987
17988 char *digest_pos = input_buf;
17989
17990 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
17991 digest[1] = 0;
17992 digest[2] = 0;
17993 digest[3] = 0;
17994
17995 // salt
17996
17997 char *salt_buf = input_buf + 8 + 1;
17998
17999 uint salt_len = 8;
18000
18001 char *salt_buf_ptr = (char *) salt->salt_buf;
18002
18003 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18004
18005 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18006
18007 salt->salt_len = salt_len;
18008
18009 return (PARSER_OK);
18010 }
18011
18012 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18013 {
18014 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18015
18016 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18017
18018 u32 *digest = (u32 *) hash_buf->digest;
18019
18020 salt_t *salt = hash_buf->salt;
18021
18022 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18023
18024 /**
18025 * parse line
18026 */
18027
18028 char *p_buf_pos = input_buf + 4;
18029
18030 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18031
18032 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18033
18034 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18035
18036 NumCyclesPower_pos++;
18037
18038 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18039
18040 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18041
18042 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18043
18044 salt_len_pos++;
18045
18046 char *salt_buf_pos = strchr (salt_len_pos, '$');
18047
18048 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18049
18050 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18051
18052 salt_buf_pos++;
18053
18054 char *iv_len_pos = strchr (salt_buf_pos, '$');
18055
18056 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18057
18058 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18059
18060 iv_len_pos++;
18061
18062 char *iv_buf_pos = strchr (iv_len_pos, '$');
18063
18064 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18065
18066 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18067
18068 iv_buf_pos++;
18069
18070 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18071
18072 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18073
18074 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18075
18076 crc_buf_pos++;
18077
18078 char *data_len_pos = strchr (crc_buf_pos, '$');
18079
18080 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18081
18082 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18083
18084 data_len_pos++;
18085
18086 char *unpack_size_pos = strchr (data_len_pos, '$');
18087
18088 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18089
18090 u32 data_len_len = unpack_size_pos - data_len_pos;
18091
18092 unpack_size_pos++;
18093
18094 char *data_buf_pos = strchr (unpack_size_pos, '$');
18095
18096 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18097
18098 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18099
18100 data_buf_pos++;
18101
18102 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;
18103
18104 const uint iter = atoi (NumCyclesPower_pos);
18105 const uint crc = atoi (crc_buf_pos);
18106 const uint p_buf = atoi (p_buf_pos);
18107 const uint salt_len = atoi (salt_len_pos);
18108 const uint iv_len = atoi (iv_len_pos);
18109 const uint unpack_size = atoi (unpack_size_pos);
18110 const uint data_len = atoi (data_len_pos);
18111
18112 /**
18113 * verify some data
18114 */
18115
18116 if (p_buf != 0) return (PARSER_SALT_VALUE);
18117 if (salt_len != 0) return (PARSER_SALT_VALUE);
18118
18119 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18120
18121 if (data_len > 384) return (PARSER_SALT_VALUE);
18122
18123 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18124
18125 /**
18126 * store data
18127 */
18128
18129 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18130 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18131 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18132 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18133
18134 seven_zip->iv_len = iv_len;
18135
18136 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18137
18138 seven_zip->salt_len = 0;
18139
18140 seven_zip->crc = crc;
18141
18142 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18143 {
18144 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18145
18146 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18147 }
18148
18149 seven_zip->data_len = data_len;
18150
18151 seven_zip->unpack_size = unpack_size;
18152
18153 // real salt
18154
18155 salt->salt_buf[0] = seven_zip->data_buf[0];
18156 salt->salt_buf[1] = seven_zip->data_buf[1];
18157 salt->salt_buf[2] = seven_zip->data_buf[2];
18158 salt->salt_buf[3] = seven_zip->data_buf[3];
18159
18160 salt->salt_len = 16;
18161
18162 salt->salt_sign[0] = iter;
18163
18164 salt->salt_iter = 1 << iter;
18165
18166 /**
18167 * digest
18168 */
18169
18170 digest[0] = crc;
18171 digest[1] = 0;
18172 digest[2] = 0;
18173 digest[3] = 0;
18174
18175 return (PARSER_OK);
18176 }
18177
18178 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18179 {
18180 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18181
18182 u32 *digest = (u32 *) hash_buf->digest;
18183
18184 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18185 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18186 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18187 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18188 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18189 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18190 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18191 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18192
18193 digest[0] = byte_swap_32 (digest[0]);
18194 digest[1] = byte_swap_32 (digest[1]);
18195 digest[2] = byte_swap_32 (digest[2]);
18196 digest[3] = byte_swap_32 (digest[3]);
18197 digest[4] = byte_swap_32 (digest[4]);
18198 digest[5] = byte_swap_32 (digest[5]);
18199 digest[6] = byte_swap_32 (digest[6]);
18200 digest[7] = byte_swap_32 (digest[7]);
18201
18202 return (PARSER_OK);
18203 }
18204
18205 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18206 {
18207 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18208
18209 u32 *digest = (u32 *) hash_buf->digest;
18210
18211 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18212 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18213 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18214 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18215 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18216 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18217 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18218 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18219 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18220 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18221 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18222 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18223 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18224 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18225 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18226 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18227
18228 digest[ 0] = byte_swap_32 (digest[ 0]);
18229 digest[ 1] = byte_swap_32 (digest[ 1]);
18230 digest[ 2] = byte_swap_32 (digest[ 2]);
18231 digest[ 3] = byte_swap_32 (digest[ 3]);
18232 digest[ 4] = byte_swap_32 (digest[ 4]);
18233 digest[ 5] = byte_swap_32 (digest[ 5]);
18234 digest[ 6] = byte_swap_32 (digest[ 6]);
18235 digest[ 7] = byte_swap_32 (digest[ 7]);
18236 digest[ 8] = byte_swap_32 (digest[ 8]);
18237 digest[ 9] = byte_swap_32 (digest[ 9]);
18238 digest[10] = byte_swap_32 (digest[10]);
18239 digest[11] = byte_swap_32 (digest[11]);
18240 digest[12] = byte_swap_32 (digest[12]);
18241 digest[13] = byte_swap_32 (digest[13]);
18242 digest[14] = byte_swap_32 (digest[14]);
18243 digest[15] = byte_swap_32 (digest[15]);
18244
18245 return (PARSER_OK);
18246 }
18247
18248 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18249 {
18250 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18251
18252 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18253
18254 u32 *digest = (u32 *) hash_buf->digest;
18255
18256 salt_t *salt = hash_buf->salt;
18257
18258 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18259
18260 /**
18261 * parse line
18262 */
18263
18264 // iterations
18265
18266 char *iter_pos = input_buf + 4;
18267
18268 u32 iter = atoi (iter_pos);
18269
18270 if (iter < 1) return (PARSER_SALT_ITERATION);
18271 if (iter > 999999) return (PARSER_SALT_ITERATION);
18272
18273 // first is *raw* salt
18274
18275 char *salt_pos = strchr (iter_pos, ':');
18276
18277 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18278
18279 salt_pos++;
18280
18281 char *hash_pos = strchr (salt_pos, ':');
18282
18283 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18284
18285 u32 salt_len = hash_pos - salt_pos;
18286
18287 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18288
18289 hash_pos++;
18290
18291 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18292
18293 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18294
18295 // decode salt
18296
18297 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18298
18299 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18300
18301 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18302
18303 salt_buf_ptr[salt_len + 3] = 0x01;
18304 salt_buf_ptr[salt_len + 4] = 0x80;
18305
18306 salt->salt_len = salt_len;
18307 salt->salt_iter = iter - 1;
18308
18309 // decode hash
18310
18311 u8 tmp_buf[100];
18312
18313 memset (tmp_buf, 0, sizeof (tmp_buf));
18314
18315 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18316
18317 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18318
18319 memcpy (digest, tmp_buf, 16);
18320
18321 // add some stuff to normal salt to make sorted happy
18322
18323 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18324 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18325 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18326 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18327 salt->salt_buf[4] = salt->salt_iter;
18328
18329 return (PARSER_OK);
18330 }
18331
18332 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18333 {
18334 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18335
18336 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18337
18338 u32 *digest = (u32 *) hash_buf->digest;
18339
18340 salt_t *salt = hash_buf->salt;
18341
18342 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18343
18344 /**
18345 * parse line
18346 */
18347
18348 // iterations
18349
18350 char *iter_pos = input_buf + 5;
18351
18352 u32 iter = atoi (iter_pos);
18353
18354 if (iter < 1) return (PARSER_SALT_ITERATION);
18355 if (iter > 999999) return (PARSER_SALT_ITERATION);
18356
18357 // first is *raw* salt
18358
18359 char *salt_pos = strchr (iter_pos, ':');
18360
18361 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18362
18363 salt_pos++;
18364
18365 char *hash_pos = strchr (salt_pos, ':');
18366
18367 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18368
18369 u32 salt_len = hash_pos - salt_pos;
18370
18371 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18372
18373 hash_pos++;
18374
18375 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18376
18377 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18378
18379 // decode salt
18380
18381 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18382
18383 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18384
18385 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18386
18387 salt_buf_ptr[salt_len + 3] = 0x01;
18388 salt_buf_ptr[salt_len + 4] = 0x80;
18389
18390 salt->salt_len = salt_len;
18391 salt->salt_iter = iter - 1;
18392
18393 // decode hash
18394
18395 u8 tmp_buf[100];
18396
18397 memset (tmp_buf, 0, sizeof (tmp_buf));
18398
18399 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18400
18401 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18402
18403 memcpy (digest, tmp_buf, 16);
18404
18405 digest[0] = byte_swap_32 (digest[0]);
18406 digest[1] = byte_swap_32 (digest[1]);
18407 digest[2] = byte_swap_32 (digest[2]);
18408 digest[3] = byte_swap_32 (digest[3]);
18409
18410 // add some stuff to normal salt to make sorted happy
18411
18412 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18413 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18414 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18415 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18416 salt->salt_buf[4] = salt->salt_iter;
18417
18418 return (PARSER_OK);
18419 }
18420
18421 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18422 {
18423 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18424
18425 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18426
18427 u64 *digest = (u64 *) hash_buf->digest;
18428
18429 salt_t *salt = hash_buf->salt;
18430
18431 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18432
18433 /**
18434 * parse line
18435 */
18436
18437 // iterations
18438
18439 char *iter_pos = input_buf + 7;
18440
18441 u32 iter = atoi (iter_pos);
18442
18443 if (iter < 1) return (PARSER_SALT_ITERATION);
18444 if (iter > 999999) return (PARSER_SALT_ITERATION);
18445
18446 // first is *raw* salt
18447
18448 char *salt_pos = strchr (iter_pos, ':');
18449
18450 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18451
18452 salt_pos++;
18453
18454 char *hash_pos = strchr (salt_pos, ':');
18455
18456 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18457
18458 u32 salt_len = hash_pos - salt_pos;
18459
18460 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18461
18462 hash_pos++;
18463
18464 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18465
18466 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18467
18468 // decode salt
18469
18470 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18471
18472 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18473
18474 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18475
18476 salt_buf_ptr[salt_len + 3] = 0x01;
18477 salt_buf_ptr[salt_len + 4] = 0x80;
18478
18479 salt->salt_len = salt_len;
18480 salt->salt_iter = iter - 1;
18481
18482 // decode hash
18483
18484 u8 tmp_buf[100];
18485
18486 memset (tmp_buf, 0, sizeof (tmp_buf));
18487
18488 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18489
18490 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18491
18492 memcpy (digest, tmp_buf, 64);
18493
18494 digest[0] = byte_swap_64 (digest[0]);
18495 digest[1] = byte_swap_64 (digest[1]);
18496 digest[2] = byte_swap_64 (digest[2]);
18497 digest[3] = byte_swap_64 (digest[3]);
18498 digest[4] = byte_swap_64 (digest[4]);
18499 digest[5] = byte_swap_64 (digest[5]);
18500 digest[6] = byte_swap_64 (digest[6]);
18501 digest[7] = byte_swap_64 (digest[7]);
18502
18503 // add some stuff to normal salt to make sorted happy
18504
18505 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18506 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18507 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18508 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18509 salt->salt_buf[4] = salt->salt_iter;
18510
18511 return (PARSER_OK);
18512 }
18513
18514 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18515 {
18516 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18517
18518 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18519
18520 uint *digest = (uint *) hash_buf->digest;
18521
18522 salt_t *salt = hash_buf->salt;
18523
18524 /**
18525 * parse line
18526 */
18527
18528 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18529
18530 char *hash_pos = strchr (salt_pos, '$');
18531
18532 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18533
18534 u32 salt_len = hash_pos - salt_pos;
18535
18536 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18537
18538 hash_pos++;
18539
18540 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18541
18542 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18543
18544 // decode hash
18545
18546 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18547 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18548 digest[ 2] = 0;
18549 digest[ 3] = 0;
18550 digest[ 4] = 0;
18551 digest[ 5] = 0;
18552 digest[ 6] = 0;
18553 digest[ 7] = 0;
18554 digest[ 8] = 0;
18555 digest[ 9] = 0;
18556 digest[10] = 0;
18557 digest[11] = 0;
18558 digest[12] = 0;
18559 digest[13] = 0;
18560 digest[14] = 0;
18561 digest[15] = 0;
18562
18563 // decode salt
18564
18565 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18566 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18567
18568 salt->salt_iter = ROUNDS_ECRYPTFS;
18569 salt->salt_len = 8;
18570
18571 return (PARSER_OK);
18572 }
18573
18574 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18575 {
18576 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18577
18578 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18579
18580 unsigned char c19 = itoa64_to_int (input_buf[19]);
18581
18582 if (c19 & 3) return (PARSER_HASH_VALUE);
18583
18584 salt_t *salt = hash_buf->salt;
18585
18586 u32 *digest = (u32 *) hash_buf->digest;
18587
18588 // iteration count
18589
18590 salt->salt_iter = itoa64_to_int (input_buf[1])
18591 | itoa64_to_int (input_buf[2]) << 6
18592 | itoa64_to_int (input_buf[3]) << 12
18593 | itoa64_to_int (input_buf[4]) << 18;
18594
18595 // set salt
18596
18597 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18598 | itoa64_to_int (input_buf[6]) << 6
18599 | itoa64_to_int (input_buf[7]) << 12
18600 | itoa64_to_int (input_buf[8]) << 18;
18601
18602 salt->salt_len = 4;
18603
18604 u8 tmp_buf[100];
18605
18606 memset (tmp_buf, 0, sizeof (tmp_buf));
18607
18608 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18609
18610 memcpy (digest, tmp_buf, 8);
18611
18612 uint tt;
18613
18614 IP (digest[0], digest[1], tt);
18615
18616 digest[0] = rotr32 (digest[0], 31);
18617 digest[1] = rotr32 (digest[1], 31);
18618 digest[2] = 0;
18619 digest[3] = 0;
18620
18621 return (PARSER_OK);
18622 }
18623
18624 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18625 {
18626 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18627
18628 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18629
18630 u32 *digest = (u32 *) hash_buf->digest;
18631
18632 salt_t *salt = hash_buf->salt;
18633
18634 /**
18635 * parse line
18636 */
18637
18638 char *type_pos = input_buf + 6 + 1;
18639
18640 char *salt_pos = strchr (type_pos, '*');
18641
18642 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18643
18644 u32 type_len = salt_pos - type_pos;
18645
18646 if (type_len != 1) return (PARSER_SALT_LENGTH);
18647
18648 salt_pos++;
18649
18650 char *crypted_pos = strchr (salt_pos, '*');
18651
18652 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18653
18654 u32 salt_len = crypted_pos - salt_pos;
18655
18656 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18657
18658 crypted_pos++;
18659
18660 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18661
18662 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18663
18664 /**
18665 * copy data
18666 */
18667
18668 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18669 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18670
18671 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18672 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18673
18674 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18675 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18676 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18677 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18678
18679 salt->salt_len = 24;
18680 salt->salt_iter = ROUNDS_RAR3;
18681
18682 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18683 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18684
18685 digest[0] = 0xc43d7b00;
18686 digest[1] = 0x40070000;
18687 digest[2] = 0;
18688 digest[3] = 0;
18689
18690 return (PARSER_OK);
18691 }
18692
18693 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18694 {
18695 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18696
18697 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18698
18699 u32 *digest = (u32 *) hash_buf->digest;
18700
18701 salt_t *salt = hash_buf->salt;
18702
18703 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18704
18705 /**
18706 * parse line
18707 */
18708
18709 char *param0_pos = input_buf + 1 + 4 + 1;
18710
18711 char *param1_pos = strchr (param0_pos, '$');
18712
18713 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18714
18715 u32 param0_len = param1_pos - param0_pos;
18716
18717 param1_pos++;
18718
18719 char *param2_pos = strchr (param1_pos, '$');
18720
18721 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18722
18723 u32 param1_len = param2_pos - param1_pos;
18724
18725 param2_pos++;
18726
18727 char *param3_pos = strchr (param2_pos, '$');
18728
18729 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18730
18731 u32 param2_len = param3_pos - param2_pos;
18732
18733 param3_pos++;
18734
18735 char *param4_pos = strchr (param3_pos, '$');
18736
18737 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18738
18739 u32 param3_len = param4_pos - param3_pos;
18740
18741 param4_pos++;
18742
18743 char *param5_pos = strchr (param4_pos, '$');
18744
18745 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18746
18747 u32 param4_len = param5_pos - param4_pos;
18748
18749 param5_pos++;
18750
18751 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18752
18753 char *salt_buf = param1_pos;
18754 char *iv = param3_pos;
18755 char *pswcheck = param5_pos;
18756
18757 const uint salt_len = atoi (param0_pos);
18758 const uint iterations = atoi (param2_pos);
18759 const uint pswcheck_len = atoi (param4_pos);
18760
18761 /**
18762 * verify some data
18763 */
18764
18765 if (param1_len != 32) return (PARSER_SALT_VALUE);
18766 if (param3_len != 32) return (PARSER_SALT_VALUE);
18767 if (param5_len != 16) return (PARSER_SALT_VALUE);
18768
18769 if (salt_len != 16) return (PARSER_SALT_VALUE);
18770 if (iterations == 0) return (PARSER_SALT_VALUE);
18771 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18772
18773 /**
18774 * store data
18775 */
18776
18777 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18778 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18779 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18780 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18781
18782 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18783 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18784 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18785 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18786
18787 salt->salt_len = 16;
18788
18789 salt->salt_sign[0] = iterations;
18790
18791 salt->salt_iter = ((1 << iterations) + 32) - 1;
18792
18793 /**
18794 * digest buf
18795 */
18796
18797 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18798 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18799 digest[2] = 0;
18800 digest[3] = 0;
18801
18802 return (PARSER_OK);
18803 }
18804
18805 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18806 {
18807 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18808
18809 u32 *digest = (u32 *) hash_buf->digest;
18810
18811 salt_t *salt = hash_buf->salt;
18812
18813 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18814 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18815 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18816 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18817 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18818 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18819 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18820 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18821
18822 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18823
18824 uint salt_len = input_len - 64 - 1;
18825
18826 char *salt_buf = input_buf + 64 + 1;
18827
18828 char *salt_buf_ptr = (char *) salt->salt_buf;
18829
18830 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18831
18832 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18833
18834 salt->salt_len = salt_len;
18835
18836 /**
18837 * we can precompute the first sha256 transform
18838 */
18839
18840 uint w[16];
18841
18842 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18843 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18844 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18845 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18846 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18847 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18848 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18849 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18850 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18851 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18852 w[10] = byte_swap_32 (salt->salt_buf[10]);
18853 w[11] = byte_swap_32 (salt->salt_buf[11]);
18854 w[12] = byte_swap_32 (salt->salt_buf[12]);
18855 w[13] = byte_swap_32 (salt->salt_buf[13]);
18856 w[14] = byte_swap_32 (salt->salt_buf[14]);
18857 w[15] = byte_swap_32 (salt->salt_buf[15]);
18858
18859 uint pc256[8];
18860
18861 pc256[0] = SHA256M_A;
18862 pc256[1] = SHA256M_B;
18863 pc256[2] = SHA256M_C;
18864 pc256[3] = SHA256M_D;
18865 pc256[4] = SHA256M_E;
18866 pc256[5] = SHA256M_F;
18867 pc256[6] = SHA256M_G;
18868 pc256[7] = SHA256M_H;
18869
18870 sha256_64 (w, pc256);
18871
18872 salt->salt_buf_pc[0] = pc256[0];
18873 salt->salt_buf_pc[1] = pc256[1];
18874 salt->salt_buf_pc[2] = pc256[2];
18875 salt->salt_buf_pc[3] = pc256[3];
18876 salt->salt_buf_pc[4] = pc256[4];
18877 salt->salt_buf_pc[5] = pc256[5];
18878 salt->salt_buf_pc[6] = pc256[6];
18879 salt->salt_buf_pc[7] = pc256[7];
18880
18881 digest[0] -= pc256[0];
18882 digest[1] -= pc256[1];
18883 digest[2] -= pc256[2];
18884 digest[3] -= pc256[3];
18885 digest[4] -= pc256[4];
18886 digest[5] -= pc256[5];
18887 digest[6] -= pc256[6];
18888 digest[7] -= pc256[7];
18889
18890 return (PARSER_OK);
18891 }
18892
18893 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18894 {
18895 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18896
18897 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18898
18899 u32 *digest = (u32 *) hash_buf->digest;
18900
18901 salt_t *salt = hash_buf->salt;
18902
18903 /**
18904 * parse line
18905 */
18906
18907 char *data_len_pos = input_buf + 1 + 10 + 1;
18908
18909 char *data_buf_pos = strchr (data_len_pos, '$');
18910
18911 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18912
18913 u32 data_len_len = data_buf_pos - data_len_pos;
18914
18915 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18916 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18917
18918 data_buf_pos++;
18919
18920 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18921
18922 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18923
18924 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18925
18926 u32 data_len = atoi (data_len_pos);
18927
18928 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18929
18930 /**
18931 * salt
18932 */
18933
18934 char *salt_pos = data_buf_pos;
18935
18936 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18937 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18938 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
18939 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
18940
18941 // this is actually the CT, which is also the hash later (if matched)
18942
18943 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
18944 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
18945 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
18946 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
18947
18948 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18949
18950 salt->salt_iter = 10 - 1;
18951
18952 /**
18953 * digest buf
18954 */
18955
18956 digest[0] = salt->salt_buf[4];
18957 digest[1] = salt->salt_buf[5];
18958 digest[2] = salt->salt_buf[6];
18959 digest[3] = salt->salt_buf[7];
18960
18961 return (PARSER_OK);
18962 }
18963
18964 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18965 {
18966 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18967
18968 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18969
18970 u32 *digest = (u32 *) hash_buf->digest;
18971
18972 salt_t *salt = hash_buf->salt;
18973
18974 /**
18975 * parse line
18976 */
18977
18978 char *salt_pos = input_buf + 11 + 1;
18979
18980 char *iter_pos = strchr (salt_pos, ',');
18981
18982 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18983
18984 u32 salt_len = iter_pos - salt_pos;
18985
18986 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18987
18988 iter_pos++;
18989
18990 char *hash_pos = strchr (iter_pos, ',');
18991
18992 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18993
18994 u32 iter_len = hash_pos - iter_pos;
18995
18996 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18997
18998 hash_pos++;
18999
19000 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
19001
19002 if (hash_len != 64) return (PARSER_HASH_LENGTH);
19003
19004 /**
19005 * salt
19006 */
19007
19008 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
19009 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
19010 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
19011 salt->salt_buf[3] = 0x00018000;
19012
19013 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19014 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19015 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
19016 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
19017
19018 salt->salt_len = salt_len / 2;
19019
19020 salt->salt_iter = atoi (iter_pos) - 1;
19021
19022 /**
19023 * digest buf
19024 */
19025
19026 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19027 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19028 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19029 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19030 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19031 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19032 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19033 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19034
19035 return (PARSER_OK);
19036 }
19037
19038 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19039 {
19040 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
19041
19042 u32 *digest = (u32 *) hash_buf->digest;
19043
19044 salt_t *salt = hash_buf->salt;
19045
19046 /**
19047 * parse line
19048 */
19049
19050 char *hash_pos = input_buf + 64;
19051 char *salt1_pos = input_buf + 128;
19052 char *salt2_pos = input_buf;
19053
19054 /**
19055 * salt
19056 */
19057
19058 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
19059 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
19060 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
19061 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
19062
19063 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
19064 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
19065 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
19066 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
19067
19068 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
19069 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
19070 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
19071 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
19072
19073 salt->salt_len = 48;
19074
19075 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
19076
19077 /**
19078 * digest buf
19079 */
19080
19081 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19082 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19083 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19084 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19085 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19086 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19087 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19088 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19089
19090 return (PARSER_OK);
19091 }
19092
19093 /**
19094 * parallel running threads
19095 */
19096
19097 #ifdef WIN
19098
19099 BOOL WINAPI sigHandler_default (DWORD sig)
19100 {
19101 switch (sig)
19102 {
19103 case CTRL_CLOSE_EVENT:
19104
19105 /*
19106 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
19107 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
19108 * function otherwise it is too late (e.g. after returning from this function)
19109 */
19110
19111 myabort ();
19112
19113 SetConsoleCtrlHandler (NULL, TRUE);
19114
19115 hc_sleep (10);
19116
19117 return TRUE;
19118
19119 case CTRL_C_EVENT:
19120 case CTRL_LOGOFF_EVENT:
19121 case CTRL_SHUTDOWN_EVENT:
19122
19123 myabort ();
19124
19125 SetConsoleCtrlHandler (NULL, TRUE);
19126
19127 return TRUE;
19128 }
19129
19130 return FALSE;
19131 }
19132
19133 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19134 {
19135 switch (sig)
19136 {
19137 case CTRL_CLOSE_EVENT:
19138
19139 myabort ();
19140
19141 SetConsoleCtrlHandler (NULL, TRUE);
19142
19143 hc_sleep (10);
19144
19145 return TRUE;
19146
19147 case CTRL_C_EVENT:
19148 case CTRL_LOGOFF_EVENT:
19149 case CTRL_SHUTDOWN_EVENT:
19150
19151 myquit ();
19152
19153 SetConsoleCtrlHandler (NULL, TRUE);
19154
19155 return TRUE;
19156 }
19157
19158 return FALSE;
19159 }
19160
19161 void hc_signal (BOOL WINAPI (callback) (DWORD))
19162 {
19163 if (callback == NULL)
19164 {
19165 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19166 }
19167 else
19168 {
19169 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19170 }
19171 }
19172
19173 #else
19174
19175 void sigHandler_default (int sig)
19176 {
19177 myabort ();
19178
19179 signal (sig, NULL);
19180 }
19181
19182 void sigHandler_benchmark (int sig)
19183 {
19184 myquit ();
19185
19186 signal (sig, NULL);
19187 }
19188
19189 void hc_signal (void (callback) (int))
19190 {
19191 if (callback == NULL) callback = SIG_DFL;
19192
19193 signal (SIGINT, callback);
19194 signal (SIGTERM, callback);
19195 signal (SIGABRT, callback);
19196 }
19197
19198 #endif
19199
19200 void status_display ();
19201
19202 void *thread_keypress (void *p)
19203 {
19204 int benchmark = *((int *) p);
19205
19206 uint quiet = data.quiet;
19207
19208 tty_break();
19209
19210 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19211 {
19212 int ch = tty_getchar();
19213
19214 if (ch == -1) break;
19215
19216 if (ch == 0) continue;
19217
19218 #ifdef _POSIX
19219 if (ch != '\n')
19220 #endif
19221
19222 hc_thread_mutex_lock (mux_display);
19223
19224 log_info ("");
19225
19226 switch (ch)
19227 {
19228 case 's':
19229 case '\n':
19230
19231 log_info ("");
19232
19233 status_display ();
19234
19235 log_info ("");
19236
19237 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19238 if (quiet == 0) fflush (stdout);
19239
19240 break;
19241
19242 case 'b':
19243
19244 log_info ("");
19245
19246 bypass ();
19247
19248 log_info ("");
19249
19250 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19251 if (quiet == 0) fflush (stdout);
19252
19253 break;
19254
19255 case 'p':
19256
19257 log_info ("");
19258
19259 SuspendThreads ();
19260
19261 log_info ("");
19262
19263 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19264 if (quiet == 0) fflush (stdout);
19265
19266 break;
19267
19268 case 'r':
19269
19270 log_info ("");
19271
19272 ResumeThreads ();
19273
19274 log_info ("");
19275
19276 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19277 if (quiet == 0) fflush (stdout);
19278
19279 break;
19280
19281 case 'c':
19282
19283 log_info ("");
19284
19285 if (benchmark == 1) break;
19286
19287 stop_at_checkpoint ();
19288
19289 log_info ("");
19290
19291 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19292 if (quiet == 0) fflush (stdout);
19293
19294 break;
19295
19296 case 'q':
19297
19298 log_info ("");
19299
19300 if (benchmark == 1)
19301 {
19302 myquit ();
19303 }
19304 else
19305 {
19306 myabort ();
19307 }
19308
19309 break;
19310 }
19311
19312 hc_thread_mutex_unlock (mux_display);
19313 }
19314
19315 tty_fix();
19316
19317 return (p);
19318 }
19319
19320 /**
19321 * rules common
19322 */
19323
19324 bool class_num (const u8 c)
19325 {
19326 return ((c >= '0') && (c <= '9'));
19327 }
19328
19329 bool class_lower (const u8 c)
19330 {
19331 return ((c >= 'a') && (c <= 'z'));
19332 }
19333
19334 bool class_upper (const u8 c)
19335 {
19336 return ((c >= 'A') && (c <= 'Z'));
19337 }
19338
19339 bool class_alpha (const u8 c)
19340 {
19341 return (class_lower (c) || class_upper (c));
19342 }
19343
19344 int conv_ctoi (const u8 c)
19345 {
19346 if (class_num (c))
19347 {
19348 return c - '0';
19349 }
19350 else if (class_upper (c))
19351 {
19352 return c - 'A' + 10;
19353 }
19354
19355 return -1;
19356 }
19357
19358 int conv_itoc (const u8 c)
19359 {
19360 if (c < 10)
19361 {
19362 return c + '0';
19363 }
19364 else if (c < 37)
19365 {
19366 return c + 'A' - 10;
19367 }
19368
19369 return -1;
19370 }
19371
19372 /**
19373 * device rules
19374 */
19375
19376 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19377 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19378 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19379 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19380 #define MAX_KERNEL_RULES 255
19381 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19382 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19383 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19384
19385 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19386 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19387 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19388 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19389
19390 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19391 {
19392 uint rule_pos;
19393 uint rule_cnt;
19394
19395 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19396 {
19397 switch (rule_buf[rule_pos])
19398 {
19399 case ' ':
19400 rule_cnt--;
19401 break;
19402
19403 case RULE_OP_MANGLE_NOOP:
19404 SET_NAME (rule, rule_buf[rule_pos]);
19405 break;
19406
19407 case RULE_OP_MANGLE_LREST:
19408 SET_NAME (rule, rule_buf[rule_pos]);
19409 break;
19410
19411 case RULE_OP_MANGLE_UREST:
19412 SET_NAME (rule, rule_buf[rule_pos]);
19413 break;
19414
19415 case RULE_OP_MANGLE_LREST_UFIRST:
19416 SET_NAME (rule, rule_buf[rule_pos]);
19417 break;
19418
19419 case RULE_OP_MANGLE_UREST_LFIRST:
19420 SET_NAME (rule, rule_buf[rule_pos]);
19421 break;
19422
19423 case RULE_OP_MANGLE_TREST:
19424 SET_NAME (rule, rule_buf[rule_pos]);
19425 break;
19426
19427 case RULE_OP_MANGLE_TOGGLE_AT:
19428 SET_NAME (rule, rule_buf[rule_pos]);
19429 SET_P0_CONV (rule, rule_buf[rule_pos]);
19430 break;
19431
19432 case RULE_OP_MANGLE_REVERSE:
19433 SET_NAME (rule, rule_buf[rule_pos]);
19434 break;
19435
19436 case RULE_OP_MANGLE_DUPEWORD:
19437 SET_NAME (rule, rule_buf[rule_pos]);
19438 break;
19439
19440 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19441 SET_NAME (rule, rule_buf[rule_pos]);
19442 SET_P0_CONV (rule, rule_buf[rule_pos]);
19443 break;
19444
19445 case RULE_OP_MANGLE_REFLECT:
19446 SET_NAME (rule, rule_buf[rule_pos]);
19447 break;
19448
19449 case RULE_OP_MANGLE_ROTATE_LEFT:
19450 SET_NAME (rule, rule_buf[rule_pos]);
19451 break;
19452
19453 case RULE_OP_MANGLE_ROTATE_RIGHT:
19454 SET_NAME (rule, rule_buf[rule_pos]);
19455 break;
19456
19457 case RULE_OP_MANGLE_APPEND:
19458 SET_NAME (rule, rule_buf[rule_pos]);
19459 SET_P0 (rule, rule_buf[rule_pos]);
19460 break;
19461
19462 case RULE_OP_MANGLE_PREPEND:
19463 SET_NAME (rule, rule_buf[rule_pos]);
19464 SET_P0 (rule, rule_buf[rule_pos]);
19465 break;
19466
19467 case RULE_OP_MANGLE_DELETE_FIRST:
19468 SET_NAME (rule, rule_buf[rule_pos]);
19469 break;
19470
19471 case RULE_OP_MANGLE_DELETE_LAST:
19472 SET_NAME (rule, rule_buf[rule_pos]);
19473 break;
19474
19475 case RULE_OP_MANGLE_DELETE_AT:
19476 SET_NAME (rule, rule_buf[rule_pos]);
19477 SET_P0_CONV (rule, rule_buf[rule_pos]);
19478 break;
19479
19480 case RULE_OP_MANGLE_EXTRACT:
19481 SET_NAME (rule, rule_buf[rule_pos]);
19482 SET_P0_CONV (rule, rule_buf[rule_pos]);
19483 SET_P1_CONV (rule, rule_buf[rule_pos]);
19484 break;
19485
19486 case RULE_OP_MANGLE_OMIT:
19487 SET_NAME (rule, rule_buf[rule_pos]);
19488 SET_P0_CONV (rule, rule_buf[rule_pos]);
19489 SET_P1_CONV (rule, rule_buf[rule_pos]);
19490 break;
19491
19492 case RULE_OP_MANGLE_INSERT:
19493 SET_NAME (rule, rule_buf[rule_pos]);
19494 SET_P0_CONV (rule, rule_buf[rule_pos]);
19495 SET_P1 (rule, rule_buf[rule_pos]);
19496 break;
19497
19498 case RULE_OP_MANGLE_OVERSTRIKE:
19499 SET_NAME (rule, rule_buf[rule_pos]);
19500 SET_P0_CONV (rule, rule_buf[rule_pos]);
19501 SET_P1 (rule, rule_buf[rule_pos]);
19502 break;
19503
19504 case RULE_OP_MANGLE_TRUNCATE_AT:
19505 SET_NAME (rule, rule_buf[rule_pos]);
19506 SET_P0_CONV (rule, rule_buf[rule_pos]);
19507 break;
19508
19509 case RULE_OP_MANGLE_REPLACE:
19510 SET_NAME (rule, rule_buf[rule_pos]);
19511 SET_P0 (rule, rule_buf[rule_pos]);
19512 SET_P1 (rule, rule_buf[rule_pos]);
19513 break;
19514
19515 case RULE_OP_MANGLE_PURGECHAR:
19516 return (-1);
19517 break;
19518
19519 case RULE_OP_MANGLE_TOGGLECASE_REC:
19520 return (-1);
19521 break;
19522
19523 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19524 SET_NAME (rule, rule_buf[rule_pos]);
19525 SET_P0_CONV (rule, rule_buf[rule_pos]);
19526 break;
19527
19528 case RULE_OP_MANGLE_DUPECHAR_LAST:
19529 SET_NAME (rule, rule_buf[rule_pos]);
19530 SET_P0_CONV (rule, rule_buf[rule_pos]);
19531 break;
19532
19533 case RULE_OP_MANGLE_DUPECHAR_ALL:
19534 SET_NAME (rule, rule_buf[rule_pos]);
19535 break;
19536
19537 case RULE_OP_MANGLE_SWITCH_FIRST:
19538 SET_NAME (rule, rule_buf[rule_pos]);
19539 break;
19540
19541 case RULE_OP_MANGLE_SWITCH_LAST:
19542 SET_NAME (rule, rule_buf[rule_pos]);
19543 break;
19544
19545 case RULE_OP_MANGLE_SWITCH_AT:
19546 SET_NAME (rule, rule_buf[rule_pos]);
19547 SET_P0_CONV (rule, rule_buf[rule_pos]);
19548 SET_P1_CONV (rule, rule_buf[rule_pos]);
19549 break;
19550
19551 case RULE_OP_MANGLE_CHR_SHIFTL:
19552 SET_NAME (rule, rule_buf[rule_pos]);
19553 SET_P0_CONV (rule, rule_buf[rule_pos]);
19554 break;
19555
19556 case RULE_OP_MANGLE_CHR_SHIFTR:
19557 SET_NAME (rule, rule_buf[rule_pos]);
19558 SET_P0_CONV (rule, rule_buf[rule_pos]);
19559 break;
19560
19561 case RULE_OP_MANGLE_CHR_INCR:
19562 SET_NAME (rule, rule_buf[rule_pos]);
19563 SET_P0_CONV (rule, rule_buf[rule_pos]);
19564 break;
19565
19566 case RULE_OP_MANGLE_CHR_DECR:
19567 SET_NAME (rule, rule_buf[rule_pos]);
19568 SET_P0_CONV (rule, rule_buf[rule_pos]);
19569 break;
19570
19571 case RULE_OP_MANGLE_REPLACE_NP1:
19572 SET_NAME (rule, rule_buf[rule_pos]);
19573 SET_P0_CONV (rule, rule_buf[rule_pos]);
19574 break;
19575
19576 case RULE_OP_MANGLE_REPLACE_NM1:
19577 SET_NAME (rule, rule_buf[rule_pos]);
19578 SET_P0_CONV (rule, rule_buf[rule_pos]);
19579 break;
19580
19581 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19582 SET_NAME (rule, rule_buf[rule_pos]);
19583 SET_P0_CONV (rule, rule_buf[rule_pos]);
19584 break;
19585
19586 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19587 SET_NAME (rule, rule_buf[rule_pos]);
19588 SET_P0_CONV (rule, rule_buf[rule_pos]);
19589 break;
19590
19591 case RULE_OP_MANGLE_TITLE:
19592 SET_NAME (rule, rule_buf[rule_pos]);
19593 break;
19594
19595 default:
19596 return (-1);
19597 break;
19598 }
19599 }
19600
19601 if (rule_pos < rule_len) return (-1);
19602
19603 return (0);
19604 }
19605
19606 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19607 {
19608 uint rule_cnt;
19609 uint rule_pos;
19610 uint rule_len = BUFSIZ - 1; // maximum possible len
19611
19612 char rule_cmd;
19613
19614 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19615 {
19616 GET_NAME (rule);
19617
19618 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19619
19620 switch (rule_cmd)
19621 {
19622 case RULE_OP_MANGLE_NOOP:
19623 rule_buf[rule_pos] = rule_cmd;
19624 break;
19625
19626 case RULE_OP_MANGLE_LREST:
19627 rule_buf[rule_pos] = rule_cmd;
19628 break;
19629
19630 case RULE_OP_MANGLE_UREST:
19631 rule_buf[rule_pos] = rule_cmd;
19632 break;
19633
19634 case RULE_OP_MANGLE_LREST_UFIRST:
19635 rule_buf[rule_pos] = rule_cmd;
19636 break;
19637
19638 case RULE_OP_MANGLE_UREST_LFIRST:
19639 rule_buf[rule_pos] = rule_cmd;
19640 break;
19641
19642 case RULE_OP_MANGLE_TREST:
19643 rule_buf[rule_pos] = rule_cmd;
19644 break;
19645
19646 case RULE_OP_MANGLE_TOGGLE_AT:
19647 rule_buf[rule_pos] = rule_cmd;
19648 GET_P0_CONV (rule);
19649 break;
19650
19651 case RULE_OP_MANGLE_REVERSE:
19652 rule_buf[rule_pos] = rule_cmd;
19653 break;
19654
19655 case RULE_OP_MANGLE_DUPEWORD:
19656 rule_buf[rule_pos] = rule_cmd;
19657 break;
19658
19659 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19660 rule_buf[rule_pos] = rule_cmd;
19661 GET_P0_CONV (rule);
19662 break;
19663
19664 case RULE_OP_MANGLE_REFLECT:
19665 rule_buf[rule_pos] = rule_cmd;
19666 break;
19667
19668 case RULE_OP_MANGLE_ROTATE_LEFT:
19669 rule_buf[rule_pos] = rule_cmd;
19670 break;
19671
19672 case RULE_OP_MANGLE_ROTATE_RIGHT:
19673 rule_buf[rule_pos] = rule_cmd;
19674 break;
19675
19676 case RULE_OP_MANGLE_APPEND:
19677 rule_buf[rule_pos] = rule_cmd;
19678 GET_P0 (rule);
19679 break;
19680
19681 case RULE_OP_MANGLE_PREPEND:
19682 rule_buf[rule_pos] = rule_cmd;
19683 GET_P0 (rule);
19684 break;
19685
19686 case RULE_OP_MANGLE_DELETE_FIRST:
19687 rule_buf[rule_pos] = rule_cmd;
19688 break;
19689
19690 case RULE_OP_MANGLE_DELETE_LAST:
19691 rule_buf[rule_pos] = rule_cmd;
19692 break;
19693
19694 case RULE_OP_MANGLE_DELETE_AT:
19695 rule_buf[rule_pos] = rule_cmd;
19696 GET_P0_CONV (rule);
19697 break;
19698
19699 case RULE_OP_MANGLE_EXTRACT:
19700 rule_buf[rule_pos] = rule_cmd;
19701 GET_P0_CONV (rule);
19702 GET_P1_CONV (rule);
19703 break;
19704
19705 case RULE_OP_MANGLE_OMIT:
19706 rule_buf[rule_pos] = rule_cmd;
19707 GET_P0_CONV (rule);
19708 GET_P1_CONV (rule);
19709 break;
19710
19711 case RULE_OP_MANGLE_INSERT:
19712 rule_buf[rule_pos] = rule_cmd;
19713 GET_P0_CONV (rule);
19714 GET_P1 (rule);
19715 break;
19716
19717 case RULE_OP_MANGLE_OVERSTRIKE:
19718 rule_buf[rule_pos] = rule_cmd;
19719 GET_P0_CONV (rule);
19720 GET_P1 (rule);
19721 break;
19722
19723 case RULE_OP_MANGLE_TRUNCATE_AT:
19724 rule_buf[rule_pos] = rule_cmd;
19725 GET_P0_CONV (rule);
19726 break;
19727
19728 case RULE_OP_MANGLE_REPLACE:
19729 rule_buf[rule_pos] = rule_cmd;
19730 GET_P0 (rule);
19731 GET_P1 (rule);
19732 break;
19733
19734 case RULE_OP_MANGLE_PURGECHAR:
19735 return (-1);
19736 break;
19737
19738 case RULE_OP_MANGLE_TOGGLECASE_REC:
19739 return (-1);
19740 break;
19741
19742 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19743 rule_buf[rule_pos] = rule_cmd;
19744 GET_P0_CONV (rule);
19745 break;
19746
19747 case RULE_OP_MANGLE_DUPECHAR_LAST:
19748 rule_buf[rule_pos] = rule_cmd;
19749 GET_P0_CONV (rule);
19750 break;
19751
19752 case RULE_OP_MANGLE_DUPECHAR_ALL:
19753 rule_buf[rule_pos] = rule_cmd;
19754 break;
19755
19756 case RULE_OP_MANGLE_SWITCH_FIRST:
19757 rule_buf[rule_pos] = rule_cmd;
19758 break;
19759
19760 case RULE_OP_MANGLE_SWITCH_LAST:
19761 rule_buf[rule_pos] = rule_cmd;
19762 break;
19763
19764 case RULE_OP_MANGLE_SWITCH_AT:
19765 rule_buf[rule_pos] = rule_cmd;
19766 GET_P0_CONV (rule);
19767 GET_P1_CONV (rule);
19768 break;
19769
19770 case RULE_OP_MANGLE_CHR_SHIFTL:
19771 rule_buf[rule_pos] = rule_cmd;
19772 GET_P0_CONV (rule);
19773 break;
19774
19775 case RULE_OP_MANGLE_CHR_SHIFTR:
19776 rule_buf[rule_pos] = rule_cmd;
19777 GET_P0_CONV (rule);
19778 break;
19779
19780 case RULE_OP_MANGLE_CHR_INCR:
19781 rule_buf[rule_pos] = rule_cmd;
19782 GET_P0_CONV (rule);
19783 break;
19784
19785 case RULE_OP_MANGLE_CHR_DECR:
19786 rule_buf[rule_pos] = rule_cmd;
19787 GET_P0_CONV (rule);
19788 break;
19789
19790 case RULE_OP_MANGLE_REPLACE_NP1:
19791 rule_buf[rule_pos] = rule_cmd;
19792 GET_P0_CONV (rule);
19793 break;
19794
19795 case RULE_OP_MANGLE_REPLACE_NM1:
19796 rule_buf[rule_pos] = rule_cmd;
19797 GET_P0_CONV (rule);
19798 break;
19799
19800 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19801 rule_buf[rule_pos] = rule_cmd;
19802 GET_P0_CONV (rule);
19803 break;
19804
19805 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19806 rule_buf[rule_pos] = rule_cmd;
19807 GET_P0_CONV (rule);
19808 break;
19809
19810 case RULE_OP_MANGLE_TITLE:
19811 rule_buf[rule_pos] = rule_cmd;
19812 break;
19813
19814 case 0:
19815 return rule_pos - 1;
19816 break;
19817
19818 default:
19819 return (-1);
19820 break;
19821 }
19822 }
19823
19824 if (rule_cnt > 0)
19825 {
19826 return rule_pos;
19827 }
19828
19829 return (-1);
19830 }
19831
19832 /**
19833 * CPU rules : this is from hashcat sources, cpu based rules
19834 */
19835
19836 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19837 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19838
19839 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19840 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19841 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19842
19843 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19844 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19845 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19846
19847 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19848 {
19849 int pos;
19850
19851 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19852
19853 return (arr_len);
19854 }
19855
19856 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19857 {
19858 int pos;
19859
19860 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19861
19862 return (arr_len);
19863 }
19864
19865 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19866 {
19867 int pos;
19868
19869 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19870
19871 return (arr_len);
19872 }
19873
19874 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19875 {
19876 int l;
19877 int r;
19878
19879 for (l = 0; l < arr_len; l++)
19880 {
19881 r = arr_len - 1 - l;
19882
19883 if (l >= r) break;
19884
19885 MANGLE_SWITCH (arr, l, r);
19886 }
19887
19888 return (arr_len);
19889 }
19890
19891 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19892 {
19893 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19894
19895 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19896
19897 return (arr_len * 2);
19898 }
19899
19900 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19901 {
19902 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19903
19904 int orig_len = arr_len;
19905
19906 int i;
19907
19908 for (i = 0; i < times; i++)
19909 {
19910 memcpy (&arr[arr_len], arr, orig_len);
19911
19912 arr_len += orig_len;
19913 }
19914
19915 return (arr_len);
19916 }
19917
19918 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19919 {
19920 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19921
19922 mangle_double (arr, arr_len);
19923
19924 mangle_reverse (arr + arr_len, arr_len);
19925
19926 return (arr_len * 2);
19927 }
19928
19929 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19930 {
19931 int l;
19932 int r;
19933
19934 for (l = 0, r = arr_len - 1; r > 0; r--)
19935 {
19936 MANGLE_SWITCH (arr, l, r);
19937 }
19938
19939 return (arr_len);
19940 }
19941
19942 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19943 {
19944 int l;
19945 int r;
19946
19947 for (l = 0, r = arr_len - 1; l < r; l++)
19948 {
19949 MANGLE_SWITCH (arr, l, r);
19950 }
19951
19952 return (arr_len);
19953 }
19954
19955 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19956 {
19957 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19958
19959 arr[arr_len] = c;
19960
19961 return (arr_len + 1);
19962 }
19963
19964 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19965 {
19966 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19967
19968 int arr_pos;
19969
19970 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19971 {
19972 arr[arr_pos + 1] = arr[arr_pos];
19973 }
19974
19975 arr[0] = c;
19976
19977 return (arr_len + 1);
19978 }
19979
19980 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19981 {
19982 if (upos >= arr_len) return (arr_len);
19983
19984 int arr_pos;
19985
19986 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19987 {
19988 arr[arr_pos] = arr[arr_pos + 1];
19989 }
19990
19991 return (arr_len - 1);
19992 }
19993
19994 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19995 {
19996 if (upos >= arr_len) return (arr_len);
19997
19998 if ((upos + ulen) > arr_len) return (arr_len);
19999
20000 int arr_pos;
20001
20002 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
20003 {
20004 arr[arr_pos] = arr[upos + arr_pos];
20005 }
20006
20007 return (ulen);
20008 }
20009
20010 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20011 {
20012 if (upos >= arr_len) return (arr_len);
20013
20014 if ((upos + ulen) >= arr_len) return (arr_len);
20015
20016 int arr_pos;
20017
20018 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
20019 {
20020 arr[arr_pos] = arr[arr_pos + ulen];
20021 }
20022
20023 return (arr_len - ulen);
20024 }
20025
20026 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20027 {
20028 if (upos >= arr_len) return (arr_len);
20029
20030 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20031
20032 int arr_pos;
20033
20034 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
20035 {
20036 arr[arr_pos + 1] = arr[arr_pos];
20037 }
20038
20039 arr[upos] = c;
20040
20041 return (arr_len + 1);
20042 }
20043
20044 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)
20045 {
20046 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20047
20048 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
20049
20050 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
20051
20052 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
20053
20054 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
20055
20056 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
20057
20058 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
20059
20060 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
20061
20062 return (arr_len + arr2_cpy);
20063 }
20064
20065 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20066 {
20067 if (upos >= arr_len) return (arr_len);
20068
20069 arr[upos] = c;
20070
20071 return (arr_len);
20072 }
20073
20074 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
20075 {
20076 if (upos >= arr_len) return (arr_len);
20077
20078 memset (arr + upos, 0, arr_len - upos);
20079
20080 return (upos);
20081 }
20082
20083 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
20084 {
20085 int arr_pos;
20086
20087 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
20088 {
20089 if (arr[arr_pos] != oldc) continue;
20090
20091 arr[arr_pos] = newc;
20092 }
20093
20094 return (arr_len);
20095 }
20096
20097 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
20098 {
20099 int arr_pos;
20100
20101 int ret_len;
20102
20103 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
20104 {
20105 if (arr[arr_pos] == c) continue;
20106
20107 arr[ret_len] = arr[arr_pos];
20108
20109 ret_len++;
20110 }
20111
20112 return (ret_len);
20113 }
20114
20115 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
20116 {
20117 if (ulen > arr_len) return (arr_len);
20118
20119 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20120
20121 char cs[100];
20122
20123 memcpy (cs, arr, ulen);
20124
20125 int i;
20126
20127 for (i = 0; i < ulen; i++)
20128 {
20129 char c = cs[i];
20130
20131 arr_len = mangle_insert (arr, arr_len, i, c);
20132 }
20133
20134 return (arr_len);
20135 }
20136
20137 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20138 {
20139 if (ulen > arr_len) return (arr_len);
20140
20141 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20142
20143 int upos = arr_len - ulen;
20144
20145 int i;
20146
20147 for (i = 0; i < ulen; i++)
20148 {
20149 char c = arr[upos + i];
20150
20151 arr_len = mangle_append (arr, arr_len, c);
20152 }
20153
20154 return (arr_len);
20155 }
20156
20157 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20158 {
20159 if ( arr_len == 0) return (arr_len);
20160 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20161
20162 char c = arr[upos];
20163
20164 int i;
20165
20166 for (i = 0; i < ulen; i++)
20167 {
20168 arr_len = mangle_insert (arr, arr_len, upos, c);
20169 }
20170
20171 return (arr_len);
20172 }
20173
20174 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20175 {
20176 if ( arr_len == 0) return (arr_len);
20177 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20178
20179 int arr_pos;
20180
20181 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20182 {
20183 int new_pos = arr_pos * 2;
20184
20185 arr[new_pos] = arr[arr_pos];
20186
20187 arr[new_pos + 1] = arr[arr_pos];
20188 }
20189
20190 return (arr_len * 2);
20191 }
20192
20193 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20194 {
20195 if (upos >= arr_len) return (arr_len);
20196 if (upos2 >= arr_len) return (arr_len);
20197
20198 MANGLE_SWITCH (arr, upos, upos2);
20199
20200 return (arr_len);
20201 }
20202
20203 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20204 {
20205 MANGLE_SWITCH (arr, upos, upos2);
20206
20207 return (arr_len);
20208 }
20209
20210 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20211 {
20212 if (upos >= arr_len) return (arr_len);
20213
20214 arr[upos] <<= 1;
20215
20216 return (arr_len);
20217 }
20218
20219 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20220 {
20221 if (upos >= arr_len) return (arr_len);
20222
20223 arr[upos] >>= 1;
20224
20225 return (arr_len);
20226 }
20227
20228 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20229 {
20230 if (upos >= arr_len) return (arr_len);
20231
20232 arr[upos] += 1;
20233
20234 return (arr_len);
20235 }
20236
20237 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20238 {
20239 if (upos >= arr_len) return (arr_len);
20240
20241 arr[upos] -= 1;
20242
20243 return (arr_len);
20244 }
20245
20246 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20247 {
20248 int upper_next = 1;
20249
20250 int pos;
20251
20252 for (pos = 0; pos < arr_len; pos++)
20253 {
20254 if (arr[pos] == ' ')
20255 {
20256 upper_next = 1;
20257
20258 continue;
20259 }
20260
20261 if (upper_next)
20262 {
20263 upper_next = 0;
20264
20265 MANGLE_UPPER_AT (arr, pos);
20266 }
20267 else
20268 {
20269 MANGLE_LOWER_AT (arr, pos);
20270 }
20271 }
20272
20273 return (arr_len);
20274 }
20275
20276 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20277 {
20278 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20279
20280 u32 j;
20281
20282 u32 rule_pos = 0;
20283
20284 for (j = 0; j < rp_gen_num; j++)
20285 {
20286 u32 r = 0;
20287 u32 p1 = 0;
20288 u32 p2 = 0;
20289 u32 p3 = 0;
20290
20291 switch ((char) get_random_num (0, 9))
20292 {
20293 case 0:
20294 r = get_random_num (0, sizeof (grp_op_nop));
20295 rule_buf[rule_pos++] = grp_op_nop[r];
20296 break;
20297
20298 case 1:
20299 r = get_random_num (0, sizeof (grp_op_pos_p0));
20300 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20301 p1 = get_random_num (0, sizeof (grp_pos));
20302 rule_buf[rule_pos++] = grp_pos[p1];
20303 break;
20304
20305 case 2:
20306 r = get_random_num (0, sizeof (grp_op_pos_p1));
20307 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20308 p1 = get_random_num (1, 6);
20309 rule_buf[rule_pos++] = grp_pos[p1];
20310 break;
20311
20312 case 3:
20313 r = get_random_num (0, sizeof (grp_op_chr));
20314 rule_buf[rule_pos++] = grp_op_chr[r];
20315 p1 = get_random_num (0x20, 0x7e);
20316 rule_buf[rule_pos++] = (char) p1;
20317 break;
20318
20319 case 4:
20320 r = get_random_num (0, sizeof (grp_op_chr_chr));
20321 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20322 p1 = get_random_num (0x20, 0x7e);
20323 rule_buf[rule_pos++] = (char) p1;
20324 p2 = get_random_num (0x20, 0x7e);
20325 while (p1 == p2)
20326 p2 = get_random_num (0x20, 0x7e);
20327 rule_buf[rule_pos++] = (char) p2;
20328 break;
20329
20330 case 5:
20331 r = get_random_num (0, sizeof (grp_op_pos_chr));
20332 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20333 p1 = get_random_num (0, sizeof (grp_pos));
20334 rule_buf[rule_pos++] = grp_pos[p1];
20335 p2 = get_random_num (0x20, 0x7e);
20336 rule_buf[rule_pos++] = (char) p2;
20337 break;
20338
20339 case 6:
20340 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20341 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20342 p1 = get_random_num (0, sizeof (grp_pos));
20343 rule_buf[rule_pos++] = grp_pos[p1];
20344 p2 = get_random_num (0, sizeof (grp_pos));
20345 while (p1 == p2)
20346 p2 = get_random_num (0, sizeof (grp_pos));
20347 rule_buf[rule_pos++] = grp_pos[p2];
20348 break;
20349
20350 case 7:
20351 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20352 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20353 p1 = get_random_num (0, sizeof (grp_pos));
20354 rule_buf[rule_pos++] = grp_pos[p1];
20355 p2 = get_random_num (1, sizeof (grp_pos));
20356 while (p1 == p2)
20357 p2 = get_random_num (1, sizeof (grp_pos));
20358 rule_buf[rule_pos++] = grp_pos[p2];
20359 break;
20360
20361 case 8:
20362 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20363 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20364 p1 = get_random_num (0, sizeof (grp_pos));
20365 rule_buf[rule_pos++] = grp_pos[p1];
20366 p2 = get_random_num (1, sizeof (grp_pos));
20367 rule_buf[rule_pos++] = grp_pos[p1];
20368 p3 = get_random_num (0, sizeof (grp_pos));
20369 rule_buf[rule_pos++] = grp_pos[p3];
20370 break;
20371 }
20372 }
20373
20374 return (rule_pos);
20375 }
20376
20377 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20378 {
20379 char mem[BLOCK_SIZE];
20380
20381 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20382
20383 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20384
20385 if (in_len < 1) return (RULE_RC_REJECT_ERROR);
20386
20387 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20388
20389 int out_len = in_len;
20390 int mem_len = in_len;
20391
20392 memcpy (out, in, out_len);
20393
20394 int rule_pos;
20395
20396 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20397 {
20398 int upos; int upos2;
20399 int ulen;
20400
20401 switch (rule[rule_pos])
20402 {
20403 case ' ':
20404 break;
20405
20406 case RULE_OP_MANGLE_NOOP:
20407 break;
20408
20409 case RULE_OP_MANGLE_LREST:
20410 out_len = mangle_lrest (out, out_len);
20411 break;
20412
20413 case RULE_OP_MANGLE_UREST:
20414 out_len = mangle_urest (out, out_len);
20415 break;
20416
20417 case RULE_OP_MANGLE_LREST_UFIRST:
20418 out_len = mangle_lrest (out, out_len);
20419 if (out_len) MANGLE_UPPER_AT (out, 0);
20420 break;
20421
20422 case RULE_OP_MANGLE_UREST_LFIRST:
20423 out_len = mangle_urest (out, out_len);
20424 if (out_len) MANGLE_LOWER_AT (out, 0);
20425 break;
20426
20427 case RULE_OP_MANGLE_TREST:
20428 out_len = mangle_trest (out, out_len);
20429 break;
20430
20431 case RULE_OP_MANGLE_TOGGLE_AT:
20432 NEXT_RULEPOS (rule_pos);
20433 NEXT_RPTOI (rule, rule_pos, upos);
20434 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20435 break;
20436
20437 case RULE_OP_MANGLE_REVERSE:
20438 out_len = mangle_reverse (out, out_len);
20439 break;
20440
20441 case RULE_OP_MANGLE_DUPEWORD:
20442 out_len = mangle_double (out, out_len);
20443 break;
20444
20445 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20446 NEXT_RULEPOS (rule_pos);
20447 NEXT_RPTOI (rule, rule_pos, ulen);
20448 out_len = mangle_double_times (out, out_len, ulen);
20449 break;
20450
20451 case RULE_OP_MANGLE_REFLECT:
20452 out_len = mangle_reflect (out, out_len);
20453 break;
20454
20455 case RULE_OP_MANGLE_ROTATE_LEFT:
20456 mangle_rotate_left (out, out_len);
20457 break;
20458
20459 case RULE_OP_MANGLE_ROTATE_RIGHT:
20460 mangle_rotate_right (out, out_len);
20461 break;
20462
20463 case RULE_OP_MANGLE_APPEND:
20464 NEXT_RULEPOS (rule_pos);
20465 out_len = mangle_append (out, out_len, rule[rule_pos]);
20466 break;
20467
20468 case RULE_OP_MANGLE_PREPEND:
20469 NEXT_RULEPOS (rule_pos);
20470 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20471 break;
20472
20473 case RULE_OP_MANGLE_DELETE_FIRST:
20474 out_len = mangle_delete_at (out, out_len, 0);
20475 break;
20476
20477 case RULE_OP_MANGLE_DELETE_LAST:
20478 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20479 break;
20480
20481 case RULE_OP_MANGLE_DELETE_AT:
20482 NEXT_RULEPOS (rule_pos);
20483 NEXT_RPTOI (rule, rule_pos, upos);
20484 out_len = mangle_delete_at (out, out_len, upos);
20485 break;
20486
20487 case RULE_OP_MANGLE_EXTRACT:
20488 NEXT_RULEPOS (rule_pos);
20489 NEXT_RPTOI (rule, rule_pos, upos);
20490 NEXT_RULEPOS (rule_pos);
20491 NEXT_RPTOI (rule, rule_pos, ulen);
20492 out_len = mangle_extract (out, out_len, upos, ulen);
20493 break;
20494
20495 case RULE_OP_MANGLE_OMIT:
20496 NEXT_RULEPOS (rule_pos);
20497 NEXT_RPTOI (rule, rule_pos, upos);
20498 NEXT_RULEPOS (rule_pos);
20499 NEXT_RPTOI (rule, rule_pos, ulen);
20500 out_len = mangle_omit (out, out_len, upos, ulen);
20501 break;
20502
20503 case RULE_OP_MANGLE_INSERT:
20504 NEXT_RULEPOS (rule_pos);
20505 NEXT_RPTOI (rule, rule_pos, upos);
20506 NEXT_RULEPOS (rule_pos);
20507 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20508 break;
20509
20510 case RULE_OP_MANGLE_OVERSTRIKE:
20511 NEXT_RULEPOS (rule_pos);
20512 NEXT_RPTOI (rule, rule_pos, upos);
20513 NEXT_RULEPOS (rule_pos);
20514 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20515 break;
20516
20517 case RULE_OP_MANGLE_TRUNCATE_AT:
20518 NEXT_RULEPOS (rule_pos);
20519 NEXT_RPTOI (rule, rule_pos, upos);
20520 out_len = mangle_truncate_at (out, out_len, upos);
20521 break;
20522
20523 case RULE_OP_MANGLE_REPLACE:
20524 NEXT_RULEPOS (rule_pos);
20525 NEXT_RULEPOS (rule_pos);
20526 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20527 break;
20528
20529 case RULE_OP_MANGLE_PURGECHAR:
20530 NEXT_RULEPOS (rule_pos);
20531 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20532 break;
20533
20534 case RULE_OP_MANGLE_TOGGLECASE_REC:
20535 /* todo */
20536 break;
20537
20538 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20539 NEXT_RULEPOS (rule_pos);
20540 NEXT_RPTOI (rule, rule_pos, ulen);
20541 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20542 break;
20543
20544 case RULE_OP_MANGLE_DUPECHAR_LAST:
20545 NEXT_RULEPOS (rule_pos);
20546 NEXT_RPTOI (rule, rule_pos, ulen);
20547 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20548 break;
20549
20550 case RULE_OP_MANGLE_DUPECHAR_ALL:
20551 out_len = mangle_dupechar (out, out_len);
20552 break;
20553
20554 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20555 NEXT_RULEPOS (rule_pos);
20556 NEXT_RPTOI (rule, rule_pos, ulen);
20557 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20558 break;
20559
20560 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20561 NEXT_RULEPOS (rule_pos);
20562 NEXT_RPTOI (rule, rule_pos, ulen);
20563 out_len = mangle_dupeblock_append (out, out_len, ulen);
20564 break;
20565
20566 case RULE_OP_MANGLE_SWITCH_FIRST:
20567 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20568 break;
20569
20570 case RULE_OP_MANGLE_SWITCH_LAST:
20571 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20572 break;
20573
20574 case RULE_OP_MANGLE_SWITCH_AT:
20575 NEXT_RULEPOS (rule_pos);
20576 NEXT_RPTOI (rule, rule_pos, upos);
20577 NEXT_RULEPOS (rule_pos);
20578 NEXT_RPTOI (rule, rule_pos, upos2);
20579 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20580 break;
20581
20582 case RULE_OP_MANGLE_CHR_SHIFTL:
20583 NEXT_RULEPOS (rule_pos);
20584 NEXT_RPTOI (rule, rule_pos, upos);
20585 mangle_chr_shiftl (out, out_len, upos);
20586 break;
20587
20588 case RULE_OP_MANGLE_CHR_SHIFTR:
20589 NEXT_RULEPOS (rule_pos);
20590 NEXT_RPTOI (rule, rule_pos, upos);
20591 mangle_chr_shiftr (out, out_len, upos);
20592 break;
20593
20594 case RULE_OP_MANGLE_CHR_INCR:
20595 NEXT_RULEPOS (rule_pos);
20596 NEXT_RPTOI (rule, rule_pos, upos);
20597 mangle_chr_incr (out, out_len, upos);
20598 break;
20599
20600 case RULE_OP_MANGLE_CHR_DECR:
20601 NEXT_RULEPOS (rule_pos);
20602 NEXT_RPTOI (rule, rule_pos, upos);
20603 mangle_chr_decr (out, out_len, upos);
20604 break;
20605
20606 case RULE_OP_MANGLE_REPLACE_NP1:
20607 NEXT_RULEPOS (rule_pos);
20608 NEXT_RPTOI (rule, rule_pos, upos);
20609 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20610 break;
20611
20612 case RULE_OP_MANGLE_REPLACE_NM1:
20613 NEXT_RULEPOS (rule_pos);
20614 NEXT_RPTOI (rule, rule_pos, upos);
20615 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20616 break;
20617
20618 case RULE_OP_MANGLE_TITLE:
20619 out_len = mangle_title (out, out_len);
20620 break;
20621
20622 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20623 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20624 NEXT_RULEPOS (rule_pos);
20625 NEXT_RPTOI (rule, rule_pos, upos);
20626 NEXT_RULEPOS (rule_pos);
20627 NEXT_RPTOI (rule, rule_pos, ulen);
20628 NEXT_RULEPOS (rule_pos);
20629 NEXT_RPTOI (rule, rule_pos, upos2);
20630 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20631 break;
20632
20633 case RULE_OP_MANGLE_APPEND_MEMORY:
20634 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20635 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20636 memcpy (out + out_len, mem, mem_len);
20637 out_len += mem_len;
20638 break;
20639
20640 case RULE_OP_MANGLE_PREPEND_MEMORY:
20641 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20642 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20643 memcpy (mem + mem_len, out, out_len);
20644 out_len += mem_len;
20645 memcpy (out, mem, out_len);
20646 break;
20647
20648 case RULE_OP_MEMORIZE_WORD:
20649 memcpy (mem, out, out_len);
20650 mem_len = out_len;
20651 break;
20652
20653 case RULE_OP_REJECT_LESS:
20654 NEXT_RULEPOS (rule_pos);
20655 NEXT_RPTOI (rule, rule_pos, upos);
20656 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20657 break;
20658
20659 case RULE_OP_REJECT_GREATER:
20660 NEXT_RULEPOS (rule_pos);
20661 NEXT_RPTOI (rule, rule_pos, upos);
20662 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20663 break;
20664
20665 case RULE_OP_REJECT_CONTAIN:
20666 NEXT_RULEPOS (rule_pos);
20667 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20668 break;
20669
20670 case RULE_OP_REJECT_NOT_CONTAIN:
20671 NEXT_RULEPOS (rule_pos);
20672 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20673 break;
20674
20675 case RULE_OP_REJECT_EQUAL_FIRST:
20676 NEXT_RULEPOS (rule_pos);
20677 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20678 break;
20679
20680 case RULE_OP_REJECT_EQUAL_LAST:
20681 NEXT_RULEPOS (rule_pos);
20682 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20683 break;
20684
20685 case RULE_OP_REJECT_EQUAL_AT:
20686 NEXT_RULEPOS (rule_pos);
20687 NEXT_RPTOI (rule, rule_pos, upos);
20688 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20689 NEXT_RULEPOS (rule_pos);
20690 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20691 break;
20692
20693 case RULE_OP_REJECT_CONTAINS:
20694 NEXT_RULEPOS (rule_pos);
20695 NEXT_RPTOI (rule, rule_pos, upos);
20696 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20697 NEXT_RULEPOS (rule_pos);
20698 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20699 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20700 break;
20701
20702 case RULE_OP_REJECT_MEMORY:
20703 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20704 break;
20705
20706 default:
20707 return (RULE_RC_SYNTAX_ERROR);
20708 break;
20709 }
20710 }
20711
20712 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20713
20714 return (out_len);
20715 }