Minor bugfix
[hashcat.git] / src / shared.c
1 /**
2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
4 * magnum <john.magnum@hushmail.com>
5 *
6 * License.....: MIT
7 */
8
9 #ifdef OSX
10 #include <stdio.h>
11 #endif
12
13 #include <shared.h>
14 #include <limits.h>
15
16 /**
17 * basic bit handling
18 */
19
20 u32 is_power_of_2(u32 v)
21 {
22 return (v && !(v & (v - 1)));
23 }
24
25 u32 rotl32 (const u32 a, const u32 n)
26 {
27 return ((a << n) | (a >> (32 - n)));
28 }
29
30 u32 rotr32 (const u32 a, const u32 n)
31 {
32 return ((a >> n) | (a << (32 - n)));
33 }
34
35 u64 rotl64 (const u64 a, const u64 n)
36 {
37 return ((a << n) | (a >> (64 - n)));
38 }
39
40 u64 rotr64 (const u64 a, const u64 n)
41 {
42 return ((a >> n) | (a << (64 - n)));
43 }
44
45 u32 byte_swap_32 (const u32 n)
46 {
47 return (n & 0xff000000) >> 24
48 | (n & 0x00ff0000) >> 8
49 | (n & 0x0000ff00) << 8
50 | (n & 0x000000ff) << 24;
51 }
52
53 u64 byte_swap_64 (const u64 n)
54 {
55 return (n & 0xff00000000000000ULL) >> 56
56 | (n & 0x00ff000000000000ULL) >> 40
57 | (n & 0x0000ff0000000000ULL) >> 24
58 | (n & 0x000000ff00000000ULL) >> 8
59 | (n & 0x00000000ff000000ULL) << 8
60 | (n & 0x0000000000ff0000ULL) << 24
61 | (n & 0x000000000000ff00ULL) << 40
62 | (n & 0x00000000000000ffULL) << 56;
63 }
64
65 /**
66 * ciphers for use on cpu
67 */
68
69 #include "cpu-des.c"
70 #include "cpu-aes.c"
71
72 /**
73 * hashes for use on cpu
74 */
75
76 #include "cpu-md5.c"
77 #include "cpu-sha256.c"
78
79 /**
80 * logging
81 */
82
83 int last_len = 0;
84
85 void log_final (FILE *fp, const char *fmt, va_list ap)
86 {
87 if (last_len)
88 {
89 fputc ('\r', fp);
90
91 for (int i = 0; i < last_len; i++)
92 {
93 fputc (' ', fp);
94 }
95
96 fputc ('\r', fp);
97 }
98
99 char s[4096] = { 0 };
100
101 int max_len = (int) sizeof (s);
102
103 int len = vsnprintf (s, max_len, fmt, ap);
104
105 if (len > max_len) len = max_len;
106
107 fwrite (s, len, 1, fp);
108
109 fflush (fp);
110
111 last_len = len;
112 }
113
114 void log_out_nn (FILE *fp, const char *fmt, ...)
115 {
116 if (SUPPRESS_OUTPUT) return;
117
118 va_list ap;
119
120 va_start (ap, fmt);
121
122 log_final (fp, fmt, ap);
123
124 va_end (ap);
125 }
126
127 void log_info_nn (const char *fmt, ...)
128 {
129 if (SUPPRESS_OUTPUT) return;
130
131 va_list ap;
132
133 va_start (ap, fmt);
134
135 log_final (stdout, fmt, ap);
136
137 va_end (ap);
138 }
139
140 void log_error_nn (const char *fmt, ...)
141 {
142 if (SUPPRESS_OUTPUT) return;
143
144 va_list ap;
145
146 va_start (ap, fmt);
147
148 log_final (stderr, fmt, ap);
149
150 va_end (ap);
151 }
152
153 void log_out (FILE *fp, const char *fmt, ...)
154 {
155 if (SUPPRESS_OUTPUT) return;
156
157 va_list ap;
158
159 va_start (ap, fmt);
160
161 log_final (fp, fmt, ap);
162
163 va_end (ap);
164
165 fputc ('\n', fp);
166
167 last_len = 0;
168 }
169
170 void log_info (const char *fmt, ...)
171 {
172 if (SUPPRESS_OUTPUT) return;
173
174 va_list ap;
175
176 va_start (ap, fmt);
177
178 log_final (stdout, fmt, ap);
179
180 va_end (ap);
181
182 fputc ('\n', stdout);
183
184 last_len = 0;
185 }
186
187 void log_error (const char *fmt, ...)
188 {
189 if (SUPPRESS_OUTPUT) return;
190
191 fputc ('\n', stderr);
192 fputc ('\n', stderr);
193
194 va_list ap;
195
196 va_start (ap, fmt);
197
198 log_final (stderr, fmt, ap);
199
200 va_end (ap);
201
202 fputc ('\n', stderr);
203 fputc ('\n', stderr);
204
205 last_len = 0;
206 }
207
208 /**
209 * converter
210 */
211
212 u8 int_to_base32 (const u8 c)
213 {
214 static const u8 tbl[0x20] =
215 {
216 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
217 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
218 };
219
220 return tbl[c];
221 }
222
223 u8 base32_to_int (const u8 c)
224 {
225 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
226 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
227
228 return 0;
229 }
230
231 u8 int_to_itoa32 (const u8 c)
232 {
233 static const u8 tbl[0x20] =
234 {
235 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
236 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
237 };
238
239 return tbl[c];
240 }
241
242 u8 itoa32_to_int (const u8 c)
243 {
244 if ((c >= '0') && (c <= '9')) return c - '0';
245 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
246
247 return 0;
248 }
249
250 u8 int_to_itoa64 (const u8 c)
251 {
252 static const u8 tbl[0x40] =
253 {
254 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
255 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
256 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
257 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
258 };
259
260 return tbl[c];
261 }
262
263 u8 itoa64_to_int (const u8 c)
264 {
265 static const u8 tbl[0x100] =
266 {
267 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
268 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
269 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
270 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
271 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
272 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
273 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
274 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
275 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
276 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
277 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
278 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
279 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
280 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
281 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
282 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
283 };
284
285 return tbl[c];
286 }
287
288 u8 int_to_base64 (const u8 c)
289 {
290 static const u8 tbl[0x40] =
291 {
292 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
293 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
294 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
295 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
296 };
297
298 return tbl[c];
299 }
300
301 u8 base64_to_int (const u8 c)
302 {
303 static const u8 tbl[0x100] =
304 {
305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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, 0x3e, 0x00, 0x00, 0x00, 0x3f,
308 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
309 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
310 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
312 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 };
322
323 return tbl[c];
324 }
325
326 u8 int_to_bf64 (const u8 c)
327 {
328 static const u8 tbl[0x40] =
329 {
330 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
331 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
332 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
333 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
334 };
335
336 return tbl[c];
337 }
338
339 u8 bf64_to_int (const u8 c)
340 {
341 static const u8 tbl[0x100] =
342 {
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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, 0x01,
346 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
348 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
349 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
350 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 };
360
361 return tbl[c];
362 }
363
364 u8 int_to_lotus64 (const u8 c)
365 {
366 if (c < 10) return '0' + c;
367 else if (c < 36) return 'A' + c - 10;
368 else if (c < 62) return 'a' + c - 36;
369 else if (c == 62) return '+';
370 else if (c == 63) return '/';
371
372 return 0;
373 }
374
375 u8 lotus64_to_int (const u8 c)
376 {
377 if ((c >= '0') && (c <= '9')) return c - '0';
378 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
379 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
380 else if (c == '+') return 62;
381 else if (c == '/') return 63;
382 else
383
384 return 0;
385 }
386
387 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
388 {
389 const u8 *in_ptr = in_buf;
390
391 u8 *out_ptr = out_buf;
392
393 for (int i = 0; i < in_len; i += 8)
394 {
395 const u8 out_val0 = f (in_ptr[0] & 0x7f);
396 const u8 out_val1 = f (in_ptr[1] & 0x7f);
397 const u8 out_val2 = f (in_ptr[2] & 0x7f);
398 const u8 out_val3 = f (in_ptr[3] & 0x7f);
399 const u8 out_val4 = f (in_ptr[4] & 0x7f);
400 const u8 out_val5 = f (in_ptr[5] & 0x7f);
401 const u8 out_val6 = f (in_ptr[6] & 0x7f);
402 const u8 out_val7 = f (in_ptr[7] & 0x7f);
403
404 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
405 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
406 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
407 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
408 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
409
410 in_ptr += 8;
411 out_ptr += 5;
412 }
413
414 for (int i = 0; i < in_len; i++)
415 {
416 if (in_buf[i] != '=') continue;
417
418 in_len = i;
419 }
420
421 int out_len = (in_len * 5) / 8;
422
423 return out_len;
424 }
425
426 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
427 {
428 const u8 *in_ptr = in_buf;
429
430 u8 *out_ptr = out_buf;
431
432 for (int i = 0; i < in_len; i += 5)
433 {
434 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
435 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
436 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
437 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
438 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
439 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
440 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
441 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
442
443 out_ptr[0] = out_val0 & 0x7f;
444 out_ptr[1] = out_val1 & 0x7f;
445 out_ptr[2] = out_val2 & 0x7f;
446 out_ptr[3] = out_val3 & 0x7f;
447 out_ptr[4] = out_val4 & 0x7f;
448 out_ptr[5] = out_val5 & 0x7f;
449 out_ptr[6] = out_val6 & 0x7f;
450 out_ptr[7] = out_val7 & 0x7f;
451
452 in_ptr += 5;
453 out_ptr += 8;
454 }
455
456 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
457
458 while (out_len % 8)
459 {
460 out_buf[out_len] = '=';
461
462 out_len++;
463 }
464
465 return out_len;
466 }
467
468 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
469 {
470 const u8 *in_ptr = in_buf;
471
472 u8 *out_ptr = out_buf;
473
474 for (int i = 0; i < in_len; i += 4)
475 {
476 const u8 out_val0 = f (in_ptr[0] & 0x7f);
477 const u8 out_val1 = f (in_ptr[1] & 0x7f);
478 const u8 out_val2 = f (in_ptr[2] & 0x7f);
479 const u8 out_val3 = f (in_ptr[3] & 0x7f);
480
481 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
482 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
483 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
484
485 in_ptr += 4;
486 out_ptr += 3;
487 }
488
489 for (int i = 0; i < in_len; i++)
490 {
491 if (in_buf[i] != '=') continue;
492
493 in_len = i;
494 }
495
496 int out_len = (in_len * 6) / 8;
497
498 return out_len;
499 }
500
501 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
502 {
503 const u8 *in_ptr = in_buf;
504
505 u8 *out_ptr = out_buf;
506
507 for (int i = 0; i < in_len; i += 3)
508 {
509 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
510 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
511 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
512 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
513
514 out_ptr[0] = out_val0 & 0x7f;
515 out_ptr[1] = out_val1 & 0x7f;
516 out_ptr[2] = out_val2 & 0x7f;
517 out_ptr[3] = out_val3 & 0x7f;
518
519 in_ptr += 3;
520 out_ptr += 4;
521 }
522
523 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
524
525 while (out_len % 4)
526 {
527 out_buf[out_len] = '=';
528
529 out_len++;
530 }
531
532 return out_len;
533 }
534
535 int is_valid_hex_char (const u8 c)
536 {
537 if ((c >= '0') && (c <= '9')) return 1;
538 if ((c >= 'A') && (c <= 'F')) return 1;
539 if ((c >= 'a') && (c <= 'f')) return 1;
540
541 return 0;
542 }
543
544 u8 hex_convert (const u8 c)
545 {
546 return (c & 15) + (c >> 6) * 9;
547 }
548
549 u8 hex_to_u8 (const u8 hex[2])
550 {
551 u8 v = 0;
552
553 v |= (hex_convert (hex[1]) << 0);
554 v |= (hex_convert (hex[0]) << 4);
555
556 return (v);
557 }
558
559 u32 hex_to_u32 (const u8 hex[8])
560 {
561 u32 v = 0;
562
563 v |= ((u32) hex_convert (hex[7])) << 0;
564 v |= ((u32) hex_convert (hex[6])) << 4;
565 v |= ((u32) hex_convert (hex[5])) << 8;
566 v |= ((u32) hex_convert (hex[4])) << 12;
567 v |= ((u32) hex_convert (hex[3])) << 16;
568 v |= ((u32) hex_convert (hex[2])) << 20;
569 v |= ((u32) hex_convert (hex[1])) << 24;
570 v |= ((u32) hex_convert (hex[0])) << 28;
571
572 return (v);
573 }
574
575 u64 hex_to_u64 (const u8 hex[16])
576 {
577 u64 v = 0;
578
579 v |= ((u64) hex_convert (hex[15]) << 0);
580 v |= ((u64) hex_convert (hex[14]) << 4);
581 v |= ((u64) hex_convert (hex[13]) << 8);
582 v |= ((u64) hex_convert (hex[12]) << 12);
583 v |= ((u64) hex_convert (hex[11]) << 16);
584 v |= ((u64) hex_convert (hex[10]) << 20);
585 v |= ((u64) hex_convert (hex[ 9]) << 24);
586 v |= ((u64) hex_convert (hex[ 8]) << 28);
587 v |= ((u64) hex_convert (hex[ 7]) << 32);
588 v |= ((u64) hex_convert (hex[ 6]) << 36);
589 v |= ((u64) hex_convert (hex[ 5]) << 40);
590 v |= ((u64) hex_convert (hex[ 4]) << 44);
591 v |= ((u64) hex_convert (hex[ 3]) << 48);
592 v |= ((u64) hex_convert (hex[ 2]) << 52);
593 v |= ((u64) hex_convert (hex[ 1]) << 56);
594 v |= ((u64) hex_convert (hex[ 0]) << 60);
595
596 return (v);
597 }
598
599 void bin_to_hex_lower (const u32 v, u8 hex[8])
600 {
601 hex[0] = v >> 28 & 15;
602 hex[1] = v >> 24 & 15;
603 hex[2] = v >> 20 & 15;
604 hex[3] = v >> 16 & 15;
605 hex[4] = v >> 12 & 15;
606 hex[5] = v >> 8 & 15;
607 hex[6] = v >> 4 & 15;
608 hex[7] = v >> 0 & 15;
609
610 u32 add;
611
612 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
613 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
614 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
615 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
616 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
617 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
618 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
619 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
620 }
621
622 /**
623 * decoder
624 */
625
626 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
627 {
628 AES_KEY skey;
629
630 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
631
632 u32 _iv[4] = { 0 };
633
634 _iv[0] = iv[0];
635 _iv[1] = iv[1];
636 _iv[2] = iv[2];
637 _iv[3] = iv[3];
638
639 for (int i = 0; i < 16; i += 4)
640 {
641 u32 _in[4] = { 0 };
642 u32 _out[4] = { 0 };
643
644 _in[0] = in[i + 0];
645 _in[1] = in[i + 1];
646 _in[2] = in[i + 2];
647 _in[3] = in[i + 3];
648
649 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
650
651 _out[0] ^= _iv[0];
652 _out[1] ^= _iv[1];
653 _out[2] ^= _iv[2];
654 _out[3] ^= _iv[3];
655
656 out[i + 0] = _out[0];
657 out[i + 1] = _out[1];
658 out[i + 2] = _out[2];
659 out[i + 3] = _out[3];
660
661 _iv[0] = _in[0];
662 _iv[1] = _in[1];
663 _iv[2] = _in[2];
664 _iv[3] = _in[3];
665 }
666 }
667
668 static void juniper_decrypt_hash (char *in, char *out)
669 {
670 // base64 decode
671
672 u8 base64_buf[100] = { 0 };
673
674 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
675
676 // iv stuff
677
678 u32 juniper_iv[4] = { 0 };
679
680 memcpy (juniper_iv, base64_buf, 12);
681
682 memcpy (out, juniper_iv, 12);
683
684 // reversed key
685
686 u32 juniper_key[4] = { 0 };
687
688 juniper_key[0] = byte_swap_32 (0xa6707a7e);
689 juniper_key[1] = byte_swap_32 (0x8df91059);
690 juniper_key[2] = byte_swap_32 (0xdea70ae5);
691 juniper_key[3] = byte_swap_32 (0x2f9c2442);
692
693 // AES decrypt
694
695 u32 *in_ptr = (u32 *) (base64_buf + 12);
696 u32 *out_ptr = (u32 *) (out + 12);
697
698 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
699 }
700
701 void phpass_decode (u8 digest[16], u8 buf[22])
702 {
703 int l;
704
705 l = itoa64_to_int (buf[ 0]) << 0;
706 l |= itoa64_to_int (buf[ 1]) << 6;
707 l |= itoa64_to_int (buf[ 2]) << 12;
708 l |= itoa64_to_int (buf[ 3]) << 18;
709
710 digest[ 0] = (l >> 0) & 0xff;
711 digest[ 1] = (l >> 8) & 0xff;
712 digest[ 2] = (l >> 16) & 0xff;
713
714 l = itoa64_to_int (buf[ 4]) << 0;
715 l |= itoa64_to_int (buf[ 5]) << 6;
716 l |= itoa64_to_int (buf[ 6]) << 12;
717 l |= itoa64_to_int (buf[ 7]) << 18;
718
719 digest[ 3] = (l >> 0) & 0xff;
720 digest[ 4] = (l >> 8) & 0xff;
721 digest[ 5] = (l >> 16) & 0xff;
722
723 l = itoa64_to_int (buf[ 8]) << 0;
724 l |= itoa64_to_int (buf[ 9]) << 6;
725 l |= itoa64_to_int (buf[10]) << 12;
726 l |= itoa64_to_int (buf[11]) << 18;
727
728 digest[ 6] = (l >> 0) & 0xff;
729 digest[ 7] = (l >> 8) & 0xff;
730 digest[ 8] = (l >> 16) & 0xff;
731
732 l = itoa64_to_int (buf[12]) << 0;
733 l |= itoa64_to_int (buf[13]) << 6;
734 l |= itoa64_to_int (buf[14]) << 12;
735 l |= itoa64_to_int (buf[15]) << 18;
736
737 digest[ 9] = (l >> 0) & 0xff;
738 digest[10] = (l >> 8) & 0xff;
739 digest[11] = (l >> 16) & 0xff;
740
741 l = itoa64_to_int (buf[16]) << 0;
742 l |= itoa64_to_int (buf[17]) << 6;
743 l |= itoa64_to_int (buf[18]) << 12;
744 l |= itoa64_to_int (buf[19]) << 18;
745
746 digest[12] = (l >> 0) & 0xff;
747 digest[13] = (l >> 8) & 0xff;
748 digest[14] = (l >> 16) & 0xff;
749
750 l = itoa64_to_int (buf[20]) << 0;
751 l |= itoa64_to_int (buf[21]) << 6;
752
753 digest[15] = (l >> 0) & 0xff;
754 }
755
756 void phpass_encode (u8 digest[16], u8 buf[22])
757 {
758 int l;
759
760 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
761
762 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
763 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
764 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
765 buf[ 3] = int_to_itoa64 (l & 0x3f);
766
767 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
768
769 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
770 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
771 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
772 buf[ 7] = int_to_itoa64 (l & 0x3f);
773
774 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
775
776 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
777 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
778 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
779 buf[11] = int_to_itoa64 (l & 0x3f);
780
781 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
782
783 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
784 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
785 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
786 buf[15] = int_to_itoa64 (l & 0x3f);
787
788 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
789
790 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
791 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
792 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
793 buf[19] = int_to_itoa64 (l & 0x3f);
794
795 l = (digest[15] << 0);
796
797 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
798 buf[21] = int_to_itoa64 (l & 0x3f);
799 }
800
801 void md5crypt_decode (u8 digest[16], u8 buf[22])
802 {
803 int l;
804
805 l = itoa64_to_int (buf[ 0]) << 0;
806 l |= itoa64_to_int (buf[ 1]) << 6;
807 l |= itoa64_to_int (buf[ 2]) << 12;
808 l |= itoa64_to_int (buf[ 3]) << 18;
809
810 digest[ 0] = (l >> 16) & 0xff;
811 digest[ 6] = (l >> 8) & 0xff;
812 digest[12] = (l >> 0) & 0xff;
813
814 l = itoa64_to_int (buf[ 4]) << 0;
815 l |= itoa64_to_int (buf[ 5]) << 6;
816 l |= itoa64_to_int (buf[ 6]) << 12;
817 l |= itoa64_to_int (buf[ 7]) << 18;
818
819 digest[ 1] = (l >> 16) & 0xff;
820 digest[ 7] = (l >> 8) & 0xff;
821 digest[13] = (l >> 0) & 0xff;
822
823 l = itoa64_to_int (buf[ 8]) << 0;
824 l |= itoa64_to_int (buf[ 9]) << 6;
825 l |= itoa64_to_int (buf[10]) << 12;
826 l |= itoa64_to_int (buf[11]) << 18;
827
828 digest[ 2] = (l >> 16) & 0xff;
829 digest[ 8] = (l >> 8) & 0xff;
830 digest[14] = (l >> 0) & 0xff;
831
832 l = itoa64_to_int (buf[12]) << 0;
833 l |= itoa64_to_int (buf[13]) << 6;
834 l |= itoa64_to_int (buf[14]) << 12;
835 l |= itoa64_to_int (buf[15]) << 18;
836
837 digest[ 3] = (l >> 16) & 0xff;
838 digest[ 9] = (l >> 8) & 0xff;
839 digest[15] = (l >> 0) & 0xff;
840
841 l = itoa64_to_int (buf[16]) << 0;
842 l |= itoa64_to_int (buf[17]) << 6;
843 l |= itoa64_to_int (buf[18]) << 12;
844 l |= itoa64_to_int (buf[19]) << 18;
845
846 digest[ 4] = (l >> 16) & 0xff;
847 digest[10] = (l >> 8) & 0xff;
848 digest[ 5] = (l >> 0) & 0xff;
849
850 l = itoa64_to_int (buf[20]) << 0;
851 l |= itoa64_to_int (buf[21]) << 6;
852
853 digest[11] = (l >> 0) & 0xff;
854 }
855
856 void md5crypt_encode (u8 digest[16], u8 buf[22])
857 {
858 int l;
859
860 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
861
862 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
863 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
864 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
865 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
866
867 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
868
869 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
870 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
871 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
872 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
873
874 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
875
876 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
877 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
878 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
879 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
880
881 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
882
883 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
884 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
885 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
886 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
887
888 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
889
890 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
891 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
892 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
893 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
894
895 l = (digest[11] << 0);
896
897 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
898 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
899 }
900
901 void sha512crypt_decode (u8 digest[64], u8 buf[86])
902 {
903 int l;
904
905 l = itoa64_to_int (buf[ 0]) << 0;
906 l |= itoa64_to_int (buf[ 1]) << 6;
907 l |= itoa64_to_int (buf[ 2]) << 12;
908 l |= itoa64_to_int (buf[ 3]) << 18;
909
910 digest[ 0] = (l >> 16) & 0xff;
911 digest[21] = (l >> 8) & 0xff;
912 digest[42] = (l >> 0) & 0xff;
913
914 l = itoa64_to_int (buf[ 4]) << 0;
915 l |= itoa64_to_int (buf[ 5]) << 6;
916 l |= itoa64_to_int (buf[ 6]) << 12;
917 l |= itoa64_to_int (buf[ 7]) << 18;
918
919 digest[22] = (l >> 16) & 0xff;
920 digest[43] = (l >> 8) & 0xff;
921 digest[ 1] = (l >> 0) & 0xff;
922
923 l = itoa64_to_int (buf[ 8]) << 0;
924 l |= itoa64_to_int (buf[ 9]) << 6;
925 l |= itoa64_to_int (buf[10]) << 12;
926 l |= itoa64_to_int (buf[11]) << 18;
927
928 digest[44] = (l >> 16) & 0xff;
929 digest[ 2] = (l >> 8) & 0xff;
930 digest[23] = (l >> 0) & 0xff;
931
932 l = itoa64_to_int (buf[12]) << 0;
933 l |= itoa64_to_int (buf[13]) << 6;
934 l |= itoa64_to_int (buf[14]) << 12;
935 l |= itoa64_to_int (buf[15]) << 18;
936
937 digest[ 3] = (l >> 16) & 0xff;
938 digest[24] = (l >> 8) & 0xff;
939 digest[45] = (l >> 0) & 0xff;
940
941 l = itoa64_to_int (buf[16]) << 0;
942 l |= itoa64_to_int (buf[17]) << 6;
943 l |= itoa64_to_int (buf[18]) << 12;
944 l |= itoa64_to_int (buf[19]) << 18;
945
946 digest[25] = (l >> 16) & 0xff;
947 digest[46] = (l >> 8) & 0xff;
948 digest[ 4] = (l >> 0) & 0xff;
949
950 l = itoa64_to_int (buf[20]) << 0;
951 l |= itoa64_to_int (buf[21]) << 6;
952 l |= itoa64_to_int (buf[22]) << 12;
953 l |= itoa64_to_int (buf[23]) << 18;
954
955 digest[47] = (l >> 16) & 0xff;
956 digest[ 5] = (l >> 8) & 0xff;
957 digest[26] = (l >> 0) & 0xff;
958
959 l = itoa64_to_int (buf[24]) << 0;
960 l |= itoa64_to_int (buf[25]) << 6;
961 l |= itoa64_to_int (buf[26]) << 12;
962 l |= itoa64_to_int (buf[27]) << 18;
963
964 digest[ 6] = (l >> 16) & 0xff;
965 digest[27] = (l >> 8) & 0xff;
966 digest[48] = (l >> 0) & 0xff;
967
968 l = itoa64_to_int (buf[28]) << 0;
969 l |= itoa64_to_int (buf[29]) << 6;
970 l |= itoa64_to_int (buf[30]) << 12;
971 l |= itoa64_to_int (buf[31]) << 18;
972
973 digest[28] = (l >> 16) & 0xff;
974 digest[49] = (l >> 8) & 0xff;
975 digest[ 7] = (l >> 0) & 0xff;
976
977 l = itoa64_to_int (buf[32]) << 0;
978 l |= itoa64_to_int (buf[33]) << 6;
979 l |= itoa64_to_int (buf[34]) << 12;
980 l |= itoa64_to_int (buf[35]) << 18;
981
982 digest[50] = (l >> 16) & 0xff;
983 digest[ 8] = (l >> 8) & 0xff;
984 digest[29] = (l >> 0) & 0xff;
985
986 l = itoa64_to_int (buf[36]) << 0;
987 l |= itoa64_to_int (buf[37]) << 6;
988 l |= itoa64_to_int (buf[38]) << 12;
989 l |= itoa64_to_int (buf[39]) << 18;
990
991 digest[ 9] = (l >> 16) & 0xff;
992 digest[30] = (l >> 8) & 0xff;
993 digest[51] = (l >> 0) & 0xff;
994
995 l = itoa64_to_int (buf[40]) << 0;
996 l |= itoa64_to_int (buf[41]) << 6;
997 l |= itoa64_to_int (buf[42]) << 12;
998 l |= itoa64_to_int (buf[43]) << 18;
999
1000 digest[31] = (l >> 16) & 0xff;
1001 digest[52] = (l >> 8) & 0xff;
1002 digest[10] = (l >> 0) & 0xff;
1003
1004 l = itoa64_to_int (buf[44]) << 0;
1005 l |= itoa64_to_int (buf[45]) << 6;
1006 l |= itoa64_to_int (buf[46]) << 12;
1007 l |= itoa64_to_int (buf[47]) << 18;
1008
1009 digest[53] = (l >> 16) & 0xff;
1010 digest[11] = (l >> 8) & 0xff;
1011 digest[32] = (l >> 0) & 0xff;
1012
1013 l = itoa64_to_int (buf[48]) << 0;
1014 l |= itoa64_to_int (buf[49]) << 6;
1015 l |= itoa64_to_int (buf[50]) << 12;
1016 l |= itoa64_to_int (buf[51]) << 18;
1017
1018 digest[12] = (l >> 16) & 0xff;
1019 digest[33] = (l >> 8) & 0xff;
1020 digest[54] = (l >> 0) & 0xff;
1021
1022 l = itoa64_to_int (buf[52]) << 0;
1023 l |= itoa64_to_int (buf[53]) << 6;
1024 l |= itoa64_to_int (buf[54]) << 12;
1025 l |= itoa64_to_int (buf[55]) << 18;
1026
1027 digest[34] = (l >> 16) & 0xff;
1028 digest[55] = (l >> 8) & 0xff;
1029 digest[13] = (l >> 0) & 0xff;
1030
1031 l = itoa64_to_int (buf[56]) << 0;
1032 l |= itoa64_to_int (buf[57]) << 6;
1033 l |= itoa64_to_int (buf[58]) << 12;
1034 l |= itoa64_to_int (buf[59]) << 18;
1035
1036 digest[56] = (l >> 16) & 0xff;
1037 digest[14] = (l >> 8) & 0xff;
1038 digest[35] = (l >> 0) & 0xff;
1039
1040 l = itoa64_to_int (buf[60]) << 0;
1041 l |= itoa64_to_int (buf[61]) << 6;
1042 l |= itoa64_to_int (buf[62]) << 12;
1043 l |= itoa64_to_int (buf[63]) << 18;
1044
1045 digest[15] = (l >> 16) & 0xff;
1046 digest[36] = (l >> 8) & 0xff;
1047 digest[57] = (l >> 0) & 0xff;
1048
1049 l = itoa64_to_int (buf[64]) << 0;
1050 l |= itoa64_to_int (buf[65]) << 6;
1051 l |= itoa64_to_int (buf[66]) << 12;
1052 l |= itoa64_to_int (buf[67]) << 18;
1053
1054 digest[37] = (l >> 16) & 0xff;
1055 digest[58] = (l >> 8) & 0xff;
1056 digest[16] = (l >> 0) & 0xff;
1057
1058 l = itoa64_to_int (buf[68]) << 0;
1059 l |= itoa64_to_int (buf[69]) << 6;
1060 l |= itoa64_to_int (buf[70]) << 12;
1061 l |= itoa64_to_int (buf[71]) << 18;
1062
1063 digest[59] = (l >> 16) & 0xff;
1064 digest[17] = (l >> 8) & 0xff;
1065 digest[38] = (l >> 0) & 0xff;
1066
1067 l = itoa64_to_int (buf[72]) << 0;
1068 l |= itoa64_to_int (buf[73]) << 6;
1069 l |= itoa64_to_int (buf[74]) << 12;
1070 l |= itoa64_to_int (buf[75]) << 18;
1071
1072 digest[18] = (l >> 16) & 0xff;
1073 digest[39] = (l >> 8) & 0xff;
1074 digest[60] = (l >> 0) & 0xff;
1075
1076 l = itoa64_to_int (buf[76]) << 0;
1077 l |= itoa64_to_int (buf[77]) << 6;
1078 l |= itoa64_to_int (buf[78]) << 12;
1079 l |= itoa64_to_int (buf[79]) << 18;
1080
1081 digest[40] = (l >> 16) & 0xff;
1082 digest[61] = (l >> 8) & 0xff;
1083 digest[19] = (l >> 0) & 0xff;
1084
1085 l = itoa64_to_int (buf[80]) << 0;
1086 l |= itoa64_to_int (buf[81]) << 6;
1087 l |= itoa64_to_int (buf[82]) << 12;
1088 l |= itoa64_to_int (buf[83]) << 18;
1089
1090 digest[62] = (l >> 16) & 0xff;
1091 digest[20] = (l >> 8) & 0xff;
1092 digest[41] = (l >> 0) & 0xff;
1093
1094 l = itoa64_to_int (buf[84]) << 0;
1095 l |= itoa64_to_int (buf[85]) << 6;
1096
1097 digest[63] = (l >> 0) & 0xff;
1098 }
1099
1100 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1101 {
1102 int l;
1103
1104 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1105
1106 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1107 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1108 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1109 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110
1111 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1112
1113 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1114 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1115 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1116 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117
1118 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1119
1120 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1121 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1122 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1123 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124
1125 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1126
1127 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1128 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1129 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1130 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131
1132 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1133
1134 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1135 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1136 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1137 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138
1139 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1140
1141 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1142 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1143 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1144 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145
1146 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1147
1148 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1149 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1150 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1151 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152
1153 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1154
1155 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1156 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1157 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1158 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159
1160 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1161
1162 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1163 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1164 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1165 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166
1167 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1168
1169 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1170 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1171 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1172 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173
1174 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1175
1176 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1177 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1178 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1179 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180
1181 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1182
1183 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1184 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1185 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1186 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187
1188 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1189
1190 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1191 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1192 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1193 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194
1195 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1196
1197 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1198 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1199 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1200 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201
1202 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1203
1204 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1205 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1206 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1207 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208
1209 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1210
1211 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1212 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1213 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1214 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215
1216 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1217
1218 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1219 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1220 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1221 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222
1223 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1224
1225 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1226 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1227 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1228 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229
1230 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1231
1232 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1233 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1234 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1235 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236
1237 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1238
1239 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1240 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1241 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1242 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243
1244 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1245
1246 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1247 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1248 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1249 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1250
1251 l = 0 | 0 | (digest[63] << 0);
1252
1253 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1254 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1255 }
1256
1257 void sha1aix_decode (u8 digest[20], u8 buf[27])
1258 {
1259 int l;
1260
1261 l = itoa64_to_int (buf[ 0]) << 0;
1262 l |= itoa64_to_int (buf[ 1]) << 6;
1263 l |= itoa64_to_int (buf[ 2]) << 12;
1264 l |= itoa64_to_int (buf[ 3]) << 18;
1265
1266 digest[ 2] = (l >> 0) & 0xff;
1267 digest[ 1] = (l >> 8) & 0xff;
1268 digest[ 0] = (l >> 16) & 0xff;
1269
1270 l = itoa64_to_int (buf[ 4]) << 0;
1271 l |= itoa64_to_int (buf[ 5]) << 6;
1272 l |= itoa64_to_int (buf[ 6]) << 12;
1273 l |= itoa64_to_int (buf[ 7]) << 18;
1274
1275 digest[ 5] = (l >> 0) & 0xff;
1276 digest[ 4] = (l >> 8) & 0xff;
1277 digest[ 3] = (l >> 16) & 0xff;
1278
1279 l = itoa64_to_int (buf[ 8]) << 0;
1280 l |= itoa64_to_int (buf[ 9]) << 6;
1281 l |= itoa64_to_int (buf[10]) << 12;
1282 l |= itoa64_to_int (buf[11]) << 18;
1283
1284 digest[ 8] = (l >> 0) & 0xff;
1285 digest[ 7] = (l >> 8) & 0xff;
1286 digest[ 6] = (l >> 16) & 0xff;
1287
1288 l = itoa64_to_int (buf[12]) << 0;
1289 l |= itoa64_to_int (buf[13]) << 6;
1290 l |= itoa64_to_int (buf[14]) << 12;
1291 l |= itoa64_to_int (buf[15]) << 18;
1292
1293 digest[11] = (l >> 0) & 0xff;
1294 digest[10] = (l >> 8) & 0xff;
1295 digest[ 9] = (l >> 16) & 0xff;
1296
1297 l = itoa64_to_int (buf[16]) << 0;
1298 l |= itoa64_to_int (buf[17]) << 6;
1299 l |= itoa64_to_int (buf[18]) << 12;
1300 l |= itoa64_to_int (buf[19]) << 18;
1301
1302 digest[14] = (l >> 0) & 0xff;
1303 digest[13] = (l >> 8) & 0xff;
1304 digest[12] = (l >> 16) & 0xff;
1305
1306 l = itoa64_to_int (buf[20]) << 0;
1307 l |= itoa64_to_int (buf[21]) << 6;
1308 l |= itoa64_to_int (buf[22]) << 12;
1309 l |= itoa64_to_int (buf[23]) << 18;
1310
1311 digest[17] = (l >> 0) & 0xff;
1312 digest[16] = (l >> 8) & 0xff;
1313 digest[15] = (l >> 16) & 0xff;
1314
1315 l = itoa64_to_int (buf[24]) << 0;
1316 l |= itoa64_to_int (buf[25]) << 6;
1317 l |= itoa64_to_int (buf[26]) << 12;
1318
1319 digest[19] = (l >> 8) & 0xff;
1320 digest[18] = (l >> 16) & 0xff;
1321 }
1322
1323 void sha1aix_encode (u8 digest[20], u8 buf[27])
1324 {
1325 int l;
1326
1327 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1328
1329 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1330 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1331 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1332 buf[ 3] = int_to_itoa64 (l & 0x3f);
1333
1334 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1335
1336 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1337 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1338 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1339 buf[ 7] = int_to_itoa64 (l & 0x3f);
1340
1341 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1342
1343 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1344 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1345 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1346 buf[11] = int_to_itoa64 (l & 0x3f);
1347
1348 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1349
1350 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1351 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1352 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1353 buf[15] = int_to_itoa64 (l & 0x3f);
1354
1355 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1356
1357 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1358 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1359 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1360 buf[19] = int_to_itoa64 (l & 0x3f);
1361
1362 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1363
1364 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1365 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1366 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1367 buf[23] = int_to_itoa64 (l & 0x3f);
1368
1369 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1370
1371 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1372 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1373 buf[26] = int_to_itoa64 (l & 0x3f);
1374 }
1375
1376 void sha256aix_decode (u8 digest[32], u8 buf[43])
1377 {
1378 int l;
1379
1380 l = itoa64_to_int (buf[ 0]) << 0;
1381 l |= itoa64_to_int (buf[ 1]) << 6;
1382 l |= itoa64_to_int (buf[ 2]) << 12;
1383 l |= itoa64_to_int (buf[ 3]) << 18;
1384
1385 digest[ 2] = (l >> 0) & 0xff;
1386 digest[ 1] = (l >> 8) & 0xff;
1387 digest[ 0] = (l >> 16) & 0xff;
1388
1389 l = itoa64_to_int (buf[ 4]) << 0;
1390 l |= itoa64_to_int (buf[ 5]) << 6;
1391 l |= itoa64_to_int (buf[ 6]) << 12;
1392 l |= itoa64_to_int (buf[ 7]) << 18;
1393
1394 digest[ 5] = (l >> 0) & 0xff;
1395 digest[ 4] = (l >> 8) & 0xff;
1396 digest[ 3] = (l >> 16) & 0xff;
1397
1398 l = itoa64_to_int (buf[ 8]) << 0;
1399 l |= itoa64_to_int (buf[ 9]) << 6;
1400 l |= itoa64_to_int (buf[10]) << 12;
1401 l |= itoa64_to_int (buf[11]) << 18;
1402
1403 digest[ 8] = (l >> 0) & 0xff;
1404 digest[ 7] = (l >> 8) & 0xff;
1405 digest[ 6] = (l >> 16) & 0xff;
1406
1407 l = itoa64_to_int (buf[12]) << 0;
1408 l |= itoa64_to_int (buf[13]) << 6;
1409 l |= itoa64_to_int (buf[14]) << 12;
1410 l |= itoa64_to_int (buf[15]) << 18;
1411
1412 digest[11] = (l >> 0) & 0xff;
1413 digest[10] = (l >> 8) & 0xff;
1414 digest[ 9] = (l >> 16) & 0xff;
1415
1416 l = itoa64_to_int (buf[16]) << 0;
1417 l |= itoa64_to_int (buf[17]) << 6;
1418 l |= itoa64_to_int (buf[18]) << 12;
1419 l |= itoa64_to_int (buf[19]) << 18;
1420
1421 digest[14] = (l >> 0) & 0xff;
1422 digest[13] = (l >> 8) & 0xff;
1423 digest[12] = (l >> 16) & 0xff;
1424
1425 l = itoa64_to_int (buf[20]) << 0;
1426 l |= itoa64_to_int (buf[21]) << 6;
1427 l |= itoa64_to_int (buf[22]) << 12;
1428 l |= itoa64_to_int (buf[23]) << 18;
1429
1430 digest[17] = (l >> 0) & 0xff;
1431 digest[16] = (l >> 8) & 0xff;
1432 digest[15] = (l >> 16) & 0xff;
1433
1434 l = itoa64_to_int (buf[24]) << 0;
1435 l |= itoa64_to_int (buf[25]) << 6;
1436 l |= itoa64_to_int (buf[26]) << 12;
1437 l |= itoa64_to_int (buf[27]) << 18;
1438
1439 digest[20] = (l >> 0) & 0xff;
1440 digest[19] = (l >> 8) & 0xff;
1441 digest[18] = (l >> 16) & 0xff;
1442
1443 l = itoa64_to_int (buf[28]) << 0;
1444 l |= itoa64_to_int (buf[29]) << 6;
1445 l |= itoa64_to_int (buf[30]) << 12;
1446 l |= itoa64_to_int (buf[31]) << 18;
1447
1448 digest[23] = (l >> 0) & 0xff;
1449 digest[22] = (l >> 8) & 0xff;
1450 digest[21] = (l >> 16) & 0xff;
1451
1452 l = itoa64_to_int (buf[32]) << 0;
1453 l |= itoa64_to_int (buf[33]) << 6;
1454 l |= itoa64_to_int (buf[34]) << 12;
1455 l |= itoa64_to_int (buf[35]) << 18;
1456
1457 digest[26] = (l >> 0) & 0xff;
1458 digest[25] = (l >> 8) & 0xff;
1459 digest[24] = (l >> 16) & 0xff;
1460
1461 l = itoa64_to_int (buf[36]) << 0;
1462 l |= itoa64_to_int (buf[37]) << 6;
1463 l |= itoa64_to_int (buf[38]) << 12;
1464 l |= itoa64_to_int (buf[39]) << 18;
1465
1466 digest[29] = (l >> 0) & 0xff;
1467 digest[28] = (l >> 8) & 0xff;
1468 digest[27] = (l >> 16) & 0xff;
1469
1470 l = itoa64_to_int (buf[40]) << 0;
1471 l |= itoa64_to_int (buf[41]) << 6;
1472 l |= itoa64_to_int (buf[42]) << 12;
1473
1474 //digest[32] = (l >> 0) & 0xff;
1475 digest[31] = (l >> 8) & 0xff;
1476 digest[30] = (l >> 16) & 0xff;
1477 }
1478
1479 void sha256aix_encode (u8 digest[32], u8 buf[43])
1480 {
1481 int l;
1482
1483 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1484
1485 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1486 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1487 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1488 buf[ 3] = int_to_itoa64 (l & 0x3f);
1489
1490 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1491
1492 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1493 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1494 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1495 buf[ 7] = int_to_itoa64 (l & 0x3f);
1496
1497 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1498
1499 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1500 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1501 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1502 buf[11] = int_to_itoa64 (l & 0x3f);
1503
1504 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1505
1506 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1507 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1508 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1509 buf[15] = int_to_itoa64 (l & 0x3f);
1510
1511 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1512
1513 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1514 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1515 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1516 buf[19] = int_to_itoa64 (l & 0x3f);
1517
1518 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1519
1520 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1521 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1522 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1523 buf[23] = int_to_itoa64 (l & 0x3f);
1524
1525 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1526
1527 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1528 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1529 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1530 buf[27] = int_to_itoa64 (l & 0x3f);
1531
1532 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1533
1534 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1535 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1536 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1537 buf[31] = int_to_itoa64 (l & 0x3f);
1538
1539 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1540
1541 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1542 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1543 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1544 buf[35] = int_to_itoa64 (l & 0x3f);
1545
1546 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1547
1548 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1549 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1550 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1551 buf[39] = int_to_itoa64 (l & 0x3f);
1552
1553 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1554
1555 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1556 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1557 buf[42] = int_to_itoa64 (l & 0x3f);
1558 }
1559
1560 void sha512aix_decode (u8 digest[64], u8 buf[86])
1561 {
1562 int l;
1563
1564 l = itoa64_to_int (buf[ 0]) << 0;
1565 l |= itoa64_to_int (buf[ 1]) << 6;
1566 l |= itoa64_to_int (buf[ 2]) << 12;
1567 l |= itoa64_to_int (buf[ 3]) << 18;
1568
1569 digest[ 2] = (l >> 0) & 0xff;
1570 digest[ 1] = (l >> 8) & 0xff;
1571 digest[ 0] = (l >> 16) & 0xff;
1572
1573 l = itoa64_to_int (buf[ 4]) << 0;
1574 l |= itoa64_to_int (buf[ 5]) << 6;
1575 l |= itoa64_to_int (buf[ 6]) << 12;
1576 l |= itoa64_to_int (buf[ 7]) << 18;
1577
1578 digest[ 5] = (l >> 0) & 0xff;
1579 digest[ 4] = (l >> 8) & 0xff;
1580 digest[ 3] = (l >> 16) & 0xff;
1581
1582 l = itoa64_to_int (buf[ 8]) << 0;
1583 l |= itoa64_to_int (buf[ 9]) << 6;
1584 l |= itoa64_to_int (buf[10]) << 12;
1585 l |= itoa64_to_int (buf[11]) << 18;
1586
1587 digest[ 8] = (l >> 0) & 0xff;
1588 digest[ 7] = (l >> 8) & 0xff;
1589 digest[ 6] = (l >> 16) & 0xff;
1590
1591 l = itoa64_to_int (buf[12]) << 0;
1592 l |= itoa64_to_int (buf[13]) << 6;
1593 l |= itoa64_to_int (buf[14]) << 12;
1594 l |= itoa64_to_int (buf[15]) << 18;
1595
1596 digest[11] = (l >> 0) & 0xff;
1597 digest[10] = (l >> 8) & 0xff;
1598 digest[ 9] = (l >> 16) & 0xff;
1599
1600 l = itoa64_to_int (buf[16]) << 0;
1601 l |= itoa64_to_int (buf[17]) << 6;
1602 l |= itoa64_to_int (buf[18]) << 12;
1603 l |= itoa64_to_int (buf[19]) << 18;
1604
1605 digest[14] = (l >> 0) & 0xff;
1606 digest[13] = (l >> 8) & 0xff;
1607 digest[12] = (l >> 16) & 0xff;
1608
1609 l = itoa64_to_int (buf[20]) << 0;
1610 l |= itoa64_to_int (buf[21]) << 6;
1611 l |= itoa64_to_int (buf[22]) << 12;
1612 l |= itoa64_to_int (buf[23]) << 18;
1613
1614 digest[17] = (l >> 0) & 0xff;
1615 digest[16] = (l >> 8) & 0xff;
1616 digest[15] = (l >> 16) & 0xff;
1617
1618 l = itoa64_to_int (buf[24]) << 0;
1619 l |= itoa64_to_int (buf[25]) << 6;
1620 l |= itoa64_to_int (buf[26]) << 12;
1621 l |= itoa64_to_int (buf[27]) << 18;
1622
1623 digest[20] = (l >> 0) & 0xff;
1624 digest[19] = (l >> 8) & 0xff;
1625 digest[18] = (l >> 16) & 0xff;
1626
1627 l = itoa64_to_int (buf[28]) << 0;
1628 l |= itoa64_to_int (buf[29]) << 6;
1629 l |= itoa64_to_int (buf[30]) << 12;
1630 l |= itoa64_to_int (buf[31]) << 18;
1631
1632 digest[23] = (l >> 0) & 0xff;
1633 digest[22] = (l >> 8) & 0xff;
1634 digest[21] = (l >> 16) & 0xff;
1635
1636 l = itoa64_to_int (buf[32]) << 0;
1637 l |= itoa64_to_int (buf[33]) << 6;
1638 l |= itoa64_to_int (buf[34]) << 12;
1639 l |= itoa64_to_int (buf[35]) << 18;
1640
1641 digest[26] = (l >> 0) & 0xff;
1642 digest[25] = (l >> 8) & 0xff;
1643 digest[24] = (l >> 16) & 0xff;
1644
1645 l = itoa64_to_int (buf[36]) << 0;
1646 l |= itoa64_to_int (buf[37]) << 6;
1647 l |= itoa64_to_int (buf[38]) << 12;
1648 l |= itoa64_to_int (buf[39]) << 18;
1649
1650 digest[29] = (l >> 0) & 0xff;
1651 digest[28] = (l >> 8) & 0xff;
1652 digest[27] = (l >> 16) & 0xff;
1653
1654 l = itoa64_to_int (buf[40]) << 0;
1655 l |= itoa64_to_int (buf[41]) << 6;
1656 l |= itoa64_to_int (buf[42]) << 12;
1657 l |= itoa64_to_int (buf[43]) << 18;
1658
1659 digest[32] = (l >> 0) & 0xff;
1660 digest[31] = (l >> 8) & 0xff;
1661 digest[30] = (l >> 16) & 0xff;
1662
1663 l = itoa64_to_int (buf[44]) << 0;
1664 l |= itoa64_to_int (buf[45]) << 6;
1665 l |= itoa64_to_int (buf[46]) << 12;
1666 l |= itoa64_to_int (buf[47]) << 18;
1667
1668 digest[35] = (l >> 0) & 0xff;
1669 digest[34] = (l >> 8) & 0xff;
1670 digest[33] = (l >> 16) & 0xff;
1671
1672 l = itoa64_to_int (buf[48]) << 0;
1673 l |= itoa64_to_int (buf[49]) << 6;
1674 l |= itoa64_to_int (buf[50]) << 12;
1675 l |= itoa64_to_int (buf[51]) << 18;
1676
1677 digest[38] = (l >> 0) & 0xff;
1678 digest[37] = (l >> 8) & 0xff;
1679 digest[36] = (l >> 16) & 0xff;
1680
1681 l = itoa64_to_int (buf[52]) << 0;
1682 l |= itoa64_to_int (buf[53]) << 6;
1683 l |= itoa64_to_int (buf[54]) << 12;
1684 l |= itoa64_to_int (buf[55]) << 18;
1685
1686 digest[41] = (l >> 0) & 0xff;
1687 digest[40] = (l >> 8) & 0xff;
1688 digest[39] = (l >> 16) & 0xff;
1689
1690 l = itoa64_to_int (buf[56]) << 0;
1691 l |= itoa64_to_int (buf[57]) << 6;
1692 l |= itoa64_to_int (buf[58]) << 12;
1693 l |= itoa64_to_int (buf[59]) << 18;
1694
1695 digest[44] = (l >> 0) & 0xff;
1696 digest[43] = (l >> 8) & 0xff;
1697 digest[42] = (l >> 16) & 0xff;
1698
1699 l = itoa64_to_int (buf[60]) << 0;
1700 l |= itoa64_to_int (buf[61]) << 6;
1701 l |= itoa64_to_int (buf[62]) << 12;
1702 l |= itoa64_to_int (buf[63]) << 18;
1703
1704 digest[47] = (l >> 0) & 0xff;
1705 digest[46] = (l >> 8) & 0xff;
1706 digest[45] = (l >> 16) & 0xff;
1707
1708 l = itoa64_to_int (buf[64]) << 0;
1709 l |= itoa64_to_int (buf[65]) << 6;
1710 l |= itoa64_to_int (buf[66]) << 12;
1711 l |= itoa64_to_int (buf[67]) << 18;
1712
1713 digest[50] = (l >> 0) & 0xff;
1714 digest[49] = (l >> 8) & 0xff;
1715 digest[48] = (l >> 16) & 0xff;
1716
1717 l = itoa64_to_int (buf[68]) << 0;
1718 l |= itoa64_to_int (buf[69]) << 6;
1719 l |= itoa64_to_int (buf[70]) << 12;
1720 l |= itoa64_to_int (buf[71]) << 18;
1721
1722 digest[53] = (l >> 0) & 0xff;
1723 digest[52] = (l >> 8) & 0xff;
1724 digest[51] = (l >> 16) & 0xff;
1725
1726 l = itoa64_to_int (buf[72]) << 0;
1727 l |= itoa64_to_int (buf[73]) << 6;
1728 l |= itoa64_to_int (buf[74]) << 12;
1729 l |= itoa64_to_int (buf[75]) << 18;
1730
1731 digest[56] = (l >> 0) & 0xff;
1732 digest[55] = (l >> 8) & 0xff;
1733 digest[54] = (l >> 16) & 0xff;
1734
1735 l = itoa64_to_int (buf[76]) << 0;
1736 l |= itoa64_to_int (buf[77]) << 6;
1737 l |= itoa64_to_int (buf[78]) << 12;
1738 l |= itoa64_to_int (buf[79]) << 18;
1739
1740 digest[59] = (l >> 0) & 0xff;
1741 digest[58] = (l >> 8) & 0xff;
1742 digest[57] = (l >> 16) & 0xff;
1743
1744 l = itoa64_to_int (buf[80]) << 0;
1745 l |= itoa64_to_int (buf[81]) << 6;
1746 l |= itoa64_to_int (buf[82]) << 12;
1747 l |= itoa64_to_int (buf[83]) << 18;
1748
1749 digest[62] = (l >> 0) & 0xff;
1750 digest[61] = (l >> 8) & 0xff;
1751 digest[60] = (l >> 16) & 0xff;
1752
1753 l = itoa64_to_int (buf[84]) << 0;
1754 l |= itoa64_to_int (buf[85]) << 6;
1755
1756 digest[63] = (l >> 16) & 0xff;
1757 }
1758
1759 void sha512aix_encode (u8 digest[64], u8 buf[86])
1760 {
1761 int l;
1762
1763 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1764
1765 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1766 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1767 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1768 buf[ 3] = int_to_itoa64 (l & 0x3f);
1769
1770 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1771
1772 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1773 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1774 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1775 buf[ 7] = int_to_itoa64 (l & 0x3f);
1776
1777 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1778
1779 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1780 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1781 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1782 buf[11] = int_to_itoa64 (l & 0x3f);
1783
1784 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1785
1786 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1787 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1788 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1789 buf[15] = int_to_itoa64 (l & 0x3f);
1790
1791 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1792
1793 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1794 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1795 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1796 buf[19] = int_to_itoa64 (l & 0x3f);
1797
1798 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1799
1800 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1801 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1802 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1803 buf[23] = int_to_itoa64 (l & 0x3f);
1804
1805 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1806
1807 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1808 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1809 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1810 buf[27] = int_to_itoa64 (l & 0x3f);
1811
1812 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1813
1814 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1815 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1816 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1817 buf[31] = int_to_itoa64 (l & 0x3f);
1818
1819 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1820
1821 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1822 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1823 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1824 buf[35] = int_to_itoa64 (l & 0x3f);
1825
1826 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1827
1828 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1829 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1830 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1831 buf[39] = int_to_itoa64 (l & 0x3f);
1832
1833 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1834
1835 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1836 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1837 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1838 buf[43] = int_to_itoa64 (l & 0x3f);
1839
1840 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1841
1842 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1843 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1844 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1845 buf[47] = int_to_itoa64 (l & 0x3f);
1846
1847 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1848
1849 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1850 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1851 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1852 buf[51] = int_to_itoa64 (l & 0x3f);
1853
1854 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1855
1856 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1857 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1858 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1859 buf[55] = int_to_itoa64 (l & 0x3f);
1860
1861 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1862
1863 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1864 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1865 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1866 buf[59] = int_to_itoa64 (l & 0x3f);
1867
1868 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1869
1870 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1871 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1872 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1873 buf[63] = int_to_itoa64 (l & 0x3f);
1874
1875 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1876
1877 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1878 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1879 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1880 buf[67] = int_to_itoa64 (l & 0x3f);
1881
1882 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1883
1884 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1885 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1886 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1887 buf[71] = int_to_itoa64 (l & 0x3f);
1888
1889 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1890
1891 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1892 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1893 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1894 buf[75] = int_to_itoa64 (l & 0x3f);
1895
1896 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1897
1898 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1899 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1900 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1901 buf[79] = int_to_itoa64 (l & 0x3f);
1902
1903 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1904
1905 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1906 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1907 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1908 buf[83] = int_to_itoa64 (l & 0x3f);
1909
1910 l = 0 | 0 | (digest[63] << 16);
1911
1912 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1913 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1914 }
1915
1916 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1917 {
1918 int l;
1919
1920 l = itoa64_to_int (buf[ 0]) << 0;
1921 l |= itoa64_to_int (buf[ 1]) << 6;
1922 l |= itoa64_to_int (buf[ 2]) << 12;
1923 l |= itoa64_to_int (buf[ 3]) << 18;
1924
1925 digest[ 0] = (l >> 16) & 0xff;
1926 digest[10] = (l >> 8) & 0xff;
1927 digest[20] = (l >> 0) & 0xff;
1928
1929 l = itoa64_to_int (buf[ 4]) << 0;
1930 l |= itoa64_to_int (buf[ 5]) << 6;
1931 l |= itoa64_to_int (buf[ 6]) << 12;
1932 l |= itoa64_to_int (buf[ 7]) << 18;
1933
1934 digest[21] = (l >> 16) & 0xff;
1935 digest[ 1] = (l >> 8) & 0xff;
1936 digest[11] = (l >> 0) & 0xff;
1937
1938 l = itoa64_to_int (buf[ 8]) << 0;
1939 l |= itoa64_to_int (buf[ 9]) << 6;
1940 l |= itoa64_to_int (buf[10]) << 12;
1941 l |= itoa64_to_int (buf[11]) << 18;
1942
1943 digest[12] = (l >> 16) & 0xff;
1944 digest[22] = (l >> 8) & 0xff;
1945 digest[ 2] = (l >> 0) & 0xff;
1946
1947 l = itoa64_to_int (buf[12]) << 0;
1948 l |= itoa64_to_int (buf[13]) << 6;
1949 l |= itoa64_to_int (buf[14]) << 12;
1950 l |= itoa64_to_int (buf[15]) << 18;
1951
1952 digest[ 3] = (l >> 16) & 0xff;
1953 digest[13] = (l >> 8) & 0xff;
1954 digest[23] = (l >> 0) & 0xff;
1955
1956 l = itoa64_to_int (buf[16]) << 0;
1957 l |= itoa64_to_int (buf[17]) << 6;
1958 l |= itoa64_to_int (buf[18]) << 12;
1959 l |= itoa64_to_int (buf[19]) << 18;
1960
1961 digest[24] = (l >> 16) & 0xff;
1962 digest[ 4] = (l >> 8) & 0xff;
1963 digest[14] = (l >> 0) & 0xff;
1964
1965 l = itoa64_to_int (buf[20]) << 0;
1966 l |= itoa64_to_int (buf[21]) << 6;
1967 l |= itoa64_to_int (buf[22]) << 12;
1968 l |= itoa64_to_int (buf[23]) << 18;
1969
1970 digest[15] = (l >> 16) & 0xff;
1971 digest[25] = (l >> 8) & 0xff;
1972 digest[ 5] = (l >> 0) & 0xff;
1973
1974 l = itoa64_to_int (buf[24]) << 0;
1975 l |= itoa64_to_int (buf[25]) << 6;
1976 l |= itoa64_to_int (buf[26]) << 12;
1977 l |= itoa64_to_int (buf[27]) << 18;
1978
1979 digest[ 6] = (l >> 16) & 0xff;
1980 digest[16] = (l >> 8) & 0xff;
1981 digest[26] = (l >> 0) & 0xff;
1982
1983 l = itoa64_to_int (buf[28]) << 0;
1984 l |= itoa64_to_int (buf[29]) << 6;
1985 l |= itoa64_to_int (buf[30]) << 12;
1986 l |= itoa64_to_int (buf[31]) << 18;
1987
1988 digest[27] = (l >> 16) & 0xff;
1989 digest[ 7] = (l >> 8) & 0xff;
1990 digest[17] = (l >> 0) & 0xff;
1991
1992 l = itoa64_to_int (buf[32]) << 0;
1993 l |= itoa64_to_int (buf[33]) << 6;
1994 l |= itoa64_to_int (buf[34]) << 12;
1995 l |= itoa64_to_int (buf[35]) << 18;
1996
1997 digest[18] = (l >> 16) & 0xff;
1998 digest[28] = (l >> 8) & 0xff;
1999 digest[ 8] = (l >> 0) & 0xff;
2000
2001 l = itoa64_to_int (buf[36]) << 0;
2002 l |= itoa64_to_int (buf[37]) << 6;
2003 l |= itoa64_to_int (buf[38]) << 12;
2004 l |= itoa64_to_int (buf[39]) << 18;
2005
2006 digest[ 9] = (l >> 16) & 0xff;
2007 digest[19] = (l >> 8) & 0xff;
2008 digest[29] = (l >> 0) & 0xff;
2009
2010 l = itoa64_to_int (buf[40]) << 0;
2011 l |= itoa64_to_int (buf[41]) << 6;
2012 l |= itoa64_to_int (buf[42]) << 12;
2013
2014 digest[31] = (l >> 8) & 0xff;
2015 digest[30] = (l >> 0) & 0xff;
2016 }
2017
2018 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2019 {
2020 int l;
2021
2022 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2023
2024 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2025 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2026 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2027 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028
2029 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2030
2031 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2032 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2033 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2034 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035
2036 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2037
2038 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2039 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2040 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2041 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042
2043 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2044
2045 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2046 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2047 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2048 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049
2050 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2051
2052 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2053 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2054 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2055 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056
2057 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2058
2059 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2060 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2061 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2062 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063
2064 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2065
2066 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2067 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2068 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2069 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070
2071 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2072
2073 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2074 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2075 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2076 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077
2078 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2079
2080 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2081 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2082 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2083 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084
2085 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2086
2087 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2088 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2089 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2090 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2091
2092 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2093
2094 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2095 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2096 buf[42] = int_to_itoa64 (l & 0x3f);
2097 }
2098
2099 void drupal7_decode (u8 digest[64], u8 buf[44])
2100 {
2101 int l;
2102
2103 l = itoa64_to_int (buf[ 0]) << 0;
2104 l |= itoa64_to_int (buf[ 1]) << 6;
2105 l |= itoa64_to_int (buf[ 2]) << 12;
2106 l |= itoa64_to_int (buf[ 3]) << 18;
2107
2108 digest[ 0] = (l >> 0) & 0xff;
2109 digest[ 1] = (l >> 8) & 0xff;
2110 digest[ 2] = (l >> 16) & 0xff;
2111
2112 l = itoa64_to_int (buf[ 4]) << 0;
2113 l |= itoa64_to_int (buf[ 5]) << 6;
2114 l |= itoa64_to_int (buf[ 6]) << 12;
2115 l |= itoa64_to_int (buf[ 7]) << 18;
2116
2117 digest[ 3] = (l >> 0) & 0xff;
2118 digest[ 4] = (l >> 8) & 0xff;
2119 digest[ 5] = (l >> 16) & 0xff;
2120
2121 l = itoa64_to_int (buf[ 8]) << 0;
2122 l |= itoa64_to_int (buf[ 9]) << 6;
2123 l |= itoa64_to_int (buf[10]) << 12;
2124 l |= itoa64_to_int (buf[11]) << 18;
2125
2126 digest[ 6] = (l >> 0) & 0xff;
2127 digest[ 7] = (l >> 8) & 0xff;
2128 digest[ 8] = (l >> 16) & 0xff;
2129
2130 l = itoa64_to_int (buf[12]) << 0;
2131 l |= itoa64_to_int (buf[13]) << 6;
2132 l |= itoa64_to_int (buf[14]) << 12;
2133 l |= itoa64_to_int (buf[15]) << 18;
2134
2135 digest[ 9] = (l >> 0) & 0xff;
2136 digest[10] = (l >> 8) & 0xff;
2137 digest[11] = (l >> 16) & 0xff;
2138
2139 l = itoa64_to_int (buf[16]) << 0;
2140 l |= itoa64_to_int (buf[17]) << 6;
2141 l |= itoa64_to_int (buf[18]) << 12;
2142 l |= itoa64_to_int (buf[19]) << 18;
2143
2144 digest[12] = (l >> 0) & 0xff;
2145 digest[13] = (l >> 8) & 0xff;
2146 digest[14] = (l >> 16) & 0xff;
2147
2148 l = itoa64_to_int (buf[20]) << 0;
2149 l |= itoa64_to_int (buf[21]) << 6;
2150 l |= itoa64_to_int (buf[22]) << 12;
2151 l |= itoa64_to_int (buf[23]) << 18;
2152
2153 digest[15] = (l >> 0) & 0xff;
2154 digest[16] = (l >> 8) & 0xff;
2155 digest[17] = (l >> 16) & 0xff;
2156
2157 l = itoa64_to_int (buf[24]) << 0;
2158 l |= itoa64_to_int (buf[25]) << 6;
2159 l |= itoa64_to_int (buf[26]) << 12;
2160 l |= itoa64_to_int (buf[27]) << 18;
2161
2162 digest[18] = (l >> 0) & 0xff;
2163 digest[19] = (l >> 8) & 0xff;
2164 digest[20] = (l >> 16) & 0xff;
2165
2166 l = itoa64_to_int (buf[28]) << 0;
2167 l |= itoa64_to_int (buf[29]) << 6;
2168 l |= itoa64_to_int (buf[30]) << 12;
2169 l |= itoa64_to_int (buf[31]) << 18;
2170
2171 digest[21] = (l >> 0) & 0xff;
2172 digest[22] = (l >> 8) & 0xff;
2173 digest[23] = (l >> 16) & 0xff;
2174
2175 l = itoa64_to_int (buf[32]) << 0;
2176 l |= itoa64_to_int (buf[33]) << 6;
2177 l |= itoa64_to_int (buf[34]) << 12;
2178 l |= itoa64_to_int (buf[35]) << 18;
2179
2180 digest[24] = (l >> 0) & 0xff;
2181 digest[25] = (l >> 8) & 0xff;
2182 digest[26] = (l >> 16) & 0xff;
2183
2184 l = itoa64_to_int (buf[36]) << 0;
2185 l |= itoa64_to_int (buf[37]) << 6;
2186 l |= itoa64_to_int (buf[38]) << 12;
2187 l |= itoa64_to_int (buf[39]) << 18;
2188
2189 digest[27] = (l >> 0) & 0xff;
2190 digest[28] = (l >> 8) & 0xff;
2191 digest[29] = (l >> 16) & 0xff;
2192
2193 l = itoa64_to_int (buf[40]) << 0;
2194 l |= itoa64_to_int (buf[41]) << 6;
2195 l |= itoa64_to_int (buf[42]) << 12;
2196 l |= itoa64_to_int (buf[43]) << 18;
2197
2198 digest[30] = (l >> 0) & 0xff;
2199 digest[31] = (l >> 8) & 0xff;
2200 digest[32] = (l >> 16) & 0xff;
2201
2202 digest[33] = 0;
2203 digest[34] = 0;
2204 digest[35] = 0;
2205 digest[36] = 0;
2206 digest[37] = 0;
2207 digest[38] = 0;
2208 digest[39] = 0;
2209 digest[40] = 0;
2210 digest[41] = 0;
2211 digest[42] = 0;
2212 digest[43] = 0;
2213 digest[44] = 0;
2214 digest[45] = 0;
2215 digest[46] = 0;
2216 digest[47] = 0;
2217 digest[48] = 0;
2218 digest[49] = 0;
2219 digest[50] = 0;
2220 digest[51] = 0;
2221 digest[52] = 0;
2222 digest[53] = 0;
2223 digest[54] = 0;
2224 digest[55] = 0;
2225 digest[56] = 0;
2226 digest[57] = 0;
2227 digest[58] = 0;
2228 digest[59] = 0;
2229 digest[60] = 0;
2230 digest[61] = 0;
2231 digest[62] = 0;
2232 digest[63] = 0;
2233 }
2234
2235 void drupal7_encode (u8 digest[64], u8 buf[43])
2236 {
2237 int l;
2238
2239 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2240
2241 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2242 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2243 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2244 buf[ 3] = int_to_itoa64 (l & 0x3f);
2245
2246 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2247
2248 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2249 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2250 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2251 buf[ 7] = int_to_itoa64 (l & 0x3f);
2252
2253 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2254
2255 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2256 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2257 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2258 buf[11] = int_to_itoa64 (l & 0x3f);
2259
2260 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2261
2262 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2263 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2264 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2265 buf[15] = int_to_itoa64 (l & 0x3f);
2266
2267 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2268
2269 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2270 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2271 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2272 buf[19] = int_to_itoa64 (l & 0x3f);
2273
2274 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2275
2276 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2277 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2278 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2279 buf[23] = int_to_itoa64 (l & 0x3f);
2280
2281 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2282
2283 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2284 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2285 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2286 buf[27] = int_to_itoa64 (l & 0x3f);
2287
2288 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2289
2290 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2291 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2292 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2293 buf[31] = int_to_itoa64 (l & 0x3f);
2294
2295 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2296
2297 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2298 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2299 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2300 buf[35] = int_to_itoa64 (l & 0x3f);
2301
2302 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2303
2304 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2305 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2306 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2307 buf[39] = int_to_itoa64 (l & 0x3f);
2308
2309 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2310
2311 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2312 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2313 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2314 //buf[43] = int_to_itoa64 (l & 0x3f);
2315 }
2316
2317 /**
2318 * tty
2319 */
2320
2321 #ifdef LINUX
2322 static struct termio savemodes;
2323 static int havemodes = 0;
2324
2325 int tty_break()
2326 {
2327 struct termio modmodes;
2328
2329 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2330
2331 havemodes = 1;
2332
2333 modmodes = savemodes;
2334 modmodes.c_lflag &= ~ICANON;
2335 modmodes.c_cc[VMIN] = 1;
2336 modmodes.c_cc[VTIME] = 0;
2337
2338 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2339 }
2340
2341 int tty_getchar()
2342 {
2343 fd_set rfds;
2344
2345 FD_ZERO (&rfds);
2346
2347 FD_SET (fileno (stdin), &rfds);
2348
2349 struct timeval tv;
2350
2351 tv.tv_sec = 1;
2352 tv.tv_usec = 0;
2353
2354 int retval = select (1, &rfds, NULL, NULL, &tv);
2355
2356 if (retval == 0) return 0;
2357 if (retval == -1) return -1;
2358
2359 return getchar();
2360 }
2361
2362 int tty_fix()
2363 {
2364 if (!havemodes) return 0;
2365
2366 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2367 }
2368 #endif
2369
2370 #ifdef OSX
2371 static struct termios savemodes;
2372 static int havemodes = 0;
2373
2374 int tty_break()
2375 {
2376 struct termios modmodes;
2377
2378 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2379
2380 havemodes = 1;
2381
2382 modmodes = savemodes;
2383 modmodes.c_lflag &= ~ICANON;
2384 modmodes.c_cc[VMIN] = 1;
2385 modmodes.c_cc[VTIME] = 0;
2386
2387 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2388 }
2389
2390 int tty_getchar()
2391 {
2392 fd_set rfds;
2393
2394 FD_ZERO (&rfds);
2395
2396 FD_SET (fileno (stdin), &rfds);
2397
2398 struct timeval tv;
2399
2400 tv.tv_sec = 1;
2401 tv.tv_usec = 0;
2402
2403 int retval = select (1, &rfds, NULL, NULL, &tv);
2404
2405 if (retval == 0) return 0;
2406 if (retval == -1) return -1;
2407
2408 return getchar();
2409 }
2410
2411 int tty_fix()
2412 {
2413 if (!havemodes) return 0;
2414
2415 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2416 }
2417 #endif
2418
2419 #ifdef WIN
2420 static DWORD saveMode = 0;
2421
2422 int tty_break()
2423 {
2424 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2425
2426 GetConsoleMode (stdinHandle, &saveMode);
2427 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2428
2429 return 0;
2430 }
2431
2432 int tty_getchar()
2433 {
2434 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2435
2436 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2437
2438 if (rc == WAIT_TIMEOUT) return 0;
2439 if (rc == WAIT_ABANDONED) return -1;
2440 if (rc == WAIT_FAILED) return -1;
2441
2442 // The whole ReadConsoleInput () part is a workaround.
2443 // For some unknown reason, maybe a mingw bug, a random signal
2444 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2445 // Then it wants to read with getche () a keyboard input
2446 // which has never been made.
2447
2448 INPUT_RECORD buf[100];
2449
2450 DWORD num = 0;
2451
2452 memset (buf, 0, sizeof (buf));
2453
2454 ReadConsoleInput (stdinHandle, buf, 100, &num);
2455
2456 FlushConsoleInputBuffer (stdinHandle);
2457
2458 for (uint i = 0; i < num; i++)
2459 {
2460 if (buf[i].EventType != KEY_EVENT) continue;
2461
2462 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2463
2464 if (KeyEvent.bKeyDown != TRUE) continue;
2465
2466 return KeyEvent.uChar.AsciiChar;
2467 }
2468
2469 return 0;
2470 }
2471
2472 int tty_fix()
2473 {
2474 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2475
2476 SetConsoleMode (stdinHandle, saveMode);
2477
2478 return 0;
2479 }
2480 #endif
2481
2482 /**
2483 * mem alloc
2484 */
2485
2486 #define MSG_ENOMEM "Insufficient memory available"
2487
2488 void *mycalloc (size_t nmemb, size_t size)
2489 {
2490 void *p = calloc (nmemb, size);
2491
2492 if (p == NULL)
2493 {
2494 log_error ("ERROR: %s", MSG_ENOMEM);
2495
2496 exit (-1);
2497 }
2498
2499 return (p);
2500 }
2501
2502 void *mymalloc (size_t size)
2503 {
2504 void *p = malloc (size);
2505
2506 if (p == NULL)
2507 {
2508 log_error ("ERROR: %s", MSG_ENOMEM);
2509
2510 exit (-1);
2511 }
2512
2513 memset (p, 0, size);
2514
2515 return (p);
2516 }
2517
2518 void myfree (void *ptr)
2519 {
2520 if (ptr == NULL) return;
2521
2522 free (ptr);
2523 }
2524
2525 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2526 {
2527 void *p = realloc (ptr, oldsz + add);
2528
2529 if (p == NULL)
2530 {
2531 log_error ("ERROR: %s", MSG_ENOMEM);
2532
2533 exit (-1);
2534 }
2535
2536 memset ((char *) p + oldsz, 0, add);
2537
2538 return (p);
2539 }
2540
2541 char *mystrdup (const char *s)
2542 {
2543 const size_t len = strlen (s);
2544
2545 char *b = (char *) mymalloc (len + 1);
2546
2547 memcpy (b, s, len);
2548
2549 return (b);
2550 }
2551
2552 FILE *logfile_open (char *logfile)
2553 {
2554 FILE *fp = fopen (logfile, "ab");
2555
2556 if (fp == NULL)
2557 {
2558 fp = stdout;
2559 }
2560
2561 return fp;
2562 }
2563
2564 void logfile_close (FILE *fp)
2565 {
2566 if (fp == stdout) return;
2567
2568 fclose (fp);
2569 }
2570
2571 void logfile_append (const char *fmt, ...)
2572 {
2573 if (data.logfile_disable == 1) return;
2574
2575 FILE *fp = logfile_open (data.logfile);
2576
2577 va_list ap;
2578
2579 va_start (ap, fmt);
2580
2581 vfprintf (fp, fmt, ap);
2582
2583 va_end (ap);
2584
2585 fputc ('\n', fp);
2586
2587 fflush (fp);
2588
2589 logfile_close (fp);
2590 }
2591
2592 int logfile_generate_id ()
2593 {
2594 const int n = rand ();
2595
2596 time_t t;
2597
2598 time (&t);
2599
2600 return t + n;
2601 }
2602
2603 char *logfile_generate_topid ()
2604 {
2605 const int id = logfile_generate_id ();
2606
2607 char *topid = (char *) mymalloc (1 + 16 + 1);
2608
2609 snprintf (topid, 1 + 16, "TOP%08x", id);
2610
2611 return topid;
2612 }
2613
2614 char *logfile_generate_subid ()
2615 {
2616 const int id = logfile_generate_id ();
2617
2618 char *subid = (char *) mymalloc (1 + 16 + 1);
2619
2620 snprintf (subid, 1 + 16, "SUB%08x", id);
2621
2622 return subid;
2623 }
2624
2625 /**
2626 * system
2627 */
2628
2629 #if F_SETLKW
2630 void lock_file (FILE *fp)
2631 {
2632 struct flock lock;
2633
2634 memset (&lock, 0, sizeof (struct flock));
2635
2636 lock.l_type = F_WRLCK;
2637 while (fcntl(fileno(fp), F_SETLKW, &lock))
2638 {
2639 if (errno != EINTR)
2640 {
2641 log_error ("ERROR: failed acquiring write lock: %s", strerror (errno));
2642
2643 exit (-1);
2644 }
2645 }
2646 }
2647
2648 void unlock_file (FILE *fp)
2649 {
2650 struct flock lock;
2651
2652 memset (&lock, 0, sizeof (struct flock));
2653
2654 lock.l_type = F_UNLCK;
2655 fcntl(fileno(fp), F_SETLK, &lock);
2656 }
2657 #endif // F_SETLKW
2658
2659 #ifdef _WIN
2660 void fsync (int fd)
2661 {
2662 HANDLE h = (HANDLE) _get_osfhandle (fd);
2663
2664 FlushFileBuffers (h);
2665 }
2666 #endif
2667
2668 /**
2669 * thermal
2670 */
2671
2672 #ifdef HAVE_HWMON
2673 #if defined(_WIN) && defined(HAVE_NVAPI)
2674 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2675 {
2676 NvU32 pGpuCount;
2677
2678 if (hm_NvAPI_EnumPhysicalGPUs (data.hm_nv, nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2679
2680 if (pGpuCount == 0)
2681 {
2682 log_info ("WARN: No NvAPI adapters found");
2683
2684 return (0);
2685 }
2686
2687 return (pGpuCount);
2688 }
2689 #endif // _WIN && HAVE_NVAPI
2690
2691 #if defined(LINUX) && defined(HAVE_NVML)
2692 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2693 {
2694 int pGpuCount = 0;
2695
2696 for (uint i = 0; i < DEVICES_MAX; i++)
2697 {
2698 if (hm_NVML_nvmlDeviceGetHandleByIndex (data.hm_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2699
2700 // can be used to determine if the device by index matches the cuda device by index
2701 // char name[100]; memset (name, 0, sizeof (name));
2702 // hm_NVML_nvmlDeviceGetName (data.hm_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2703
2704 pGpuCount++;
2705 }
2706
2707 if (pGpuCount == 0)
2708 {
2709 log_info ("WARN: No NVML adapters found");
2710
2711 return (0);
2712 }
2713
2714 return (pGpuCount);
2715 }
2716 #endif // LINUX && HAVE_NVML
2717
2718 #ifdef HAVE_ADL
2719 int get_adapters_num_amd (void *adl, int *iNumberAdapters)
2720 {
2721 if (hm_ADL_Adapter_NumberOfAdapters_Get ((ADL_PTR *) adl, iNumberAdapters) != ADL_OK) return -1;
2722
2723 if (iNumberAdapters == 0)
2724 {
2725 log_info ("WARN: No ADL adapters found.");
2726
2727 return -1;
2728 }
2729
2730 return 0;
2731 }
2732
2733 /*
2734 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2735 {
2736 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2737 ADLODParameters lpOdParameters;
2738
2739 lpOdParameters.iSize = sizeof (ADLODParameters);
2740 size_t plevels_size = 0;
2741
2742 if (hm_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2743
2744 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2745 __func__, iAdapterIndex,
2746 lpOdParameters.iNumberOfPerformanceLevels,
2747 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2748 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2749
2750 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2751
2752 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2753
2754 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2755
2756 if (hm_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2757
2758 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2759 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2760 __func__, iAdapterIndex, j,
2761 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2762
2763 myfree (lpOdPerformanceLevels);
2764
2765 return 0;
2766 }
2767 */
2768
2769 LPAdapterInfo hm_get_adapter_info_amd (void *adl, int iNumberAdapters)
2770 {
2771 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2772
2773 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2774
2775 if (hm_ADL_Adapter_AdapterInfo_Get ((ADL_PTR *) adl, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2776
2777 return lpAdapterInfo;
2778 }
2779
2780 /*
2781 //
2782 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2783 //
2784
2785 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2786 {
2787 u32 idx = -1;
2788
2789 for (uint i = 0; i < num_adl_adapters; i++)
2790 {
2791 int opencl_bus_num = hm_device[i].busid;
2792 int opencl_dev_num = hm_device[i].devid;
2793
2794 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2795 {
2796 idx = i;
2797
2798 break;
2799 }
2800 }
2801
2802 if (idx >= DEVICES_MAX) return -1;
2803
2804 return idx;
2805 }
2806
2807 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2808 {
2809 for (uint i = 0; i < opencl_num_devices; i++)
2810 {
2811 cl_device_topology_amd device_topology;
2812
2813 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2814
2815 hm_device[i].busid = device_topology.pcie.bus;
2816 hm_device[i].devid = device_topology.pcie.device;
2817 }
2818 }
2819 */
2820
2821 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2822 {
2823 // basically bubble sort
2824
2825 for (int i = 0; i < num_adl_adapters; i++)
2826 {
2827 for (int j = 0; j < num_adl_adapters - 1; j++)
2828 {
2829 // get info of adapter [x]
2830
2831 u32 adapter_index_x = valid_adl_device_list[j];
2832 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2833
2834 u32 bus_num_x = info_x.iBusNumber;
2835 u32 dev_num_x = info_x.iDeviceNumber;
2836
2837 // get info of adapter [y]
2838
2839 u32 adapter_index_y = valid_adl_device_list[j + 1];
2840 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2841
2842 u32 bus_num_y = info_y.iBusNumber;
2843 u32 dev_num_y = info_y.iDeviceNumber;
2844
2845 uint need_swap = 0;
2846
2847 if (bus_num_y < bus_num_x)
2848 {
2849 need_swap = 1;
2850 }
2851 else if (bus_num_y == bus_num_x)
2852 {
2853 if (dev_num_y < dev_num_x)
2854 {
2855 need_swap = 1;
2856 }
2857 }
2858
2859 if (need_swap == 1)
2860 {
2861 u32 temp = valid_adl_device_list[j + 1];
2862
2863 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2864 valid_adl_device_list[j + 0] = temp;
2865 }
2866 }
2867 }
2868 }
2869
2870 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2871 {
2872 *num_adl_adapters = 0;
2873
2874 u32 *adl_adapters = NULL;
2875
2876 int *bus_numbers = NULL;
2877 int *device_numbers = NULL;
2878
2879 for (int i = 0; i < iNumberAdapters; i++)
2880 {
2881 AdapterInfo info = lpAdapterInfo[i];
2882
2883 if (strlen (info.strUDID) < 1) continue;
2884
2885 #ifdef WIN
2886 if (info.iVendorID != 1002) continue;
2887 #else
2888 if (info.iVendorID != 0x1002) continue;
2889 #endif
2890
2891 if (info.iBusNumber < 0) continue;
2892 if (info.iDeviceNumber < 0) continue;
2893
2894 int found = 0;
2895
2896 for (int pos = 0; pos < *num_adl_adapters; pos++)
2897 {
2898 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2899 {
2900 found = 1;
2901 break;
2902 }
2903 }
2904
2905 if (found) continue;
2906
2907 // add it to the list
2908
2909 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2910
2911 adl_adapters[*num_adl_adapters] = i;
2912
2913 // rest is just bookkeeping
2914
2915 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2916 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2917
2918 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2919 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2920
2921 (*num_adl_adapters)++;
2922 }
2923
2924 myfree (bus_numbers);
2925 myfree (device_numbers);
2926
2927 // sort the list by increasing bus id, device id number
2928
2929 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2930
2931 return adl_adapters;
2932 }
2933
2934 int hm_check_fanspeed_control (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2935 {
2936 // loop through all valid devices
2937
2938 for (int i = 0; i < num_adl_adapters; i++)
2939 {
2940 u32 adapter_index = valid_adl_device_list[i];
2941
2942 // get AdapterInfo
2943
2944 AdapterInfo info = lpAdapterInfo[adapter_index];
2945
2946 // unfortunately this doesn't work since bus id and dev id are not unique
2947 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2948 // if (opencl_device_index == -1) continue;
2949
2950 int opencl_device_index = i;
2951
2952 // if (hm_show_performance_level (adl, info.iAdapterIndex) != 0) return -1;
2953
2954 // get fanspeed info
2955
2956 if (hm_device[opencl_device_index].od_version == 5)
2957 {
2958 ADLFanSpeedInfo FanSpeedInfo;
2959
2960 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2961
2962 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2963
2964 if (hm_ADL_Overdrive5_FanSpeedInfo_Get (adl, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2965
2966 // check read and write capability in fanspeedinfo
2967
2968 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2969 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2970 {
2971 hm_device[opencl_device_index].fan_supported = 1;
2972 }
2973 else
2974 {
2975 hm_device[opencl_device_index].fan_supported = 0;
2976 }
2977 }
2978 else // od_version == 6
2979 {
2980 ADLOD6FanSpeedInfo faninfo;
2981
2982 memset (&faninfo, 0, sizeof (faninfo));
2983
2984 if (hm_ADL_Overdrive6_FanSpeed_Get (adl, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2985
2986 // check read capability in fanspeedinfo
2987
2988 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2989 {
2990 hm_device[opencl_device_index].fan_supported = 1;
2991 }
2992 else
2993 {
2994 hm_device[opencl_device_index].fan_supported = 0;
2995 }
2996 }
2997 }
2998
2999 return 0;
3000 }
3001
3002 int hm_get_overdrive_version (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3003 {
3004 for (int i = 0; i < num_adl_adapters; i++)
3005 {
3006 u32 adapter_index = valid_adl_device_list[i];
3007
3008 // get AdapterInfo
3009
3010 AdapterInfo info = lpAdapterInfo[adapter_index];
3011
3012 // get overdrive version
3013
3014 int od_supported = 0;
3015 int od_enabled = 0;
3016 int od_version = 0;
3017
3018 if (hm_ADL_Overdrive_Caps (adl, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3019
3020 // store the overdrive version in hm_device
3021
3022 // unfortunately this doesn't work since bus id and dev id are not unique
3023 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3024 // if (opencl_device_index == -1) continue;
3025
3026 int opencl_device_index = i;
3027
3028 hm_device[opencl_device_index].od_version = od_version;
3029 }
3030
3031 return 0;
3032 }
3033
3034 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3035 {
3036 for (int i = 0; i < num_adl_adapters; i++)
3037 {
3038 u32 adapter_index = valid_adl_device_list[i];
3039
3040 // get AdapterInfo
3041
3042 AdapterInfo info = lpAdapterInfo[adapter_index];
3043
3044 // store the iAdapterIndex in hm_device
3045
3046 // unfortunately this doesn't work since bus id and dev id are not unique
3047 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3048 // if (opencl_device_index == -1) continue;
3049
3050 int opencl_device_index = i;
3051
3052 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3053 }
3054
3055 return num_adl_adapters;
3056 }
3057 #endif // HAVE_ADL
3058
3059 int hm_get_temperature_with_device_id (const uint device_id)
3060 {
3061 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3062
3063 #ifdef HAVE_ADL
3064 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3065 {
3066 if (data.hm_amd)
3067 {
3068 if (data.hm_device[device_id].od_version == 5)
3069 {
3070 ADLTemperature Temperature;
3071
3072 Temperature.iSize = sizeof (ADLTemperature);
3073
3074 if (hm_ADL_Overdrive5_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3075
3076 return Temperature.iTemperature / 1000;
3077 }
3078 else if (data.hm_device[device_id].od_version == 6)
3079 {
3080 int Temperature = 0;
3081
3082 if (hm_ADL_Overdrive6_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3083
3084 return Temperature / 1000;
3085 }
3086 }
3087 }
3088 #endif
3089
3090 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3091 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3092 {
3093 #if defined(LINUX) && defined(HAVE_NVML)
3094 int temperature = 0;
3095
3096 hm_NVML_nvmlDeviceGetTemperature (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3097
3098 return temperature;
3099 #endif
3100
3101 #if defined(WIN) && defined(HAVE_NVAPI)
3102 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3103
3104 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3105 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3106 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3107 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3108
3109 if (hm_NvAPI_GPU_GetThermalSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3110
3111 return pThermalSettings.sensor[0].currentTemp;
3112 #endif // WIN && HAVE_NVAPI
3113 }
3114 #endif // HAVE_NVML || HAVE_NVAPI
3115
3116 return -1;
3117 }
3118
3119 int hm_get_fanspeed_with_device_id (const uint device_id)
3120 {
3121 // we shouldn't really need this extra CL_DEVICE_TYPE_GPU check, because fan_supported should not be set w/ CPUs
3122 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3123
3124 if (data.hm_device[device_id].fan_supported == 1)
3125 {
3126 #ifdef HAVE_ADL
3127 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3128 {
3129 if (data.hm_amd)
3130 {
3131 if (data.hm_device[device_id].od_version == 5)
3132 {
3133 ADLFanSpeedValue lpFanSpeedValue;
3134
3135 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3136
3137 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3138 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3139 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3140
3141 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3142
3143 return lpFanSpeedValue.iFanSpeed;
3144 }
3145 else // od_version == 6
3146 {
3147 ADLOD6FanSpeedInfo faninfo;
3148
3149 memset (&faninfo, 0, sizeof (faninfo));
3150
3151 if (hm_ADL_Overdrive6_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3152
3153 return faninfo.iFanSpeedPercent;
3154 }
3155 }
3156 }
3157 #endif // HAVE_ADL
3158
3159 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3160 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3161 {
3162 #if defined(LINUX) && defined(HAVE_NVML)
3163 int speed = 0;
3164
3165 hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, (unsigned int *) &speed);
3166
3167 return speed;
3168 #endif
3169
3170 #if defined(WIN) && defined(HAVE_NVAPI)
3171
3172 NV_GPU_COOLER_SETTINGS pCoolerSettings;
3173
3174 pCoolerSettings.Version = GPU_COOLER_SETTINGS_VER | sizeof (NV_GPU_COOLER_SETTINGS);
3175
3176 hm_NvAPI_GPU_GetCoolerSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pCoolerSettings);
3177
3178 return pCoolerSettings.Cooler[0].CurrentLevel;
3179 #endif
3180 }
3181 #endif // HAVE_NVML || HAVE_NVAPI
3182 }
3183
3184 return -1;
3185 }
3186
3187 int hm_get_utilization_with_device_id (const uint device_id)
3188 {
3189 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3190
3191 #ifdef HAVE_ADL
3192 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3193 {
3194 if (data.hm_amd)
3195 {
3196 ADLPMActivity PMActivity;
3197
3198 PMActivity.iSize = sizeof (ADLPMActivity);
3199
3200 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3201
3202 return PMActivity.iActivityPercent;
3203 }
3204 }
3205 #endif // HAVE_ADL
3206
3207 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3208 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3209 {
3210 #if defined(LINUX) && defined(HAVE_NVML)
3211 nvmlUtilization_t utilization;
3212
3213 hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3214
3215 return utilization.gpu;
3216 #endif
3217
3218 #if defined(WIN) && defined(HAVE_NVAPI)
3219 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3220
3221 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3222
3223 if (hm_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3224
3225 return pDynamicPstatesInfoEx.utilization[0].percentage;
3226 #endif
3227 }
3228 #endif // HAVE_NVML || HAVE_NVAPI
3229
3230 return -1;
3231 }
3232
3233 #ifdef HAVE_ADL
3234 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3235 {
3236 if (data.hm_device[device_id].fan_supported == 1)
3237 {
3238 if (data.hm_amd)
3239 {
3240 if (data.hm_device[device_id].od_version == 5)
3241 {
3242 ADLFanSpeedValue lpFanSpeedValue;
3243
3244 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3245
3246 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3247 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3248 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3249 lpFanSpeedValue.iFanSpeed = fanspeed;
3250
3251 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3252
3253 return 0;
3254 }
3255 else // od_version == 6
3256 {
3257 ADLOD6FanSpeedValue fan_speed_value;
3258
3259 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3260
3261 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3262 fan_speed_value.iFanSpeed = fanspeed;
3263
3264 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3265
3266 return 0;
3267 }
3268 }
3269 }
3270
3271 return -1;
3272 }
3273 #endif
3274
3275 // helper function for status display
3276
3277 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3278 {
3279 #define VALUE_NOT_AVAILABLE "N/A"
3280
3281 if (value == -1)
3282 {
3283 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3284 }
3285 else
3286 {
3287 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3288 }
3289 }
3290 #endif // HAVE_HWMON
3291
3292 /**
3293 * maskprocessor
3294 */
3295
3296 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3297 {
3298 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3299
3300 if (css_cnt > SP_PW_MAX)
3301 {
3302 log_error ("ERROR: mask length is too long");
3303
3304 exit (-1);
3305 }
3306
3307 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3308 {
3309 uint *uniq_tbl = uniq_tbls[css_pos];
3310
3311 uint *cs_buf = css[css_pos].cs_buf;
3312 uint cs_len = css[css_pos].cs_len;
3313
3314 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3315 {
3316 uint c = cs_buf[cs_pos] & 0xff;
3317
3318 uniq_tbl[c] = 1;
3319 }
3320 }
3321 }
3322
3323 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3324 {
3325 cs_t *cs = &css[css_cnt];
3326
3327 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3328
3329 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3330
3331 size_t i;
3332
3333 for (i = 0; i < cs->cs_len; i++)
3334 {
3335 const uint u = cs->cs_buf[i];
3336
3337 css_uniq[u] = 1;
3338 }
3339
3340 for (i = 0; i < in_len; i++)
3341 {
3342 uint u = in_buf[i] & 0xff;
3343
3344 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3345
3346 if (css_uniq[u] == 1) continue;
3347
3348 css_uniq[u] = 1;
3349
3350 cs->cs_buf[cs->cs_len] = u;
3351
3352 cs->cs_len++;
3353 }
3354
3355 myfree (css_uniq);
3356 }
3357
3358 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3359 {
3360 size_t in_pos;
3361
3362 for (in_pos = 0; in_pos < in_len; in_pos++)
3363 {
3364 uint p0 = in_buf[in_pos] & 0xff;
3365
3366 if (interpret == 1 && p0 == '?')
3367 {
3368 in_pos++;
3369
3370 if (in_pos == in_len) break;
3371
3372 uint p1 = in_buf[in_pos] & 0xff;
3373
3374 switch (p1)
3375 {
3376 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3377 break;
3378 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3379 break;
3380 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3381 break;
3382 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3383 break;
3384 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3385 break;
3386 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3387 break;
3388 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3389 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3390 break;
3391 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3392 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3393 break;
3394 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3395 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3396 break;
3397 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3398 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3399 break;
3400 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3401 break;
3402 default: log_error ("Syntax error: %s", in_buf);
3403 exit (-1);
3404 }
3405 }
3406 else
3407 {
3408 if (data.hex_charset)
3409 {
3410 in_pos++;
3411
3412 if (in_pos == in_len)
3413 {
3414 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3415
3416 exit (-1);
3417 }
3418
3419 uint p1 = in_buf[in_pos] & 0xff;
3420
3421 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3422 {
3423 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3424
3425 exit (-1);
3426 }
3427
3428 uint chr = 0;
3429
3430 chr = hex_convert (p1) << 0;
3431 chr |= hex_convert (p0) << 4;
3432
3433 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3434 }
3435 else
3436 {
3437 uint chr = p0;
3438
3439 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3440 }
3441 }
3442 }
3443 }
3444
3445 u64 mp_get_sum (uint css_cnt, cs_t *css)
3446 {
3447 u64 sum = 1;
3448
3449 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3450 {
3451 sum *= css[css_pos].cs_len;
3452 }
3453
3454 return (sum);
3455 }
3456
3457 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3458 {
3459 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3460
3461 uint mask_pos;
3462 uint css_pos;
3463
3464 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3465 {
3466 char p0 = mask_buf[mask_pos];
3467
3468 if (p0 == '?')
3469 {
3470 mask_pos++;
3471
3472 if (mask_pos == mask_len) break;
3473
3474 char p1 = mask_buf[mask_pos];
3475
3476 uint chr = p1;
3477
3478 switch (p1)
3479 {
3480 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3481 break;
3482 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3483 break;
3484 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3485 break;
3486 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3487 break;
3488 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3489 break;
3490 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3491 break;
3492 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3493 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3494 break;
3495 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3496 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3497 break;
3498 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3499 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3500 break;
3501 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3502 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3503 break;
3504 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3505 break;
3506 default: log_error ("ERROR: syntax error: %s", mask_buf);
3507 exit (-1);
3508 }
3509 }
3510 else
3511 {
3512 if (data.hex_charset)
3513 {
3514 mask_pos++;
3515
3516 // if there is no 2nd hex character, show an error:
3517
3518 if (mask_pos == mask_len)
3519 {
3520 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3521
3522 exit (-1);
3523 }
3524
3525 char p1 = mask_buf[mask_pos];
3526
3527 // if they are not valid hex character, show an error:
3528
3529 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3530 {
3531 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3532
3533 exit (-1);
3534 }
3535
3536 uint chr = 0;
3537
3538 chr |= hex_convert (p1) << 0;
3539 chr |= hex_convert (p0) << 4;
3540
3541 mp_add_cs_buf (&chr, 1, css, css_pos);
3542 }
3543 else
3544 {
3545 uint chr = p0;
3546
3547 mp_add_cs_buf (&chr, 1, css, css_pos);
3548 }
3549 }
3550 }
3551
3552 if (css_pos == 0)
3553 {
3554 log_error ("ERROR: invalid mask length (0)");
3555
3556 exit (-1);
3557 }
3558
3559 *css_cnt = css_pos;
3560
3561 return (css);
3562 }
3563
3564 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3565 {
3566 for (int i = 0; i < css_cnt; i++)
3567 {
3568 uint len = css[i].cs_len;
3569 u64 next = val / len;
3570 uint pos = val % len;
3571 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3572 val = next;
3573 }
3574 }
3575
3576 void mp_cut_at (char *mask, uint max)
3577 {
3578 uint i;
3579 uint j;
3580 uint mask_len = strlen (mask);
3581
3582 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3583 {
3584 if (mask[i] == '?') i++;
3585 }
3586
3587 mask[i] = 0;
3588 }
3589
3590 void mp_setup_sys (cs_t *mp_sys)
3591 {
3592 uint pos;
3593 uint chr;
3594 uint donec[CHARSIZ] = { 0 };
3595
3596 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3597 mp_sys[0].cs_buf[pos++] = chr;
3598 mp_sys[0].cs_len = pos; }
3599
3600 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3601 mp_sys[1].cs_buf[pos++] = chr;
3602 mp_sys[1].cs_len = pos; }
3603
3604 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3605 mp_sys[2].cs_buf[pos++] = chr;
3606 mp_sys[2].cs_len = pos; }
3607
3608 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3609 mp_sys[3].cs_buf[pos++] = chr;
3610 mp_sys[3].cs_len = pos; }
3611
3612 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3613 mp_sys[4].cs_len = pos; }
3614
3615 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3616 mp_sys[5].cs_len = pos; }
3617 }
3618
3619 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3620 {
3621 FILE *fp = fopen (buf, "rb");
3622
3623 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3624 {
3625 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3626 }
3627 else
3628 {
3629 char mp_file[1024] = { 0 };
3630
3631 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3632
3633 fclose (fp);
3634
3635 len = in_superchop (mp_file);
3636
3637 if (len == 0)
3638 {
3639 log_info ("WARNING: charset file corrupted");
3640
3641 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3642 }
3643 else
3644 {
3645 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3646 }
3647 }
3648 }
3649
3650 void mp_reset_usr (cs_t *mp_usr, uint index)
3651 {
3652 mp_usr[index].cs_len = 0;
3653
3654 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3655 }
3656
3657 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3658 {
3659 char *new_mask_buf = (char *) mymalloc (256);
3660
3661 uint mask_pos;
3662
3663 uint css_pos;
3664
3665 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3666 {
3667 if (css_pos == len) break;
3668
3669 char p0 = mask_buf[mask_pos];
3670
3671 new_mask_buf[mask_pos] = p0;
3672
3673 if (p0 == '?')
3674 {
3675 mask_pos++;
3676
3677 if (mask_pos == mask_len) break;
3678
3679 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3680 }
3681 else
3682 {
3683 if (data.hex_charset)
3684 {
3685 mask_pos++;
3686
3687 if (mask_pos == mask_len)
3688 {
3689 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3690
3691 exit (-1);
3692 }
3693
3694 char p1 = mask_buf[mask_pos];
3695
3696 // if they are not valid hex character, show an error:
3697
3698 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3699 {
3700 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3701
3702 exit (-1);
3703 }
3704
3705 new_mask_buf[mask_pos] = p1;
3706 }
3707 }
3708 }
3709
3710 if (css_pos == len) return (new_mask_buf);
3711
3712 myfree (new_mask_buf);
3713
3714 return (NULL);
3715 }
3716
3717 /**
3718 * statprocessor
3719 */
3720
3721 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3722 {
3723 u64 sum = 1;
3724
3725 uint i;
3726
3727 for (i = start; i < stop; i++)
3728 {
3729 sum *= root_css_buf[i].cs_len;
3730 }
3731
3732 return (sum);
3733 }
3734
3735 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3736 {
3737 u64 v = ctx;
3738
3739 cs_t *cs = &root_css_buf[start];
3740
3741 uint i;
3742
3743 for (i = start; i < stop; i++)
3744 {
3745 const u64 m = v % cs->cs_len;
3746 const u64 d = v / cs->cs_len;
3747
3748 v = d;
3749
3750 const uint k = cs->cs_buf[m];
3751
3752 pw_buf[i - start] = (char) k;
3753
3754 cs = &markov_css_buf[(i * CHARSIZ) + k];
3755 }
3756 }
3757
3758 int sp_comp_val (const void *p1, const void *p2)
3759 {
3760 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3761 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3762
3763 return b2->val - b1->val;
3764 }
3765
3766 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)
3767 {
3768 uint i;
3769 uint j;
3770 uint k;
3771
3772 /**
3773 * Initialize hcstats
3774 */
3775
3776 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3777
3778 u64 *root_stats_ptr = root_stats_buf;
3779
3780 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3781
3782 for (i = 0; i < SP_PW_MAX; i++)
3783 {
3784 root_stats_buf_by_pos[i] = root_stats_ptr;
3785
3786 root_stats_ptr += CHARSIZ;
3787 }
3788
3789 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3790
3791 u64 *markov_stats_ptr = markov_stats_buf;
3792
3793 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3794
3795 for (i = 0; i < SP_PW_MAX; i++)
3796 {
3797 for (j = 0; j < CHARSIZ; j++)
3798 {
3799 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3800
3801 markov_stats_ptr += CHARSIZ;
3802 }
3803 }
3804
3805 /**
3806 * Load hcstats File
3807 */
3808
3809 if (hcstat == NULL)
3810 {
3811 char hcstat_tmp[256] = { 0 };
3812
3813 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3814
3815 hcstat = hcstat_tmp;
3816 }
3817
3818 FILE *fd = fopen (hcstat, "rb");
3819
3820 if (fd == NULL)
3821 {
3822 log_error ("%s: %s", hcstat, strerror (errno));
3823
3824 exit (-1);
3825 }
3826
3827 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3828 {
3829 log_error ("%s: Could not load data", hcstat);
3830
3831 fclose (fd);
3832
3833 exit (-1);
3834 }
3835
3836 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3837 {
3838 log_error ("%s: Could not load data", hcstat);
3839
3840 fclose (fd);
3841
3842 exit (-1);
3843 }
3844
3845 fclose (fd);
3846
3847 /**
3848 * Markov modifier of hcstat_table on user request
3849 */
3850
3851 if (disable)
3852 {
3853 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3854 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3855 }
3856
3857 if (classic)
3858 {
3859 /* Add all stats to first position */
3860
3861 for (i = 1; i < SP_PW_MAX; i++)
3862 {
3863 u64 *out = root_stats_buf_by_pos[0];
3864 u64 *in = root_stats_buf_by_pos[i];
3865
3866 for (j = 0; j < CHARSIZ; j++)
3867 {
3868 *out++ += *in++;
3869 }
3870 }
3871
3872 for (i = 1; i < SP_PW_MAX; i++)
3873 {
3874 u64 *out = markov_stats_buf_by_key[0][0];
3875 u64 *in = markov_stats_buf_by_key[i][0];
3876
3877 for (j = 0; j < CHARSIZ; j++)
3878 {
3879 for (k = 0; k < CHARSIZ; k++)
3880 {
3881 *out++ += *in++;
3882 }
3883 }
3884 }
3885
3886 /* copy them to all pw_positions */
3887
3888 for (i = 1; i < SP_PW_MAX; i++)
3889 {
3890 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
3891 }
3892
3893 for (i = 1; i < SP_PW_MAX; i++)
3894 {
3895 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
3896 }
3897 }
3898
3899 /**
3900 * Initialize tables
3901 */
3902
3903 hcstat_table_t *root_table_ptr = root_table_buf;
3904
3905 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3906
3907 for (i = 0; i < SP_PW_MAX; i++)
3908 {
3909 root_table_buf_by_pos[i] = root_table_ptr;
3910
3911 root_table_ptr += CHARSIZ;
3912 }
3913
3914 hcstat_table_t *markov_table_ptr = markov_table_buf;
3915
3916 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3917
3918 for (i = 0; i < SP_PW_MAX; i++)
3919 {
3920 for (j = 0; j < CHARSIZ; j++)
3921 {
3922 markov_table_buf_by_key[i][j] = markov_table_ptr;
3923
3924 markov_table_ptr += CHARSIZ;
3925 }
3926 }
3927
3928 /**
3929 * Convert hcstat to tables
3930 */
3931
3932 for (i = 0; i < SP_ROOT_CNT; i++)
3933 {
3934 uint key = i % CHARSIZ;
3935
3936 root_table_buf[i].key = key;
3937 root_table_buf[i].val = root_stats_buf[i];
3938 }
3939
3940 for (i = 0; i < SP_MARKOV_CNT; i++)
3941 {
3942 uint key = i % CHARSIZ;
3943
3944 markov_table_buf[i].key = key;
3945 markov_table_buf[i].val = markov_stats_buf[i];
3946 }
3947
3948 myfree (root_stats_buf);
3949 myfree (markov_stats_buf);
3950
3951 /**
3952 * Finally sort them
3953 */
3954
3955 for (i = 0; i < SP_PW_MAX; i++)
3956 {
3957 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3958 }
3959
3960 for (i = 0; i < SP_PW_MAX; i++)
3961 {
3962 for (j = 0; j < CHARSIZ; j++)
3963 {
3964 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3965 }
3966 }
3967 }
3968
3969 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])
3970 {
3971 /**
3972 * Convert tables to css
3973 */
3974
3975 for (uint i = 0; i < SP_ROOT_CNT; i++)
3976 {
3977 uint pw_pos = i / CHARSIZ;
3978
3979 cs_t *cs = &root_css_buf[pw_pos];
3980
3981 if (cs->cs_len == threshold) continue;
3982
3983 uint key = root_table_buf[i].key;
3984
3985 if (uniq_tbls[pw_pos][key] == 0) continue;
3986
3987 cs->cs_buf[cs->cs_len] = key;
3988
3989 cs->cs_len++;
3990 }
3991
3992 /**
3993 * Convert table to css
3994 */
3995
3996 for (uint i = 0; i < SP_MARKOV_CNT; i++)
3997 {
3998 uint c = i / CHARSIZ;
3999
4000 cs_t *cs = &markov_css_buf[c];
4001
4002 if (cs->cs_len == threshold) continue;
4003
4004 uint pw_pos = c / CHARSIZ;
4005
4006 uint key = markov_table_buf[i].key;
4007
4008 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4009
4010 cs->cs_buf[cs->cs_len] = key;
4011
4012 cs->cs_len++;
4013 }
4014
4015 /*
4016 for (uint i = 0; i < 8; i++)
4017 {
4018 for (uint j = 0x20; j < 0x80; j++)
4019 {
4020 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4021
4022 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4023
4024 for (uint k = 0; k < 10; k++)
4025 {
4026 printf (" %u\n", ptr->cs_buf[k]);
4027 }
4028 }
4029 }
4030 */
4031 }
4032
4033 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4034 {
4035 for (uint i = 0; i < SP_PW_MAX; i += 2)
4036 {
4037 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4038
4039 out += CHARSIZ;
4040 in += CHARSIZ;
4041
4042 out->key = 0;
4043 out->val = 1;
4044
4045 out++;
4046
4047 for (uint j = 1; j < CHARSIZ; j++)
4048 {
4049 out->key = j;
4050 out->val = 0;
4051
4052 out++;
4053 }
4054 }
4055 }
4056
4057 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4058 {
4059 for (uint i = 0; i < SP_PW_MAX; i += 2)
4060 {
4061 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4062
4063 out += CHARSIZ * CHARSIZ;
4064 in += CHARSIZ * CHARSIZ;
4065
4066 for (uint j = 0; j < CHARSIZ; j++)
4067 {
4068 out->key = 0;
4069 out->val = 1;
4070
4071 out++;
4072
4073 for (uint k = 1; k < CHARSIZ; k++)
4074 {
4075 out->key = k;
4076 out->val = 0;
4077
4078 out++;
4079 }
4080 }
4081 }
4082 }
4083
4084 /**
4085 * mixed shared functions
4086 */
4087
4088 void dump_hex (const u8 *s, const int sz)
4089 {
4090 for (int i = 0; i < sz; i++)
4091 {
4092 log_info_nn ("%02x ", s[i]);
4093 }
4094
4095 log_info ("");
4096 }
4097
4098 void usage_mini_print (const char *progname)
4099 {
4100 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4101 }
4102
4103 void usage_big_print (const char *progname)
4104 {
4105 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4106 }
4107
4108 char *get_exec_path ()
4109 {
4110 int exec_path_len = 1024;
4111
4112 char *exec_path = (char *) mymalloc (exec_path_len);
4113
4114 #ifdef LINUX
4115
4116 char tmp[32] = { 0 };
4117
4118 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4119
4120 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4121
4122 #elif WIN
4123
4124 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4125
4126 #elif OSX
4127
4128 uint size = exec_path_len;
4129
4130 if (_NSGetExecutablePath (exec_path, &size) != 0)
4131 {
4132 log_error("! executable path buffer too small\n");
4133
4134 exit (-1);
4135 }
4136
4137 const int len = strlen (exec_path);
4138
4139 #else
4140 #error Your Operating System is not supported or detected
4141 #endif
4142
4143 exec_path[len] = 0;
4144
4145 return exec_path;
4146 }
4147
4148 char *get_install_dir (const char *progname)
4149 {
4150 char *install_dir = mystrdup (progname);
4151 char *last_slash = NULL;
4152
4153 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4154 {
4155 *last_slash = 0;
4156 }
4157 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4158 {
4159 *last_slash = 0;
4160 }
4161 else
4162 {
4163 install_dir[0] = '.';
4164 install_dir[1] = 0;
4165 }
4166
4167 return (install_dir);
4168 }
4169
4170 char *get_profile_dir (const char *homedir)
4171 {
4172 #define DOT_HASHCAT ".hashcat"
4173
4174 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4175
4176 char *profile_dir = (char *) mymalloc (len + 1);
4177
4178 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4179
4180 return profile_dir;
4181 }
4182
4183 char *get_session_dir (const char *profile_dir)
4184 {
4185 #define SESSIONS_FOLDER "sessions"
4186
4187 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4188
4189 char *session_dir = (char *) mymalloc (len + 1);
4190
4191 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4192
4193 return session_dir;
4194 }
4195
4196 uint count_lines (FILE *fd)
4197 {
4198 uint cnt = 0;
4199
4200 char *buf = (char *) mymalloc (BUFSIZ + 1);
4201
4202 char prev = '\n';
4203
4204 while (!feof (fd))
4205 {
4206 size_t nread = fread (buf, sizeof (char), BUFSIZ, fd);
4207
4208 if (nread < 1) continue;
4209
4210 size_t i;
4211
4212 for (i = 0; i < nread; i++)
4213 {
4214 if (prev == '\n') cnt++;
4215
4216 prev = buf[i];
4217 }
4218 }
4219
4220 myfree (buf);
4221
4222 return cnt;
4223 }
4224
4225 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4226 {
4227 uint crc = ~0;
4228
4229 FILE *fd = fopen (filename, "rb");
4230
4231 if (fd == NULL)
4232 {
4233 log_error ("%s: %s", filename, strerror (errno));
4234
4235 exit (-1);
4236 }
4237
4238 #define MAX_KEY_SIZE (1024 * 1024)
4239
4240 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4241
4242 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4243
4244 fclose (fd);
4245
4246 int kpos = 0;
4247
4248 for (int fpos = 0; fpos < nread; fpos++)
4249 {
4250 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4251
4252 keytab[kpos++] += (crc >> 24) & 0xff;
4253 keytab[kpos++] += (crc >> 16) & 0xff;
4254 keytab[kpos++] += (crc >> 8) & 0xff;
4255 keytab[kpos++] += (crc >> 0) & 0xff;
4256
4257 if (kpos >= 64) kpos = 0;
4258 }
4259
4260 myfree (buf);
4261 }
4262
4263 #ifdef OSX
4264 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4265 {
4266 int core;
4267
4268 for (core = 0; core < (8 * (int)cpu_size); core++)
4269 if (CPU_ISSET(core, cpu_set)) break;
4270
4271 thread_affinity_policy_data_t policy = { core };
4272
4273 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4274
4275 if (data.quiet == 0)
4276 {
4277 if (rc != KERN_SUCCESS)
4278 {
4279 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4280 }
4281 }
4282
4283 return rc;
4284 }
4285 #endif
4286
4287 void set_cpu_affinity (char *cpu_affinity)
4288 {
4289 #ifdef WIN
4290 DWORD_PTR aff_mask = 0;
4291 #elif _POSIX
4292 cpu_set_t cpuset;
4293 CPU_ZERO (&cpuset);
4294 #endif
4295
4296 if (cpu_affinity)
4297 {
4298 char *devices = strdup (cpu_affinity);
4299
4300 char *next = strtok (devices, ",");
4301
4302 do
4303 {
4304 uint cpu_id = atoi (next);
4305
4306 if (cpu_id == 0)
4307 {
4308 #ifdef WIN
4309 aff_mask = 0;
4310 #elif _POSIX
4311 CPU_ZERO (&cpuset);
4312 #endif
4313
4314 break;
4315 }
4316
4317 if (cpu_id > 32)
4318 {
4319 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4320
4321 exit (-1);
4322 }
4323
4324 #ifdef WIN
4325 aff_mask |= 1 << (cpu_id - 1);
4326 #elif _POSIX
4327 CPU_SET ((cpu_id - 1), &cpuset);
4328 #endif
4329
4330 } while ((next = strtok (NULL, ",")) != NULL);
4331
4332 free (devices);
4333 }
4334
4335 #ifdef WIN
4336 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4337 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4338 #elif _POSIX
4339 pthread_t thread = pthread_self ();
4340 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4341 #endif
4342 }
4343
4344 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4345 {
4346 char *element, *end;
4347
4348 end = (char *) base + nmemb * size;
4349
4350 for (element = (char *) base; element < end; element += size)
4351 if (!compar (element, key))
4352 return element;
4353
4354 return NULL;
4355 }
4356
4357 int sort_by_u32 (const void *v1, const void *v2)
4358 {
4359 const u32 *s1 = (const u32 *) v1;
4360 const u32 *s2 = (const u32 *) v2;
4361
4362 return *s1 - *s2;
4363 }
4364
4365 int sort_by_salt (const void *v1, const void *v2)
4366 {
4367 const salt_t *s1 = (const salt_t *) v1;
4368 const salt_t *s2 = (const salt_t *) v2;
4369
4370 const int res1 = s1->salt_len - s2->salt_len;
4371
4372 if (res1 != 0) return (res1);
4373
4374 const int res2 = s1->salt_iter - s2->salt_iter;
4375
4376 if (res2 != 0) return (res2);
4377
4378 uint n;
4379
4380 n = 16;
4381
4382 while (n--)
4383 {
4384 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4385 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4386 }
4387
4388 n = 8;
4389
4390 while (n--)
4391 {
4392 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4393 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4394 }
4395
4396 return (0);
4397 }
4398
4399 int sort_by_salt_buf (const void *v1, const void *v2)
4400 {
4401 const pot_t *p1 = (const pot_t *) v1;
4402 const pot_t *p2 = (const pot_t *) v2;
4403
4404 const hash_t *h1 = &p1->hash;
4405 const hash_t *h2 = &p2->hash;
4406
4407 const salt_t *s1 = h1->salt;
4408 const salt_t *s2 = h2->salt;
4409
4410 uint n = 16;
4411
4412 while (n--)
4413 {
4414 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4415 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4416 }
4417
4418 return 0;
4419 }
4420
4421 int sort_by_hash_t_salt (const void *v1, const void *v2)
4422 {
4423 const hash_t *h1 = (const hash_t *) v1;
4424 const hash_t *h2 = (const hash_t *) v2;
4425
4426 const salt_t *s1 = h1->salt;
4427 const salt_t *s2 = h2->salt;
4428
4429 // testphase: this should work
4430 uint n = 16;
4431
4432 while (n--)
4433 {
4434 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4435 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4436 }
4437
4438 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4439 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4440 if (s1->salt_len > s2->salt_len) return ( 1);
4441 if (s1->salt_len < s2->salt_len) return (-1);
4442
4443 uint n = s1->salt_len;
4444
4445 while (n--)
4446 {
4447 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4448 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4449 }
4450 */
4451
4452 return 0;
4453 }
4454
4455 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4456 {
4457 const hash_t *h1 = (const hash_t *) v1;
4458 const hash_t *h2 = (const hash_t *) v2;
4459
4460 const salt_t *s1 = h1->salt;
4461 const salt_t *s2 = h2->salt;
4462
4463 // 16 - 2 (since last 2 uints contain the digest)
4464 uint n = 14;
4465
4466 while (n--)
4467 {
4468 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4469 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4470 }
4471
4472 return 0;
4473 }
4474
4475 int sort_by_hash_no_salt (const void *v1, const void *v2)
4476 {
4477 const hash_t *h1 = (const hash_t *) v1;
4478 const hash_t *h2 = (const hash_t *) v2;
4479
4480 const void *d1 = h1->digest;
4481 const void *d2 = h2->digest;
4482
4483 return data.sort_by_digest (d1, d2);
4484 }
4485
4486 int sort_by_hash (const void *v1, const void *v2)
4487 {
4488 const hash_t *h1 = (const hash_t *) v1;
4489 const hash_t *h2 = (const hash_t *) v2;
4490
4491 if (data.isSalted)
4492 {
4493 const salt_t *s1 = h1->salt;
4494 const salt_t *s2 = h2->salt;
4495
4496 int res = sort_by_salt (s1, s2);
4497
4498 if (res != 0) return (res);
4499 }
4500
4501 const void *d1 = h1->digest;
4502 const void *d2 = h2->digest;
4503
4504 return data.sort_by_digest (d1, d2);
4505 }
4506
4507 int sort_by_pot (const void *v1, const void *v2)
4508 {
4509 const pot_t *p1 = (const pot_t *) v1;
4510 const pot_t *p2 = (const pot_t *) v2;
4511
4512 const hash_t *h1 = &p1->hash;
4513 const hash_t *h2 = &p2->hash;
4514
4515 return sort_by_hash (h1, h2);
4516 }
4517
4518 int sort_by_mtime (const void *p1, const void *p2)
4519 {
4520 const char **f1 = (const char **) p1;
4521 const char **f2 = (const char **) p2;
4522
4523 struct stat s1; stat (*f1, &s1);
4524 struct stat s2; stat (*f2, &s2);
4525
4526 return s2.st_mtime - s1.st_mtime;
4527 }
4528
4529 int sort_by_cpu_rule (const void *p1, const void *p2)
4530 {
4531 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4532 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4533
4534 return memcmp (r1, r2, sizeof (cpu_rule_t));
4535 }
4536
4537 int sort_by_kernel_rule (const void *p1, const void *p2)
4538 {
4539 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4540 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4541
4542 return memcmp (r1, r2, sizeof (kernel_rule_t));
4543 }
4544
4545 int sort_by_stringptr (const void *p1, const void *p2)
4546 {
4547 const char **s1 = (const char **) p1;
4548 const char **s2 = (const char **) p2;
4549
4550 return strcmp (*s1, *s2);
4551 }
4552
4553 int sort_by_dictstat (const void *s1, const void *s2)
4554 {
4555 dictstat_t *d1 = (dictstat_t *) s1;
4556 dictstat_t *d2 = (dictstat_t *) s2;
4557
4558 #ifdef LINUX
4559 d2->stat.st_atim = d1->stat.st_atim;
4560 #else
4561 d2->stat.st_atime = d1->stat.st_atime;
4562 #endif
4563
4564 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4565 }
4566
4567 int sort_by_bitmap (const void *p1, const void *p2)
4568 {
4569 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4570 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4571
4572 return b1->collisions - b2->collisions;
4573 }
4574
4575 int sort_by_digest_4_2 (const void *v1, const void *v2)
4576 {
4577 const u32 *d1 = (const u32 *) v1;
4578 const u32 *d2 = (const u32 *) v2;
4579
4580 uint n = 2;
4581
4582 while (n--)
4583 {
4584 if (d1[n] > d2[n]) return ( 1);
4585 if (d1[n] < d2[n]) return (-1);
4586 }
4587
4588 return (0);
4589 }
4590
4591 int sort_by_digest_4_4 (const void *v1, const void *v2)
4592 {
4593 const u32 *d1 = (const u32 *) v1;
4594 const u32 *d2 = (const u32 *) v2;
4595
4596 uint n = 4;
4597
4598 while (n--)
4599 {
4600 if (d1[n] > d2[n]) return ( 1);
4601 if (d1[n] < d2[n]) return (-1);
4602 }
4603
4604 return (0);
4605 }
4606
4607 int sort_by_digest_4_5 (const void *v1, const void *v2)
4608 {
4609 const u32 *d1 = (const u32 *) v1;
4610 const u32 *d2 = (const u32 *) v2;
4611
4612 uint n = 5;
4613
4614 while (n--)
4615 {
4616 if (d1[n] > d2[n]) return ( 1);
4617 if (d1[n] < d2[n]) return (-1);
4618 }
4619
4620 return (0);
4621 }
4622
4623 int sort_by_digest_4_6 (const void *v1, const void *v2)
4624 {
4625 const u32 *d1 = (const u32 *) v1;
4626 const u32 *d2 = (const u32 *) v2;
4627
4628 uint n = 6;
4629
4630 while (n--)
4631 {
4632 if (d1[n] > d2[n]) return ( 1);
4633 if (d1[n] < d2[n]) return (-1);
4634 }
4635
4636 return (0);
4637 }
4638
4639 int sort_by_digest_4_8 (const void *v1, const void *v2)
4640 {
4641 const u32 *d1 = (const u32 *) v1;
4642 const u32 *d2 = (const u32 *) v2;
4643
4644 uint n = 8;
4645
4646 while (n--)
4647 {
4648 if (d1[n] > d2[n]) return ( 1);
4649 if (d1[n] < d2[n]) return (-1);
4650 }
4651
4652 return (0);
4653 }
4654
4655 int sort_by_digest_4_16 (const void *v1, const void *v2)
4656 {
4657 const u32 *d1 = (const u32 *) v1;
4658 const u32 *d2 = (const u32 *) v2;
4659
4660 uint n = 16;
4661
4662 while (n--)
4663 {
4664 if (d1[n] > d2[n]) return ( 1);
4665 if (d1[n] < d2[n]) return (-1);
4666 }
4667
4668 return (0);
4669 }
4670
4671 int sort_by_digest_4_32 (const void *v1, const void *v2)
4672 {
4673 const u32 *d1 = (const u32 *) v1;
4674 const u32 *d2 = (const u32 *) v2;
4675
4676 uint n = 32;
4677
4678 while (n--)
4679 {
4680 if (d1[n] > d2[n]) return ( 1);
4681 if (d1[n] < d2[n]) return (-1);
4682 }
4683
4684 return (0);
4685 }
4686
4687 int sort_by_digest_4_64 (const void *v1, const void *v2)
4688 {
4689 const u32 *d1 = (const u32 *) v1;
4690 const u32 *d2 = (const u32 *) v2;
4691
4692 uint n = 64;
4693
4694 while (n--)
4695 {
4696 if (d1[n] > d2[n]) return ( 1);
4697 if (d1[n] < d2[n]) return (-1);
4698 }
4699
4700 return (0);
4701 }
4702
4703 int sort_by_digest_8_8 (const void *v1, const void *v2)
4704 {
4705 const u64 *d1 = (const u64 *) v1;
4706 const u64 *d2 = (const u64 *) v2;
4707
4708 uint n = 8;
4709
4710 while (n--)
4711 {
4712 if (d1[n] > d2[n]) return ( 1);
4713 if (d1[n] < d2[n]) return (-1);
4714 }
4715
4716 return (0);
4717 }
4718
4719 int sort_by_digest_8_16 (const void *v1, const void *v2)
4720 {
4721 const u64 *d1 = (const u64 *) v1;
4722 const u64 *d2 = (const u64 *) v2;
4723
4724 uint n = 16;
4725
4726 while (n--)
4727 {
4728 if (d1[n] > d2[n]) return ( 1);
4729 if (d1[n] < d2[n]) return (-1);
4730 }
4731
4732 return (0);
4733 }
4734
4735 int sort_by_digest_8_25 (const void *v1, const void *v2)
4736 {
4737 const u64 *d1 = (const u64 *) v1;
4738 const u64 *d2 = (const u64 *) v2;
4739
4740 uint n = 25;
4741
4742 while (n--)
4743 {
4744 if (d1[n] > d2[n]) return ( 1);
4745 if (d1[n] < d2[n]) return (-1);
4746 }
4747
4748 return (0);
4749 }
4750
4751 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4752 {
4753 const u32 *d1 = (const u32 *) v1;
4754 const u32 *d2 = (const u32 *) v2;
4755
4756 const uint dgst_pos0 = data.dgst_pos0;
4757 const uint dgst_pos1 = data.dgst_pos1;
4758 const uint dgst_pos2 = data.dgst_pos2;
4759 const uint dgst_pos3 = data.dgst_pos3;
4760
4761 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4762 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4763 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4764 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4765 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4766 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4767 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4768 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4769
4770 return (0);
4771 }
4772
4773 int sort_by_tuning_db_alias (const void *v1, const void *v2)
4774 {
4775 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
4776 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
4777
4778 const int res1 = strcmp (t1->device_name, t2->device_name);
4779
4780 if (res1 != 0) return (res1);
4781
4782 return 0;
4783 }
4784
4785 int sort_by_tuning_db_entry (const void *v1, const void *v2)
4786 {
4787 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
4788 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
4789
4790 const int res1 = strcmp (t1->device_name, t2->device_name);
4791
4792 if (res1 != 0) return (res1);
4793
4794 const int res2 = t1->attack_mode
4795 - t2->attack_mode;
4796
4797 if (res2 != 0) return (res2);
4798
4799 const int res3 = t1->hash_type
4800 - t2->hash_type;
4801
4802 if (res3 != 0) return (res3);
4803
4804 return 0;
4805 }
4806
4807 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)
4808 {
4809 uint outfile_autohex = data.outfile_autohex;
4810
4811 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4812
4813 FILE *debug_fp = NULL;
4814
4815 if (debug_file != NULL)
4816 {
4817 debug_fp = fopen (debug_file, "ab");
4818
4819 lock_file (debug_fp);
4820 }
4821 else
4822 {
4823 debug_fp = stderr;
4824 }
4825
4826 if (debug_fp == NULL)
4827 {
4828 log_info ("WARNING: Could not open debug-file for writing");
4829 }
4830 else
4831 {
4832 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4833 {
4834 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4835
4836 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4837 }
4838
4839 fwrite (rule_ptr, rule_len, 1, debug_fp);
4840
4841 if (debug_mode == 4)
4842 {
4843 fputc (':', debug_fp);
4844
4845 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4846 }
4847
4848 fputc ('\n', debug_fp);
4849
4850 if (debug_file != NULL) fclose (debug_fp);
4851 }
4852 }
4853
4854 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4855 {
4856 int needs_hexify = 0;
4857
4858 if (outfile_autohex == 1)
4859 {
4860 for (uint i = 0; i < plain_len; i++)
4861 {
4862 if (plain_ptr[i] < 0x20)
4863 {
4864 needs_hexify = 1;
4865
4866 break;
4867 }
4868
4869 if (plain_ptr[i] > 0x7f)
4870 {
4871 needs_hexify = 1;
4872
4873 break;
4874 }
4875 }
4876 }
4877
4878 if (needs_hexify == 1)
4879 {
4880 fprintf (fp, "$HEX[");
4881
4882 for (uint i = 0; i < plain_len; i++)
4883 {
4884 fprintf (fp, "%02x", plain_ptr[i]);
4885 }
4886
4887 fprintf (fp, "]");
4888 }
4889 else
4890 {
4891 fwrite (plain_ptr, plain_len, 1, fp);
4892 }
4893 }
4894
4895 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)
4896 {
4897 uint outfile_format = data.outfile_format;
4898
4899 char separator = data.separator;
4900
4901 if (outfile_format & OUTFILE_FMT_HASH)
4902 {
4903 fprintf (out_fp, "%s", out_buf);
4904
4905 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4906 {
4907 fputc (separator, out_fp);
4908 }
4909 }
4910 else if (data.username)
4911 {
4912 if (username != NULL)
4913 {
4914 for (uint i = 0; i < user_len; i++)
4915 {
4916 fprintf (out_fp, "%c", username[i]);
4917 }
4918
4919 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4920 {
4921 fputc (separator, out_fp);
4922 }
4923 }
4924 }
4925
4926 if (outfile_format & OUTFILE_FMT_PLAIN)
4927 {
4928 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4929
4930 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4931 {
4932 fputc (separator, out_fp);
4933 }
4934 }
4935
4936 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4937 {
4938 for (uint i = 0; i < plain_len; i++)
4939 {
4940 fprintf (out_fp, "%02x", plain_ptr[i]);
4941 }
4942
4943 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4944 {
4945 fputc (separator, out_fp);
4946 }
4947 }
4948
4949 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4950 {
4951 #ifdef _WIN
4952 __mingw_fprintf (out_fp, "%llu", crackpos);
4953 #endif
4954
4955 #ifdef _POSIX
4956 #ifdef __x86_64__
4957 fprintf (out_fp, "%lu", (unsigned long) crackpos);
4958 #else
4959 fprintf (out_fp, "%llu", crackpos);
4960 #endif
4961 #endif
4962 }
4963
4964 fputc ('\n', out_fp);
4965 }
4966
4967 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)
4968 {
4969 pot_t pot_key;
4970
4971 pot_key.hash.salt = hashes_buf->salt;
4972 pot_key.hash.digest = hashes_buf->digest;
4973
4974 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4975
4976 if (pot_ptr)
4977 {
4978 log_info_nn ("");
4979
4980 input_buf[input_len] = 0;
4981
4982 // user
4983 unsigned char *username = NULL;
4984 uint user_len = 0;
4985
4986 if (data.username)
4987 {
4988 user_t *user = hashes_buf->hash_info->user;
4989
4990 if (user)
4991 {
4992 username = (unsigned char *) (user->user_name);
4993
4994 user_len = user->user_len;
4995 }
4996 }
4997
4998 // do output the line
4999 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
5000 }
5001 }
5002
5003 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
5004 #define LM_MASKED_PLAIN "[notfound]"
5005
5006 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)
5007 {
5008 // left
5009
5010 pot_t pot_left_key;
5011
5012 pot_left_key.hash.salt = hash_left->salt;
5013 pot_left_key.hash.digest = hash_left->digest;
5014
5015 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5016
5017 // right
5018
5019 uint weak_hash_found = 0;
5020
5021 pot_t pot_right_key;
5022
5023 pot_right_key.hash.salt = hash_right->salt;
5024 pot_right_key.hash.digest = hash_right->digest;
5025
5026 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5027
5028 if (pot_right_ptr == NULL)
5029 {
5030 // special case, if "weak hash"
5031
5032 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5033 {
5034 weak_hash_found = 1;
5035
5036 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5037
5038 // in theory this is not needed, but we are paranoia:
5039
5040 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5041 pot_right_ptr->plain_len = 0;
5042 }
5043 }
5044
5045 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5046 {
5047 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
5048
5049 return;
5050 }
5051
5052 // at least one half was found:
5053
5054 log_info_nn ("");
5055
5056 input_buf[input_len] = 0;
5057
5058 // user
5059
5060 unsigned char *username = NULL;
5061 uint user_len = 0;
5062
5063 if (data.username)
5064 {
5065 user_t *user = hash_left->hash_info->user;
5066
5067 if (user)
5068 {
5069 username = (unsigned char *) (user->user_name);
5070
5071 user_len = user->user_len;
5072 }
5073 }
5074
5075 // mask the part which was not found
5076
5077 uint left_part_masked = 0;
5078 uint right_part_masked = 0;
5079
5080 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5081
5082 if (pot_left_ptr == NULL)
5083 {
5084 left_part_masked = 1;
5085
5086 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5087
5088 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5089
5090 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5091 pot_left_ptr->plain_len = mask_plain_len;
5092 }
5093
5094 if (pot_right_ptr == NULL)
5095 {
5096 right_part_masked = 1;
5097
5098 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5099
5100 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5101
5102 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5103 pot_right_ptr->plain_len = mask_plain_len;
5104 }
5105
5106 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5107
5108 pot_t pot_ptr;
5109
5110 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5111
5112 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5113
5114 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5115
5116 // do output the line
5117
5118 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5119
5120 if (weak_hash_found == 1) myfree (pot_right_ptr);
5121
5122 if (left_part_masked == 1) myfree (pot_left_ptr);
5123 if (right_part_masked == 1) myfree (pot_right_ptr);
5124 }
5125
5126 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)
5127 {
5128 pot_t pot_key;
5129
5130 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5131
5132 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5133
5134 if (pot_ptr == NULL)
5135 {
5136 log_info_nn ("");
5137
5138 input_buf[input_len] = 0;
5139
5140 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5141 }
5142 }
5143
5144 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)
5145 {
5146 // left
5147
5148 pot_t pot_left_key;
5149
5150 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5151
5152 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5153
5154 // right
5155
5156 pot_t pot_right_key;
5157
5158 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5159
5160 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5161
5162 uint weak_hash_found = 0;
5163
5164 if (pot_right_ptr == NULL)
5165 {
5166 // special case, if "weak hash"
5167
5168 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5169 {
5170 weak_hash_found = 1;
5171
5172 // we just need that pot_right_ptr is not a NULL pointer
5173
5174 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5175 }
5176 }
5177
5178 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5179 {
5180 if (weak_hash_found == 1) myfree (pot_right_ptr);
5181
5182 return;
5183 }
5184
5185 // ... at least one part was not cracked
5186
5187 log_info_nn ("");
5188
5189 input_buf[input_len] = 0;
5190
5191 // only show the hash part which is still not cracked
5192
5193 uint user_len = input_len - 32;
5194
5195 char *hash_output = (char *) mymalloc (33);
5196
5197 memcpy (hash_output, input_buf, input_len);
5198
5199 if (pot_left_ptr != NULL)
5200 {
5201 // only show right part (because left part was already found)
5202
5203 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5204
5205 hash_output[user_len + 16] = 0;
5206 }
5207
5208 if (pot_right_ptr != NULL)
5209 {
5210 // only show left part (because right part was already found)
5211
5212 memcpy (hash_output + user_len, input_buf + user_len, 16);
5213
5214 hash_output[user_len + 16] = 0;
5215 }
5216
5217 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5218
5219 myfree (hash_output);
5220
5221 if (weak_hash_found == 1) myfree (pot_right_ptr);
5222 }
5223
5224 uint setup_opencl_platforms_filter (char *opencl_platforms)
5225 {
5226 uint opencl_platforms_filter = 0;
5227
5228 if (opencl_platforms)
5229 {
5230 char *platforms = strdup (opencl_platforms);
5231
5232 char *next = strtok (platforms, ",");
5233
5234 do
5235 {
5236 int platform = atoi (next);
5237
5238 if (platform < 1 || platform > 32)
5239 {
5240 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5241
5242 exit (-1);
5243 }
5244
5245 opencl_platforms_filter |= 1 << (platform - 1);
5246
5247 } while ((next = strtok (NULL, ",")) != NULL);
5248
5249 free (platforms);
5250 }
5251 else
5252 {
5253 opencl_platforms_filter = -1;
5254 }
5255
5256 return opencl_platforms_filter;
5257 }
5258
5259 u32 setup_devices_filter (char *opencl_devices)
5260 {
5261 u32 devices_filter = 0;
5262
5263 if (opencl_devices)
5264 {
5265 char *devices = strdup (opencl_devices);
5266
5267 char *next = strtok (devices, ",");
5268
5269 do
5270 {
5271 int device_id = atoi (next);
5272
5273 if (device_id < 1 || device_id > 32)
5274 {
5275 log_error ("ERROR: invalid device_id %u specified", device_id);
5276
5277 exit (-1);
5278 }
5279
5280 devices_filter |= 1 << (device_id - 1);
5281
5282 } while ((next = strtok (NULL, ",")) != NULL);
5283
5284 free (devices);
5285 }
5286 else
5287 {
5288 devices_filter = -1;
5289 }
5290
5291 return devices_filter;
5292 }
5293
5294 cl_device_type setup_device_types_filter (char *opencl_device_types)
5295 {
5296 cl_device_type device_types_filter = 0;
5297
5298 if (opencl_device_types)
5299 {
5300 char *device_types = strdup (opencl_device_types);
5301
5302 char *next = strtok (device_types, ",");
5303
5304 do
5305 {
5306 int device_type = atoi (next);
5307
5308 if (device_type < 1 || device_type > 3)
5309 {
5310 log_error ("ERROR: invalid device_type %u specified", device_type);
5311
5312 exit (-1);
5313 }
5314
5315 device_types_filter |= 1 << device_type;
5316
5317 } while ((next = strtok (NULL, ",")) != NULL);
5318
5319 free (device_types);
5320 }
5321 else
5322 {
5323 // Do not use CPU by default, this often reduces GPU performance because
5324 // the CPU is too busy to handle GPU synchronization
5325
5326 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5327 }
5328
5329 return device_types_filter;
5330 }
5331
5332 u32 get_random_num (const u32 min, const u32 max)
5333 {
5334 if (min == max) return (min);
5335
5336 return ((rand () % (max - min)) + min);
5337 }
5338
5339 u32 mydivc32 (const u32 dividend, const u32 divisor)
5340 {
5341 u32 quotient = dividend / divisor;
5342
5343 if (dividend % divisor) quotient++;
5344
5345 return quotient;
5346 }
5347
5348 u64 mydivc64 (const u64 dividend, const u64 divisor)
5349 {
5350 u64 quotient = dividend / divisor;
5351
5352 if (dividend % divisor) quotient++;
5353
5354 return quotient;
5355 }
5356
5357 void format_timer_display (struct tm *tm, char *buf, size_t len)
5358 {
5359 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5360 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5361
5362 if (tm->tm_year - 70)
5363 {
5364 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5365 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5366
5367 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5368 }
5369 else if (tm->tm_yday)
5370 {
5371 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5372 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5373
5374 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5375 }
5376 else if (tm->tm_hour)
5377 {
5378 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5379 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5380
5381 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5382 }
5383 else if (tm->tm_min)
5384 {
5385 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5386 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5387
5388 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5389 }
5390 else
5391 {
5392 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5393
5394 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5395 }
5396 }
5397
5398 void format_speed_display (float val, char *buf, size_t len)
5399 {
5400 if (val <= 0)
5401 {
5402 buf[0] = '0';
5403 buf[1] = ' ';
5404 buf[2] = 0;
5405
5406 return;
5407 }
5408
5409 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5410
5411 uint level = 0;
5412
5413 while (val > 99999)
5414 {
5415 val /= 1000;
5416
5417 level++;
5418 }
5419
5420 /* generate output */
5421
5422 if (level == 0)
5423 {
5424 snprintf (buf, len - 1, "%.0f ", val);
5425 }
5426 else
5427 {
5428 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5429 }
5430 }
5431
5432 void lowercase (u8 *buf, int len)
5433 {
5434 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5435 }
5436
5437 void uppercase (u8 *buf, int len)
5438 {
5439 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5440 }
5441
5442 int fgetl (FILE *fp, char *line_buf)
5443 {
5444 int line_len = 0;
5445
5446 while (!feof (fp))
5447 {
5448 const int c = fgetc (fp);
5449
5450 if (c == EOF) break;
5451
5452 line_buf[line_len] = (char) c;
5453
5454 line_len++;
5455
5456 if (line_len == BUFSIZ) line_len--;
5457
5458 if (c == '\n') break;
5459 }
5460
5461 if (line_len == 0) return 0;
5462
5463 if (line_buf[line_len - 1] == '\n')
5464 {
5465 line_len--;
5466
5467 line_buf[line_len] = 0;
5468 }
5469
5470 if (line_len == 0) return 0;
5471
5472 if (line_buf[line_len - 1] == '\r')
5473 {
5474 line_len--;
5475
5476 line_buf[line_len] = 0;
5477 }
5478
5479 return (line_len);
5480 }
5481
5482 int in_superchop (char *buf)
5483 {
5484 int len = strlen (buf);
5485
5486 while (len)
5487 {
5488 if (buf[len - 1] == '\n')
5489 {
5490 len--;
5491
5492 continue;
5493 }
5494
5495 if (buf[len - 1] == '\r')
5496 {
5497 len--;
5498
5499 continue;
5500 }
5501
5502 break;
5503 }
5504
5505 buf[len] = 0;
5506
5507 return len;
5508 }
5509
5510 char **scan_directory (const char *path)
5511 {
5512 char *tmp_path = mystrdup (path);
5513
5514 size_t tmp_path_len = strlen (tmp_path);
5515
5516 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5517 {
5518 tmp_path[tmp_path_len - 1] = 0;
5519
5520 tmp_path_len = strlen (tmp_path);
5521 }
5522
5523 char **files = NULL;
5524
5525 int num_files = 0;
5526
5527 DIR *d = NULL;
5528
5529 if ((d = opendir (tmp_path)) != NULL)
5530 {
5531 #ifdef OSX
5532 struct dirent e;
5533
5534 for (;;) {
5535 memset (&e, 0, sizeof (e));
5536 struct dirent *de = NULL;
5537
5538 if (readdir_r (d, &e, &de) != 0)
5539 {
5540 log_error ("ERROR: readdir_r() failed");
5541
5542 break;
5543 }
5544
5545 if (de == NULL) break;
5546 #else
5547 struct dirent *de;
5548
5549 while ((de = readdir (d)) != NULL)
5550 {
5551 #endif
5552 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5553
5554 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5555
5556 char *path_file = (char *) mymalloc (path_size + 1);
5557
5558 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5559
5560 path_file[path_size] = 0;
5561
5562 DIR *d_test;
5563
5564 if ((d_test = opendir (path_file)) != NULL)
5565 {
5566 closedir (d_test);
5567
5568 myfree (path_file);
5569 }
5570 else
5571 {
5572 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5573
5574 num_files++;
5575
5576 files[num_files - 1] = path_file;
5577 }
5578 }
5579
5580 closedir (d);
5581 }
5582 else if (errno == ENOTDIR)
5583 {
5584 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5585
5586 num_files++;
5587
5588 files[num_files - 1] = mystrdup (path);
5589 }
5590
5591 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5592
5593 num_files++;
5594
5595 files[num_files - 1] = NULL;
5596
5597 myfree (tmp_path);
5598
5599 return (files);
5600 }
5601
5602 int count_dictionaries (char **dictionary_files)
5603 {
5604 if (dictionary_files == NULL) return 0;
5605
5606 int cnt = 0;
5607
5608 for (int d = 0; dictionary_files[d] != NULL; d++)
5609 {
5610 cnt++;
5611 }
5612
5613 return (cnt);
5614 }
5615
5616 char *stroptitype (const uint opti_type)
5617 {
5618 switch (opti_type)
5619 {
5620 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5621 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5622 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5623 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5624 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5625 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5626 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5627 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5628 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5629 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5630 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5631 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5632 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5633 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5634 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5635 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5636 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5637 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5638 }
5639
5640 return (NULL);
5641 }
5642
5643 char *strparser (const uint parser_status)
5644 {
5645 switch (parser_status)
5646 {
5647 case PARSER_OK: return ((char *) PA_000); break;
5648 case PARSER_COMMENT: return ((char *) PA_001); break;
5649 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5650 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5651 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5652 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5653 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5654 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5655 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5656 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5657 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5658 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5659 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5660 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5661 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5662 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5663 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5664 }
5665
5666 return ((char *) PA_255);
5667 }
5668
5669 char *strhashtype (const uint hash_mode)
5670 {
5671 switch (hash_mode)
5672 {
5673 case 0: return ((char *) HT_00000); break;
5674 case 10: return ((char *) HT_00010); break;
5675 case 11: return ((char *) HT_00011); break;
5676 case 12: return ((char *) HT_00012); break;
5677 case 20: return ((char *) HT_00020); break;
5678 case 21: return ((char *) HT_00021); break;
5679 case 22: return ((char *) HT_00022); break;
5680 case 23: return ((char *) HT_00023); break;
5681 case 30: return ((char *) HT_00030); break;
5682 case 40: return ((char *) HT_00040); break;
5683 case 50: return ((char *) HT_00050); break;
5684 case 60: return ((char *) HT_00060); break;
5685 case 100: return ((char *) HT_00100); break;
5686 case 101: return ((char *) HT_00101); break;
5687 case 110: return ((char *) HT_00110); break;
5688 case 111: return ((char *) HT_00111); break;
5689 case 112: return ((char *) HT_00112); break;
5690 case 120: return ((char *) HT_00120); break;
5691 case 121: return ((char *) HT_00121); break;
5692 case 122: return ((char *) HT_00122); break;
5693 case 124: return ((char *) HT_00124); break;
5694 case 130: return ((char *) HT_00130); break;
5695 case 131: return ((char *) HT_00131); break;
5696 case 132: return ((char *) HT_00132); break;
5697 case 133: return ((char *) HT_00133); break;
5698 case 140: return ((char *) HT_00140); break;
5699 case 141: return ((char *) HT_00141); break;
5700 case 150: return ((char *) HT_00150); break;
5701 case 160: return ((char *) HT_00160); break;
5702 case 190: return ((char *) HT_00190); break;
5703 case 200: return ((char *) HT_00200); break;
5704 case 300: return ((char *) HT_00300); break;
5705 case 400: return ((char *) HT_00400); break;
5706 case 500: return ((char *) HT_00500); break;
5707 case 501: return ((char *) HT_00501); break;
5708 case 900: return ((char *) HT_00900); break;
5709 case 910: return ((char *) HT_00910); break;
5710 case 1000: return ((char *) HT_01000); break;
5711 case 1100: return ((char *) HT_01100); break;
5712 case 1400: return ((char *) HT_01400); break;
5713 case 1410: return ((char *) HT_01410); break;
5714 case 1420: return ((char *) HT_01420); break;
5715 case 1421: return ((char *) HT_01421); break;
5716 case 1430: return ((char *) HT_01430); break;
5717 case 1440: return ((char *) HT_01440); break;
5718 case 1441: return ((char *) HT_01441); break;
5719 case 1450: return ((char *) HT_01450); break;
5720 case 1460: return ((char *) HT_01460); break;
5721 case 1500: return ((char *) HT_01500); break;
5722 case 1600: return ((char *) HT_01600); break;
5723 case 1700: return ((char *) HT_01700); break;
5724 case 1710: return ((char *) HT_01710); break;
5725 case 1711: return ((char *) HT_01711); break;
5726 case 1720: return ((char *) HT_01720); break;
5727 case 1722: return ((char *) HT_01722); break;
5728 case 1730: return ((char *) HT_01730); break;
5729 case 1731: return ((char *) HT_01731); break;
5730 case 1740: return ((char *) HT_01740); break;
5731 case 1750: return ((char *) HT_01750); break;
5732 case 1760: return ((char *) HT_01760); break;
5733 case 1800: return ((char *) HT_01800); break;
5734 case 2100: return ((char *) HT_02100); break;
5735 case 2400: return ((char *) HT_02400); break;
5736 case 2410: return ((char *) HT_02410); break;
5737 case 2500: return ((char *) HT_02500); break;
5738 case 2600: return ((char *) HT_02600); break;
5739 case 2611: return ((char *) HT_02611); break;
5740 case 2612: return ((char *) HT_02612); break;
5741 case 2711: return ((char *) HT_02711); break;
5742 case 2811: return ((char *) HT_02811); break;
5743 case 3000: return ((char *) HT_03000); break;
5744 case 3100: return ((char *) HT_03100); break;
5745 case 3200: return ((char *) HT_03200); break;
5746 case 3710: return ((char *) HT_03710); break;
5747 case 3711: return ((char *) HT_03711); break;
5748 case 3800: return ((char *) HT_03800); break;
5749 case 4300: return ((char *) HT_04300); break;
5750 case 4400: return ((char *) HT_04400); break;
5751 case 4500: return ((char *) HT_04500); break;
5752 case 4700: return ((char *) HT_04700); break;
5753 case 4800: return ((char *) HT_04800); break;
5754 case 4900: return ((char *) HT_04900); break;
5755 case 5000: return ((char *) HT_05000); break;
5756 case 5100: return ((char *) HT_05100); break;
5757 case 5200: return ((char *) HT_05200); break;
5758 case 5300: return ((char *) HT_05300); break;
5759 case 5400: return ((char *) HT_05400); break;
5760 case 5500: return ((char *) HT_05500); break;
5761 case 5600: return ((char *) HT_05600); break;
5762 case 5700: return ((char *) HT_05700); break;
5763 case 5800: return ((char *) HT_05800); break;
5764 case 6000: return ((char *) HT_06000); break;
5765 case 6100: return ((char *) HT_06100); break;
5766 case 6211: return ((char *) HT_06211); break;
5767 case 6212: return ((char *) HT_06212); break;
5768 case 6213: return ((char *) HT_06213); break;
5769 case 6221: return ((char *) HT_06221); break;
5770 case 6222: return ((char *) HT_06222); break;
5771 case 6223: return ((char *) HT_06223); break;
5772 case 6231: return ((char *) HT_06231); break;
5773 case 6232: return ((char *) HT_06232); break;
5774 case 6233: return ((char *) HT_06233); break;
5775 case 6241: return ((char *) HT_06241); break;
5776 case 6242: return ((char *) HT_06242); break;
5777 case 6243: return ((char *) HT_06243); break;
5778 case 6300: return ((char *) HT_06300); break;
5779 case 6400: return ((char *) HT_06400); break;
5780 case 6500: return ((char *) HT_06500); break;
5781 case 6600: return ((char *) HT_06600); break;
5782 case 6700: return ((char *) HT_06700); break;
5783 case 6800: return ((char *) HT_06800); break;
5784 case 6900: return ((char *) HT_06900); break;
5785 case 7100: return ((char *) HT_07100); break;
5786 case 7200: return ((char *) HT_07200); break;
5787 case 7300: return ((char *) HT_07300); break;
5788 case 7400: return ((char *) HT_07400); break;
5789 case 7500: return ((char *) HT_07500); break;
5790 case 7600: return ((char *) HT_07600); break;
5791 case 7700: return ((char *) HT_07700); break;
5792 case 7800: return ((char *) HT_07800); break;
5793 case 7900: return ((char *) HT_07900); break;
5794 case 8000: return ((char *) HT_08000); break;
5795 case 8100: return ((char *) HT_08100); break;
5796 case 8200: return ((char *) HT_08200); break;
5797 case 8300: return ((char *) HT_08300); break;
5798 case 8400: return ((char *) HT_08400); break;
5799 case 8500: return ((char *) HT_08500); break;
5800 case 8600: return ((char *) HT_08600); break;
5801 case 8700: return ((char *) HT_08700); break;
5802 case 8800: return ((char *) HT_08800); break;
5803 case 8900: return ((char *) HT_08900); break;
5804 case 9000: return ((char *) HT_09000); break;
5805 case 9100: return ((char *) HT_09100); break;
5806 case 9200: return ((char *) HT_09200); break;
5807 case 9300: return ((char *) HT_09300); break;
5808 case 9400: return ((char *) HT_09400); break;
5809 case 9500: return ((char *) HT_09500); break;
5810 case 9600: return ((char *) HT_09600); break;
5811 case 9700: return ((char *) HT_09700); break;
5812 case 9710: return ((char *) HT_09710); break;
5813 case 9720: return ((char *) HT_09720); break;
5814 case 9800: return ((char *) HT_09800); break;
5815 case 9810: return ((char *) HT_09810); break;
5816 case 9820: return ((char *) HT_09820); break;
5817 case 9900: return ((char *) HT_09900); break;
5818 case 10000: return ((char *) HT_10000); break;
5819 case 10100: return ((char *) HT_10100); break;
5820 case 10200: return ((char *) HT_10200); break;
5821 case 10300: return ((char *) HT_10300); break;
5822 case 10400: return ((char *) HT_10400); break;
5823 case 10410: return ((char *) HT_10410); break;
5824 case 10420: return ((char *) HT_10420); break;
5825 case 10500: return ((char *) HT_10500); break;
5826 case 10600: return ((char *) HT_10600); break;
5827 case 10700: return ((char *) HT_10700); break;
5828 case 10800: return ((char *) HT_10800); break;
5829 case 10900: return ((char *) HT_10900); break;
5830 case 11000: return ((char *) HT_11000); break;
5831 case 11100: return ((char *) HT_11100); break;
5832 case 11200: return ((char *) HT_11200); break;
5833 case 11300: return ((char *) HT_11300); break;
5834 case 11400: return ((char *) HT_11400); break;
5835 case 11500: return ((char *) HT_11500); break;
5836 case 11600: return ((char *) HT_11600); break;
5837 case 11700: return ((char *) HT_11700); break;
5838 case 11800: return ((char *) HT_11800); break;
5839 case 11900: return ((char *) HT_11900); break;
5840 case 12000: return ((char *) HT_12000); break;
5841 case 12100: return ((char *) HT_12100); break;
5842 case 12200: return ((char *) HT_12200); break;
5843 case 12300: return ((char *) HT_12300); break;
5844 case 12400: return ((char *) HT_12400); break;
5845 case 12500: return ((char *) HT_12500); break;
5846 case 12600: return ((char *) HT_12600); break;
5847 case 12700: return ((char *) HT_12700); break;
5848 case 12800: return ((char *) HT_12800); break;
5849 case 12900: return ((char *) HT_12900); break;
5850 case 13000: return ((char *) HT_13000); break;
5851 case 13100: return ((char *) HT_13100); break;
5852 }
5853
5854 return ((char *) "Unknown");
5855 }
5856
5857 char *strstatus (const uint devices_status)
5858 {
5859 switch (devices_status)
5860 {
5861 case STATUS_INIT: return ((char *) ST_0000); break;
5862 case STATUS_STARTING: return ((char *) ST_0001); break;
5863 case STATUS_RUNNING: return ((char *) ST_0002); break;
5864 case STATUS_PAUSED: return ((char *) ST_0003); break;
5865 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5866 case STATUS_CRACKED: return ((char *) ST_0005); break;
5867 case STATUS_ABORTED: return ((char *) ST_0006); break;
5868 case STATUS_QUIT: return ((char *) ST_0007); break;
5869 case STATUS_BYPASS: return ((char *) ST_0008); break;
5870 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5871 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
5872 }
5873
5874 return ((char *) "Unknown");
5875 }
5876
5877 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5878 {
5879 uint hash_type = data.hash_type;
5880 uint hash_mode = data.hash_mode;
5881 uint salt_type = data.salt_type;
5882 uint opts_type = data.opts_type;
5883 uint opti_type = data.opti_type;
5884 uint dgst_size = data.dgst_size;
5885
5886 char *hashfile = data.hashfile;
5887
5888 uint len = 4096;
5889
5890 uint digest_buf[64] = { 0 };
5891
5892 u64 *digest_buf64 = (u64 *) digest_buf;
5893
5894 char *digests_buf_ptr = (char *) data.digests_buf;
5895
5896 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5897
5898 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5899 {
5900 uint tt;
5901
5902 switch (hash_type)
5903 {
5904 case HASH_TYPE_DESCRYPT:
5905 FP (digest_buf[1], digest_buf[0], tt);
5906 break;
5907
5908 case HASH_TYPE_DESRACF:
5909 digest_buf[0] = rotl32 (digest_buf[0], 29);
5910 digest_buf[1] = rotl32 (digest_buf[1], 29);
5911
5912 FP (digest_buf[1], digest_buf[0], tt);
5913 break;
5914
5915 case HASH_TYPE_LM:
5916 FP (digest_buf[1], digest_buf[0], tt);
5917 break;
5918
5919 case HASH_TYPE_NETNTLM:
5920 digest_buf[0] = rotl32 (digest_buf[0], 29);
5921 digest_buf[1] = rotl32 (digest_buf[1], 29);
5922 digest_buf[2] = rotl32 (digest_buf[2], 29);
5923 digest_buf[3] = rotl32 (digest_buf[3], 29);
5924
5925 FP (digest_buf[1], digest_buf[0], tt);
5926 FP (digest_buf[3], digest_buf[2], tt);
5927 break;
5928
5929 case HASH_TYPE_BSDICRYPT:
5930 digest_buf[0] = rotl32 (digest_buf[0], 31);
5931 digest_buf[1] = rotl32 (digest_buf[1], 31);
5932
5933 FP (digest_buf[1], digest_buf[0], tt);
5934 break;
5935 }
5936 }
5937
5938 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5939 {
5940 switch (hash_type)
5941 {
5942 case HASH_TYPE_MD4:
5943 digest_buf[0] += MD4M_A;
5944 digest_buf[1] += MD4M_B;
5945 digest_buf[2] += MD4M_C;
5946 digest_buf[3] += MD4M_D;
5947 break;
5948
5949 case HASH_TYPE_MD5:
5950 digest_buf[0] += MD5M_A;
5951 digest_buf[1] += MD5M_B;
5952 digest_buf[2] += MD5M_C;
5953 digest_buf[3] += MD5M_D;
5954 break;
5955
5956 case HASH_TYPE_SHA1:
5957 digest_buf[0] += SHA1M_A;
5958 digest_buf[1] += SHA1M_B;
5959 digest_buf[2] += SHA1M_C;
5960 digest_buf[3] += SHA1M_D;
5961 digest_buf[4] += SHA1M_E;
5962 break;
5963
5964 case HASH_TYPE_SHA256:
5965 digest_buf[0] += SHA256M_A;
5966 digest_buf[1] += SHA256M_B;
5967 digest_buf[2] += SHA256M_C;
5968 digest_buf[3] += SHA256M_D;
5969 digest_buf[4] += SHA256M_E;
5970 digest_buf[5] += SHA256M_F;
5971 digest_buf[6] += SHA256M_G;
5972 digest_buf[7] += SHA256M_H;
5973 break;
5974
5975 case HASH_TYPE_SHA384:
5976 digest_buf64[0] += SHA384M_A;
5977 digest_buf64[1] += SHA384M_B;
5978 digest_buf64[2] += SHA384M_C;
5979 digest_buf64[3] += SHA384M_D;
5980 digest_buf64[4] += SHA384M_E;
5981 digest_buf64[5] += SHA384M_F;
5982 digest_buf64[6] += 0;
5983 digest_buf64[7] += 0;
5984 break;
5985
5986 case HASH_TYPE_SHA512:
5987 digest_buf64[0] += SHA512M_A;
5988 digest_buf64[1] += SHA512M_B;
5989 digest_buf64[2] += SHA512M_C;
5990 digest_buf64[3] += SHA512M_D;
5991 digest_buf64[4] += SHA512M_E;
5992 digest_buf64[5] += SHA512M_F;
5993 digest_buf64[6] += SHA512M_G;
5994 digest_buf64[7] += SHA512M_H;
5995 break;
5996 }
5997 }
5998
5999 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
6000 {
6001 if (dgst_size == DGST_SIZE_4_2)
6002 {
6003 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6004 }
6005 else if (dgst_size == DGST_SIZE_4_4)
6006 {
6007 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6008 }
6009 else if (dgst_size == DGST_SIZE_4_5)
6010 {
6011 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6012 }
6013 else if (dgst_size == DGST_SIZE_4_6)
6014 {
6015 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6016 }
6017 else if (dgst_size == DGST_SIZE_4_8)
6018 {
6019 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6020 }
6021 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6022 {
6023 if (hash_type == HASH_TYPE_WHIRLPOOL)
6024 {
6025 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6026 }
6027 else if (hash_type == HASH_TYPE_SHA384)
6028 {
6029 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6030 }
6031 else if (hash_type == HASH_TYPE_SHA512)
6032 {
6033 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6034 }
6035 else if (hash_type == HASH_TYPE_GOST)
6036 {
6037 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6038 }
6039 }
6040 else if (dgst_size == DGST_SIZE_4_64)
6041 {
6042 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6043 }
6044 else if (dgst_size == DGST_SIZE_8_25)
6045 {
6046 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6047 }
6048 }
6049
6050 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6051 | (data.salt_type == SALT_TYPE_EXTERN)
6052 | (data.salt_type == SALT_TYPE_EMBEDDED));
6053
6054 salt_t salt;
6055
6056 if (isSalted)
6057 {
6058 memset (&salt, 0, sizeof (salt_t));
6059
6060 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6061
6062 char *ptr = (char *) salt.salt_buf;
6063
6064 uint len = salt.salt_len;
6065
6066 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6067 {
6068 uint tt;
6069
6070 switch (hash_type)
6071 {
6072 case HASH_TYPE_NETNTLM:
6073
6074 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6075 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6076
6077 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6078
6079 break;
6080 }
6081 }
6082
6083 if (opts_type & OPTS_TYPE_ST_UNICODE)
6084 {
6085 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6086 {
6087 ptr[i] = ptr[j];
6088 }
6089
6090 len = len / 2;
6091 }
6092
6093 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6094 {
6095 uint max = salt.salt_len / 4;
6096
6097 if (len % 4) max++;
6098
6099 for (uint i = 0; i < max; i++)
6100 {
6101 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6102 }
6103 }
6104
6105 if (opts_type & OPTS_TYPE_ST_HEX)
6106 {
6107 char tmp[64] = { 0 };
6108
6109 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6110 {
6111 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6112 }
6113
6114 len = len * 2;
6115
6116 memcpy (ptr, tmp, len);
6117 }
6118
6119 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6120
6121 memset (ptr + len, 0, memset_size);
6122
6123 salt.salt_len = len;
6124 }
6125
6126 //
6127 // some modes require special encoding
6128 //
6129
6130 uint out_buf_plain[256] = { 0 };
6131 uint out_buf_salt[256] = { 0 };
6132
6133 char tmp_buf[1024] = { 0 };
6134
6135 char *ptr_plain = (char *) out_buf_plain;
6136 char *ptr_salt = (char *) out_buf_salt;
6137
6138 if (hash_mode == 22)
6139 {
6140 char username[30] = { 0 };
6141
6142 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6143
6144 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6145
6146 u16 *ptr = (u16 *) digest_buf;
6147
6148 tmp_buf[ 0] = sig[0];
6149 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6150 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6151 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6152 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6153 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6154 tmp_buf[ 6] = sig[1];
6155 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6156 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6157 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6158 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6159 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6160 tmp_buf[12] = sig[2];
6161 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6162 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6163 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6164 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6165 tmp_buf[17] = sig[3];
6166 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6167 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6168 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6169 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6170 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6171 tmp_buf[23] = sig[4];
6172 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6173 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6174 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6175 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6176 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6177 tmp_buf[29] = sig[5];
6178
6179 snprintf (out_buf, len-1, "%s:%s",
6180 tmp_buf,
6181 username);
6182 }
6183 else if (hash_mode == 23)
6184 {
6185 // do not show the \nskyper\n part in output
6186
6187 char *salt_buf_ptr = (char *) salt.salt_buf;
6188
6189 salt_buf_ptr[salt.salt_len - 8] = 0;
6190
6191 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6192 digest_buf[0],
6193 digest_buf[1],
6194 digest_buf[2],
6195 digest_buf[3],
6196 salt_buf_ptr);
6197 }
6198 else if (hash_mode == 101)
6199 {
6200 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6201
6202 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6203 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6204 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6205 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6206 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6207
6208 memcpy (tmp_buf, digest_buf, 20);
6209
6210 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6211
6212 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6213 }
6214 else if (hash_mode == 111)
6215 {
6216 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6217
6218 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6219 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6220 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6221 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6222 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6223
6224 memcpy (tmp_buf, digest_buf, 20);
6225 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6226
6227 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6228
6229 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6230 }
6231 else if (hash_mode == 122)
6232 {
6233 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6234 (char *) salt.salt_buf,
6235 digest_buf[0],
6236 digest_buf[1],
6237 digest_buf[2],
6238 digest_buf[3],
6239 digest_buf[4]);
6240 }
6241 else if (hash_mode == 124)
6242 {
6243 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6244 (char *) salt.salt_buf,
6245 digest_buf[0],
6246 digest_buf[1],
6247 digest_buf[2],
6248 digest_buf[3],
6249 digest_buf[4]);
6250 }
6251 else if (hash_mode == 131)
6252 {
6253 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6254 (char *) salt.salt_buf,
6255 0, 0, 0, 0, 0,
6256 digest_buf[0],
6257 digest_buf[1],
6258 digest_buf[2],
6259 digest_buf[3],
6260 digest_buf[4]);
6261 }
6262 else if (hash_mode == 132)
6263 {
6264 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6265 (char *) salt.salt_buf,
6266 digest_buf[0],
6267 digest_buf[1],
6268 digest_buf[2],
6269 digest_buf[3],
6270 digest_buf[4]);
6271 }
6272 else if (hash_mode == 133)
6273 {
6274 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6275
6276 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6277 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6278 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6279 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6280 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6281
6282 memcpy (tmp_buf, digest_buf, 20);
6283
6284 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6285
6286 snprintf (out_buf, len-1, "%s", ptr_plain);
6287 }
6288 else if (hash_mode == 141)
6289 {
6290 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6291
6292 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6293
6294 memset (tmp_buf, 0, sizeof (tmp_buf));
6295
6296 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6297
6298 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6299 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6300 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6301 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6302 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6303
6304 memcpy (tmp_buf, digest_buf, 20);
6305
6306 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6307
6308 ptr_plain[27] = 0;
6309
6310 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6311 }
6312 else if (hash_mode == 400)
6313 {
6314 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6315
6316 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6317 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6318 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6319 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6320
6321 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6322
6323 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6324 }
6325 else if (hash_mode == 500)
6326 {
6327 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6328
6329 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6330 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6331 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6332 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6333
6334 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6335
6336 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6337 {
6338 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6339 }
6340 else
6341 {
6342 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6343 }
6344 }
6345 else if (hash_mode == 501)
6346 {
6347 uint digest_idx = salt.digests_offset + digest_pos;
6348
6349 hashinfo_t **hashinfo_ptr = data.hash_info;
6350 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6351
6352 snprintf (out_buf, len-1, "%s", hash_buf);
6353 }
6354 else if (hash_mode == 1421)
6355 {
6356 u8 *salt_ptr = (u8 *) salt.salt_buf;
6357
6358 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6359 salt_ptr[0],
6360 salt_ptr[1],
6361 salt_ptr[2],
6362 salt_ptr[3],
6363 salt_ptr[4],
6364 salt_ptr[5],
6365 digest_buf[0],
6366 digest_buf[1],
6367 digest_buf[2],
6368 digest_buf[3],
6369 digest_buf[4],
6370 digest_buf[5],
6371 digest_buf[6],
6372 digest_buf[7]);
6373 }
6374 else if (hash_mode == 1441)
6375 {
6376 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6377
6378 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6379
6380 memset (tmp_buf, 0, sizeof (tmp_buf));
6381
6382 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6383
6384 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6385 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6386 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6387 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6388 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6389 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6390 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6391 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6392
6393 memcpy (tmp_buf, digest_buf, 32);
6394
6395 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6396
6397 ptr_plain[43] = 0;
6398
6399 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6400 }
6401 else if (hash_mode == 1500)
6402 {
6403 out_buf[0] = salt.salt_sign[0] & 0xff;
6404 out_buf[1] = salt.salt_sign[1] & 0xff;
6405 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6406 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6407 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6408
6409 memset (tmp_buf, 0, sizeof (tmp_buf));
6410
6411 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6412
6413 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6414 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6415
6416 memcpy (tmp_buf, digest_buf, 8);
6417
6418 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6419
6420 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6421
6422 out_buf[13] = 0;
6423 }
6424 else if (hash_mode == 1600)
6425 {
6426 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6427
6428 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6429 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6430 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6431 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6432
6433 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6434
6435 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6436 {
6437 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6438 }
6439 else
6440 {
6441 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6442 }
6443 }
6444 else if (hash_mode == 1711)
6445 {
6446 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6447
6448 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6449 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6450 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6451 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6452 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6453 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6454 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6455 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6456
6457 memcpy (tmp_buf, digest_buf, 64);
6458 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6459
6460 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6461
6462 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6463 }
6464 else if (hash_mode == 1722)
6465 {
6466 uint *ptr = digest_buf;
6467
6468 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6469 (unsigned char *) salt.salt_buf,
6470 ptr[ 1], ptr[ 0],
6471 ptr[ 3], ptr[ 2],
6472 ptr[ 5], ptr[ 4],
6473 ptr[ 7], ptr[ 6],
6474 ptr[ 9], ptr[ 8],
6475 ptr[11], ptr[10],
6476 ptr[13], ptr[12],
6477 ptr[15], ptr[14]);
6478 }
6479 else if (hash_mode == 1731)
6480 {
6481 uint *ptr = digest_buf;
6482
6483 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6484 (unsigned char *) salt.salt_buf,
6485 ptr[ 1], ptr[ 0],
6486 ptr[ 3], ptr[ 2],
6487 ptr[ 5], ptr[ 4],
6488 ptr[ 7], ptr[ 6],
6489 ptr[ 9], ptr[ 8],
6490 ptr[11], ptr[10],
6491 ptr[13], ptr[12],
6492 ptr[15], ptr[14]);
6493 }
6494 else if (hash_mode == 1800)
6495 {
6496 // temp workaround
6497
6498 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6499 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6500 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6501 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6502 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6503 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6504 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6505 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6506
6507 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6508
6509 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6510 {
6511 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6512 }
6513 else
6514 {
6515 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6516 }
6517 }
6518 else if (hash_mode == 2100)
6519 {
6520 uint pos = 0;
6521
6522 snprintf (out_buf + pos, len-1, "%s%i#",
6523 SIGNATURE_DCC2,
6524 salt.salt_iter + 1);
6525
6526 uint signature_len = strlen (out_buf);
6527
6528 pos += signature_len;
6529 len -= signature_len;
6530
6531 char *salt_ptr = (char *) salt.salt_buf;
6532
6533 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6534
6535 snprintf (out_buf + pos, 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 == 2400) || (hash_mode == 2410))
6542 {
6543 memcpy (tmp_buf, digest_buf, 16);
6544
6545 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6546
6547 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6548 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6549 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6550 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6551
6552 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6553 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6554 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6555 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6556
6557 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6558 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6559 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6560 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6561
6562 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6563 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6564 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6565 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6566
6567 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6568 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6569 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6570 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6571
6572 out_buf[16] = 0;
6573 }
6574 else if (hash_mode == 2500)
6575 {
6576 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6577
6578 wpa_t *wpa = &wpas[salt_pos];
6579
6580 uint pke[25] = { 0 };
6581
6582 char *pke_ptr = (char *) pke;
6583
6584 for (uint i = 0; i < 25; i++)
6585 {
6586 pke[i] = byte_swap_32 (wpa->pke[i]);
6587 }
6588
6589 unsigned char mac1[6] = { 0 };
6590 unsigned char mac2[6] = { 0 };
6591
6592 memcpy (mac1, pke_ptr + 23, 6);
6593 memcpy (mac2, pke_ptr + 29, 6);
6594
6595 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6596 (char *) salt.salt_buf,
6597 mac1[0],
6598 mac1[1],
6599 mac1[2],
6600 mac1[3],
6601 mac1[4],
6602 mac1[5],
6603 mac2[0],
6604 mac2[1],
6605 mac2[2],
6606 mac2[3],
6607 mac2[4],
6608 mac2[5]);
6609 }
6610 else if (hash_mode == 4400)
6611 {
6612 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6613 byte_swap_32 (digest_buf[0]),
6614 byte_swap_32 (digest_buf[1]),
6615 byte_swap_32 (digest_buf[2]),
6616 byte_swap_32 (digest_buf[3]));
6617 }
6618 else if (hash_mode == 4700)
6619 {
6620 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6621 byte_swap_32 (digest_buf[0]),
6622 byte_swap_32 (digest_buf[1]),
6623 byte_swap_32 (digest_buf[2]),
6624 byte_swap_32 (digest_buf[3]),
6625 byte_swap_32 (digest_buf[4]));
6626 }
6627 else if (hash_mode == 4800)
6628 {
6629 u8 chap_id_byte = (u8) salt.salt_buf[4];
6630
6631 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6632 digest_buf[0],
6633 digest_buf[1],
6634 digest_buf[2],
6635 digest_buf[3],
6636 byte_swap_32 (salt.salt_buf[0]),
6637 byte_swap_32 (salt.salt_buf[1]),
6638 byte_swap_32 (salt.salt_buf[2]),
6639 byte_swap_32 (salt.salt_buf[3]),
6640 chap_id_byte);
6641 }
6642 else if (hash_mode == 4900)
6643 {
6644 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6645 byte_swap_32 (digest_buf[0]),
6646 byte_swap_32 (digest_buf[1]),
6647 byte_swap_32 (digest_buf[2]),
6648 byte_swap_32 (digest_buf[3]),
6649 byte_swap_32 (digest_buf[4]));
6650 }
6651 else if (hash_mode == 5100)
6652 {
6653 snprintf (out_buf, len-1, "%08x%08x",
6654 digest_buf[0],
6655 digest_buf[1]);
6656 }
6657 else if (hash_mode == 5200)
6658 {
6659 snprintf (out_buf, len-1, "%s", hashfile);
6660 }
6661 else if (hash_mode == 5300)
6662 {
6663 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6664
6665 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6666
6667 int buf_len = len -1;
6668
6669 // msg_buf
6670
6671 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6672
6673 for (uint i = 0; i < ikepsk_msg_len; i++)
6674 {
6675 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6676 {
6677 snprintf (out_buf, buf_len, ":");
6678
6679 buf_len--;
6680 out_buf++;
6681 }
6682
6683 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6684
6685 buf_len -= 8;
6686 out_buf += 8;
6687 }
6688
6689 // nr_buf
6690
6691 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6692
6693 for (uint i = 0; i < ikepsk_nr_len; i++)
6694 {
6695 if ((i == 0) || (i == 5))
6696 {
6697 snprintf (out_buf, buf_len, ":");
6698
6699 buf_len--;
6700 out_buf++;
6701 }
6702
6703 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6704
6705 buf_len -= 8;
6706 out_buf += 8;
6707 }
6708
6709 // digest_buf
6710
6711 for (uint i = 0; i < 4; i++)
6712 {
6713 if (i == 0)
6714 {
6715 snprintf (out_buf, buf_len, ":");
6716
6717 buf_len--;
6718 out_buf++;
6719 }
6720
6721 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6722
6723 buf_len -= 8;
6724 out_buf += 8;
6725 }
6726 }
6727 else if (hash_mode == 5400)
6728 {
6729 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6730
6731 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6732
6733 int buf_len = len -1;
6734
6735 // msg_buf
6736
6737 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6738
6739 for (uint i = 0; i < ikepsk_msg_len; i++)
6740 {
6741 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6742 {
6743 snprintf (out_buf, buf_len, ":");
6744
6745 buf_len--;
6746 out_buf++;
6747 }
6748
6749 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6750
6751 buf_len -= 8;
6752 out_buf += 8;
6753 }
6754
6755 // nr_buf
6756
6757 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6758
6759 for (uint i = 0; i < ikepsk_nr_len; i++)
6760 {
6761 if ((i == 0) || (i == 5))
6762 {
6763 snprintf (out_buf, buf_len, ":");
6764
6765 buf_len--;
6766 out_buf++;
6767 }
6768
6769 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6770
6771 buf_len -= 8;
6772 out_buf += 8;
6773 }
6774
6775 // digest_buf
6776
6777 for (uint i = 0; i < 5; i++)
6778 {
6779 if (i == 0)
6780 {
6781 snprintf (out_buf, buf_len, ":");
6782
6783 buf_len--;
6784 out_buf++;
6785 }
6786
6787 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6788
6789 buf_len -= 8;
6790 out_buf += 8;
6791 }
6792 }
6793 else if (hash_mode == 5500)
6794 {
6795 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6796
6797 netntlm_t *netntlm = &netntlms[salt_pos];
6798
6799 char user_buf[64] = { 0 };
6800 char domain_buf[64] = { 0 };
6801 char srvchall_buf[1024] = { 0 };
6802 char clichall_buf[1024] = { 0 };
6803
6804 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6805 {
6806 char *ptr = (char *) netntlm->userdomain_buf;
6807
6808 user_buf[i] = ptr[j];
6809 }
6810
6811 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6812 {
6813 char *ptr = (char *) netntlm->userdomain_buf;
6814
6815 domain_buf[i] = ptr[netntlm->user_len + j];
6816 }
6817
6818 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6819 {
6820 u8 *ptr = (u8 *) netntlm->chall_buf;
6821
6822 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6823 }
6824
6825 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6826 {
6827 u8 *ptr = (u8 *) netntlm->chall_buf;
6828
6829 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6830 }
6831
6832 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6833 user_buf,
6834 domain_buf,
6835 srvchall_buf,
6836 digest_buf[0],
6837 digest_buf[1],
6838 digest_buf[2],
6839 digest_buf[3],
6840 byte_swap_32 (salt.salt_buf_pc[0]),
6841 byte_swap_32 (salt.salt_buf_pc[1]),
6842 clichall_buf);
6843 }
6844 else if (hash_mode == 5600)
6845 {
6846 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6847
6848 netntlm_t *netntlm = &netntlms[salt_pos];
6849
6850 char user_buf[64] = { 0 };
6851 char domain_buf[64] = { 0 };
6852 char srvchall_buf[1024] = { 0 };
6853 char clichall_buf[1024] = { 0 };
6854
6855 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6856 {
6857 char *ptr = (char *) netntlm->userdomain_buf;
6858
6859 user_buf[i] = ptr[j];
6860 }
6861
6862 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6863 {
6864 char *ptr = (char *) netntlm->userdomain_buf;
6865
6866 domain_buf[i] = ptr[netntlm->user_len + j];
6867 }
6868
6869 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6870 {
6871 u8 *ptr = (u8 *) netntlm->chall_buf;
6872
6873 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6874 }
6875
6876 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6877 {
6878 u8 *ptr = (u8 *) netntlm->chall_buf;
6879
6880 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6881 }
6882
6883 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6884 user_buf,
6885 domain_buf,
6886 srvchall_buf,
6887 digest_buf[0],
6888 digest_buf[1],
6889 digest_buf[2],
6890 digest_buf[3],
6891 clichall_buf);
6892 }
6893 else if (hash_mode == 5700)
6894 {
6895 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6896
6897 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6898 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6899 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6900 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6901 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6902 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6903 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6904 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6905
6906 memcpy (tmp_buf, digest_buf, 32);
6907
6908 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6909
6910 ptr_plain[43] = 0;
6911
6912 snprintf (out_buf, len-1, "%s", ptr_plain);
6913 }
6914 else if (hash_mode == 5800)
6915 {
6916 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6917 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6918 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6919 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6920 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6921
6922 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6923 digest_buf[0],
6924 digest_buf[1],
6925 digest_buf[2],
6926 digest_buf[3],
6927 digest_buf[4]);
6928 }
6929 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6930 {
6931 snprintf (out_buf, len-1, "%s", hashfile);
6932 }
6933 else if (hash_mode == 6300)
6934 {
6935 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6936
6937 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6938 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6939 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6940 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6941
6942 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6943
6944 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6945 }
6946 else if (hash_mode == 6400)
6947 {
6948 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6949
6950 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6951 }
6952 else if (hash_mode == 6500)
6953 {
6954 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6955
6956 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6957 }
6958 else if (hash_mode == 6600)
6959 {
6960 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6961
6962 agilekey_t *agilekey = &agilekeys[salt_pos];
6963
6964 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6965 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6966
6967 uint buf_len = len - 1;
6968
6969 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6970 buf_len -= 22;
6971
6972 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6973 {
6974 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6975
6976 buf_len -= 2;
6977 }
6978 }
6979 else if (hash_mode == 6700)
6980 {
6981 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6982
6983 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6984 }
6985 else if (hash_mode == 6800)
6986 {
6987 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6988 }
6989 else if (hash_mode == 7100)
6990 {
6991 uint *ptr = digest_buf;
6992
6993 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6994
6995 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6996
6997 uint esalt[8] = { 0 };
6998
6999 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
7000 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
7001 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
7002 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
7003 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
7004 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
7005 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
7006 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
7007
7008 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",
7009 SIGNATURE_SHA512OSX,
7010 salt.salt_iter + 1,
7011 esalt[ 0], esalt[ 1],
7012 esalt[ 2], esalt[ 3],
7013 esalt[ 4], esalt[ 5],
7014 esalt[ 6], esalt[ 7],
7015 ptr [ 1], ptr [ 0],
7016 ptr [ 3], ptr [ 2],
7017 ptr [ 5], ptr [ 4],
7018 ptr [ 7], ptr [ 6],
7019 ptr [ 9], ptr [ 8],
7020 ptr [11], ptr [10],
7021 ptr [13], ptr [12],
7022 ptr [15], ptr [14]);
7023 }
7024 else if (hash_mode == 7200)
7025 {
7026 uint *ptr = digest_buf;
7027
7028 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7029
7030 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7031
7032 uint len_used = 0;
7033
7034 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7035
7036 len_used = strlen (out_buf);
7037
7038 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7039
7040 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7041 {
7042 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7043 }
7044
7045 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",
7046 ptr [ 1], ptr [ 0],
7047 ptr [ 3], ptr [ 2],
7048 ptr [ 5], ptr [ 4],
7049 ptr [ 7], ptr [ 6],
7050 ptr [ 9], ptr [ 8],
7051 ptr [11], ptr [10],
7052 ptr [13], ptr [12],
7053 ptr [15], ptr [14]);
7054 }
7055 else if (hash_mode == 7300)
7056 {
7057 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7058
7059 rakp_t *rakp = &rakps[salt_pos];
7060
7061 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7062 {
7063 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7064 }
7065
7066 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7067 digest_buf[0],
7068 digest_buf[1],
7069 digest_buf[2],
7070 digest_buf[3],
7071 digest_buf[4]);
7072 }
7073 else if (hash_mode == 7400)
7074 {
7075 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7076
7077 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7078 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7079 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7080 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7081 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7082 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7083 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7084 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7085
7086 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7087
7088 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7089 {
7090 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7091 }
7092 else
7093 {
7094 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7095 }
7096 }
7097 else if (hash_mode == 7500)
7098 {
7099 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7100
7101 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7102
7103 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7104 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7105
7106 char data[128] = { 0 };
7107
7108 char *ptr_data = data;
7109
7110 for (uint i = 0; i < 36; i++, ptr_data += 2)
7111 {
7112 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7113 }
7114
7115 for (uint i = 0; i < 16; i++, ptr_data += 2)
7116 {
7117 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7118 }
7119
7120 *ptr_data = 0;
7121
7122 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7123 SIGNATURE_KRB5PA,
7124 (char *) krb5pa->user,
7125 (char *) krb5pa->realm,
7126 (char *) krb5pa->salt,
7127 data);
7128 }
7129 else if (hash_mode == 7700)
7130 {
7131 snprintf (out_buf, len-1, "%s$%08X%08X",
7132 (char *) salt.salt_buf,
7133 digest_buf[0],
7134 digest_buf[1]);
7135 }
7136 else if (hash_mode == 7800)
7137 {
7138 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7139 (char *) salt.salt_buf,
7140 digest_buf[0],
7141 digest_buf[1],
7142 digest_buf[2],
7143 digest_buf[3],
7144 digest_buf[4]);
7145 }
7146 else if (hash_mode == 7900)
7147 {
7148 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7149
7150 // ugly hack start
7151
7152 char *tmp = (char *) salt.salt_buf_pc;
7153
7154 ptr_plain[42] = tmp[0];
7155
7156 // ugly hack end
7157
7158 ptr_plain[43] = 0;
7159
7160 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7161 }
7162 else if (hash_mode == 8000)
7163 {
7164 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7165 (unsigned char *) salt.salt_buf,
7166 digest_buf[0],
7167 digest_buf[1],
7168 digest_buf[2],
7169 digest_buf[3],
7170 digest_buf[4],
7171 digest_buf[5],
7172 digest_buf[6],
7173 digest_buf[7]);
7174 }
7175 else if (hash_mode == 8100)
7176 {
7177 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7178 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7179
7180 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7181 (unsigned char *) salt.salt_buf,
7182 digest_buf[0],
7183 digest_buf[1],
7184 digest_buf[2],
7185 digest_buf[3],
7186 digest_buf[4]);
7187 }
7188 else if (hash_mode == 8200)
7189 {
7190 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7191
7192 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7193
7194 char data_buf[4096] = { 0 };
7195
7196 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7197 {
7198 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7199 }
7200
7201 data_buf[cloudkey->data_len * 2] = 0;
7202
7203 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7204 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7205 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7206 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7207 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7208 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7209 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7210 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7211
7212 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7213 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7214 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7215 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7216
7217 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7218 digest_buf[0],
7219 digest_buf[1],
7220 digest_buf[2],
7221 digest_buf[3],
7222 digest_buf[4],
7223 digest_buf[5],
7224 digest_buf[6],
7225 digest_buf[7],
7226 salt.salt_buf[0],
7227 salt.salt_buf[1],
7228 salt.salt_buf[2],
7229 salt.salt_buf[3],
7230 salt.salt_iter + 1,
7231 data_buf);
7232 }
7233 else if (hash_mode == 8300)
7234 {
7235 char digest_buf_c[34] = { 0 };
7236
7237 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7238
7239 digest_buf_c[32] = 0;
7240
7241 // domain
7242
7243 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7244
7245 char domain_buf_c[33] = { 0 };
7246
7247 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7248
7249 for (uint i = 0; i < salt_pc_len; i++)
7250 {
7251 const char next = domain_buf_c[i];
7252
7253 domain_buf_c[i] = '.';
7254
7255 i += next;
7256 }
7257
7258 domain_buf_c[salt_pc_len] = 0;
7259
7260 // final
7261
7262 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7263 }
7264 else if (hash_mode == 8500)
7265 {
7266 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7267 }
7268 else if (hash_mode == 2612)
7269 {
7270 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7271 SIGNATURE_PHPS,
7272 (char *) salt.salt_buf,
7273 digest_buf[0],
7274 digest_buf[1],
7275 digest_buf[2],
7276 digest_buf[3]);
7277 }
7278 else if (hash_mode == 3711)
7279 {
7280 char *salt_ptr = (char *) salt.salt_buf;
7281
7282 salt_ptr[salt.salt_len - 1] = 0;
7283
7284 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7285 SIGNATURE_MEDIAWIKI_B,
7286 salt_ptr,
7287 digest_buf[0],
7288 digest_buf[1],
7289 digest_buf[2],
7290 digest_buf[3]);
7291 }
7292 else if (hash_mode == 8800)
7293 {
7294 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7295
7296 androidfde_t *androidfde = &androidfdes[salt_pos];
7297
7298 char tmp[3073] = { 0 };
7299
7300 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7301 {
7302 sprintf (tmp + j, "%08x", androidfde->data[i]);
7303 }
7304
7305 tmp[3072] = 0;
7306
7307 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7308 SIGNATURE_ANDROIDFDE,
7309 byte_swap_32 (salt.salt_buf[0]),
7310 byte_swap_32 (salt.salt_buf[1]),
7311 byte_swap_32 (salt.salt_buf[2]),
7312 byte_swap_32 (salt.salt_buf[3]),
7313 byte_swap_32 (digest_buf[0]),
7314 byte_swap_32 (digest_buf[1]),
7315 byte_swap_32 (digest_buf[2]),
7316 byte_swap_32 (digest_buf[3]),
7317 tmp);
7318 }
7319 else if (hash_mode == 8900)
7320 {
7321 uint N = salt.scrypt_N;
7322 uint r = salt.scrypt_r;
7323 uint p = salt.scrypt_p;
7324
7325 char base64_salt[32] = { 0 };
7326
7327 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7328
7329 memset (tmp_buf, 0, 46);
7330
7331 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7332 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7333 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7334 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7335 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7336 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7337 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7338 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7339 digest_buf[8] = 0; // needed for base64_encode ()
7340
7341 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7342
7343 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7344 SIGNATURE_SCRYPT,
7345 N,
7346 r,
7347 p,
7348 base64_salt,
7349 tmp_buf);
7350 }
7351 else if (hash_mode == 9000)
7352 {
7353 snprintf (out_buf, len-1, "%s", hashfile);
7354 }
7355 else if (hash_mode == 9200)
7356 {
7357 // salt
7358
7359 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7360
7361 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7362
7363 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7364
7365 // hash
7366
7367 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7368 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7369 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7370 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7371 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7372 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7373 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7374 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7375 digest_buf[8] = 0; // needed for base64_encode ()
7376
7377 char tmp_buf[64] = { 0 };
7378
7379 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7380 tmp_buf[43] = 0; // cut it here
7381
7382 // output
7383
7384 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7385 }
7386 else if (hash_mode == 9300)
7387 {
7388 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7389 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7390 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7391 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7392 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7393 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7394 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7395 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7396 digest_buf[8] = 0; // needed for base64_encode ()
7397
7398 char tmp_buf[64] = { 0 };
7399
7400 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7401 tmp_buf[43] = 0; // cut it here
7402
7403 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7404
7405 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7406 }
7407 else if (hash_mode == 9400)
7408 {
7409 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7410
7411 office2007_t *office2007 = &office2007s[salt_pos];
7412
7413 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7414 SIGNATURE_OFFICE2007,
7415 2007,
7416 20,
7417 office2007->keySize,
7418 16,
7419 salt.salt_buf[0],
7420 salt.salt_buf[1],
7421 salt.salt_buf[2],
7422 salt.salt_buf[3],
7423 office2007->encryptedVerifier[0],
7424 office2007->encryptedVerifier[1],
7425 office2007->encryptedVerifier[2],
7426 office2007->encryptedVerifier[3],
7427 office2007->encryptedVerifierHash[0],
7428 office2007->encryptedVerifierHash[1],
7429 office2007->encryptedVerifierHash[2],
7430 office2007->encryptedVerifierHash[3],
7431 office2007->encryptedVerifierHash[4]);
7432 }
7433 else if (hash_mode == 9500)
7434 {
7435 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7436
7437 office2010_t *office2010 = &office2010s[salt_pos];
7438
7439 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,
7440
7441 salt.salt_buf[0],
7442 salt.salt_buf[1],
7443 salt.salt_buf[2],
7444 salt.salt_buf[3],
7445 office2010->encryptedVerifier[0],
7446 office2010->encryptedVerifier[1],
7447 office2010->encryptedVerifier[2],
7448 office2010->encryptedVerifier[3],
7449 office2010->encryptedVerifierHash[0],
7450 office2010->encryptedVerifierHash[1],
7451 office2010->encryptedVerifierHash[2],
7452 office2010->encryptedVerifierHash[3],
7453 office2010->encryptedVerifierHash[4],
7454 office2010->encryptedVerifierHash[5],
7455 office2010->encryptedVerifierHash[6],
7456 office2010->encryptedVerifierHash[7]);
7457 }
7458 else if (hash_mode == 9600)
7459 {
7460 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7461
7462 office2013_t *office2013 = &office2013s[salt_pos];
7463
7464 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,
7465
7466 salt.salt_buf[0],
7467 salt.salt_buf[1],
7468 salt.salt_buf[2],
7469 salt.salt_buf[3],
7470 office2013->encryptedVerifier[0],
7471 office2013->encryptedVerifier[1],
7472 office2013->encryptedVerifier[2],
7473 office2013->encryptedVerifier[3],
7474 office2013->encryptedVerifierHash[0],
7475 office2013->encryptedVerifierHash[1],
7476 office2013->encryptedVerifierHash[2],
7477 office2013->encryptedVerifierHash[3],
7478 office2013->encryptedVerifierHash[4],
7479 office2013->encryptedVerifierHash[5],
7480 office2013->encryptedVerifierHash[6],
7481 office2013->encryptedVerifierHash[7]);
7482 }
7483 else if (hash_mode == 9700)
7484 {
7485 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7486
7487 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7488
7489 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7490 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7491 byte_swap_32 (salt.salt_buf[0]),
7492 byte_swap_32 (salt.salt_buf[1]),
7493 byte_swap_32 (salt.salt_buf[2]),
7494 byte_swap_32 (salt.salt_buf[3]),
7495 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7496 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7497 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7498 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7499 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7500 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7501 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7502 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7503 }
7504 else if (hash_mode == 9710)
7505 {
7506 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7507
7508 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7509
7510 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7511 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7512 byte_swap_32 (salt.salt_buf[0]),
7513 byte_swap_32 (salt.salt_buf[1]),
7514 byte_swap_32 (salt.salt_buf[2]),
7515 byte_swap_32 (salt.salt_buf[3]),
7516 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7517 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7518 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7519 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7520 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7521 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7522 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7523 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7524 }
7525 else if (hash_mode == 9720)
7526 {
7527 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7528
7529 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7530
7531 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7532
7533 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7534 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7535 byte_swap_32 (salt.salt_buf[0]),
7536 byte_swap_32 (salt.salt_buf[1]),
7537 byte_swap_32 (salt.salt_buf[2]),
7538 byte_swap_32 (salt.salt_buf[3]),
7539 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7540 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7541 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7542 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7543 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7544 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7545 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7546 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7547 rc4key[0],
7548 rc4key[1],
7549 rc4key[2],
7550 rc4key[3],
7551 rc4key[4]);
7552 }
7553 else if (hash_mode == 9800)
7554 {
7555 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7556
7557 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7558
7559 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7560 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7561 salt.salt_buf[0],
7562 salt.salt_buf[1],
7563 salt.salt_buf[2],
7564 salt.salt_buf[3],
7565 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7566 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7567 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7568 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7569 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7570 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7571 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7572 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7573 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7574 }
7575 else if (hash_mode == 9810)
7576 {
7577 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7578
7579 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7580
7581 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7582 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7583 salt.salt_buf[0],
7584 salt.salt_buf[1],
7585 salt.salt_buf[2],
7586 salt.salt_buf[3],
7587 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7588 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7589 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7590 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7591 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7592 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7593 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7594 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7595 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7596 }
7597 else if (hash_mode == 9820)
7598 {
7599 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7600
7601 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7602
7603 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7604
7605 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7606 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7607 salt.salt_buf[0],
7608 salt.salt_buf[1],
7609 salt.salt_buf[2],
7610 salt.salt_buf[3],
7611 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7612 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7613 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7614 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7615 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7616 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7617 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7618 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7619 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7620 rc4key[0],
7621 rc4key[1],
7622 rc4key[2],
7623 rc4key[3],
7624 rc4key[4]);
7625 }
7626 else if (hash_mode == 10000)
7627 {
7628 // salt
7629
7630 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7631
7632 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7633
7634 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7635
7636 // hash
7637
7638 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7639 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7640 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7641 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7642 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7643 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7644 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7645 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7646 digest_buf[8] = 0; // needed for base64_encode ()
7647
7648 char tmp_buf[64] = { 0 };
7649
7650 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7651
7652 // output
7653
7654 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7655 }
7656 else if (hash_mode == 10100)
7657 {
7658 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7659 digest_buf[0],
7660 digest_buf[1],
7661 2,
7662 4,
7663 byte_swap_32 (salt.salt_buf[0]),
7664 byte_swap_32 (salt.salt_buf[1]),
7665 byte_swap_32 (salt.salt_buf[2]),
7666 byte_swap_32 (salt.salt_buf[3]));
7667 }
7668 else if (hash_mode == 10200)
7669 {
7670 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7671
7672 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7673
7674 // challenge
7675
7676 char challenge[100] = { 0 };
7677
7678 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7679
7680 // response
7681
7682 char tmp_buf[100] = { 0 };
7683
7684 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7685 (char *) cram_md5->user,
7686 digest_buf[0],
7687 digest_buf[1],
7688 digest_buf[2],
7689 digest_buf[3]);
7690
7691 char response[100] = { 0 };
7692
7693 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7694
7695 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7696 }
7697 else if (hash_mode == 10300)
7698 {
7699 char tmp_buf[100] = { 0 };
7700
7701 memcpy (tmp_buf + 0, digest_buf, 20);
7702 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7703
7704 uint tmp_len = 20 + salt.salt_len;
7705
7706 // base64 encode it
7707
7708 char base64_encoded[100] = { 0 };
7709
7710 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7711
7712 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7713 }
7714 else if (hash_mode == 10400)
7715 {
7716 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7717
7718 pdf_t *pdf = &pdfs[salt_pos];
7719
7720 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",
7721
7722 pdf->V,
7723 pdf->R,
7724 40,
7725 pdf->P,
7726 pdf->enc_md,
7727 pdf->id_len,
7728 byte_swap_32 (pdf->id_buf[0]),
7729 byte_swap_32 (pdf->id_buf[1]),
7730 byte_swap_32 (pdf->id_buf[2]),
7731 byte_swap_32 (pdf->id_buf[3]),
7732 pdf->u_len,
7733 byte_swap_32 (pdf->u_buf[0]),
7734 byte_swap_32 (pdf->u_buf[1]),
7735 byte_swap_32 (pdf->u_buf[2]),
7736 byte_swap_32 (pdf->u_buf[3]),
7737 byte_swap_32 (pdf->u_buf[4]),
7738 byte_swap_32 (pdf->u_buf[5]),
7739 byte_swap_32 (pdf->u_buf[6]),
7740 byte_swap_32 (pdf->u_buf[7]),
7741 pdf->o_len,
7742 byte_swap_32 (pdf->o_buf[0]),
7743 byte_swap_32 (pdf->o_buf[1]),
7744 byte_swap_32 (pdf->o_buf[2]),
7745 byte_swap_32 (pdf->o_buf[3]),
7746 byte_swap_32 (pdf->o_buf[4]),
7747 byte_swap_32 (pdf->o_buf[5]),
7748 byte_swap_32 (pdf->o_buf[6]),
7749 byte_swap_32 (pdf->o_buf[7])
7750 );
7751 }
7752 else if (hash_mode == 10410)
7753 {
7754 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7755
7756 pdf_t *pdf = &pdfs[salt_pos];
7757
7758 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",
7759
7760 pdf->V,
7761 pdf->R,
7762 40,
7763 pdf->P,
7764 pdf->enc_md,
7765 pdf->id_len,
7766 byte_swap_32 (pdf->id_buf[0]),
7767 byte_swap_32 (pdf->id_buf[1]),
7768 byte_swap_32 (pdf->id_buf[2]),
7769 byte_swap_32 (pdf->id_buf[3]),
7770 pdf->u_len,
7771 byte_swap_32 (pdf->u_buf[0]),
7772 byte_swap_32 (pdf->u_buf[1]),
7773 byte_swap_32 (pdf->u_buf[2]),
7774 byte_swap_32 (pdf->u_buf[3]),
7775 byte_swap_32 (pdf->u_buf[4]),
7776 byte_swap_32 (pdf->u_buf[5]),
7777 byte_swap_32 (pdf->u_buf[6]),
7778 byte_swap_32 (pdf->u_buf[7]),
7779 pdf->o_len,
7780 byte_swap_32 (pdf->o_buf[0]),
7781 byte_swap_32 (pdf->o_buf[1]),
7782 byte_swap_32 (pdf->o_buf[2]),
7783 byte_swap_32 (pdf->o_buf[3]),
7784 byte_swap_32 (pdf->o_buf[4]),
7785 byte_swap_32 (pdf->o_buf[5]),
7786 byte_swap_32 (pdf->o_buf[6]),
7787 byte_swap_32 (pdf->o_buf[7])
7788 );
7789 }
7790 else if (hash_mode == 10420)
7791 {
7792 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7793
7794 pdf_t *pdf = &pdfs[salt_pos];
7795
7796 u8 *rc4key = (u8 *) pdf->rc4key;
7797
7798 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",
7799
7800 pdf->V,
7801 pdf->R,
7802 40,
7803 pdf->P,
7804 pdf->enc_md,
7805 pdf->id_len,
7806 byte_swap_32 (pdf->id_buf[0]),
7807 byte_swap_32 (pdf->id_buf[1]),
7808 byte_swap_32 (pdf->id_buf[2]),
7809 byte_swap_32 (pdf->id_buf[3]),
7810 pdf->u_len,
7811 byte_swap_32 (pdf->u_buf[0]),
7812 byte_swap_32 (pdf->u_buf[1]),
7813 byte_swap_32 (pdf->u_buf[2]),
7814 byte_swap_32 (pdf->u_buf[3]),
7815 byte_swap_32 (pdf->u_buf[4]),
7816 byte_swap_32 (pdf->u_buf[5]),
7817 byte_swap_32 (pdf->u_buf[6]),
7818 byte_swap_32 (pdf->u_buf[7]),
7819 pdf->o_len,
7820 byte_swap_32 (pdf->o_buf[0]),
7821 byte_swap_32 (pdf->o_buf[1]),
7822 byte_swap_32 (pdf->o_buf[2]),
7823 byte_swap_32 (pdf->o_buf[3]),
7824 byte_swap_32 (pdf->o_buf[4]),
7825 byte_swap_32 (pdf->o_buf[5]),
7826 byte_swap_32 (pdf->o_buf[6]),
7827 byte_swap_32 (pdf->o_buf[7]),
7828 rc4key[0],
7829 rc4key[1],
7830 rc4key[2],
7831 rc4key[3],
7832 rc4key[4]
7833 );
7834 }
7835 else if (hash_mode == 10500)
7836 {
7837 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7838
7839 pdf_t *pdf = &pdfs[salt_pos];
7840
7841 if (pdf->id_len == 32)
7842 {
7843 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",
7844
7845 pdf->V,
7846 pdf->R,
7847 128,
7848 pdf->P,
7849 pdf->enc_md,
7850 pdf->id_len,
7851 byte_swap_32 (pdf->id_buf[0]),
7852 byte_swap_32 (pdf->id_buf[1]),
7853 byte_swap_32 (pdf->id_buf[2]),
7854 byte_swap_32 (pdf->id_buf[3]),
7855 byte_swap_32 (pdf->id_buf[4]),
7856 byte_swap_32 (pdf->id_buf[5]),
7857 byte_swap_32 (pdf->id_buf[6]),
7858 byte_swap_32 (pdf->id_buf[7]),
7859 pdf->u_len,
7860 byte_swap_32 (pdf->u_buf[0]),
7861 byte_swap_32 (pdf->u_buf[1]),
7862 byte_swap_32 (pdf->u_buf[2]),
7863 byte_swap_32 (pdf->u_buf[3]),
7864 byte_swap_32 (pdf->u_buf[4]),
7865 byte_swap_32 (pdf->u_buf[5]),
7866 byte_swap_32 (pdf->u_buf[6]),
7867 byte_swap_32 (pdf->u_buf[7]),
7868 pdf->o_len,
7869 byte_swap_32 (pdf->o_buf[0]),
7870 byte_swap_32 (pdf->o_buf[1]),
7871 byte_swap_32 (pdf->o_buf[2]),
7872 byte_swap_32 (pdf->o_buf[3]),
7873 byte_swap_32 (pdf->o_buf[4]),
7874 byte_swap_32 (pdf->o_buf[5]),
7875 byte_swap_32 (pdf->o_buf[6]),
7876 byte_swap_32 (pdf->o_buf[7])
7877 );
7878 }
7879 else
7880 {
7881 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",
7882
7883 pdf->V,
7884 pdf->R,
7885 128,
7886 pdf->P,
7887 pdf->enc_md,
7888 pdf->id_len,
7889 byte_swap_32 (pdf->id_buf[0]),
7890 byte_swap_32 (pdf->id_buf[1]),
7891 byte_swap_32 (pdf->id_buf[2]),
7892 byte_swap_32 (pdf->id_buf[3]),
7893 pdf->u_len,
7894 byte_swap_32 (pdf->u_buf[0]),
7895 byte_swap_32 (pdf->u_buf[1]),
7896 byte_swap_32 (pdf->u_buf[2]),
7897 byte_swap_32 (pdf->u_buf[3]),
7898 byte_swap_32 (pdf->u_buf[4]),
7899 byte_swap_32 (pdf->u_buf[5]),
7900 byte_swap_32 (pdf->u_buf[6]),
7901 byte_swap_32 (pdf->u_buf[7]),
7902 pdf->o_len,
7903 byte_swap_32 (pdf->o_buf[0]),
7904 byte_swap_32 (pdf->o_buf[1]),
7905 byte_swap_32 (pdf->o_buf[2]),
7906 byte_swap_32 (pdf->o_buf[3]),
7907 byte_swap_32 (pdf->o_buf[4]),
7908 byte_swap_32 (pdf->o_buf[5]),
7909 byte_swap_32 (pdf->o_buf[6]),
7910 byte_swap_32 (pdf->o_buf[7])
7911 );
7912 }
7913 }
7914 else if (hash_mode == 10600)
7915 {
7916 uint digest_idx = salt.digests_offset + digest_pos;
7917
7918 hashinfo_t **hashinfo_ptr = data.hash_info;
7919 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7920
7921 snprintf (out_buf, len-1, "%s", hash_buf);
7922 }
7923 else if (hash_mode == 10700)
7924 {
7925 uint digest_idx = salt.digests_offset + digest_pos;
7926
7927 hashinfo_t **hashinfo_ptr = data.hash_info;
7928 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7929
7930 snprintf (out_buf, len-1, "%s", hash_buf);
7931 }
7932 else if (hash_mode == 10900)
7933 {
7934 uint digest_idx = salt.digests_offset + digest_pos;
7935
7936 hashinfo_t **hashinfo_ptr = data.hash_info;
7937 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7938
7939 snprintf (out_buf, len-1, "%s", hash_buf);
7940 }
7941 else if (hash_mode == 11100)
7942 {
7943 u32 salt_challenge = salt.salt_buf[0];
7944
7945 salt_challenge = byte_swap_32 (salt_challenge);
7946
7947 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7948
7949 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7950 SIGNATURE_POSTGRESQL_AUTH,
7951 user_name,
7952 salt_challenge,
7953 digest_buf[0],
7954 digest_buf[1],
7955 digest_buf[2],
7956 digest_buf[3]);
7957 }
7958 else if (hash_mode == 11200)
7959 {
7960 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7961 SIGNATURE_MYSQL_AUTH,
7962 (unsigned char *) salt.salt_buf,
7963 digest_buf[0],
7964 digest_buf[1],
7965 digest_buf[2],
7966 digest_buf[3],
7967 digest_buf[4]);
7968 }
7969 else if (hash_mode == 11300)
7970 {
7971 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7972
7973 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7974
7975 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7976 const uint ckey_len = bitcoin_wallet->ckey_len;
7977 const uint public_key_len = bitcoin_wallet->public_key_len;
7978
7979 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7980 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7981 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7982
7983 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7984 {
7985 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7986
7987 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7988 }
7989
7990 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7991 {
7992 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7993
7994 sprintf (ckey_buf + j, "%02x", ptr[i]);
7995 }
7996
7997 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7998 {
7999 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
8000
8001 sprintf (public_key_buf + j, "%02x", ptr[i]);
8002 }
8003
8004 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
8005 SIGNATURE_BITCOIN_WALLET,
8006 cry_master_len * 2,
8007 cry_master_buf,
8008 salt.salt_len,
8009 (unsigned char *) salt.salt_buf,
8010 salt.salt_iter + 1,
8011 ckey_len * 2,
8012 ckey_buf,
8013 public_key_len * 2,
8014 public_key_buf
8015 );
8016
8017 free (cry_master_buf);
8018 free (ckey_buf);
8019 free (public_key_buf);
8020 }
8021 else if (hash_mode == 11400)
8022 {
8023 uint digest_idx = salt.digests_offset + digest_pos;
8024
8025 hashinfo_t **hashinfo_ptr = data.hash_info;
8026 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8027
8028 snprintf (out_buf, len-1, "%s", hash_buf);
8029 }
8030 else if (hash_mode == 11600)
8031 {
8032 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8033
8034 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8035
8036 const uint data_len = seven_zip->data_len;
8037
8038 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8039
8040 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8041 {
8042 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8043
8044 sprintf (data_buf + j, "%02x", ptr[i]);
8045 }
8046
8047 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8048 SIGNATURE_SEVEN_ZIP,
8049 0,
8050 salt.salt_sign[0],
8051 0,
8052 (char *) seven_zip->salt_buf,
8053 seven_zip->iv_len,
8054 seven_zip->iv_buf[0],
8055 seven_zip->iv_buf[1],
8056 seven_zip->iv_buf[2],
8057 seven_zip->iv_buf[3],
8058 seven_zip->crc,
8059 seven_zip->data_len,
8060 seven_zip->unpack_size,
8061 data_buf);
8062
8063 free (data_buf);
8064 }
8065 else if (hash_mode == 11700)
8066 {
8067 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8068 digest_buf[0],
8069 digest_buf[1],
8070 digest_buf[2],
8071 digest_buf[3],
8072 digest_buf[4],
8073 digest_buf[5],
8074 digest_buf[6],
8075 digest_buf[7]);
8076 }
8077 else if (hash_mode == 11800)
8078 {
8079 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8080 digest_buf[ 0],
8081 digest_buf[ 1],
8082 digest_buf[ 2],
8083 digest_buf[ 3],
8084 digest_buf[ 4],
8085 digest_buf[ 5],
8086 digest_buf[ 6],
8087 digest_buf[ 7],
8088 digest_buf[ 8],
8089 digest_buf[ 9],
8090 digest_buf[10],
8091 digest_buf[11],
8092 digest_buf[12],
8093 digest_buf[13],
8094 digest_buf[14],
8095 digest_buf[15]);
8096 }
8097 else if (hash_mode == 11900)
8098 {
8099 uint digest_idx = salt.digests_offset + digest_pos;
8100
8101 hashinfo_t **hashinfo_ptr = data.hash_info;
8102 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8103
8104 snprintf (out_buf, len-1, "%s", hash_buf);
8105 }
8106 else if (hash_mode == 12000)
8107 {
8108 uint digest_idx = salt.digests_offset + digest_pos;
8109
8110 hashinfo_t **hashinfo_ptr = data.hash_info;
8111 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8112
8113 snprintf (out_buf, len-1, "%s", hash_buf);
8114 }
8115 else if (hash_mode == 12100)
8116 {
8117 uint digest_idx = salt.digests_offset + digest_pos;
8118
8119 hashinfo_t **hashinfo_ptr = data.hash_info;
8120 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8121
8122 snprintf (out_buf, len-1, "%s", hash_buf);
8123 }
8124 else if (hash_mode == 12200)
8125 {
8126 uint *ptr_digest = digest_buf;
8127 uint *ptr_salt = salt.salt_buf;
8128
8129 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8130 SIGNATURE_ECRYPTFS,
8131 ptr_salt[0],
8132 ptr_salt[1],
8133 ptr_digest[0],
8134 ptr_digest[1]);
8135 }
8136 else if (hash_mode == 12300)
8137 {
8138 uint *ptr_digest = digest_buf;
8139 uint *ptr_salt = salt.salt_buf;
8140
8141 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",
8142 ptr_digest[ 0], ptr_digest[ 1],
8143 ptr_digest[ 2], ptr_digest[ 3],
8144 ptr_digest[ 4], ptr_digest[ 5],
8145 ptr_digest[ 6], ptr_digest[ 7],
8146 ptr_digest[ 8], ptr_digest[ 9],
8147 ptr_digest[10], ptr_digest[11],
8148 ptr_digest[12], ptr_digest[13],
8149 ptr_digest[14], ptr_digest[15],
8150 ptr_salt[0],
8151 ptr_salt[1],
8152 ptr_salt[2],
8153 ptr_salt[3]);
8154 }
8155 else if (hash_mode == 12400)
8156 {
8157 // encode iteration count
8158
8159 char salt_iter[5] = { 0 };
8160
8161 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8162 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8163 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8164 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8165 salt_iter[4] = 0;
8166
8167 // encode salt
8168
8169 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8170 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8171 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8172 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8173 ptr_salt[4] = 0;
8174
8175 // encode digest
8176
8177 memset (tmp_buf, 0, sizeof (tmp_buf));
8178
8179 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8180 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8181
8182 memcpy (tmp_buf, digest_buf, 8);
8183
8184 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8185
8186 ptr_plain[11] = 0;
8187
8188 // fill the resulting buffer
8189
8190 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8191 }
8192 else if (hash_mode == 12500)
8193 {
8194 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8195 SIGNATURE_RAR3,
8196 byte_swap_32 (salt.salt_buf[0]),
8197 byte_swap_32 (salt.salt_buf[1]),
8198 salt.salt_buf[2],
8199 salt.salt_buf[3],
8200 salt.salt_buf[4],
8201 salt.salt_buf[5]);
8202 }
8203 else if (hash_mode == 12600)
8204 {
8205 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8206 digest_buf[0] + salt.salt_buf_pc[0],
8207 digest_buf[1] + salt.salt_buf_pc[1],
8208 digest_buf[2] + salt.salt_buf_pc[2],
8209 digest_buf[3] + salt.salt_buf_pc[3],
8210 digest_buf[4] + salt.salt_buf_pc[4],
8211 digest_buf[5] + salt.salt_buf_pc[5],
8212 digest_buf[6] + salt.salt_buf_pc[6],
8213 digest_buf[7] + salt.salt_buf_pc[7]);
8214 }
8215 else if (hash_mode == 12700)
8216 {
8217 uint digest_idx = salt.digests_offset + digest_pos;
8218
8219 hashinfo_t **hashinfo_ptr = data.hash_info;
8220 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8221
8222 snprintf (out_buf, len-1, "%s", hash_buf);
8223 }
8224 else if (hash_mode == 12800)
8225 {
8226 const u8 *ptr = (const u8 *) salt.salt_buf;
8227
8228 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",
8229 SIGNATURE_MS_DRSR,
8230 ptr[0],
8231 ptr[1],
8232 ptr[2],
8233 ptr[3],
8234 ptr[4],
8235 ptr[5],
8236 ptr[6],
8237 ptr[7],
8238 ptr[8],
8239 ptr[9],
8240 salt.salt_iter + 1,
8241 byte_swap_32 (digest_buf[0]),
8242 byte_swap_32 (digest_buf[1]),
8243 byte_swap_32 (digest_buf[2]),
8244 byte_swap_32 (digest_buf[3]),
8245 byte_swap_32 (digest_buf[4]),
8246 byte_swap_32 (digest_buf[5]),
8247 byte_swap_32 (digest_buf[6]),
8248 byte_swap_32 (digest_buf[7])
8249 );
8250 }
8251 else if (hash_mode == 12900)
8252 {
8253 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",
8254 salt.salt_buf[ 4],
8255 salt.salt_buf[ 5],
8256 salt.salt_buf[ 6],
8257 salt.salt_buf[ 7],
8258 salt.salt_buf[ 8],
8259 salt.salt_buf[ 9],
8260 salt.salt_buf[10],
8261 salt.salt_buf[11],
8262 byte_swap_32 (digest_buf[0]),
8263 byte_swap_32 (digest_buf[1]),
8264 byte_swap_32 (digest_buf[2]),
8265 byte_swap_32 (digest_buf[3]),
8266 byte_swap_32 (digest_buf[4]),
8267 byte_swap_32 (digest_buf[5]),
8268 byte_swap_32 (digest_buf[6]),
8269 byte_swap_32 (digest_buf[7]),
8270 salt.salt_buf[ 0],
8271 salt.salt_buf[ 1],
8272 salt.salt_buf[ 2],
8273 salt.salt_buf[ 3]
8274 );
8275 }
8276 else if (hash_mode == 13000)
8277 {
8278 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8279
8280 rar5_t *rar5 = &rar5s[salt_pos];
8281
8282 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8283 salt.salt_buf[0],
8284 salt.salt_buf[1],
8285 salt.salt_buf[2],
8286 salt.salt_buf[3],
8287 salt.salt_sign[0],
8288 rar5->iv[0],
8289 rar5->iv[1],
8290 rar5->iv[2],
8291 rar5->iv[3],
8292 byte_swap_32 (digest_buf[0]),
8293 byte_swap_32 (digest_buf[1])
8294 );
8295 }
8296 else if (hash_mode == 13100)
8297 {
8298 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8299
8300 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8301
8302 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8303 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8304
8305 char data[2560 * 4 * 2] = { 0 };
8306
8307 char *ptr_data = data;
8308
8309 for (uint i = 0; i < 16; i++, ptr_data += 2)
8310 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8311
8312 /* skip '$' */
8313 ptr_data++;
8314
8315 for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
8316 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8317
8318 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8319 SIGNATURE_KRB5TGS,
8320 (char *) krb5tgs->account_info,
8321 data,
8322 data + 33);
8323 }
8324 else
8325 {
8326 if (hash_type == HASH_TYPE_MD4)
8327 {
8328 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8329 digest_buf[0],
8330 digest_buf[1],
8331 digest_buf[2],
8332 digest_buf[3]);
8333 }
8334 else if (hash_type == HASH_TYPE_MD5)
8335 {
8336 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8337 digest_buf[0],
8338 digest_buf[1],
8339 digest_buf[2],
8340 digest_buf[3]);
8341 }
8342 else if (hash_type == HASH_TYPE_SHA1)
8343 {
8344 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8345 digest_buf[0],
8346 digest_buf[1],
8347 digest_buf[2],
8348 digest_buf[3],
8349 digest_buf[4]);
8350 }
8351 else if (hash_type == HASH_TYPE_SHA256)
8352 {
8353 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8354 digest_buf[0],
8355 digest_buf[1],
8356 digest_buf[2],
8357 digest_buf[3],
8358 digest_buf[4],
8359 digest_buf[5],
8360 digest_buf[6],
8361 digest_buf[7]);
8362 }
8363 else if (hash_type == HASH_TYPE_SHA384)
8364 {
8365 uint *ptr = digest_buf;
8366
8367 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8368 ptr[ 1], ptr[ 0],
8369 ptr[ 3], ptr[ 2],
8370 ptr[ 5], ptr[ 4],
8371 ptr[ 7], ptr[ 6],
8372 ptr[ 9], ptr[ 8],
8373 ptr[11], ptr[10]);
8374 }
8375 else if (hash_type == HASH_TYPE_SHA512)
8376 {
8377 uint *ptr = digest_buf;
8378
8379 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8380 ptr[ 1], ptr[ 0],
8381 ptr[ 3], ptr[ 2],
8382 ptr[ 5], ptr[ 4],
8383 ptr[ 7], ptr[ 6],
8384 ptr[ 9], ptr[ 8],
8385 ptr[11], ptr[10],
8386 ptr[13], ptr[12],
8387 ptr[15], ptr[14]);
8388 }
8389 else if (hash_type == HASH_TYPE_LM)
8390 {
8391 snprintf (out_buf, len-1, "%08x%08x",
8392 digest_buf[0],
8393 digest_buf[1]);
8394 }
8395 else if (hash_type == HASH_TYPE_ORACLEH)
8396 {
8397 snprintf (out_buf, len-1, "%08X%08X",
8398 digest_buf[0],
8399 digest_buf[1]);
8400 }
8401 else if (hash_type == HASH_TYPE_BCRYPT)
8402 {
8403 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8404 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8405
8406 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8407
8408 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8409 }
8410 else if (hash_type == HASH_TYPE_KECCAK)
8411 {
8412 uint *ptr = digest_buf;
8413
8414 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",
8415 ptr[ 1], ptr[ 0],
8416 ptr[ 3], ptr[ 2],
8417 ptr[ 5], ptr[ 4],
8418 ptr[ 7], ptr[ 6],
8419 ptr[ 9], ptr[ 8],
8420 ptr[11], ptr[10],
8421 ptr[13], ptr[12],
8422 ptr[15], ptr[14],
8423 ptr[17], ptr[16],
8424 ptr[19], ptr[18],
8425 ptr[21], ptr[20],
8426 ptr[23], ptr[22],
8427 ptr[25], ptr[24],
8428 ptr[27], ptr[26],
8429 ptr[29], ptr[28],
8430 ptr[31], ptr[30],
8431 ptr[33], ptr[32],
8432 ptr[35], ptr[34],
8433 ptr[37], ptr[36],
8434 ptr[39], ptr[38],
8435 ptr[41], ptr[30],
8436 ptr[43], ptr[42],
8437 ptr[45], ptr[44],
8438 ptr[47], ptr[46],
8439 ptr[49], ptr[48]
8440 );
8441
8442 out_buf[salt.keccak_mdlen * 2] = 0;
8443 }
8444 else if (hash_type == HASH_TYPE_RIPEMD160)
8445 {
8446 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8447 digest_buf[0],
8448 digest_buf[1],
8449 digest_buf[2],
8450 digest_buf[3],
8451 digest_buf[4]);
8452 }
8453 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8454 {
8455 digest_buf[ 0] = digest_buf[ 0];
8456 digest_buf[ 1] = digest_buf[ 1];
8457 digest_buf[ 2] = digest_buf[ 2];
8458 digest_buf[ 3] = digest_buf[ 3];
8459 digest_buf[ 4] = digest_buf[ 4];
8460 digest_buf[ 5] = digest_buf[ 5];
8461 digest_buf[ 6] = digest_buf[ 6];
8462 digest_buf[ 7] = digest_buf[ 7];
8463 digest_buf[ 8] = digest_buf[ 8];
8464 digest_buf[ 9] = digest_buf[ 9];
8465 digest_buf[10] = digest_buf[10];
8466 digest_buf[11] = digest_buf[11];
8467 digest_buf[12] = digest_buf[12];
8468 digest_buf[13] = digest_buf[13];
8469 digest_buf[14] = digest_buf[14];
8470 digest_buf[15] = digest_buf[15];
8471
8472 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8473 digest_buf[ 0],
8474 digest_buf[ 1],
8475 digest_buf[ 2],
8476 digest_buf[ 3],
8477 digest_buf[ 4],
8478 digest_buf[ 5],
8479 digest_buf[ 6],
8480 digest_buf[ 7],
8481 digest_buf[ 8],
8482 digest_buf[ 9],
8483 digest_buf[10],
8484 digest_buf[11],
8485 digest_buf[12],
8486 digest_buf[13],
8487 digest_buf[14],
8488 digest_buf[15]);
8489 }
8490 else if (hash_type == HASH_TYPE_GOST)
8491 {
8492 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8493 digest_buf[0],
8494 digest_buf[1],
8495 digest_buf[2],
8496 digest_buf[3],
8497 digest_buf[4],
8498 digest_buf[5],
8499 digest_buf[6],
8500 digest_buf[7]);
8501 }
8502 else if (hash_type == HASH_TYPE_MYSQL)
8503 {
8504 snprintf (out_buf, len-1, "%08x%08x",
8505 digest_buf[0],
8506 digest_buf[1]);
8507 }
8508 else if (hash_type == HASH_TYPE_LOTUS5)
8509 {
8510 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8511 digest_buf[0],
8512 digest_buf[1],
8513 digest_buf[2],
8514 digest_buf[3]);
8515 }
8516 else if (hash_type == HASH_TYPE_LOTUS6)
8517 {
8518 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8519 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8520 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8521 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8522
8523 char buf[16] = { 0 };
8524
8525 memcpy (buf + 0, salt.salt_buf, 5);
8526 memcpy (buf + 5, digest_buf, 9);
8527
8528 buf[3] -= -4;
8529
8530 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8531
8532 tmp_buf[18] = salt.salt_buf_pc[7];
8533 tmp_buf[19] = 0;
8534
8535 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8536 }
8537 else if (hash_type == HASH_TYPE_LOTUS8)
8538 {
8539 char buf[52] = { 0 };
8540
8541 // salt
8542
8543 memcpy (buf + 0, salt.salt_buf, 16);
8544
8545 buf[3] -= -4;
8546
8547 // iteration
8548
8549 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8550
8551 // chars
8552
8553 buf[26] = salt.salt_buf_pc[0];
8554 buf[27] = salt.salt_buf_pc[1];
8555
8556 // digest
8557
8558 memcpy (buf + 28, digest_buf, 8);
8559
8560 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8561
8562 tmp_buf[49] = 0;
8563
8564 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8565 }
8566 else if (hash_type == HASH_TYPE_CRC32)
8567 {
8568 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8569 }
8570 }
8571
8572 if (salt_type == SALT_TYPE_INTERN)
8573 {
8574 size_t pos = strlen (out_buf);
8575
8576 out_buf[pos] = data.separator;
8577
8578 char *ptr = (char *) salt.salt_buf;
8579
8580 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8581
8582 out_buf[pos + 1 + salt.salt_len] = 0;
8583 }
8584 }
8585
8586 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8587 {
8588 memset (hccap, 0, sizeof (hccap_t));
8589
8590 salt_t *salt = &data.salts_buf[salt_pos];
8591
8592 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8593
8594 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8595 wpa_t *wpa = &wpas[salt_pos];
8596
8597 hccap->keyver = wpa->keyver;
8598
8599 hccap->eapol_size = wpa->eapol_size;
8600
8601 if (wpa->keyver != 1)
8602 {
8603 uint eapol_tmp[64] = { 0 };
8604
8605 for (uint i = 0; i < 64; i++)
8606 {
8607 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8608 }
8609
8610 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8611 }
8612 else
8613 {
8614 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8615 }
8616
8617 uint pke_tmp[25] = { 0 };
8618
8619 for (int i = 5; i < 25; i++)
8620 {
8621 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8622 }
8623
8624 char *pke_ptr = (char *) pke_tmp;
8625
8626 memcpy (hccap->mac1, pke_ptr + 23, 6);
8627 memcpy (hccap->mac2, pke_ptr + 29, 6);
8628 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8629 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8630
8631 char *digests_buf_ptr = (char *) data.digests_buf;
8632
8633 uint dgst_size = data.dgst_size;
8634
8635 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8636
8637 if (wpa->keyver != 1)
8638 {
8639 uint digest_tmp[4] = { 0 };
8640
8641 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8642 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8643 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8644 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8645
8646 memcpy (hccap->keymic, digest_tmp, 16);
8647 }
8648 else
8649 {
8650 memcpy (hccap->keymic, digest_ptr, 16);
8651 }
8652 }
8653
8654 void SuspendThreads ()
8655 {
8656 if (data.devices_status == STATUS_RUNNING)
8657 {
8658 hc_timer_set (&data.timer_paused);
8659
8660 data.devices_status = STATUS_PAUSED;
8661
8662 log_info ("Paused");
8663 }
8664 }
8665
8666 void ResumeThreads ()
8667 {
8668 if (data.devices_status == STATUS_PAUSED)
8669 {
8670 float ms_paused;
8671
8672 hc_timer_get (data.timer_paused, ms_paused);
8673
8674 data.ms_paused += ms_paused;
8675
8676 data.devices_status = STATUS_RUNNING;
8677
8678 log_info ("Resumed");
8679 }
8680 }
8681
8682 void bypass ()
8683 {
8684 if (data.devices_status != STATUS_RUNNING) return;
8685
8686 data.devices_status = STATUS_BYPASS;
8687
8688 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8689 }
8690
8691 void stop_at_checkpoint ()
8692 {
8693 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8694 {
8695 if (data.devices_status != STATUS_RUNNING) return;
8696 }
8697
8698 // this feature only makes sense if --restore-disable was not specified
8699
8700 if (data.restore_disable == 1)
8701 {
8702 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8703
8704 return;
8705 }
8706
8707 // check if monitoring of Restore Point updates should be enabled or disabled
8708
8709 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8710 {
8711 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8712
8713 // save the current restore point value
8714
8715 data.checkpoint_cur_words = get_lowest_words_done ();
8716
8717 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8718 }
8719 else
8720 {
8721 data.devices_status = STATUS_RUNNING;
8722
8723 // reset the global value for checkpoint checks
8724
8725 data.checkpoint_cur_words = 0;
8726
8727 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8728 }
8729 }
8730
8731 void myabort ()
8732 {
8733 if (data.devices_status == STATUS_INIT) return;
8734 if (data.devices_status == STATUS_STARTING) return;
8735
8736 data.devices_status = STATUS_ABORTED;
8737 }
8738
8739 void myquit ()
8740 {
8741 if (data.devices_status == STATUS_INIT) return;
8742 if (data.devices_status == STATUS_STARTING) return;
8743
8744 data.devices_status = STATUS_QUIT;
8745 }
8746
8747 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8748 {
8749 FILE *fp = fopen (kernel_file, "rb");
8750
8751 if (fp != NULL)
8752 {
8753 struct stat st;
8754
8755 memset (&st, 0, sizeof (st));
8756
8757 stat (kernel_file, &st);
8758
8759 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8760
8761 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8762
8763 if (num_read != (size_t) st.st_size)
8764 {
8765 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8766
8767 exit (-1);
8768 }
8769
8770 fclose (fp);
8771
8772 buf[st.st_size] = 0;
8773
8774 for (int i = 0; i < num_devices; i++)
8775 {
8776 kernel_lengths[i] = (size_t) st.st_size;
8777
8778 kernel_sources[i] = buf;
8779 }
8780 }
8781 else
8782 {
8783 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8784
8785 exit (-1);
8786 }
8787
8788 return;
8789 }
8790
8791 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8792 {
8793 if (binary_size > 0)
8794 {
8795 FILE *fp = fopen (dst, "wb");
8796
8797 lock_file (fp);
8798 fwrite (binary, sizeof (u8), binary_size, fp);
8799
8800 fflush (fp);
8801 fclose (fp);
8802 }
8803 }
8804
8805 /**
8806 * restore
8807 */
8808
8809 restore_data_t *init_restore (int argc, char **argv)
8810 {
8811 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8812
8813 if (data.restore_disable == 0)
8814 {
8815 FILE *fp = fopen (data.eff_restore_file, "rb");
8816
8817 if (fp)
8818 {
8819 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8820
8821 if (nread != 1)
8822 {
8823 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8824
8825 exit (-1);
8826 }
8827
8828 fclose (fp);
8829
8830 if (rd->pid)
8831 {
8832 char pidbin[BUFSIZ] = { 0 };
8833
8834 int pidbin_len = -1;
8835
8836 #ifdef _POSIX
8837 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8838
8839 FILE *fd = fopen (pidbin, "rb");
8840
8841 if (fd)
8842 {
8843 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8844
8845 pidbin[pidbin_len] = 0;
8846
8847 fclose (fd);
8848
8849 char *argv0_r = strrchr (argv[0], '/');
8850
8851 char *pidbin_r = strrchr (pidbin, '/');
8852
8853 if (argv0_r == NULL) argv0_r = argv[0];
8854
8855 if (pidbin_r == NULL) pidbin_r = pidbin;
8856
8857 if (strcmp (argv0_r, pidbin_r) == 0)
8858 {
8859 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8860
8861 exit (-1);
8862 }
8863 }
8864
8865 #elif _WIN
8866 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8867
8868 char pidbin2[BUFSIZ] = { 0 };
8869
8870 int pidbin2_len = -1;
8871
8872 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8873 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8874
8875 pidbin[pidbin_len] = 0;
8876 pidbin2[pidbin2_len] = 0;
8877
8878 if (pidbin2_len)
8879 {
8880 if (strcmp (pidbin, pidbin2) == 0)
8881 {
8882 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8883
8884 exit (-1);
8885 }
8886 }
8887 #endif
8888 }
8889
8890 if (rd->version_bin < RESTORE_MIN)
8891 {
8892 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8893
8894 exit (-1);
8895 }
8896 }
8897 }
8898
8899 memset (rd, 0, sizeof (restore_data_t));
8900
8901 rd->version_bin = VERSION_BIN;
8902
8903 #ifdef _POSIX
8904 rd->pid = getpid ();
8905 #elif _WIN
8906 rd->pid = GetCurrentProcessId ();
8907 #endif
8908
8909 if (getcwd (rd->cwd, 255) == NULL)
8910 {
8911 myfree (rd);
8912
8913 return (NULL);
8914 }
8915
8916 rd->argc = argc;
8917 rd->argv = argv;
8918
8919 return (rd);
8920 }
8921
8922 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8923 {
8924 FILE *fp = fopen (eff_restore_file, "rb");
8925
8926 if (fp == NULL)
8927 {
8928 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8929
8930 exit (-1);
8931 }
8932
8933 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8934 {
8935 log_error ("ERROR: cannot read %s", eff_restore_file);
8936
8937 exit (-1);
8938 }
8939
8940 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8941
8942 for (uint i = 0; i < rd->argc; i++)
8943 {
8944 char buf[BUFSIZ] = { 0 };
8945
8946 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8947 {
8948 log_error ("ERROR: cannot read %s", eff_restore_file);
8949
8950 exit (-1);
8951 }
8952
8953 size_t len = strlen (buf);
8954
8955 if (len) buf[len - 1] = 0;
8956
8957 rd->argv[i] = mystrdup (buf);
8958 }
8959
8960 fclose (fp);
8961
8962 char new_cwd[1024] = { 0 };
8963
8964 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8965
8966 if (nwd == NULL)
8967 {
8968 log_error ("Restore file is corrupted");
8969 }
8970
8971 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8972 {
8973 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8974 {
8975 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8976
8977 exit (-1);
8978 }
8979
8980 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8981 }
8982
8983 if (chdir (rd->cwd))
8984 {
8985 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8986
8987 exit (-1);
8988 }
8989 }
8990
8991 u64 get_lowest_words_done ()
8992 {
8993 u64 words_cur = -1;
8994
8995 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8996 {
8997 hc_device_param_t *device_param = &data.devices_param[device_id];
8998
8999 if (device_param->skipped) continue;
9000
9001 const u64 words_done = device_param->words_done;
9002
9003 if (words_done < words_cur) words_cur = words_done;
9004 }
9005
9006 // It's possible that a device's workload isn't finished right after a restore-case.
9007 // In that case, this function would return 0 and overwrite the real restore point
9008 // There's also data.words_cur which is set to rd->words_cur but it changes while
9009 // the attack is running therefore we should stick to rd->words_cur.
9010 // Note that -s influences rd->words_cur we should keep a close look on that.
9011
9012 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9013
9014 return words_cur;
9015 }
9016
9017 void write_restore (const char *new_restore_file, restore_data_t *rd)
9018 {
9019 u64 words_cur = get_lowest_words_done ();
9020
9021 rd->words_cur = words_cur;
9022
9023 FILE *fp = fopen (new_restore_file, "wb");
9024
9025 if (fp == NULL)
9026 {
9027 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9028
9029 exit (-1);
9030 }
9031
9032 if (setvbuf (fp, NULL, _IONBF, 0))
9033 {
9034 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9035
9036 exit (-1);
9037 }
9038
9039 fwrite (rd, sizeof (restore_data_t), 1, fp);
9040
9041 for (uint i = 0; i < rd->argc; i++)
9042 {
9043 fprintf (fp, "%s", rd->argv[i]);
9044 fputc ('\n', fp);
9045 }
9046
9047 fflush (fp);
9048
9049 fsync (fileno (fp));
9050
9051 fclose (fp);
9052 }
9053
9054 void cycle_restore ()
9055 {
9056 const char *eff_restore_file = data.eff_restore_file;
9057 const char *new_restore_file = data.new_restore_file;
9058
9059 restore_data_t *rd = data.rd;
9060
9061 write_restore (new_restore_file, rd);
9062
9063 struct stat st;
9064
9065 memset (&st, 0, sizeof(st));
9066
9067 if (stat (eff_restore_file, &st) == 0)
9068 {
9069 if (unlink (eff_restore_file))
9070 {
9071 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
9072 }
9073 }
9074
9075 if (rename (new_restore_file, eff_restore_file))
9076 {
9077 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9078 }
9079 }
9080
9081 void check_checkpoint ()
9082 {
9083 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9084
9085 u64 words_cur = get_lowest_words_done ();
9086
9087 if (words_cur != data.checkpoint_cur_words)
9088 {
9089 myabort ();
9090 }
9091 }
9092
9093 /**
9094 * tuning db
9095 */
9096
9097 void tuning_db_destroy (tuning_db_t *tuning_db)
9098 {
9099 int i;
9100
9101 for (i = 0; i < tuning_db->alias_cnt; i++)
9102 {
9103 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9104
9105 myfree (alias->device_name);
9106 myfree (alias->alias_name);
9107 }
9108
9109 for (i = 0; i < tuning_db->entry_cnt; i++)
9110 {
9111 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9112
9113 myfree (entry->device_name);
9114 }
9115
9116 myfree (tuning_db->alias_buf);
9117 myfree (tuning_db->entry_buf);
9118
9119 myfree (tuning_db);
9120 }
9121
9122 tuning_db_t *tuning_db_alloc (FILE *fp)
9123 {
9124 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9125
9126 int num_lines = count_lines (fp);
9127
9128 // a bit over-allocated
9129
9130 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9131 tuning_db->alias_cnt = 0;
9132
9133 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9134 tuning_db->entry_cnt = 0;
9135
9136 return tuning_db;
9137 }
9138
9139 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9140 {
9141 FILE *fp = fopen (tuning_db_file, "rb");
9142
9143 if (fp == NULL)
9144 {
9145 log_error ("%s: %s", tuning_db_file, strerror (errno));
9146
9147 exit (-1);
9148 }
9149
9150 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9151
9152 rewind (fp);
9153
9154 int line_num = 0;
9155
9156 while (!feof (fp))
9157 {
9158 char buf[BUFSIZ];
9159
9160 char *line_buf = fgets (buf, sizeof (buf) - 1, fp);
9161
9162 if (line_buf == NULL) break;
9163
9164 line_num++;
9165
9166 const int line_len = in_superchop (line_buf);
9167
9168 if (line_len == 0) continue;
9169
9170 if (line_buf[0] == '#') continue;
9171
9172 // start processing
9173
9174 char *token_ptr[7] = { NULL };
9175
9176 int token_cnt = 0;
9177
9178 char *next = strtok (line_buf, "\t ");
9179
9180 token_ptr[token_cnt] = next;
9181
9182 token_cnt++;
9183
9184 while ((next = strtok (NULL, "\t ")) != NULL)
9185 {
9186 token_ptr[token_cnt] = next;
9187
9188 token_cnt++;
9189 }
9190
9191 if (token_cnt == 2)
9192 {
9193 char *device_name = token_ptr[0];
9194 char *alias_name = token_ptr[1];
9195
9196 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9197
9198 alias->device_name = mystrdup (device_name);
9199 alias->alias_name = mystrdup (alias_name);
9200
9201 tuning_db->alias_cnt++;
9202 }
9203 else if (token_cnt == 6)
9204 {
9205 if ((token_ptr[1][0] != '0') &&
9206 (token_ptr[1][0] != '1') &&
9207 (token_ptr[1][0] != '3') &&
9208 (token_ptr[1][0] != '*'))
9209 {
9210 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9211
9212 continue;
9213 }
9214
9215 if ((token_ptr[3][0] != '1') &&
9216 (token_ptr[3][0] != '2') &&
9217 (token_ptr[3][0] != '4') &&
9218 (token_ptr[3][0] != '8') &&
9219 (token_ptr[3][0] != 'N'))
9220 {
9221 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9222
9223 continue;
9224 }
9225
9226 char *device_name = token_ptr[0];
9227
9228 int attack_mode = -1;
9229 int hash_type = -1;
9230 int vector_width = -1;
9231 int kernel_accel = -1;
9232 int kernel_loops = -1;
9233
9234 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9235 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9236 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9237
9238 if (token_ptr[4][0] != 'A')
9239 {
9240 kernel_accel = atoi (token_ptr[4]);
9241
9242 if ((kernel_accel < 1) || (kernel_accel > 1024))
9243 {
9244 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9245
9246 continue;
9247 }
9248 }
9249 else
9250 {
9251 kernel_accel = 0;
9252 }
9253
9254 if (token_ptr[5][0] != 'A')
9255 {
9256 kernel_loops = atoi (token_ptr[5]);
9257
9258 if ((kernel_loops < 1) || (kernel_loops > 1024))
9259 {
9260 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9261
9262 continue;
9263 }
9264 }
9265 else
9266 {
9267 kernel_loops = 0;
9268 }
9269
9270 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9271
9272 entry->device_name = mystrdup (device_name);
9273 entry->attack_mode = attack_mode;
9274 entry->hash_type = hash_type;
9275 entry->vector_width = vector_width;
9276 entry->kernel_accel = kernel_accel;
9277 entry->kernel_loops = kernel_loops;
9278
9279 tuning_db->entry_cnt++;
9280 }
9281 else
9282 {
9283 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9284
9285 continue;
9286 }
9287 }
9288
9289 fclose (fp);
9290
9291 // todo: print loaded 'cnt' message
9292
9293 // sort the database
9294
9295 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9296 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9297
9298 return tuning_db;
9299 }
9300
9301 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, hc_device_param_t *device_param, int attack_mode, int hash_type)
9302 {
9303 static tuning_db_entry_t s;
9304
9305 // first we need to convert all spaces in the device_name to underscore
9306
9307 char *device_name_nospace = strdup (device_param->device_name);
9308
9309 int device_name_length = strlen (device_name_nospace);
9310
9311 int i;
9312
9313 for (i = 0; i < device_name_length; i++)
9314 {
9315 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9316 }
9317
9318 // find out if there's an alias configured
9319
9320 tuning_db_alias_t a;
9321
9322 a.device_name = device_name_nospace;
9323
9324 tuning_db_alias_t *alias = bsearch (&a, tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9325
9326 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9327
9328 // attack-mode 6 and 7 are attack-mode 1 basically
9329
9330 if (attack_mode == 6) attack_mode = 1;
9331 if (attack_mode == 7) attack_mode = 1;
9332
9333 // bsearch is not ideal but fast enough
9334
9335 s.device_name = device_name_nospace;
9336 s.attack_mode = attack_mode;
9337 s.hash_type = hash_type;
9338
9339 tuning_db_entry_t *entry = NULL;
9340
9341 // this will produce all 2^3 combinations required
9342
9343 for (i = 0; i < 8; i++)
9344 {
9345 s.device_name = (i & 1) ? "*" : device_name_nospace;
9346 s.attack_mode = (i & 2) ? -1 : attack_mode;
9347 s.hash_type = (i & 4) ? -1 : hash_type;
9348
9349 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9350
9351 if (entry != NULL) break;
9352
9353 // in non-wildcard mode do some additional checks:
9354
9355 if ((i & 1) == 0)
9356 {
9357 // in case we have an alias-name
9358
9359 if (alias_name != NULL)
9360 {
9361 s.device_name = alias_name;
9362
9363 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9364
9365 if (entry != NULL) break;
9366 }
9367
9368 // or by device type
9369
9370 if (device_param->device_type & CL_DEVICE_TYPE_CPU)
9371 {
9372 s.device_name = "DEVICE_TYPE_CPU";
9373 }
9374 else if (device_param->device_type & CL_DEVICE_TYPE_GPU)
9375 {
9376 s.device_name = "DEVICE_TYPE_GPU";
9377 }
9378 else if (device_param->device_type & CL_DEVICE_TYPE_ACCELERATOR)
9379 {
9380 s.device_name = "DEVICE_TYPE_ACCELERATOR";
9381 }
9382
9383 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9384
9385 if (entry != NULL) break;
9386 }
9387 }
9388
9389 // free converted device_name
9390
9391 myfree (device_name_nospace);
9392
9393 return entry;
9394 }
9395
9396 /**
9397 * parser
9398 */
9399
9400 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9401 {
9402 u8 tmp[256] = { 0 };
9403
9404 if (salt_len > sizeof (tmp))
9405 {
9406 return UINT_MAX;
9407 }
9408
9409 memcpy (tmp, in, salt_len);
9410
9411 if (data.opts_type & OPTS_TYPE_ST_HEX)
9412 {
9413 if ((salt_len % 2) == 0)
9414 {
9415 u32 new_salt_len = salt_len / 2;
9416
9417 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9418 {
9419 u8 p0 = tmp[j + 0];
9420 u8 p1 = tmp[j + 1];
9421
9422 tmp[i] = hex_convert (p1) << 0;
9423 tmp[i] |= hex_convert (p0) << 4;
9424 }
9425
9426 salt_len = new_salt_len;
9427 }
9428 else
9429 {
9430 return UINT_MAX;
9431 }
9432 }
9433 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9434 {
9435 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9436 }
9437
9438 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9439
9440 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9441 {
9442 if (salt_len < 20)
9443 {
9444 u32 *tmp_uint = (u32 *) tmp;
9445
9446 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9447 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9448 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9449 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9450 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9451 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9452 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9453 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9454 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9455 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9456
9457 salt_len = salt_len * 2;
9458 }
9459 else
9460 {
9461 return UINT_MAX;
9462 }
9463 }
9464
9465 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9466 {
9467 lowercase (tmp, salt_len);
9468 }
9469
9470 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9471 {
9472 uppercase (tmp, salt_len);
9473 }
9474
9475 u32 len = salt_len;
9476
9477 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9478 {
9479 tmp[len++] = 0x80;
9480 }
9481
9482 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9483 {
9484 tmp[len++] = 0x01;
9485 }
9486
9487 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9488 {
9489 u32 *tmp_uint = (uint *) tmp;
9490
9491 u32 max = len / 4;
9492
9493 if (len % 4) max++;
9494
9495 for (u32 i = 0; i < max; i++)
9496 {
9497 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9498 }
9499
9500 // Important: we may need to increase the length of memcpy since
9501 // we don't want to "loose" some swapped bytes (could happen if
9502 // they do not perfectly fit in the 4-byte blocks)
9503 // Memcpy does always copy the bytes in the BE order, but since
9504 // we swapped them, some important bytes could be in positions
9505 // we normally skip with the original len
9506
9507 if (len % 4) len += 4 - (len % 4);
9508 }
9509
9510 memcpy (out, tmp, len);
9511
9512 return (salt_len);
9513 }
9514
9515 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9516 {
9517 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9518
9519 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9520
9521 u32 *digest = (u32 *) hash_buf->digest;
9522
9523 salt_t *salt = hash_buf->salt;
9524
9525 memcpy ((char *) salt->salt_sign, input_buf, 6);
9526
9527 char *iter_pos = input_buf + 4;
9528
9529 salt->salt_iter = 1 << atoi (iter_pos);
9530
9531 char *salt_pos = strchr (iter_pos, '$');
9532
9533 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9534
9535 salt_pos++;
9536
9537 uint salt_len = 16;
9538
9539 salt->salt_len = salt_len;
9540
9541 u8 tmp_buf[100] = { 0 };
9542
9543 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9544
9545 char *salt_buf_ptr = (char *) salt->salt_buf;
9546
9547 memcpy (salt_buf_ptr, tmp_buf, 16);
9548
9549 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9550 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9551 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9552 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9553
9554 char *hash_pos = salt_pos + 22;
9555
9556 memset (tmp_buf, 0, sizeof (tmp_buf));
9557
9558 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9559
9560 memcpy (digest, tmp_buf, 24);
9561
9562 digest[0] = byte_swap_32 (digest[0]);
9563 digest[1] = byte_swap_32 (digest[1]);
9564 digest[2] = byte_swap_32 (digest[2]);
9565 digest[3] = byte_swap_32 (digest[3]);
9566 digest[4] = byte_swap_32 (digest[4]);
9567 digest[5] = byte_swap_32 (digest[5]);
9568
9569 digest[5] &= ~0xff; // its just 23 not 24 !
9570
9571 return (PARSER_OK);
9572 }
9573
9574 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9575 {
9576 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9577
9578 u32 *digest = (u32 *) hash_buf->digest;
9579
9580 u8 tmp_buf[100] = { 0 };
9581
9582 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9583
9584 memcpy (digest, tmp_buf, 32);
9585
9586 digest[0] = byte_swap_32 (digest[0]);
9587 digest[1] = byte_swap_32 (digest[1]);
9588 digest[2] = byte_swap_32 (digest[2]);
9589 digest[3] = byte_swap_32 (digest[3]);
9590 digest[4] = byte_swap_32 (digest[4]);
9591 digest[5] = byte_swap_32 (digest[5]);
9592 digest[6] = byte_swap_32 (digest[6]);
9593 digest[7] = byte_swap_32 (digest[7]);
9594
9595 digest[0] -= SHA256M_A;
9596 digest[1] -= SHA256M_B;
9597 digest[2] -= SHA256M_C;
9598 digest[3] -= SHA256M_D;
9599 digest[4] -= SHA256M_E;
9600 digest[5] -= SHA256M_F;
9601 digest[6] -= SHA256M_G;
9602 digest[7] -= SHA256M_H;
9603
9604 return (PARSER_OK);
9605 }
9606
9607 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9608 {
9609 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9610
9611 u32 *digest = (u32 *) hash_buf->digest;
9612
9613 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9614 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9615
9616 digest[0] = byte_swap_32 (digest[0]);
9617 digest[1] = byte_swap_32 (digest[1]);
9618
9619 uint tt;
9620
9621 IP (digest[0], digest[1], tt);
9622
9623 digest[0] = digest[0];
9624 digest[1] = digest[1];
9625 digest[2] = 0;
9626 digest[3] = 0;
9627
9628 return (PARSER_OK);
9629 }
9630
9631 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9632 {
9633 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9634
9635 u32 *digest = (u32 *) hash_buf->digest;
9636
9637 salt_t *salt = hash_buf->salt;
9638
9639 char *hash_pos = input_buf + 8;
9640
9641 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9642 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9643 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9644 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9645 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9646
9647 digest[0] -= SHA1M_A;
9648 digest[1] -= SHA1M_B;
9649 digest[2] -= SHA1M_C;
9650 digest[3] -= SHA1M_D;
9651 digest[4] -= SHA1M_E;
9652
9653 uint salt_len = 8;
9654
9655 char *salt_buf_ptr = (char *) salt->salt_buf;
9656
9657 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9658
9659 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9660
9661 salt->salt_len = salt_len;
9662
9663 return (PARSER_OK);
9664 }
9665
9666 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9667 {
9668 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9669
9670 u64 *digest = (u64 *) hash_buf->digest;
9671
9672 salt_t *salt = hash_buf->salt;
9673
9674 char *hash_pos = input_buf + 8;
9675
9676 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9677 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9678 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9679 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9680 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9681 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9682 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9683 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9684
9685 digest[0] -= SHA512M_A;
9686 digest[1] -= SHA512M_B;
9687 digest[2] -= SHA512M_C;
9688 digest[3] -= SHA512M_D;
9689 digest[4] -= SHA512M_E;
9690 digest[5] -= SHA512M_F;
9691 digest[6] -= SHA512M_G;
9692 digest[7] -= SHA512M_H;
9693
9694 uint salt_len = 8;
9695
9696 char *salt_buf_ptr = (char *) salt->salt_buf;
9697
9698 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9699
9700 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9701
9702 salt->salt_len = salt_len;
9703
9704 return (PARSER_OK);
9705 }
9706
9707 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9708 {
9709 if (data.opts_type & OPTS_TYPE_ST_HEX)
9710 {
9711 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9712 }
9713 else
9714 {
9715 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9716 }
9717
9718 u32 *digest = (u32 *) hash_buf->digest;
9719
9720 salt_t *salt = hash_buf->salt;
9721
9722 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9723 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9724 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9725 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9726
9727 digest[0] = byte_swap_32 (digest[0]);
9728 digest[1] = byte_swap_32 (digest[1]);
9729 digest[2] = byte_swap_32 (digest[2]);
9730 digest[3] = byte_swap_32 (digest[3]);
9731
9732 digest[0] -= MD5M_A;
9733 digest[1] -= MD5M_B;
9734 digest[2] -= MD5M_C;
9735 digest[3] -= MD5M_D;
9736
9737 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9738
9739 uint salt_len = input_len - 32 - 1;
9740
9741 char *salt_buf = input_buf + 32 + 1;
9742
9743 char *salt_buf_ptr = (char *) salt->salt_buf;
9744
9745 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9746
9747 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9748
9749 salt->salt_len = salt_len;
9750
9751 return (PARSER_OK);
9752 }
9753
9754 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9755 {
9756 if (data.opts_type & OPTS_TYPE_ST_HEX)
9757 {
9758 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9759 }
9760 else
9761 {
9762 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9763 }
9764
9765 // unscramble
9766
9767 char clean_input_buf[32] = { 0 };
9768
9769 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9770 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9771
9772 for (int i = 0, j = 0, k = 0; i < 30; i++)
9773 {
9774 if (i == pos[j])
9775 {
9776 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9777
9778 j++;
9779 }
9780 else
9781 {
9782 clean_input_buf[k] = input_buf[i];
9783
9784 k++;
9785 }
9786 }
9787
9788 // base64 decode
9789
9790 u32 *digest = (u32 *) hash_buf->digest;
9791
9792 salt_t *salt = hash_buf->salt;
9793
9794 u32 a, b, c, d, e, f;
9795
9796 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9797 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9798 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9799 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9800 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9801 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9802
9803 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9804 | (((d << 12) | (e << 6) | (f)) << 0);
9805
9806 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9807 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9808 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9809 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9810 e = base64_to_int (clean_input_buf[10] & 0x7f);
9811 f = base64_to_int (clean_input_buf[11] & 0x7f);
9812
9813 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9814 | (((d << 12) | (e << 6) | (f)) << 0);
9815
9816 a = base64_to_int (clean_input_buf[12] & 0x7f);
9817 b = base64_to_int (clean_input_buf[13] & 0x7f);
9818 c = base64_to_int (clean_input_buf[14] & 0x7f);
9819 d = base64_to_int (clean_input_buf[15] & 0x7f);
9820 e = base64_to_int (clean_input_buf[16] & 0x7f);
9821 f = base64_to_int (clean_input_buf[17] & 0x7f);
9822
9823 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9824 | (((d << 12) | (e << 6) | (f)) << 0);
9825
9826 a = base64_to_int (clean_input_buf[18] & 0x7f);
9827 b = base64_to_int (clean_input_buf[19] & 0x7f);
9828 c = base64_to_int (clean_input_buf[20] & 0x7f);
9829 d = base64_to_int (clean_input_buf[21] & 0x7f);
9830 e = base64_to_int (clean_input_buf[22] & 0x7f);
9831 f = base64_to_int (clean_input_buf[23] & 0x7f);
9832
9833 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9834 | (((d << 12) | (e << 6) | (f)) << 0);
9835
9836 digest[0] = byte_swap_32 (digest[0]);
9837 digest[1] = byte_swap_32 (digest[1]);
9838 digest[2] = byte_swap_32 (digest[2]);
9839 digest[3] = byte_swap_32 (digest[3]);
9840
9841 digest[0] -= MD5M_A;
9842 digest[1] -= MD5M_B;
9843 digest[2] -= MD5M_C;
9844 digest[3] -= MD5M_D;
9845
9846 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9847
9848 uint salt_len = input_len - 30 - 1;
9849
9850 char *salt_buf = input_buf + 30 + 1;
9851
9852 char *salt_buf_ptr = (char *) salt->salt_buf;
9853
9854 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9855
9856 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9857 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9858
9859 salt->salt_len = salt_len;
9860
9861 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9862
9863 salt->salt_len += 22;
9864
9865 return (PARSER_OK);
9866 }
9867
9868 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9869 {
9870 if (data.opts_type & OPTS_TYPE_ST_HEX)
9871 {
9872 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9873 }
9874 else
9875 {
9876 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9877 }
9878
9879 u32 *digest = (u32 *) hash_buf->digest;
9880
9881 salt_t *salt = hash_buf->salt;
9882
9883 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9884 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9885 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9886 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9887 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
9888
9889 digest[0] -= SHA1M_A;
9890 digest[1] -= SHA1M_B;
9891 digest[2] -= SHA1M_C;
9892 digest[3] -= SHA1M_D;
9893 digest[4] -= SHA1M_E;
9894
9895 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9896
9897 uint salt_len = input_len - 40 - 1;
9898
9899 char *salt_buf = input_buf + 40 + 1;
9900
9901 char *salt_buf_ptr = (char *) salt->salt_buf;
9902
9903 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9904
9905 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9906
9907 salt->salt_len = salt_len;
9908
9909 return (PARSER_OK);
9910 }
9911
9912 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9913 {
9914 if (data.opts_type & OPTS_TYPE_ST_HEX)
9915 {
9916 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9917 }
9918 else
9919 {
9920 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9921 }
9922
9923 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9924
9925 char *iter_pos = input_buf + 6;
9926
9927 salt_t *salt = hash_buf->salt;
9928
9929 uint iter = atoi (iter_pos);
9930
9931 if (iter < 1)
9932 {
9933 iter = ROUNDS_DCC2;
9934 }
9935
9936 salt->salt_iter = iter - 1;
9937
9938 char *salt_pos = strchr (iter_pos, '#');
9939
9940 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9941
9942 salt_pos++;
9943
9944 char *digest_pos = strchr (salt_pos, '#');
9945
9946 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9947
9948 digest_pos++;
9949
9950 uint salt_len = digest_pos - salt_pos - 1;
9951
9952 u32 *digest = (u32 *) hash_buf->digest;
9953
9954 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
9955 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
9956 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
9957 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
9958
9959 char *salt_buf_ptr = (char *) salt->salt_buf;
9960
9961 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9962
9963 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9964
9965 salt->salt_len = salt_len;
9966
9967 return (PARSER_OK);
9968 }
9969
9970 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9971 {
9972 u32 *digest = (u32 *) hash_buf->digest;
9973
9974 salt_t *salt = hash_buf->salt;
9975
9976 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9977
9978 hccap_t in;
9979
9980 memcpy (&in, input_buf, input_len);
9981
9982 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9983
9984 memcpy (digest, in.keymic, 16);
9985
9986 /*
9987 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9988 The phrase "Pairwise key expansion"
9989 Access Point Address (referred to as Authenticator Address AA)
9990 Supplicant Address (referred to as Supplicant Address SA)
9991 Access Point Nonce (referred to as Authenticator Anonce)
9992 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9993 */
9994
9995 uint salt_len = strlen (in.essid);
9996
9997 memcpy (salt->salt_buf, in.essid, salt_len);
9998
9999 salt->salt_len = salt_len;
10000
10001 salt->salt_iter = ROUNDS_WPA2 - 1;
10002
10003 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10004
10005 memcpy (pke_ptr, "Pairwise key expansion", 23);
10006
10007 if (memcmp (in.mac1, in.mac2, 6) < 0)
10008 {
10009 memcpy (pke_ptr + 23, in.mac1, 6);
10010 memcpy (pke_ptr + 29, in.mac2, 6);
10011 }
10012 else
10013 {
10014 memcpy (pke_ptr + 23, in.mac2, 6);
10015 memcpy (pke_ptr + 29, in.mac1, 6);
10016 }
10017
10018 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10019 {
10020 memcpy (pke_ptr + 35, in.nonce1, 32);
10021 memcpy (pke_ptr + 67, in.nonce2, 32);
10022 }
10023 else
10024 {
10025 memcpy (pke_ptr + 35, in.nonce2, 32);
10026 memcpy (pke_ptr + 67, in.nonce1, 32);
10027 }
10028
10029 for (int i = 0; i < 25; i++)
10030 {
10031 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10032 }
10033
10034 wpa->keyver = in.keyver;
10035
10036 if (wpa->keyver > 255)
10037 {
10038 log_info ("ATTENTION!");
10039 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10040 log_info (" This could be due to a recent aircrack-ng bug.");
10041 log_info (" The key version was automatically reset to a reasonable value.");
10042 log_info ("");
10043
10044 wpa->keyver &= 0xff;
10045 }
10046
10047 wpa->eapol_size = in.eapol_size;
10048
10049 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10050
10051 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10052
10053 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10054
10055 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10056
10057 if (wpa->keyver == 1)
10058 {
10059 // nothing to do
10060 }
10061 else
10062 {
10063 digest[0] = byte_swap_32 (digest[0]);
10064 digest[1] = byte_swap_32 (digest[1]);
10065 digest[2] = byte_swap_32 (digest[2]);
10066 digest[3] = byte_swap_32 (digest[3]);
10067
10068 for (int i = 0; i < 64; i++)
10069 {
10070 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10071 }
10072 }
10073
10074 uint32_t *p0 = (uint32_t *) in.essid;
10075 uint32_t c0 = 0;
10076 uint32_t c1 = 0;
10077
10078 for (unsigned int i = 0; i < sizeof(in.essid)/sizeof(uint32_t); i++) c0 ^= *p0++;
10079 for (unsigned int i = 0; i < sizeof(wpa->pke)/sizeof(wpa->pke[0]); i++) c1 ^= wpa->pke[i];
10080
10081 salt->salt_buf[10] = c0;
10082 salt->salt_buf[11] = c1;
10083
10084 return (PARSER_OK);
10085 }
10086
10087 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10088 {
10089 u32 *digest = (u32 *) hash_buf->digest;
10090
10091 salt_t *salt = hash_buf->salt;
10092
10093 if (input_len == 0)
10094 {
10095 log_error ("Password Safe v2 container not specified");
10096
10097 exit (-1);
10098 }
10099
10100 FILE *fp = fopen (input_buf, "rb");
10101
10102 if (fp == NULL)
10103 {
10104 log_error ("%s: %s", input_buf, strerror (errno));
10105
10106 exit (-1);
10107 }
10108
10109 psafe2_hdr buf;
10110
10111 memset (&buf, 0, sizeof (psafe2_hdr));
10112
10113 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10114
10115 fclose (fp);
10116
10117 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10118
10119 salt->salt_buf[0] = buf.random[0];
10120 salt->salt_buf[1] = buf.random[1];
10121
10122 salt->salt_len = 8;
10123 salt->salt_iter = 1000;
10124
10125 digest[0] = byte_swap_32 (buf.hash[0]);
10126 digest[1] = byte_swap_32 (buf.hash[1]);
10127 digest[2] = byte_swap_32 (buf.hash[2]);
10128 digest[3] = byte_swap_32 (buf.hash[3]);
10129 digest[4] = byte_swap_32 (buf.hash[4]);
10130
10131 return (PARSER_OK);
10132 }
10133
10134 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10135 {
10136 u32 *digest = (u32 *) hash_buf->digest;
10137
10138 salt_t *salt = hash_buf->salt;
10139
10140 if (input_len == 0)
10141 {
10142 log_error (".psafe3 not specified");
10143
10144 exit (-1);
10145 }
10146
10147 FILE *fp = fopen (input_buf, "rb");
10148
10149 if (fp == NULL)
10150 {
10151 log_error ("%s: %s", input_buf, strerror (errno));
10152
10153 exit (-1);
10154 }
10155
10156 psafe3_t in;
10157
10158 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10159
10160 fclose (fp);
10161
10162 data.hashfile = input_buf; // we will need this in case it gets cracked
10163
10164 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10165
10166 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10167
10168 salt->salt_iter = in.iterations + 1;
10169
10170 salt->salt_buf[0] = in.salt_buf[0];
10171 salt->salt_buf[1] = in.salt_buf[1];
10172 salt->salt_buf[2] = in.salt_buf[2];
10173 salt->salt_buf[3] = in.salt_buf[3];
10174 salt->salt_buf[4] = in.salt_buf[4];
10175 salt->salt_buf[5] = in.salt_buf[5];
10176 salt->salt_buf[6] = in.salt_buf[6];
10177 salt->salt_buf[7] = in.salt_buf[7];
10178
10179 salt->salt_len = 32;
10180
10181 digest[0] = in.hash_buf[0];
10182 digest[1] = in.hash_buf[1];
10183 digest[2] = in.hash_buf[2];
10184 digest[3] = in.hash_buf[3];
10185 digest[4] = in.hash_buf[4];
10186 digest[5] = in.hash_buf[5];
10187 digest[6] = in.hash_buf[6];
10188 digest[7] = in.hash_buf[7];
10189
10190 digest[0] = byte_swap_32 (digest[0]);
10191 digest[1] = byte_swap_32 (digest[1]);
10192 digest[2] = byte_swap_32 (digest[2]);
10193 digest[3] = byte_swap_32 (digest[3]);
10194 digest[4] = byte_swap_32 (digest[4]);
10195 digest[5] = byte_swap_32 (digest[5]);
10196 digest[6] = byte_swap_32 (digest[6]);
10197 digest[7] = byte_swap_32 (digest[7]);
10198
10199 return (PARSER_OK);
10200 }
10201
10202 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10203 {
10204 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10205
10206 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10207
10208 u32 *digest = (u32 *) hash_buf->digest;
10209
10210 salt_t *salt = hash_buf->salt;
10211
10212 char *iter_pos = input_buf + 3;
10213
10214 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10215
10216 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10217
10218 memcpy ((char *) salt->salt_sign, input_buf, 4);
10219
10220 salt->salt_iter = salt_iter;
10221
10222 char *salt_pos = iter_pos + 1;
10223
10224 uint salt_len = 8;
10225
10226 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10227
10228 salt->salt_len = salt_len;
10229
10230 char *hash_pos = salt_pos + salt_len;
10231
10232 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10233
10234 return (PARSER_OK);
10235 }
10236
10237 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10238 {
10239 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10240
10241 u32 *digest = (u32 *) hash_buf->digest;
10242
10243 salt_t *salt = hash_buf->salt;
10244
10245 char *salt_pos = input_buf + 3;
10246
10247 uint iterations_len = 0;
10248
10249 if (memcmp (salt_pos, "rounds=", 7) == 0)
10250 {
10251 salt_pos += 7;
10252
10253 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10254
10255 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10256 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10257
10258 salt_pos[0] = 0x0;
10259
10260 salt->salt_iter = atoi (salt_pos - iterations_len);
10261
10262 salt_pos += 1;
10263
10264 iterations_len += 8;
10265 }
10266 else
10267 {
10268 salt->salt_iter = ROUNDS_MD5CRYPT;
10269 }
10270
10271 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10272
10273 char *hash_pos = strchr (salt_pos, '$');
10274
10275 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10276
10277 uint salt_len = hash_pos - salt_pos;
10278
10279 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10280
10281 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10282
10283 salt->salt_len = salt_len;
10284
10285 hash_pos++;
10286
10287 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10288
10289 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10290
10291 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10292
10293 return (PARSER_OK);
10294 }
10295
10296 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10297 {
10298 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10299
10300 u32 *digest = (u32 *) hash_buf->digest;
10301
10302 salt_t *salt = hash_buf->salt;
10303
10304 char *salt_pos = input_buf + 6;
10305
10306 uint iterations_len = 0;
10307
10308 if (memcmp (salt_pos, "rounds=", 7) == 0)
10309 {
10310 salt_pos += 7;
10311
10312 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10313
10314 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10315 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10316
10317 salt_pos[0] = 0x0;
10318
10319 salt->salt_iter = atoi (salt_pos - iterations_len);
10320
10321 salt_pos += 1;
10322
10323 iterations_len += 8;
10324 }
10325 else
10326 {
10327 salt->salt_iter = ROUNDS_MD5CRYPT;
10328 }
10329
10330 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10331
10332 char *hash_pos = strchr (salt_pos, '$');
10333
10334 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10335
10336 uint salt_len = hash_pos - salt_pos;
10337
10338 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10339
10340 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10341
10342 salt->salt_len = salt_len;
10343
10344 hash_pos++;
10345
10346 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10347
10348 return (PARSER_OK);
10349 }
10350
10351 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10352 {
10353 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10354
10355 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10356
10357 u32 *digest = (u32 *) hash_buf->digest;
10358
10359 salt_t *salt = hash_buf->salt;
10360
10361 char *salt_pos = input_buf + 14;
10362
10363 char *hash_pos = strchr (salt_pos, '*');
10364
10365 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10366
10367 hash_pos++;
10368
10369 uint salt_len = hash_pos - salt_pos - 1;
10370
10371 char *salt_buf_ptr = (char *) salt->salt_buf;
10372
10373 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10374
10375 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10376
10377 salt->salt_len = salt_len;
10378
10379 u8 tmp_buf[100] = { 0 };
10380
10381 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10382
10383 memcpy (digest, tmp_buf, 20);
10384
10385 digest[0] = byte_swap_32 (digest[0]);
10386 digest[1] = byte_swap_32 (digest[1]);
10387 digest[2] = byte_swap_32 (digest[2]);
10388 digest[3] = byte_swap_32 (digest[3]);
10389 digest[4] = byte_swap_32 (digest[4]);
10390
10391 digest[0] -= SHA1M_A;
10392 digest[1] -= SHA1M_B;
10393 digest[2] -= SHA1M_C;
10394 digest[3] -= SHA1M_D;
10395 digest[4] -= SHA1M_E;
10396
10397 return (PARSER_OK);
10398 }
10399
10400 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10401 {
10402 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10403
10404 unsigned char c12 = itoa64_to_int (input_buf[12]);
10405
10406 if (c12 & 3) return (PARSER_HASH_VALUE);
10407
10408 u32 *digest = (u32 *) hash_buf->digest;
10409
10410 salt_t *salt = hash_buf->salt;
10411
10412 // for ascii_digest
10413 salt->salt_sign[0] = input_buf[0];
10414 salt->salt_sign[1] = input_buf[1];
10415
10416 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10417 | itoa64_to_int (input_buf[1]) << 6;
10418
10419 salt->salt_len = 2;
10420
10421 u8 tmp_buf[100] = { 0 };
10422
10423 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10424
10425 memcpy (digest, tmp_buf, 8);
10426
10427 uint tt;
10428
10429 IP (digest[0], digest[1], tt);
10430
10431 digest[2] = 0;
10432 digest[3] = 0;
10433
10434 return (PARSER_OK);
10435 }
10436
10437 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10438 {
10439 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10440
10441 u32 *digest = (u32 *) hash_buf->digest;
10442
10443 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10444 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10445 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10446 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10447
10448 digest[0] = byte_swap_32 (digest[0]);
10449 digest[1] = byte_swap_32 (digest[1]);
10450 digest[2] = byte_swap_32 (digest[2]);
10451 digest[3] = byte_swap_32 (digest[3]);
10452
10453 digest[0] -= MD4M_A;
10454 digest[1] -= MD4M_B;
10455 digest[2] -= MD4M_C;
10456 digest[3] -= MD4M_D;
10457
10458 return (PARSER_OK);
10459 }
10460
10461 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10462 {
10463 if (data.opts_type & OPTS_TYPE_ST_HEX)
10464 {
10465 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10466 }
10467 else
10468 {
10469 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10470 }
10471
10472 u32 *digest = (u32 *) hash_buf->digest;
10473
10474 salt_t *salt = hash_buf->salt;
10475
10476 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10477 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10478 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10479 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10480
10481 digest[0] = byte_swap_32 (digest[0]);
10482 digest[1] = byte_swap_32 (digest[1]);
10483 digest[2] = byte_swap_32 (digest[2]);
10484 digest[3] = byte_swap_32 (digest[3]);
10485
10486 digest[0] -= MD4M_A;
10487 digest[1] -= MD4M_B;
10488 digest[2] -= MD4M_C;
10489 digest[3] -= MD4M_D;
10490
10491 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10492
10493 uint salt_len = input_len - 32 - 1;
10494
10495 char *salt_buf = input_buf + 32 + 1;
10496
10497 char *salt_buf_ptr = (char *) salt->salt_buf;
10498
10499 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10500
10501 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10502
10503 salt->salt_len = salt_len;
10504
10505 return (PARSER_OK);
10506 }
10507
10508 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10509 {
10510 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10511
10512 u32 *digest = (u32 *) hash_buf->digest;
10513
10514 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10515 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10516 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10517 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10518
10519 digest[0] = byte_swap_32 (digest[0]);
10520 digest[1] = byte_swap_32 (digest[1]);
10521 digest[2] = byte_swap_32 (digest[2]);
10522 digest[3] = byte_swap_32 (digest[3]);
10523
10524 digest[0] -= MD5M_A;
10525 digest[1] -= MD5M_B;
10526 digest[2] -= MD5M_C;
10527 digest[3] -= MD5M_D;
10528
10529 return (PARSER_OK);
10530 }
10531
10532 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10533 {
10534 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10535
10536 u32 *digest = (u32 *) hash_buf->digest;
10537
10538 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10539 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10540 digest[2] = 0;
10541 digest[3] = 0;
10542
10543 digest[0] = byte_swap_32 (digest[0]);
10544 digest[1] = byte_swap_32 (digest[1]);
10545
10546 return (PARSER_OK);
10547 }
10548
10549 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10550 {
10551 if (data.opts_type & OPTS_TYPE_ST_HEX)
10552 {
10553 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10554 }
10555 else
10556 {
10557 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10558 }
10559
10560 u32 *digest = (u32 *) hash_buf->digest;
10561
10562 salt_t *salt = hash_buf->salt;
10563
10564 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10565 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10566 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10567 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10568
10569 digest[0] = byte_swap_32 (digest[0]);
10570 digest[1] = byte_swap_32 (digest[1]);
10571 digest[2] = byte_swap_32 (digest[2]);
10572 digest[3] = byte_swap_32 (digest[3]);
10573
10574 digest[0] -= MD5M_A;
10575 digest[1] -= MD5M_B;
10576 digest[2] -= MD5M_C;
10577 digest[3] -= MD5M_D;
10578
10579 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10580
10581 uint salt_len = input_len - 32 - 1;
10582
10583 char *salt_buf = input_buf + 32 + 1;
10584
10585 char *salt_buf_ptr = (char *) salt->salt_buf;
10586
10587 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10588
10589 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10590
10591 salt->salt_len = salt_len;
10592
10593 return (PARSER_OK);
10594 }
10595
10596 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10597 {
10598 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10599
10600 u32 *digest = (u32 *) hash_buf->digest;
10601
10602 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10603 | itoa64_to_int (input_buf[ 1]) << 6
10604 | itoa64_to_int (input_buf[ 2]) << 12
10605 | itoa64_to_int (input_buf[ 3]) << 18;
10606 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10607 | itoa64_to_int (input_buf[ 5]) << 6
10608 | itoa64_to_int (input_buf[ 6]) << 12
10609 | itoa64_to_int (input_buf[ 7]) << 18;
10610 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10611 | itoa64_to_int (input_buf[ 9]) << 6
10612 | itoa64_to_int (input_buf[10]) << 12
10613 | itoa64_to_int (input_buf[11]) << 18;
10614 digest[3] = itoa64_to_int (input_buf[12]) << 0
10615 | itoa64_to_int (input_buf[13]) << 6
10616 | itoa64_to_int (input_buf[14]) << 12
10617 | itoa64_to_int (input_buf[15]) << 18;
10618
10619 digest[0] -= MD5M_A;
10620 digest[1] -= MD5M_B;
10621 digest[2] -= MD5M_C;
10622 digest[3] -= MD5M_D;
10623
10624 digest[0] &= 0x00ffffff;
10625 digest[1] &= 0x00ffffff;
10626 digest[2] &= 0x00ffffff;
10627 digest[3] &= 0x00ffffff;
10628
10629 return (PARSER_OK);
10630 }
10631
10632 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10633 {
10634 if (data.opts_type & OPTS_TYPE_ST_HEX)
10635 {
10636 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10637 }
10638 else
10639 {
10640 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10641 }
10642
10643 u32 *digest = (u32 *) hash_buf->digest;
10644
10645 salt_t *salt = hash_buf->salt;
10646
10647 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10648 | itoa64_to_int (input_buf[ 1]) << 6
10649 | itoa64_to_int (input_buf[ 2]) << 12
10650 | itoa64_to_int (input_buf[ 3]) << 18;
10651 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10652 | itoa64_to_int (input_buf[ 5]) << 6
10653 | itoa64_to_int (input_buf[ 6]) << 12
10654 | itoa64_to_int (input_buf[ 7]) << 18;
10655 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10656 | itoa64_to_int (input_buf[ 9]) << 6
10657 | itoa64_to_int (input_buf[10]) << 12
10658 | itoa64_to_int (input_buf[11]) << 18;
10659 digest[3] = itoa64_to_int (input_buf[12]) << 0
10660 | itoa64_to_int (input_buf[13]) << 6
10661 | itoa64_to_int (input_buf[14]) << 12
10662 | itoa64_to_int (input_buf[15]) << 18;
10663
10664 digest[0] -= MD5M_A;
10665 digest[1] -= MD5M_B;
10666 digest[2] -= MD5M_C;
10667 digest[3] -= MD5M_D;
10668
10669 digest[0] &= 0x00ffffff;
10670 digest[1] &= 0x00ffffff;
10671 digest[2] &= 0x00ffffff;
10672 digest[3] &= 0x00ffffff;
10673
10674 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10675
10676 uint salt_len = input_len - 16 - 1;
10677
10678 char *salt_buf = input_buf + 16 + 1;
10679
10680 char *salt_buf_ptr = (char *) salt->salt_buf;
10681
10682 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10683
10684 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10685
10686 salt->salt_len = salt_len;
10687
10688 return (PARSER_OK);
10689 }
10690
10691 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10692 {
10693 key[0] = (nthash[0] >> 0);
10694 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10695 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10696 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10697 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10698 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10699 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10700 key[7] = (nthash[6] << 1);
10701
10702 key[0] |= 0x01;
10703 key[1] |= 0x01;
10704 key[2] |= 0x01;
10705 key[3] |= 0x01;
10706 key[4] |= 0x01;
10707 key[5] |= 0x01;
10708 key[6] |= 0x01;
10709 key[7] |= 0x01;
10710 }
10711
10712 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10713 {
10714 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10715
10716 u32 *digest = (u32 *) hash_buf->digest;
10717
10718 salt_t *salt = hash_buf->salt;
10719
10720 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10721
10722 /**
10723 * parse line
10724 */
10725
10726 char *user_pos = input_buf;
10727
10728 char *unused_pos = strchr (user_pos, ':');
10729
10730 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10731
10732 uint user_len = unused_pos - user_pos;
10733
10734 if (user_len > 60) return (PARSER_SALT_LENGTH);
10735
10736 unused_pos++;
10737
10738 char *domain_pos = strchr (unused_pos, ':');
10739
10740 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10741
10742 uint unused_len = domain_pos - unused_pos;
10743
10744 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10745
10746 domain_pos++;
10747
10748 char *srvchall_pos = strchr (domain_pos, ':');
10749
10750 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10751
10752 uint domain_len = srvchall_pos - domain_pos;
10753
10754 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10755
10756 srvchall_pos++;
10757
10758 char *hash_pos = strchr (srvchall_pos, ':');
10759
10760 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10761
10762 uint srvchall_len = hash_pos - srvchall_pos;
10763
10764 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10765
10766 hash_pos++;
10767
10768 char *clichall_pos = strchr (hash_pos, ':');
10769
10770 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10771
10772 uint hash_len = clichall_pos - hash_pos;
10773
10774 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10775
10776 clichall_pos++;
10777
10778 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10779
10780 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10781
10782 /**
10783 * store some data for later use
10784 */
10785
10786 netntlm->user_len = user_len * 2;
10787 netntlm->domain_len = domain_len * 2;
10788 netntlm->srvchall_len = srvchall_len / 2;
10789 netntlm->clichall_len = clichall_len / 2;
10790
10791 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10792 char *chall_ptr = (char *) netntlm->chall_buf;
10793
10794 /**
10795 * handle username and domainname
10796 */
10797
10798 for (uint i = 0; i < user_len; i++)
10799 {
10800 *userdomain_ptr++ = user_pos[i];
10801 *userdomain_ptr++ = 0;
10802 }
10803
10804 for (uint i = 0; i < domain_len; i++)
10805 {
10806 *userdomain_ptr++ = domain_pos[i];
10807 *userdomain_ptr++ = 0;
10808 }
10809
10810 /**
10811 * handle server challenge encoding
10812 */
10813
10814 for (uint i = 0; i < srvchall_len; i += 2)
10815 {
10816 const char p0 = srvchall_pos[i + 0];
10817 const char p1 = srvchall_pos[i + 1];
10818
10819 *chall_ptr++ = hex_convert (p1) << 0
10820 | hex_convert (p0) << 4;
10821 }
10822
10823 /**
10824 * handle client challenge encoding
10825 */
10826
10827 for (uint i = 0; i < clichall_len; i += 2)
10828 {
10829 const char p0 = clichall_pos[i + 0];
10830 const char p1 = clichall_pos[i + 1];
10831
10832 *chall_ptr++ = hex_convert (p1) << 0
10833 | hex_convert (p0) << 4;
10834 }
10835
10836 /**
10837 * store data
10838 */
10839
10840 char *salt_buf_ptr = (char *) salt->salt_buf;
10841
10842 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10843
10844 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10845
10846 salt->salt_len = salt_len;
10847
10848 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10849 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10850 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10851 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10852
10853 digest[0] = byte_swap_32 (digest[0]);
10854 digest[1] = byte_swap_32 (digest[1]);
10855 digest[2] = byte_swap_32 (digest[2]);
10856 digest[3] = byte_swap_32 (digest[3]);
10857
10858 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10859
10860 uint digest_tmp[2] = { 0 };
10861
10862 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10863 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
10864
10865 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10866 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10867
10868 /* special case 2: ESS */
10869
10870 if (srvchall_len == 48)
10871 {
10872 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10873 {
10874 uint w[16] = { 0 };
10875
10876 w[ 0] = netntlm->chall_buf[6];
10877 w[ 1] = netntlm->chall_buf[7];
10878 w[ 2] = netntlm->chall_buf[0];
10879 w[ 3] = netntlm->chall_buf[1];
10880 w[ 4] = 0x80;
10881 w[14] = 16 * 8;
10882
10883 uint dgst[4] = { 0 };
10884
10885 dgst[0] = MAGIC_A;
10886 dgst[1] = MAGIC_B;
10887 dgst[2] = MAGIC_C;
10888 dgst[3] = MAGIC_D;
10889
10890 md5_64 (w, dgst);
10891
10892 salt->salt_buf[0] = dgst[0];
10893 salt->salt_buf[1] = dgst[1];
10894 }
10895 }
10896
10897 /* precompute netntlmv1 exploit start */
10898
10899 for (uint i = 0; i < 0x10000; i++)
10900 {
10901 uint key_md4[2] = { i, 0 };
10902 uint key_des[2] = { 0, 0 };
10903
10904 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
10905
10906 uint Kc[16] = { 0 };
10907 uint Kd[16] = { 0 };
10908
10909 _des_keysetup (key_des, Kc, Kd, c_skb);
10910
10911 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10912
10913 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10914
10915 if (data3[0] != digest_tmp[0]) continue;
10916 if (data3[1] != digest_tmp[1]) continue;
10917
10918 salt->salt_buf[2] = i;
10919
10920 salt->salt_len = 24;
10921
10922 break;
10923 }
10924
10925 salt->salt_buf_pc[0] = digest_tmp[0];
10926 salt->salt_buf_pc[1] = digest_tmp[1];
10927
10928 /* precompute netntlmv1 exploit stop */
10929
10930 u32 tt;
10931
10932 IP (digest[0], digest[1], tt);
10933 IP (digest[2], digest[3], tt);
10934
10935 digest[0] = rotr32 (digest[0], 29);
10936 digest[1] = rotr32 (digest[1], 29);
10937 digest[2] = rotr32 (digest[2], 29);
10938 digest[3] = rotr32 (digest[3], 29);
10939
10940 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10941
10942 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
10943 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
10944
10945 return (PARSER_OK);
10946 }
10947
10948 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10949 {
10950 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10951
10952 u32 *digest = (u32 *) hash_buf->digest;
10953
10954 salt_t *salt = hash_buf->salt;
10955
10956 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10957
10958 /**
10959 * parse line
10960 */
10961
10962 char *user_pos = input_buf;
10963
10964 char *unused_pos = strchr (user_pos, ':');
10965
10966 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10967
10968 uint user_len = unused_pos - user_pos;
10969
10970 if (user_len > 60) return (PARSER_SALT_LENGTH);
10971
10972 unused_pos++;
10973
10974 char *domain_pos = strchr (unused_pos, ':');
10975
10976 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10977
10978 uint unused_len = domain_pos - unused_pos;
10979
10980 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10981
10982 domain_pos++;
10983
10984 char *srvchall_pos = strchr (domain_pos, ':');
10985
10986 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10987
10988 uint domain_len = srvchall_pos - domain_pos;
10989
10990 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10991
10992 srvchall_pos++;
10993
10994 char *hash_pos = strchr (srvchall_pos, ':');
10995
10996 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10997
10998 uint srvchall_len = hash_pos - srvchall_pos;
10999
11000 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11001
11002 hash_pos++;
11003
11004 char *clichall_pos = strchr (hash_pos, ':');
11005
11006 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11007
11008 uint hash_len = clichall_pos - hash_pos;
11009
11010 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11011
11012 clichall_pos++;
11013
11014 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11015
11016 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11017
11018 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11019
11020 /**
11021 * store some data for later use
11022 */
11023
11024 netntlm->user_len = user_len * 2;
11025 netntlm->domain_len = domain_len * 2;
11026 netntlm->srvchall_len = srvchall_len / 2;
11027 netntlm->clichall_len = clichall_len / 2;
11028
11029 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11030 char *chall_ptr = (char *) netntlm->chall_buf;
11031
11032 /**
11033 * handle username and domainname
11034 */
11035
11036 for (uint i = 0; i < user_len; i++)
11037 {
11038 *userdomain_ptr++ = toupper (user_pos[i]);
11039 *userdomain_ptr++ = 0;
11040 }
11041
11042 for (uint i = 0; i < domain_len; i++)
11043 {
11044 *userdomain_ptr++ = domain_pos[i];
11045 *userdomain_ptr++ = 0;
11046 }
11047
11048 *userdomain_ptr++ = 0x80;
11049
11050 /**
11051 * handle server challenge encoding
11052 */
11053
11054 for (uint i = 0; i < srvchall_len; i += 2)
11055 {
11056 const char p0 = srvchall_pos[i + 0];
11057 const char p1 = srvchall_pos[i + 1];
11058
11059 *chall_ptr++ = hex_convert (p1) << 0
11060 | hex_convert (p0) << 4;
11061 }
11062
11063 /**
11064 * handle client challenge encoding
11065 */
11066
11067 for (uint i = 0; i < clichall_len; i += 2)
11068 {
11069 const char p0 = clichall_pos[i + 0];
11070 const char p1 = clichall_pos[i + 1];
11071
11072 *chall_ptr++ = hex_convert (p1) << 0
11073 | hex_convert (p0) << 4;
11074 }
11075
11076 *chall_ptr++ = 0x80;
11077
11078 /**
11079 * handle hash itself
11080 */
11081
11082 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11083 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11084 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11085 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11086
11087 digest[0] = byte_swap_32 (digest[0]);
11088 digest[1] = byte_swap_32 (digest[1]);
11089 digest[2] = byte_swap_32 (digest[2]);
11090 digest[3] = byte_swap_32 (digest[3]);
11091
11092 /**
11093 * reuse challange data as salt_buf, its the buffer that is most likely unique
11094 */
11095
11096 salt->salt_buf[0] = 0;
11097 salt->salt_buf[1] = 0;
11098 salt->salt_buf[2] = 0;
11099 salt->salt_buf[3] = 0;
11100 salt->salt_buf[4] = 0;
11101 salt->salt_buf[5] = 0;
11102 salt->salt_buf[6] = 0;
11103 salt->salt_buf[7] = 0;
11104
11105 uint *uptr;
11106
11107 uptr = (uint *) netntlm->userdomain_buf;
11108
11109 for (uint i = 0; i < 16; i += 16)
11110 {
11111 md5_64 (uptr, salt->salt_buf);
11112 }
11113
11114 uptr = (uint *) netntlm->chall_buf;
11115
11116 for (uint i = 0; i < 256; i += 16)
11117 {
11118 md5_64 (uptr, salt->salt_buf);
11119 }
11120
11121 salt->salt_len = 16;
11122
11123 return (PARSER_OK);
11124 }
11125
11126 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11127 {
11128 if (data.opts_type & OPTS_TYPE_ST_HEX)
11129 {
11130 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11131 }
11132 else
11133 {
11134 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11135 }
11136
11137 u32 *digest = (u32 *) hash_buf->digest;
11138
11139 salt_t *salt = hash_buf->salt;
11140
11141 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11142 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11143 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11144 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11145
11146 digest[0] = byte_swap_32 (digest[0]);
11147 digest[1] = byte_swap_32 (digest[1]);
11148 digest[2] = byte_swap_32 (digest[2]);
11149 digest[3] = byte_swap_32 (digest[3]);
11150
11151 digest[0] -= MD5M_A;
11152 digest[1] -= MD5M_B;
11153 digest[2] -= MD5M_C;
11154 digest[3] -= MD5M_D;
11155
11156 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11157
11158 uint salt_len = input_len - 32 - 1;
11159
11160 char *salt_buf = input_buf + 32 + 1;
11161
11162 char *salt_buf_ptr = (char *) salt->salt_buf;
11163
11164 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11165
11166 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11167
11168 salt->salt_len = salt_len;
11169
11170 return (PARSER_OK);
11171 }
11172
11173 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11174 {
11175 if (data.opts_type & OPTS_TYPE_ST_HEX)
11176 {
11177 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11178 }
11179 else
11180 {
11181 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11182 }
11183
11184 u32 *digest = (u32 *) hash_buf->digest;
11185
11186 salt_t *salt = hash_buf->salt;
11187
11188 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11189 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11190 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11191 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11192
11193 digest[0] = byte_swap_32 (digest[0]);
11194 digest[1] = byte_swap_32 (digest[1]);
11195 digest[2] = byte_swap_32 (digest[2]);
11196 digest[3] = byte_swap_32 (digest[3]);
11197
11198 digest[0] -= MD5M_A;
11199 digest[1] -= MD5M_B;
11200 digest[2] -= MD5M_C;
11201 digest[3] -= MD5M_D;
11202
11203 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11204
11205 uint salt_len = input_len - 32 - 1;
11206
11207 char *salt_buf = input_buf + 32 + 1;
11208
11209 char *salt_buf_ptr = (char *) salt->salt_buf;
11210
11211 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11212
11213 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11214
11215 salt->salt_len = salt_len;
11216
11217 return (PARSER_OK);
11218 }
11219
11220 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11221 {
11222 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11223
11224 u32 *digest = (u32 *) hash_buf->digest;
11225
11226 salt_t *salt = hash_buf->salt;
11227
11228 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11229 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11230 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11231 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11232
11233 digest[0] = byte_swap_32 (digest[0]);
11234 digest[1] = byte_swap_32 (digest[1]);
11235 digest[2] = byte_swap_32 (digest[2]);
11236 digest[3] = byte_swap_32 (digest[3]);
11237
11238 digest[0] -= MD5M_A;
11239 digest[1] -= MD5M_B;
11240 digest[2] -= MD5M_C;
11241 digest[3] -= MD5M_D;
11242
11243 /**
11244 * This is a virtual salt. While the algorithm is basically not salted
11245 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11246 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11247 */
11248
11249 char *salt_buf_ptr = (char *) salt->salt_buf;
11250
11251 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11252
11253 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11254
11255 salt->salt_len = salt_len;
11256
11257 return (PARSER_OK);
11258 }
11259
11260 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11261 {
11262 if (data.opts_type & OPTS_TYPE_ST_HEX)
11263 {
11264 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11265 }
11266 else
11267 {
11268 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11269 }
11270
11271 u32 *digest = (u32 *) hash_buf->digest;
11272
11273 salt_t *salt = hash_buf->salt;
11274
11275 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11276 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11277 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11278 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11279
11280 digest[0] = byte_swap_32 (digest[0]);
11281 digest[1] = byte_swap_32 (digest[1]);
11282 digest[2] = byte_swap_32 (digest[2]);
11283 digest[3] = byte_swap_32 (digest[3]);
11284
11285 digest[0] -= MD5M_A;
11286 digest[1] -= MD5M_B;
11287 digest[2] -= MD5M_C;
11288 digest[3] -= MD5M_D;
11289
11290 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11291
11292 uint salt_len = input_len - 32 - 1;
11293
11294 char *salt_buf = input_buf + 32 + 1;
11295
11296 char *salt_buf_ptr = (char *) salt->salt_buf;
11297
11298 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11299
11300 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11301
11302 salt->salt_len = salt_len;
11303
11304 return (PARSER_OK);
11305 }
11306
11307 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11308 {
11309 if (data.opts_type & OPTS_TYPE_ST_HEX)
11310 {
11311 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11312 }
11313 else
11314 {
11315 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11316 }
11317
11318 u32 *digest = (u32 *) hash_buf->digest;
11319
11320 salt_t *salt = hash_buf->salt;
11321
11322 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11323 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11324 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11325 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11326
11327 digest[0] = byte_swap_32 (digest[0]);
11328 digest[1] = byte_swap_32 (digest[1]);
11329 digest[2] = byte_swap_32 (digest[2]);
11330 digest[3] = byte_swap_32 (digest[3]);
11331
11332 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11333
11334 uint salt_len = input_len - 32 - 1;
11335
11336 char *salt_buf = input_buf + 32 + 1;
11337
11338 char *salt_buf_ptr = (char *) salt->salt_buf;
11339
11340 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11341
11342 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11343
11344 salt->salt_len = salt_len;
11345
11346 return (PARSER_OK);
11347 }
11348
11349 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11350 {
11351 if (data.opts_type & OPTS_TYPE_ST_HEX)
11352 {
11353 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11354 }
11355 else
11356 {
11357 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11358 }
11359
11360 u32 *digest = (u32 *) hash_buf->digest;
11361
11362 salt_t *salt = hash_buf->salt;
11363
11364 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11365 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11366 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11367 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11368
11369 digest[0] = byte_swap_32 (digest[0]);
11370 digest[1] = byte_swap_32 (digest[1]);
11371 digest[2] = byte_swap_32 (digest[2]);
11372 digest[3] = byte_swap_32 (digest[3]);
11373
11374 digest[0] -= MD4M_A;
11375 digest[1] -= MD4M_B;
11376 digest[2] -= MD4M_C;
11377 digest[3] -= MD4M_D;
11378
11379 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11380
11381 uint salt_len = input_len - 32 - 1;
11382
11383 char *salt_buf = input_buf + 32 + 1;
11384
11385 char *salt_buf_ptr = (char *) salt->salt_buf;
11386
11387 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11388
11389 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11390
11391 salt->salt_len = salt_len;
11392
11393 return (PARSER_OK);
11394 }
11395
11396 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11397 {
11398 if (data.opts_type & OPTS_TYPE_ST_HEX)
11399 {
11400 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11401 }
11402 else
11403 {
11404 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11405 }
11406
11407 u32 *digest = (u32 *) hash_buf->digest;
11408
11409 salt_t *salt = hash_buf->salt;
11410
11411 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11412 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11413 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11414 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11415
11416 digest[0] = byte_swap_32 (digest[0]);
11417 digest[1] = byte_swap_32 (digest[1]);
11418 digest[2] = byte_swap_32 (digest[2]);
11419 digest[3] = byte_swap_32 (digest[3]);
11420
11421 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11422
11423 uint salt_len = input_len - 32 - 1;
11424
11425 char *salt_buf = input_buf + 32 + 1;
11426
11427 uint salt_pc_block[16] = { 0 };
11428
11429 char *salt_pc_block_ptr = (char *) salt_pc_block;
11430
11431 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11432
11433 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11434
11435 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11436
11437 salt_pc_block[14] = salt_len * 8;
11438
11439 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11440
11441 md5_64 (salt_pc_block, salt_pc_digest);
11442
11443 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11444 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11445 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11446 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11447
11448 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11449
11450 memcpy (salt_buf_ptr, salt_buf, salt_len);
11451
11452 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11453
11454 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11455 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11456 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11457 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11458
11459 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11460
11461 return (PARSER_OK);
11462 }
11463
11464 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11465 {
11466 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11467
11468 u32 *digest = (u32 *) hash_buf->digest;
11469
11470 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11471 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11472 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11473 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11474 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11475
11476 digest[0] -= SHA1M_A;
11477 digest[1] -= SHA1M_B;
11478 digest[2] -= SHA1M_C;
11479 digest[3] -= SHA1M_D;
11480 digest[4] -= SHA1M_E;
11481
11482 return (PARSER_OK);
11483 }
11484
11485 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11486 {
11487 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11488
11489 u32 *digest = (u32 *) hash_buf->digest;
11490
11491 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11492 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11493 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11494 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11495 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11496
11497 return (PARSER_OK);
11498 }
11499
11500 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11501 {
11502 if (data.opts_type & OPTS_TYPE_ST_HEX)
11503 {
11504 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11505 }
11506 else
11507 {
11508 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11509 }
11510
11511 u32 *digest = (u32 *) hash_buf->digest;
11512
11513 salt_t *salt = hash_buf->salt;
11514
11515 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11516 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11517 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11518 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11519 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11520
11521 digest[0] -= SHA1M_A;
11522 digest[1] -= SHA1M_B;
11523 digest[2] -= SHA1M_C;
11524 digest[3] -= SHA1M_D;
11525 digest[4] -= SHA1M_E;
11526
11527 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11528
11529 uint salt_len = input_len - 40 - 1;
11530
11531 char *salt_buf = input_buf + 40 + 1;
11532
11533 char *salt_buf_ptr = (char *) salt->salt_buf;
11534
11535 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11536
11537 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11538
11539 salt->salt_len = salt_len;
11540
11541 return (PARSER_OK);
11542 }
11543
11544 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11545 {
11546 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11547
11548 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11549
11550 u32 *digest = (u32 *) hash_buf->digest;
11551
11552 u8 tmp_buf[100] = { 0 };
11553
11554 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11555
11556 memcpy (digest, tmp_buf, 20);
11557
11558 digest[0] = byte_swap_32 (digest[0]);
11559 digest[1] = byte_swap_32 (digest[1]);
11560 digest[2] = byte_swap_32 (digest[2]);
11561 digest[3] = byte_swap_32 (digest[3]);
11562 digest[4] = byte_swap_32 (digest[4]);
11563
11564 digest[0] -= SHA1M_A;
11565 digest[1] -= SHA1M_B;
11566 digest[2] -= SHA1M_C;
11567 digest[3] -= SHA1M_D;
11568 digest[4] -= SHA1M_E;
11569
11570 return (PARSER_OK);
11571 }
11572
11573 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11574 {
11575 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11576
11577 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11578
11579 u32 *digest = (u32 *) hash_buf->digest;
11580
11581 salt_t *salt = hash_buf->salt;
11582
11583 u8 tmp_buf[100] = { 0 };
11584
11585 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11586
11587 memcpy (digest, tmp_buf, 20);
11588
11589 salt->salt_len = tmp_len - 20;
11590
11591 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11592
11593 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11594 {
11595 char *ptr = (char *) salt->salt_buf;
11596
11597 ptr[salt->salt_len] = 0x80;
11598 }
11599
11600 digest[0] = byte_swap_32 (digest[0]);
11601 digest[1] = byte_swap_32 (digest[1]);
11602 digest[2] = byte_swap_32 (digest[2]);
11603 digest[3] = byte_swap_32 (digest[3]);
11604 digest[4] = byte_swap_32 (digest[4]);
11605
11606 digest[0] -= SHA1M_A;
11607 digest[1] -= SHA1M_B;
11608 digest[2] -= SHA1M_C;
11609 digest[3] -= SHA1M_D;
11610 digest[4] -= SHA1M_E;
11611
11612 return (PARSER_OK);
11613 }
11614
11615 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11616 {
11617 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11618
11619 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11620
11621 u32 *digest = (u32 *) hash_buf->digest;
11622
11623 salt_t *salt = hash_buf->salt;
11624
11625 char *salt_buf = input_buf + 6;
11626
11627 uint salt_len = 8;
11628
11629 char *salt_buf_ptr = (char *) salt->salt_buf;
11630
11631 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11632
11633 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11634
11635 salt->salt_len = salt_len;
11636
11637 char *hash_pos = input_buf + 6 + 8 + 40;
11638
11639 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11640 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11641 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11642 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11643 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11644
11645 digest[0] -= SHA1M_A;
11646 digest[1] -= SHA1M_B;
11647 digest[2] -= SHA1M_C;
11648 digest[3] -= SHA1M_D;
11649 digest[4] -= SHA1M_E;
11650
11651 return (PARSER_OK);
11652 }
11653
11654 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11655 {
11656 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11657
11658 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11659
11660 u32 *digest = (u32 *) hash_buf->digest;
11661
11662 salt_t *salt = hash_buf->salt;
11663
11664 char *salt_buf = input_buf + 6;
11665
11666 uint salt_len = 8;
11667
11668 char *salt_buf_ptr = (char *) salt->salt_buf;
11669
11670 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11671
11672 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11673
11674 salt->salt_len = salt_len;
11675
11676 char *hash_pos = input_buf + 6 + 8;
11677
11678 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11679 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11680 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11681 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11682 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11683
11684 digest[0] -= SHA1M_A;
11685 digest[1] -= SHA1M_B;
11686 digest[2] -= SHA1M_C;
11687 digest[3] -= SHA1M_D;
11688 digest[4] -= SHA1M_E;
11689
11690 return (PARSER_OK);
11691 }
11692
11693 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11694 {
11695 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11696
11697 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11698
11699 u64 *digest = (u64 *) hash_buf->digest;
11700
11701 salt_t *salt = hash_buf->salt;
11702
11703 char *salt_buf = input_buf + 6;
11704
11705 uint salt_len = 8;
11706
11707 char *salt_buf_ptr = (char *) salt->salt_buf;
11708
11709 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11710
11711 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11712
11713 salt->salt_len = salt_len;
11714
11715 char *hash_pos = input_buf + 6 + 8;
11716
11717 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11718 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11719 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11720 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11721 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11722 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11723 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11724 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11725
11726 digest[0] -= SHA512M_A;
11727 digest[1] -= SHA512M_B;
11728 digest[2] -= SHA512M_C;
11729 digest[3] -= SHA512M_D;
11730 digest[4] -= SHA512M_E;
11731 digest[5] -= SHA512M_F;
11732 digest[6] -= SHA512M_G;
11733 digest[7] -= SHA512M_H;
11734
11735 return (PARSER_OK);
11736 }
11737
11738 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11739 {
11740 if (data.opts_type & OPTS_TYPE_ST_HEX)
11741 {
11742 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11743 }
11744 else
11745 {
11746 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11747 }
11748
11749 u32 *digest = (u32 *) hash_buf->digest;
11750
11751 salt_t *salt = hash_buf->salt;
11752
11753 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11754 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11755 digest[2] = 0;
11756 digest[3] = 0;
11757
11758 digest[0] = byte_swap_32 (digest[0]);
11759 digest[1] = byte_swap_32 (digest[1]);
11760
11761 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11762
11763 uint salt_len = input_len - 16 - 1;
11764
11765 char *salt_buf = input_buf + 16 + 1;
11766
11767 char *salt_buf_ptr = (char *) salt->salt_buf;
11768
11769 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11770
11771 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11772
11773 salt->salt_len = salt_len;
11774
11775 return (PARSER_OK);
11776 }
11777
11778 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11779 {
11780 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11781
11782 u32 *digest = (u32 *) hash_buf->digest;
11783
11784 salt_t *salt = hash_buf->salt;
11785
11786 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11787 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11788 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11789 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11790 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11791
11792 digest[0] -= SHA1M_A;
11793 digest[1] -= SHA1M_B;
11794 digest[2] -= SHA1M_C;
11795 digest[3] -= SHA1M_D;
11796 digest[4] -= SHA1M_E;
11797
11798 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11799
11800 uint salt_len = input_len - 40 - 1;
11801
11802 char *salt_buf = input_buf + 40 + 1;
11803
11804 char *salt_buf_ptr = (char *) salt->salt_buf;
11805
11806 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11807
11808 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11809
11810 salt->salt_len = salt_len;
11811
11812 return (PARSER_OK);
11813 }
11814
11815 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11816 {
11817 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11818
11819 u32 *digest = (u32 *) hash_buf->digest;
11820
11821 salt_t *salt = hash_buf->salt;
11822
11823 char *hash_pos = input_buf;
11824
11825 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11826 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11827 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11828 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11829 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
11830 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
11831 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
11832 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
11833 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
11834 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
11835 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
11836 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
11837 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
11838 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
11839 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
11840 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
11841
11842 char *salt_pos = input_buf + 128;
11843
11844 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
11845 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
11846 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
11847 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
11848
11849 salt->salt_iter = ROUNDS_ORACLET - 1;
11850 salt->salt_len = 16;
11851
11852 return (PARSER_OK);
11853 }
11854
11855 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11856 {
11857 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11858
11859 u32 *digest = (u32 *) hash_buf->digest;
11860
11861 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11862 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11863 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11864 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11865 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11866 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11867 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11868 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11869
11870 digest[0] -= SHA256M_A;
11871 digest[1] -= SHA256M_B;
11872 digest[2] -= SHA256M_C;
11873 digest[3] -= SHA256M_D;
11874 digest[4] -= SHA256M_E;
11875 digest[5] -= SHA256M_F;
11876 digest[6] -= SHA256M_G;
11877 digest[7] -= SHA256M_H;
11878
11879 return (PARSER_OK);
11880 }
11881
11882 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11883 {
11884 if (data.opts_type & OPTS_TYPE_ST_HEX)
11885 {
11886 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11887 }
11888 else
11889 {
11890 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11891 }
11892
11893 u32 *digest = (u32 *) hash_buf->digest;
11894
11895 salt_t *salt = hash_buf->salt;
11896
11897 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11898 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11899 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11900 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11901 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11902 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11903 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11904 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11905
11906 digest[0] -= SHA256M_A;
11907 digest[1] -= SHA256M_B;
11908 digest[2] -= SHA256M_C;
11909 digest[3] -= SHA256M_D;
11910 digest[4] -= SHA256M_E;
11911 digest[5] -= SHA256M_F;
11912 digest[6] -= SHA256M_G;
11913 digest[7] -= SHA256M_H;
11914
11915 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11916
11917 uint salt_len = input_len - 64 - 1;
11918
11919 char *salt_buf = input_buf + 64 + 1;
11920
11921 char *salt_buf_ptr = (char *) salt->salt_buf;
11922
11923 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11924
11925 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11926
11927 salt->salt_len = salt_len;
11928
11929 return (PARSER_OK);
11930 }
11931
11932 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11933 {
11934 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11935
11936 u64 *digest = (u64 *) hash_buf->digest;
11937
11938 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11939 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11940 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11941 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11942 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11943 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11944 digest[6] = 0;
11945 digest[7] = 0;
11946
11947 digest[0] -= SHA384M_A;
11948 digest[1] -= SHA384M_B;
11949 digest[2] -= SHA384M_C;
11950 digest[3] -= SHA384M_D;
11951 digest[4] -= SHA384M_E;
11952 digest[5] -= SHA384M_F;
11953 digest[6] -= 0;
11954 digest[7] -= 0;
11955
11956 return (PARSER_OK);
11957 }
11958
11959 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11960 {
11961 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11962
11963 u64 *digest = (u64 *) hash_buf->digest;
11964
11965 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11966 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11967 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11968 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11969 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11970 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11971 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11972 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11973
11974 digest[0] -= SHA512M_A;
11975 digest[1] -= SHA512M_B;
11976 digest[2] -= SHA512M_C;
11977 digest[3] -= SHA512M_D;
11978 digest[4] -= SHA512M_E;
11979 digest[5] -= SHA512M_F;
11980 digest[6] -= SHA512M_G;
11981 digest[7] -= SHA512M_H;
11982
11983 return (PARSER_OK);
11984 }
11985
11986 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11987 {
11988 if (data.opts_type & OPTS_TYPE_ST_HEX)
11989 {
11990 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11991 }
11992 else
11993 {
11994 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11995 }
11996
11997 u64 *digest = (u64 *) hash_buf->digest;
11998
11999 salt_t *salt = hash_buf->salt;
12000
12001 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12002 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12003 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12004 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12005 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12006 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12007 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12008 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12009
12010 digest[0] -= SHA512M_A;
12011 digest[1] -= SHA512M_B;
12012 digest[2] -= SHA512M_C;
12013 digest[3] -= SHA512M_D;
12014 digest[4] -= SHA512M_E;
12015 digest[5] -= SHA512M_F;
12016 digest[6] -= SHA512M_G;
12017 digest[7] -= SHA512M_H;
12018
12019 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12020
12021 uint salt_len = input_len - 128 - 1;
12022
12023 char *salt_buf = input_buf + 128 + 1;
12024
12025 char *salt_buf_ptr = (char *) salt->salt_buf;
12026
12027 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12028
12029 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12030
12031 salt->salt_len = salt_len;
12032
12033 return (PARSER_OK);
12034 }
12035
12036 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12037 {
12038 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12039
12040 u64 *digest = (u64 *) hash_buf->digest;
12041
12042 salt_t *salt = hash_buf->salt;
12043
12044 char *salt_pos = input_buf + 3;
12045
12046 uint iterations_len = 0;
12047
12048 if (memcmp (salt_pos, "rounds=", 7) == 0)
12049 {
12050 salt_pos += 7;
12051
12052 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12053
12054 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12055 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12056
12057 salt_pos[0] = 0x0;
12058
12059 salt->salt_iter = atoi (salt_pos - iterations_len);
12060
12061 salt_pos += 1;
12062
12063 iterations_len += 8;
12064 }
12065 else
12066 {
12067 salt->salt_iter = ROUNDS_SHA512CRYPT;
12068 }
12069
12070 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12071
12072 char *hash_pos = strchr (salt_pos, '$');
12073
12074 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12075
12076 uint salt_len = hash_pos - salt_pos;
12077
12078 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12079
12080 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12081
12082 salt->salt_len = salt_len;
12083
12084 hash_pos++;
12085
12086 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12087
12088 return (PARSER_OK);
12089 }
12090
12091 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12092 {
12093 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12094
12095 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12096
12097 u64 *digest = (u64 *) hash_buf->digest;
12098
12099 salt_t *salt = hash_buf->salt;
12100
12101 uint keccak_mdlen = input_len / 2;
12102
12103 for (uint i = 0; i < keccak_mdlen / 8; i++)
12104 {
12105 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12106
12107 digest[i] = byte_swap_64 (digest[i]);
12108 }
12109
12110 salt->keccak_mdlen = keccak_mdlen;
12111
12112 return (PARSER_OK);
12113 }
12114
12115 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12116 {
12117 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12118
12119 u32 *digest = (u32 *) hash_buf->digest;
12120
12121 salt_t *salt = hash_buf->salt;
12122
12123 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12124
12125 /**
12126 * Parse that strange long line
12127 */
12128
12129 char *in_off[9];
12130
12131 size_t in_len[9] = { 0 };
12132
12133 in_off[0] = strtok (input_buf, ":");
12134
12135 in_len[0] = strlen (in_off[0]);
12136
12137 size_t i;
12138
12139 for (i = 1; i < 9; i++)
12140 {
12141 in_off[i] = strtok (NULL, ":");
12142
12143 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12144
12145 in_len[i] = strlen (in_off[i]);
12146 }
12147
12148 char *ptr = (char *) ikepsk->msg_buf;
12149
12150 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12151 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12152 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12153 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12154 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12155 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12156
12157 *ptr = 0x80;
12158
12159 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12160
12161 ptr = (char *) ikepsk->nr_buf;
12162
12163 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12164 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12165
12166 *ptr = 0x80;
12167
12168 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12169
12170 /**
12171 * Store to database
12172 */
12173
12174 ptr = in_off[8];
12175
12176 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12177 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12178 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12179 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12180
12181 digest[0] = byte_swap_32 (digest[0]);
12182 digest[1] = byte_swap_32 (digest[1]);
12183 digest[2] = byte_swap_32 (digest[2]);
12184 digest[3] = byte_swap_32 (digest[3]);
12185
12186 salt->salt_len = 32;
12187
12188 salt->salt_buf[0] = ikepsk->nr_buf[0];
12189 salt->salt_buf[1] = ikepsk->nr_buf[1];
12190 salt->salt_buf[2] = ikepsk->nr_buf[2];
12191 salt->salt_buf[3] = ikepsk->nr_buf[3];
12192 salt->salt_buf[4] = ikepsk->nr_buf[4];
12193 salt->salt_buf[5] = ikepsk->nr_buf[5];
12194 salt->salt_buf[6] = ikepsk->nr_buf[6];
12195 salt->salt_buf[7] = ikepsk->nr_buf[7];
12196
12197 return (PARSER_OK);
12198 }
12199
12200 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12201 {
12202 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12203
12204 u32 *digest = (u32 *) hash_buf->digest;
12205
12206 salt_t *salt = hash_buf->salt;
12207
12208 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12209
12210 /**
12211 * Parse that strange long line
12212 */
12213
12214 char *in_off[9];
12215
12216 size_t in_len[9] = { 0 };
12217
12218 in_off[0] = strtok (input_buf, ":");
12219
12220 in_len[0] = strlen (in_off[0]);
12221
12222 size_t i;
12223
12224 for (i = 1; i < 9; i++)
12225 {
12226 in_off[i] = strtok (NULL, ":");
12227
12228 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12229
12230 in_len[i] = strlen (in_off[i]);
12231 }
12232
12233 char *ptr = (char *) ikepsk->msg_buf;
12234
12235 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12236 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12237 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12238 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12239 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12240 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12241
12242 *ptr = 0x80;
12243
12244 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12245
12246 ptr = (char *) ikepsk->nr_buf;
12247
12248 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12249 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12250
12251 *ptr = 0x80;
12252
12253 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12254
12255 /**
12256 * Store to database
12257 */
12258
12259 ptr = in_off[8];
12260
12261 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12262 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12263 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12264 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12265 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12266
12267 salt->salt_len = 32;
12268
12269 salt->salt_buf[0] = ikepsk->nr_buf[0];
12270 salt->salt_buf[1] = ikepsk->nr_buf[1];
12271 salt->salt_buf[2] = ikepsk->nr_buf[2];
12272 salt->salt_buf[3] = ikepsk->nr_buf[3];
12273 salt->salt_buf[4] = ikepsk->nr_buf[4];
12274 salt->salt_buf[5] = ikepsk->nr_buf[5];
12275 salt->salt_buf[6] = ikepsk->nr_buf[6];
12276 salt->salt_buf[7] = ikepsk->nr_buf[7];
12277
12278 return (PARSER_OK);
12279 }
12280
12281 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12282 {
12283 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12284
12285 u32 *digest = (u32 *) hash_buf->digest;
12286
12287 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12288 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12289 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12290 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12291 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12292
12293 digest[0] = byte_swap_32 (digest[0]);
12294 digest[1] = byte_swap_32 (digest[1]);
12295 digest[2] = byte_swap_32 (digest[2]);
12296 digest[3] = byte_swap_32 (digest[3]);
12297 digest[4] = byte_swap_32 (digest[4]);
12298
12299 return (PARSER_OK);
12300 }
12301
12302 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12303 {
12304 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12305
12306 u32 *digest = (u32 *) hash_buf->digest;
12307
12308 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12309 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12310 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12311 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12312 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12313 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12314 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12315 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12316 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12317 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12318 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12319 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12320 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12321 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12322 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12323 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12324
12325 return (PARSER_OK);
12326 }
12327
12328 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12329 {
12330 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12331
12332 u32 *digest = (u32 *) hash_buf->digest;
12333
12334 salt_t *salt = hash_buf->salt;
12335
12336 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12337 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12338 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12339 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12340 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12341
12342 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12343
12344 uint salt_len = input_len - 40 - 1;
12345
12346 char *salt_buf = input_buf + 40 + 1;
12347
12348 char *salt_buf_ptr = (char *) salt->salt_buf;
12349
12350 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12351
12352 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12353
12354 salt->salt_len = salt_len;
12355
12356 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12357
12358 return (PARSER_OK);
12359 }
12360
12361 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12362 {
12363 u32 *digest = (u32 *) hash_buf->digest;
12364
12365 salt_t *salt = hash_buf->salt;
12366
12367 tc_t *tc = (tc_t *) hash_buf->esalt;
12368
12369 if (input_len == 0)
12370 {
12371 log_error ("TrueCrypt container not specified");
12372
12373 exit (-1);
12374 }
12375
12376 FILE *fp = fopen (input_buf, "rb");
12377
12378 if (fp == NULL)
12379 {
12380 log_error ("%s: %s", input_buf, strerror (errno));
12381
12382 exit (-1);
12383 }
12384
12385 char buf[512] = { 0 };
12386
12387 int n = fread (buf, 1, sizeof (buf), fp);
12388
12389 fclose (fp);
12390
12391 if (n != 512) return (PARSER_TC_FILE_SIZE);
12392
12393 memcpy (tc->salt_buf, buf, 64);
12394
12395 memcpy (tc->data_buf, buf + 64, 512 - 64);
12396
12397 salt->salt_buf[0] = tc->salt_buf[0];
12398
12399 salt->salt_len = 4;
12400
12401 salt->salt_iter = 1000 - 1;
12402
12403 digest[0] = tc->data_buf[0];
12404
12405 return (PARSER_OK);
12406 }
12407
12408 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12409 {
12410 u32 *digest = (u32 *) hash_buf->digest;
12411
12412 salt_t *salt = hash_buf->salt;
12413
12414 tc_t *tc = (tc_t *) hash_buf->esalt;
12415
12416 if (input_len == 0)
12417 {
12418 log_error ("TrueCrypt container not specified");
12419
12420 exit (-1);
12421 }
12422
12423 FILE *fp = fopen (input_buf, "rb");
12424
12425 if (fp == NULL)
12426 {
12427 log_error ("%s: %s", input_buf, strerror (errno));
12428
12429 exit (-1);
12430 }
12431
12432 char buf[512] = { 0 };
12433
12434 int n = fread (buf, 1, sizeof (buf), fp);
12435
12436 fclose (fp);
12437
12438 if (n != 512) return (PARSER_TC_FILE_SIZE);
12439
12440 memcpy (tc->salt_buf, buf, 64);
12441
12442 memcpy (tc->data_buf, buf + 64, 512 - 64);
12443
12444 salt->salt_buf[0] = tc->salt_buf[0];
12445
12446 salt->salt_len = 4;
12447
12448 salt->salt_iter = 2000 - 1;
12449
12450 digest[0] = tc->data_buf[0];
12451
12452 return (PARSER_OK);
12453 }
12454
12455 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12456 {
12457 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12458
12459 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12460
12461 u32 *digest = (u32 *) hash_buf->digest;
12462
12463 salt_t *salt = hash_buf->salt;
12464
12465 char *salt_pos = input_buf + 6;
12466
12467 char *hash_pos = strchr (salt_pos, '$');
12468
12469 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12470
12471 uint salt_len = hash_pos - salt_pos;
12472
12473 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12474
12475 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12476
12477 salt->salt_len = salt_len;
12478
12479 salt->salt_iter = 1000;
12480
12481 hash_pos++;
12482
12483 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12484
12485 return (PARSER_OK);
12486 }
12487
12488 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12489 {
12490 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12491
12492 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12493
12494 u32 *digest = (u32 *) hash_buf->digest;
12495
12496 salt_t *salt = hash_buf->salt;
12497
12498 char *iter_pos = input_buf + 7;
12499
12500 char *salt_pos = strchr (iter_pos, '$');
12501
12502 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12503
12504 salt_pos++;
12505
12506 char *hash_pos = strchr (salt_pos, '$');
12507
12508 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12509
12510 uint salt_len = hash_pos - salt_pos;
12511
12512 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12513
12514 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12515
12516 salt->salt_len = salt_len;
12517
12518 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12519
12520 salt->salt_sign[0] = atoi (salt_iter);
12521
12522 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12523
12524 hash_pos++;
12525
12526 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12527
12528 digest[0] = byte_swap_32 (digest[0]);
12529 digest[1] = byte_swap_32 (digest[1]);
12530 digest[2] = byte_swap_32 (digest[2]);
12531 digest[3] = byte_swap_32 (digest[3]);
12532 digest[4] = byte_swap_32 (digest[4]);
12533
12534 return (PARSER_OK);
12535 }
12536
12537 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12538 {
12539 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12540
12541 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12542
12543 u32 *digest = (u32 *) hash_buf->digest;
12544
12545 salt_t *salt = hash_buf->salt;
12546
12547 char *iter_pos = input_buf + 9;
12548
12549 char *salt_pos = strchr (iter_pos, '$');
12550
12551 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12552
12553 salt_pos++;
12554
12555 char *hash_pos = strchr (salt_pos, '$');
12556
12557 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12558
12559 uint salt_len = hash_pos - salt_pos;
12560
12561 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12562
12563 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12564
12565 salt->salt_len = salt_len;
12566
12567 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12568
12569 salt->salt_sign[0] = atoi (salt_iter);
12570
12571 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12572
12573 hash_pos++;
12574
12575 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12576
12577 digest[0] = byte_swap_32 (digest[0]);
12578 digest[1] = byte_swap_32 (digest[1]);
12579 digest[2] = byte_swap_32 (digest[2]);
12580 digest[3] = byte_swap_32 (digest[3]);
12581 digest[4] = byte_swap_32 (digest[4]);
12582 digest[5] = byte_swap_32 (digest[5]);
12583 digest[6] = byte_swap_32 (digest[6]);
12584 digest[7] = byte_swap_32 (digest[7]);
12585
12586 return (PARSER_OK);
12587 }
12588
12589 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12590 {
12591 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12592
12593 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12594
12595 u64 *digest = (u64 *) hash_buf->digest;
12596
12597 salt_t *salt = hash_buf->salt;
12598
12599 char *iter_pos = input_buf + 9;
12600
12601 char *salt_pos = strchr (iter_pos, '$');
12602
12603 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12604
12605 salt_pos++;
12606
12607 char *hash_pos = strchr (salt_pos, '$');
12608
12609 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12610
12611 uint salt_len = hash_pos - salt_pos;
12612
12613 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12614
12615 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12616
12617 salt->salt_len = salt_len;
12618
12619 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12620
12621 salt->salt_sign[0] = atoi (salt_iter);
12622
12623 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12624
12625 hash_pos++;
12626
12627 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12628
12629 digest[0] = byte_swap_64 (digest[0]);
12630 digest[1] = byte_swap_64 (digest[1]);
12631 digest[2] = byte_swap_64 (digest[2]);
12632 digest[3] = byte_swap_64 (digest[3]);
12633 digest[4] = byte_swap_64 (digest[4]);
12634 digest[5] = byte_swap_64 (digest[5]);
12635 digest[6] = byte_swap_64 (digest[6]);
12636 digest[7] = byte_swap_64 (digest[7]);
12637
12638 return (PARSER_OK);
12639 }
12640
12641 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12642 {
12643 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12644
12645 u32 *digest = (u32 *) hash_buf->digest;
12646
12647 salt_t *salt = hash_buf->salt;
12648
12649 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12650
12651 /**
12652 * parse line
12653 */
12654
12655 char *iterations_pos = input_buf;
12656
12657 char *saltbuf_pos = strchr (iterations_pos, ':');
12658
12659 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12660
12661 uint iterations_len = saltbuf_pos - iterations_pos;
12662
12663 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12664
12665 saltbuf_pos++;
12666
12667 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12668
12669 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12670
12671 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12672
12673 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12674
12675 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12676
12677 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12678
12679 cipherbuf_pos++;
12680
12681 /**
12682 * pbkdf2 iterations
12683 */
12684
12685 salt->salt_iter = atoi (iterations_pos) - 1;
12686
12687 /**
12688 * handle salt encoding
12689 */
12690
12691 char *saltbuf_ptr = (char *) salt->salt_buf;
12692
12693 for (uint i = 0; i < saltbuf_len; i += 2)
12694 {
12695 const char p0 = saltbuf_pos[i + 0];
12696 const char p1 = saltbuf_pos[i + 1];
12697
12698 *saltbuf_ptr++ = hex_convert (p1) << 0
12699 | hex_convert (p0) << 4;
12700 }
12701
12702 salt->salt_len = saltbuf_len / 2;
12703
12704 /**
12705 * handle cipher encoding
12706 */
12707
12708 uint *tmp = (uint *) mymalloc (32);
12709
12710 char *cipherbuf_ptr = (char *) tmp;
12711
12712 for (uint i = 2016; i < cipherbuf_len; i += 2)
12713 {
12714 const char p0 = cipherbuf_pos[i + 0];
12715 const char p1 = cipherbuf_pos[i + 1];
12716
12717 *cipherbuf_ptr++ = hex_convert (p1) << 0
12718 | hex_convert (p0) << 4;
12719 }
12720
12721 // iv is stored at salt_buf 4 (length 16)
12722 // data is stored at salt_buf 8 (length 16)
12723
12724 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12725 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12726 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12727 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12728
12729 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12730 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12731 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12732 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12733
12734 free (tmp);
12735
12736 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12737 {
12738 const char p0 = cipherbuf_pos[j + 0];
12739 const char p1 = cipherbuf_pos[j + 1];
12740
12741 agilekey->cipher[i] = hex_convert (p1) << 0
12742 | hex_convert (p0) << 4;
12743 }
12744
12745 /**
12746 * digest buf
12747 */
12748
12749 digest[0] = 0x10101010;
12750 digest[1] = 0x10101010;
12751 digest[2] = 0x10101010;
12752 digest[3] = 0x10101010;
12753
12754 return (PARSER_OK);
12755 }
12756
12757 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12758 {
12759 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12760
12761 u32 *digest = (u32 *) hash_buf->digest;
12762
12763 salt_t *salt = hash_buf->salt;
12764
12765 char *hashbuf_pos = input_buf;
12766
12767 char *iterations_pos = strchr (hashbuf_pos, ':');
12768
12769 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12770
12771 uint hash_len = iterations_pos - hashbuf_pos;
12772
12773 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12774
12775 iterations_pos++;
12776
12777 char *saltbuf_pos = strchr (iterations_pos, ':');
12778
12779 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12780
12781 uint iterations_len = saltbuf_pos - iterations_pos;
12782
12783 saltbuf_pos++;
12784
12785 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12786
12787 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12788
12789 char *salt_buf_ptr = (char *) salt->salt_buf;
12790
12791 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12792
12793 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12794
12795 salt->salt_len = salt_len;
12796
12797 salt->salt_iter = atoi (iterations_pos) - 1;
12798
12799 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12800 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12801 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12802 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12803
12804 return (PARSER_OK);
12805 }
12806
12807 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12808 {
12809 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12810
12811 u32 *digest = (u32 *) hash_buf->digest;
12812
12813 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12814 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12815 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12816 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12817 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12818 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12819 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12820 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12821
12822 digest[0] = byte_swap_32 (digest[0]);
12823 digest[1] = byte_swap_32 (digest[1]);
12824 digest[2] = byte_swap_32 (digest[2]);
12825 digest[3] = byte_swap_32 (digest[3]);
12826 digest[4] = byte_swap_32 (digest[4]);
12827 digest[5] = byte_swap_32 (digest[5]);
12828 digest[6] = byte_swap_32 (digest[6]);
12829 digest[7] = byte_swap_32 (digest[7]);
12830
12831 return (PARSER_OK);
12832 }
12833
12834 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12835 {
12836 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12837
12838 u32 *digest = (u32 *) hash_buf->digest;
12839
12840 salt_t *salt = hash_buf->salt;
12841
12842 char *salt_pos = input_buf + 3;
12843
12844 uint iterations_len = 0;
12845
12846 if (memcmp (salt_pos, "rounds=", 7) == 0)
12847 {
12848 salt_pos += 7;
12849
12850 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12851
12852 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12853 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12854
12855 salt_pos[0] = 0x0;
12856
12857 salt->salt_iter = atoi (salt_pos - iterations_len);
12858
12859 salt_pos += 1;
12860
12861 iterations_len += 8;
12862 }
12863 else
12864 {
12865 salt->salt_iter = ROUNDS_SHA256CRYPT;
12866 }
12867
12868 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12869
12870 char *hash_pos = strchr (salt_pos, '$');
12871
12872 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12873
12874 uint salt_len = hash_pos - salt_pos;
12875
12876 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12877
12878 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12879
12880 salt->salt_len = salt_len;
12881
12882 hash_pos++;
12883
12884 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12885
12886 return (PARSER_OK);
12887 }
12888
12889 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12890 {
12891 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12892
12893 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12894
12895 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12896
12897 u64 *digest = (u64 *) hash_buf->digest;
12898
12899 salt_t *salt = hash_buf->salt;
12900
12901 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12902
12903 char *iter_pos = input_buf + 4;
12904
12905 char *salt_pos = strchr (iter_pos, '$');
12906
12907 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12908
12909 salt_pos++;
12910
12911 char *hash_pos = strchr (salt_pos, '$');
12912
12913 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12914
12915 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12916
12917 hash_pos++;
12918
12919 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12920 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12921 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12922 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12923 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12924 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12925 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12926 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12927
12928 uint salt_len = hash_pos - salt_pos - 1;
12929
12930 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12931
12932 salt->salt_len = salt_len / 2;
12933
12934 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12935 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12936 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12937 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12938 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
12939 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
12940 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
12941 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
12942
12943 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12944 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12945 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12946 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12947 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12948 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12949 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12950 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12951 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12952 pbkdf2_sha512->salt_buf[9] = 0x80;
12953
12954 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12955
12956 salt->salt_iter = atoi (iter_pos) - 1;
12957
12958 return (PARSER_OK);
12959 }
12960
12961 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12962 {
12963 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12964
12965 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12966
12967 u32 *digest = (u32 *) hash_buf->digest;
12968
12969 salt_t *salt = hash_buf->salt;
12970
12971 char *salt_pos = input_buf + 14;
12972
12973 char *hash_pos = strchr (salt_pos, '*');
12974
12975 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12976
12977 hash_pos++;
12978
12979 uint salt_len = hash_pos - salt_pos - 1;
12980
12981 char *salt_buf_ptr = (char *) salt->salt_buf;
12982
12983 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12984
12985 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12986
12987 salt->salt_len = salt_len;
12988
12989 u8 tmp_buf[100] = { 0 };
12990
12991 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
12992
12993 memcpy (digest, tmp_buf, 32);
12994
12995 digest[0] = byte_swap_32 (digest[0]);
12996 digest[1] = byte_swap_32 (digest[1]);
12997 digest[2] = byte_swap_32 (digest[2]);
12998 digest[3] = byte_swap_32 (digest[3]);
12999 digest[4] = byte_swap_32 (digest[4]);
13000 digest[5] = byte_swap_32 (digest[5]);
13001 digest[6] = byte_swap_32 (digest[6]);
13002 digest[7] = byte_swap_32 (digest[7]);
13003
13004 digest[0] -= SHA256M_A;
13005 digest[1] -= SHA256M_B;
13006 digest[2] -= SHA256M_C;
13007 digest[3] -= SHA256M_D;
13008 digest[4] -= SHA256M_E;
13009 digest[5] -= SHA256M_F;
13010 digest[6] -= SHA256M_G;
13011 digest[7] -= SHA256M_H;
13012
13013 return (PARSER_OK);
13014 }
13015
13016 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13017 {
13018 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13019
13020 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13021
13022 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13023
13024 u64 *digest = (u64 *) hash_buf->digest;
13025
13026 salt_t *salt = hash_buf->salt;
13027
13028 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13029
13030 char *iter_pos = input_buf + 19;
13031
13032 char *salt_pos = strchr (iter_pos, '.');
13033
13034 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13035
13036 salt_pos++;
13037
13038 char *hash_pos = strchr (salt_pos, '.');
13039
13040 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13041
13042 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13043
13044 hash_pos++;
13045
13046 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13047 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13048 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13049 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13050 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13051 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13052 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13053 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13054
13055 uint salt_len = hash_pos - salt_pos - 1;
13056
13057 salt_len /= 2;
13058
13059 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13060
13061 uint i;
13062
13063 for (i = 0; i < salt_len; i++)
13064 {
13065 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13066 }
13067
13068 salt_buf_ptr[salt_len + 3] = 0x01;
13069 salt_buf_ptr[salt_len + 4] = 0x80;
13070
13071 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13072
13073 salt->salt_len = salt_len;
13074
13075 salt->salt_iter = atoi (iter_pos) - 1;
13076
13077 return (PARSER_OK);
13078 }
13079
13080 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13081 {
13082 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13083
13084 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13085
13086 u64 *digest = (u64 *) hash_buf->digest;
13087
13088 salt_t *salt = hash_buf->salt;
13089
13090 u8 tmp_buf[120] = { 0 };
13091
13092 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13093
13094 memcpy (digest, tmp_buf, 64);
13095
13096 digest[0] = byte_swap_64 (digest[0]);
13097 digest[1] = byte_swap_64 (digest[1]);
13098 digest[2] = byte_swap_64 (digest[2]);
13099 digest[3] = byte_swap_64 (digest[3]);
13100 digest[4] = byte_swap_64 (digest[4]);
13101 digest[5] = byte_swap_64 (digest[5]);
13102 digest[6] = byte_swap_64 (digest[6]);
13103 digest[7] = byte_swap_64 (digest[7]);
13104
13105 digest[0] -= SHA512M_A;
13106 digest[1] -= SHA512M_B;
13107 digest[2] -= SHA512M_C;
13108 digest[3] -= SHA512M_D;
13109 digest[4] -= SHA512M_E;
13110 digest[5] -= SHA512M_F;
13111 digest[6] -= SHA512M_G;
13112 digest[7] -= SHA512M_H;
13113
13114 salt->salt_len = tmp_len - 64;
13115
13116 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13117
13118 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13119 {
13120 char *ptr = (char *) salt->salt_buf;
13121
13122 ptr[salt->salt_len] = 0x80;
13123 }
13124
13125 return (PARSER_OK);
13126 }
13127
13128 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13129 {
13130 if (data.opts_type & OPTS_TYPE_ST_HEX)
13131 {
13132 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13133 }
13134 else
13135 {
13136 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13137 }
13138
13139 u32 *digest = (u32 *) hash_buf->digest;
13140
13141 salt_t *salt = hash_buf->salt;
13142
13143 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13144 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13145 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13146 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13147
13148 digest[0] = byte_swap_32 (digest[0]);
13149 digest[1] = byte_swap_32 (digest[1]);
13150 digest[2] = byte_swap_32 (digest[2]);
13151 digest[3] = byte_swap_32 (digest[3]);
13152
13153 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13154
13155 uint salt_len = input_len - 32 - 1;
13156
13157 char *salt_buf = input_buf + 32 + 1;
13158
13159 char *salt_buf_ptr = (char *) salt->salt_buf;
13160
13161 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13162
13163 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13164
13165 salt->salt_len = salt_len;
13166
13167 return (PARSER_OK);
13168 }
13169
13170 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13171 {
13172 if (data.opts_type & OPTS_TYPE_ST_HEX)
13173 {
13174 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13175 }
13176 else
13177 {
13178 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13179 }
13180
13181 u32 *digest = (u32 *) hash_buf->digest;
13182
13183 salt_t *salt = hash_buf->salt;
13184
13185 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13186 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13187 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13188 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13189 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13190
13191 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13192
13193 uint salt_len = input_len - 40 - 1;
13194
13195 char *salt_buf = input_buf + 40 + 1;
13196
13197 char *salt_buf_ptr = (char *) salt->salt_buf;
13198
13199 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13200
13201 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13202
13203 salt->salt_len = salt_len;
13204
13205 return (PARSER_OK);
13206 }
13207
13208 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13209 {
13210 if (data.opts_type & OPTS_TYPE_ST_HEX)
13211 {
13212 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13213 }
13214 else
13215 {
13216 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13217 }
13218
13219 u32 *digest = (u32 *) hash_buf->digest;
13220
13221 salt_t *salt = hash_buf->salt;
13222
13223 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13224 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13225 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13226 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13227 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13228 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13229 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13230 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13231
13232 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13233
13234 uint salt_len = input_len - 64 - 1;
13235
13236 char *salt_buf = input_buf + 64 + 1;
13237
13238 char *salt_buf_ptr = (char *) salt->salt_buf;
13239
13240 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13241
13242 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13243
13244 salt->salt_len = salt_len;
13245
13246 return (PARSER_OK);
13247 }
13248
13249 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13250 {
13251 if (data.opts_type & OPTS_TYPE_ST_HEX)
13252 {
13253 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13254 }
13255 else
13256 {
13257 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13258 }
13259
13260 u64 *digest = (u64 *) hash_buf->digest;
13261
13262 salt_t *salt = hash_buf->salt;
13263
13264 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13265 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13266 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13267 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13268 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13269 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13270 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13271 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13272
13273 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13274
13275 uint salt_len = input_len - 128 - 1;
13276
13277 char *salt_buf = input_buf + 128 + 1;
13278
13279 char *salt_buf_ptr = (char *) salt->salt_buf;
13280
13281 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13282
13283 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13284
13285 salt->salt_len = salt_len;
13286
13287 return (PARSER_OK);
13288 }
13289
13290 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13291 {
13292 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13293
13294 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13295
13296 u32 *digest = (u32 *) hash_buf->digest;
13297
13298 salt_t *salt = hash_buf->salt;
13299
13300 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13301
13302 /**
13303 * parse line
13304 */
13305
13306 char *user_pos = input_buf + 10 + 1;
13307
13308 char *realm_pos = strchr (user_pos, '$');
13309
13310 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13311
13312 uint user_len = realm_pos - user_pos;
13313
13314 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13315
13316 realm_pos++;
13317
13318 char *salt_pos = strchr (realm_pos, '$');
13319
13320 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13321
13322 uint realm_len = salt_pos - realm_pos;
13323
13324 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13325
13326 salt_pos++;
13327
13328 char *data_pos = strchr (salt_pos, '$');
13329
13330 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13331
13332 uint salt_len = data_pos - salt_pos;
13333
13334 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13335
13336 data_pos++;
13337
13338 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13339
13340 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13341
13342 /**
13343 * copy data
13344 */
13345
13346 memcpy (krb5pa->user, user_pos, user_len);
13347 memcpy (krb5pa->realm, realm_pos, realm_len);
13348 memcpy (krb5pa->salt, salt_pos, salt_len);
13349
13350 char *timestamp_ptr = (char *) krb5pa->timestamp;
13351
13352 for (uint i = 0; i < (36 * 2); i += 2)
13353 {
13354 const char p0 = data_pos[i + 0];
13355 const char p1 = data_pos[i + 1];
13356
13357 *timestamp_ptr++ = hex_convert (p1) << 0
13358 | hex_convert (p0) << 4;
13359 }
13360
13361 char *checksum_ptr = (char *) krb5pa->checksum;
13362
13363 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13364 {
13365 const char p0 = data_pos[i + 0];
13366 const char p1 = data_pos[i + 1];
13367
13368 *checksum_ptr++ = hex_convert (p1) << 0
13369 | hex_convert (p0) << 4;
13370 }
13371
13372 /**
13373 * copy some data to generic buffers to make sorting happy
13374 */
13375
13376 salt->salt_buf[0] = krb5pa->timestamp[0];
13377 salt->salt_buf[1] = krb5pa->timestamp[1];
13378 salt->salt_buf[2] = krb5pa->timestamp[2];
13379 salt->salt_buf[3] = krb5pa->timestamp[3];
13380 salt->salt_buf[4] = krb5pa->timestamp[4];
13381 salt->salt_buf[5] = krb5pa->timestamp[5];
13382 salt->salt_buf[6] = krb5pa->timestamp[6];
13383 salt->salt_buf[7] = krb5pa->timestamp[7];
13384 salt->salt_buf[8] = krb5pa->timestamp[8];
13385
13386 salt->salt_len = 36;
13387
13388 digest[0] = krb5pa->checksum[0];
13389 digest[1] = krb5pa->checksum[1];
13390 digest[2] = krb5pa->checksum[2];
13391 digest[3] = krb5pa->checksum[3];
13392
13393 return (PARSER_OK);
13394 }
13395
13396 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13397 {
13398 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13399
13400 u32 *digest = (u32 *) hash_buf->digest;
13401
13402 salt_t *salt = hash_buf->salt;
13403
13404 /**
13405 * parse line
13406 */
13407
13408 char *salt_pos = input_buf;
13409
13410 char *hash_pos = strchr (salt_pos, '$');
13411
13412 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13413
13414 uint salt_len = hash_pos - salt_pos;
13415
13416 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13417
13418 hash_pos++;
13419
13420 uint hash_len = input_len - 1 - salt_len;
13421
13422 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13423
13424 /**
13425 * valid some data
13426 */
13427
13428 uint user_len = 0;
13429
13430 for (uint i = 0; i < salt_len; i++)
13431 {
13432 if (salt_pos[i] == ' ') continue;
13433
13434 user_len++;
13435 }
13436
13437 // SAP user names cannot be longer than 12 characters
13438 if (user_len > 12) return (PARSER_SALT_LENGTH);
13439
13440 // SAP user name cannot start with ! or ?
13441 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13442
13443 /**
13444 * copy data
13445 */
13446
13447 char *salt_buf_ptr = (char *) salt->salt_buf;
13448
13449 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13450
13451 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13452
13453 salt->salt_len = salt_len;
13454
13455 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13456 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13457 digest[2] = 0;
13458 digest[3] = 0;
13459
13460 digest[0] = byte_swap_32 (digest[0]);
13461 digest[1] = byte_swap_32 (digest[1]);
13462
13463 return (PARSER_OK);
13464 }
13465
13466 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13467 {
13468 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13469
13470 u32 *digest = (u32 *) hash_buf->digest;
13471
13472 salt_t *salt = hash_buf->salt;
13473
13474 /**
13475 * parse line
13476 */
13477
13478 char *salt_pos = input_buf;
13479
13480 char *hash_pos = strchr (salt_pos, '$');
13481
13482 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13483
13484 uint salt_len = hash_pos - salt_pos;
13485
13486 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13487
13488 hash_pos++;
13489
13490 uint hash_len = input_len - 1 - salt_len;
13491
13492 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13493
13494 /**
13495 * valid some data
13496 */
13497
13498 uint user_len = 0;
13499
13500 for (uint i = 0; i < salt_len; i++)
13501 {
13502 if (salt_pos[i] == ' ') continue;
13503
13504 user_len++;
13505 }
13506
13507 // SAP user names cannot be longer than 12 characters
13508 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13509 // so far nobody complained so we stay with this because it helps in optimization
13510 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13511
13512 if (user_len > 12) return (PARSER_SALT_LENGTH);
13513
13514 // SAP user name cannot start with ! or ?
13515 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13516
13517 /**
13518 * copy data
13519 */
13520
13521 char *salt_buf_ptr = (char *) salt->salt_buf;
13522
13523 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13524
13525 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13526
13527 salt->salt_len = salt_len;
13528
13529 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13530 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13531 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13532 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13533 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13534
13535 return (PARSER_OK);
13536 }
13537
13538 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13539 {
13540 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13541
13542 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13543
13544 u64 *digest = (u64 *) hash_buf->digest;
13545
13546 salt_t *salt = hash_buf->salt;
13547
13548 char *iter_pos = input_buf + 3;
13549
13550 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13551
13552 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13553
13554 memcpy ((char *) salt->salt_sign, input_buf, 4);
13555
13556 salt->salt_iter = salt_iter;
13557
13558 char *salt_pos = iter_pos + 1;
13559
13560 uint salt_len = 8;
13561
13562 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13563
13564 salt->salt_len = salt_len;
13565
13566 char *hash_pos = salt_pos + salt_len;
13567
13568 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13569
13570 // ugly hack start
13571
13572 char *tmp = (char *) salt->salt_buf_pc;
13573
13574 tmp[0] = hash_pos[42];
13575
13576 // ugly hack end
13577
13578 digest[ 0] = byte_swap_64 (digest[ 0]);
13579 digest[ 1] = byte_swap_64 (digest[ 1]);
13580 digest[ 2] = byte_swap_64 (digest[ 2]);
13581 digest[ 3] = byte_swap_64 (digest[ 3]);
13582 digest[ 4] = 0;
13583 digest[ 5] = 0;
13584 digest[ 6] = 0;
13585 digest[ 7] = 0;
13586
13587 return (PARSER_OK);
13588 }
13589
13590 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13591 {
13592 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13593
13594 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13595
13596 u32 *digest = (u32 *) hash_buf->digest;
13597
13598 salt_t *salt = hash_buf->salt;
13599
13600 char *salt_buf = input_buf + 6;
13601
13602 uint salt_len = 16;
13603
13604 char *salt_buf_ptr = (char *) salt->salt_buf;
13605
13606 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13607
13608 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13609
13610 salt->salt_len = salt_len;
13611
13612 char *hash_pos = input_buf + 6 + 16;
13613
13614 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13615 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13616 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13617 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13618 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13619 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13620 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13621 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13622
13623 return (PARSER_OK);
13624 }
13625
13626 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13627 {
13628 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13629
13630 u32 *digest = (u32 *) hash_buf->digest;
13631
13632 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13633 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13634 digest[2] = 0;
13635 digest[3] = 0;
13636
13637 return (PARSER_OK);
13638 }
13639
13640 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13641 {
13642 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13643
13644 u32 *digest = (u32 *) hash_buf->digest;
13645
13646 salt_t *salt = hash_buf->salt;
13647
13648 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13649
13650 char *saltbuf_pos = input_buf;
13651
13652 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13653
13654 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13655
13656 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13657
13658 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13659 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13660
13661 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13662
13663 hashbuf_pos++;
13664
13665 uint hashbuf_len = input_len - saltbuf_len - 1;
13666
13667 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13668
13669 char *salt_ptr = (char *) saltbuf_pos;
13670 char *rakp_ptr = (char *) rakp->salt_buf;
13671
13672 uint i;
13673 uint j;
13674
13675 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13676 {
13677 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13678 }
13679
13680 rakp_ptr[j] = 0x80;
13681
13682 rakp->salt_len = j;
13683
13684 for (i = 0; i < 64; i++)
13685 {
13686 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13687 }
13688
13689 salt->salt_buf[0] = rakp->salt_buf[0];
13690 salt->salt_buf[1] = rakp->salt_buf[1];
13691 salt->salt_buf[2] = rakp->salt_buf[2];
13692 salt->salt_buf[3] = rakp->salt_buf[3];
13693 salt->salt_buf[4] = rakp->salt_buf[4];
13694 salt->salt_buf[5] = rakp->salt_buf[5];
13695 salt->salt_buf[6] = rakp->salt_buf[6];
13696 salt->salt_buf[7] = rakp->salt_buf[7];
13697
13698 salt->salt_len = 32; // muss min. 32 haben
13699
13700 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13701 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13702 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13703 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13704 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13705
13706 return (PARSER_OK);
13707 }
13708
13709 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13710 {
13711 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13712
13713 u32 *digest = (u32 *) hash_buf->digest;
13714
13715 salt_t *salt = hash_buf->salt;
13716
13717 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13718
13719 char *salt_pos = input_buf + 1;
13720
13721 memcpy (salt->salt_buf, salt_pos, 8);
13722
13723 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13724 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13725
13726 salt->salt_len = 8;
13727
13728 char *hash_pos = salt_pos + 8;
13729
13730 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13731 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13732 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13733 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13734 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13735
13736 digest[0] -= SHA1M_A;
13737 digest[1] -= SHA1M_B;
13738 digest[2] -= SHA1M_C;
13739 digest[3] -= SHA1M_D;
13740 digest[4] -= SHA1M_E;
13741
13742 return (PARSER_OK);
13743 }
13744
13745 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13746 {
13747 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13748
13749 u32 *digest = (u32 *) hash_buf->digest;
13750
13751 salt_t *salt = hash_buf->salt;
13752
13753 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13754 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13755 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13756 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13757
13758 digest[0] = byte_swap_32 (digest[0]);
13759 digest[1] = byte_swap_32 (digest[1]);
13760 digest[2] = byte_swap_32 (digest[2]);
13761 digest[3] = byte_swap_32 (digest[3]);
13762
13763 digest[0] -= MD5M_A;
13764 digest[1] -= MD5M_B;
13765 digest[2] -= MD5M_C;
13766 digest[3] -= MD5M_D;
13767
13768 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13769
13770 char *salt_buf_ptr = input_buf + 32 + 1;
13771
13772 u32 *salt_buf = salt->salt_buf;
13773
13774 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13775 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13776 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13777 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13778
13779 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13780 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13781 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13782 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13783
13784 salt->salt_len = 16 + 1;
13785
13786 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13787
13788 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13789
13790 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13791
13792 return (PARSER_OK);
13793 }
13794
13795 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13796 {
13797 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13798
13799 u32 *digest = (u32 *) hash_buf->digest;
13800
13801 salt_t *salt = hash_buf->salt;
13802
13803 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13804
13805 /**
13806 * parse line
13807 */
13808
13809 char *hashbuf_pos = input_buf;
13810
13811 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13812
13813 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13814
13815 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13816
13817 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13818
13819 saltbuf_pos++;
13820
13821 char *iteration_pos = strchr (saltbuf_pos, ':');
13822
13823 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13824
13825 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13826
13827 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13828
13829 iteration_pos++;
13830
13831 char *databuf_pos = strchr (iteration_pos, ':');
13832
13833 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13834
13835 const uint iteration_len = databuf_pos - iteration_pos;
13836
13837 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13838 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13839
13840 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13841
13842 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13843 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13844
13845 databuf_pos++;
13846
13847 // digest
13848
13849 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13850 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13851 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13852 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13853 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13854 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
13855 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
13856 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
13857
13858 // salt
13859
13860 char *saltbuf_ptr = (char *) salt->salt_buf;
13861
13862 for (uint i = 0; i < saltbuf_len; i += 2)
13863 {
13864 const char p0 = saltbuf_pos[i + 0];
13865 const char p1 = saltbuf_pos[i + 1];
13866
13867 *saltbuf_ptr++ = hex_convert (p1) << 0
13868 | hex_convert (p0) << 4;
13869 }
13870
13871 salt->salt_buf[4] = 0x01000000;
13872 salt->salt_buf[5] = 0x80;
13873
13874 salt->salt_len = saltbuf_len / 2;
13875
13876 // iteration
13877
13878 salt->salt_iter = atoi (iteration_pos) - 1;
13879
13880 // data
13881
13882 char *databuf_ptr = (char *) cloudkey->data_buf;
13883
13884 for (uint i = 0; i < databuf_len; i += 2)
13885 {
13886 const char p0 = databuf_pos[i + 0];
13887 const char p1 = databuf_pos[i + 1];
13888
13889 *databuf_ptr++ = hex_convert (p1) << 0
13890 | hex_convert (p0) << 4;
13891 }
13892
13893 *databuf_ptr++ = 0x80;
13894
13895 for (uint i = 0; i < 512; i++)
13896 {
13897 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13898 }
13899
13900 cloudkey->data_len = databuf_len / 2;
13901
13902 return (PARSER_OK);
13903 }
13904
13905 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13906 {
13907 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13908
13909 u32 *digest = (u32 *) hash_buf->digest;
13910
13911 salt_t *salt = hash_buf->salt;
13912
13913 /**
13914 * parse line
13915 */
13916
13917 char *hashbuf_pos = input_buf;
13918
13919 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13920
13921 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13922
13923 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13924
13925 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13926
13927 domainbuf_pos++;
13928
13929 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13930
13931 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13932
13933 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13934
13935 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13936
13937 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13938
13939 saltbuf_pos++;
13940
13941 char *iteration_pos = strchr (saltbuf_pos, ':');
13942
13943 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13944
13945 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13946
13947 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13948
13949 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13950
13951 iteration_pos++;
13952
13953 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13954
13955 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13956 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13957
13958 // ok, the plan for this algorithm is the following:
13959 // we have 2 salts here, the domain-name and a random salt
13960 // while both are used in the initial transformation,
13961 // only the random salt is used in the following iterations
13962 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13963 // and one that includes only the real salt (stored into salt_buf[]).
13964 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13965
13966 u8 tmp_buf[100] = { 0 };
13967
13968 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
13969
13970 memcpy (digest, tmp_buf, 20);
13971
13972 digest[0] = byte_swap_32 (digest[0]);
13973 digest[1] = byte_swap_32 (digest[1]);
13974 digest[2] = byte_swap_32 (digest[2]);
13975 digest[3] = byte_swap_32 (digest[3]);
13976 digest[4] = byte_swap_32 (digest[4]);
13977
13978 // domain
13979
13980 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13981
13982 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13983
13984 char *len_ptr = NULL;
13985
13986 for (uint i = 0; i < domainbuf_len; i++)
13987 {
13988 if (salt_buf_pc_ptr[i] == '.')
13989 {
13990 len_ptr = &salt_buf_pc_ptr[i];
13991
13992 *len_ptr = 0;
13993 }
13994 else
13995 {
13996 *len_ptr += 1;
13997 }
13998 }
13999
14000 salt->salt_buf_pc[7] = domainbuf_len;
14001
14002 // "real" salt
14003
14004 char *salt_buf_ptr = (char *) salt->salt_buf;
14005
14006 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14007
14008 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14009
14010 salt->salt_len = salt_len;
14011
14012 // iteration
14013
14014 salt->salt_iter = atoi (iteration_pos);
14015
14016 return (PARSER_OK);
14017 }
14018
14019 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14020 {
14021 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14022
14023 u32 *digest = (u32 *) hash_buf->digest;
14024
14025 salt_t *salt = hash_buf->salt;
14026
14027 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14028 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14029 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14030 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14031 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14032
14033 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14034
14035 uint salt_len = input_len - 40 - 1;
14036
14037 char *salt_buf = input_buf + 40 + 1;
14038
14039 char *salt_buf_ptr = (char *) salt->salt_buf;
14040
14041 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14042
14043 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14044
14045 salt->salt_len = salt_len;
14046
14047 return (PARSER_OK);
14048 }
14049
14050 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14051 {
14052 const u8 ascii_to_ebcdic[] =
14053 {
14054 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14055 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14056 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14057 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14058 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14059 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14060 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14061 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14062 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14063 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14064 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14065 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14066 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14067 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14068 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14069 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14070 };
14071
14072 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14073
14074 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14075
14076 u32 *digest = (u32 *) hash_buf->digest;
14077
14078 salt_t *salt = hash_buf->salt;
14079
14080 char *salt_pos = input_buf + 6 + 1;
14081
14082 char *digest_pos = strchr (salt_pos, '*');
14083
14084 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14085
14086 uint salt_len = digest_pos - salt_pos;
14087
14088 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14089
14090 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14091
14092 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14093
14094 digest_pos++;
14095
14096 char *salt_buf_ptr = (char *) salt->salt_buf;
14097 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14098
14099 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14100
14101 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14102
14103 salt->salt_len = salt_len;
14104
14105 for (uint i = 0; i < salt_len; i++)
14106 {
14107 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14108 }
14109 for (uint i = salt_len; i < 8; i++)
14110 {
14111 salt_buf_pc_ptr[i] = 0x40;
14112 }
14113
14114 uint tt;
14115
14116 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14117
14118 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14119 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14120
14121 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14122 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14123
14124 digest[0] = byte_swap_32 (digest[0]);
14125 digest[1] = byte_swap_32 (digest[1]);
14126
14127 IP (digest[0], digest[1], tt);
14128
14129 digest[0] = rotr32 (digest[0], 29);
14130 digest[1] = rotr32 (digest[1], 29);
14131 digest[2] = 0;
14132 digest[3] = 0;
14133
14134 return (PARSER_OK);
14135 }
14136
14137 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14138 {
14139 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14140
14141 u32 *digest = (u32 *) hash_buf->digest;
14142
14143 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14144 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14145 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14146 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14147
14148 digest[0] = byte_swap_32 (digest[0]);
14149 digest[1] = byte_swap_32 (digest[1]);
14150 digest[2] = byte_swap_32 (digest[2]);
14151 digest[3] = byte_swap_32 (digest[3]);
14152
14153 return (PARSER_OK);
14154 }
14155
14156 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14157 {
14158 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14159
14160 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14161
14162 u32 *digest = (u32 *) hash_buf->digest;
14163
14164 salt_t *salt = hash_buf->salt;
14165
14166 u8 tmp_buf[120] = { 0 };
14167
14168 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14169
14170 tmp_buf[3] += -4; // dont ask!
14171
14172 memcpy (salt->salt_buf, tmp_buf, 5);
14173
14174 salt->salt_len = 5;
14175
14176 memcpy (digest, tmp_buf + 5, 9);
14177
14178 // yes, only 9 byte are needed to crack, but 10 to display
14179
14180 salt->salt_buf_pc[7] = input_buf[20];
14181
14182 return (PARSER_OK);
14183 }
14184
14185 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14186 {
14187 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14188
14189 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) 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] = { 0 };
14196
14197 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14198
14199 tmp_buf[3] += -4; // dont ask!
14200
14201 // salt
14202
14203 memcpy (salt->salt_buf, tmp_buf, 16);
14204
14205 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)
14206
14207 // iteration
14208
14209 char tmp_iter_buf[11] = { 0 };
14210
14211 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14212
14213 tmp_iter_buf[10] = 0;
14214
14215 salt->salt_iter = atoi (tmp_iter_buf);
14216
14217 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14218 {
14219 return (PARSER_SALT_ITERATION);
14220 }
14221
14222 salt->salt_iter--; // first round in init
14223
14224 // 2 additional bytes for display only
14225
14226 salt->salt_buf_pc[0] = tmp_buf[26];
14227 salt->salt_buf_pc[1] = tmp_buf[27];
14228
14229 // digest
14230
14231 memcpy (digest, tmp_buf + 28, 8);
14232
14233 digest[0] = byte_swap_32 (digest[0]);
14234 digest[1] = byte_swap_32 (digest[1]);
14235 digest[2] = 0;
14236 digest[3] = 0;
14237
14238 return (PARSER_OK);
14239 }
14240
14241 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14242 {
14243 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14244
14245 u32 *digest = (u32 *) hash_buf->digest;
14246
14247 salt_t *salt = hash_buf->salt;
14248
14249 char *salt_buf_pos = input_buf;
14250
14251 char *hash_buf_pos = salt_buf_pos + 6;
14252
14253 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14254 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14255 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14256 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14257 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14258 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14259 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14260 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14261
14262 digest[0] -= SHA256M_A;
14263 digest[1] -= SHA256M_B;
14264 digest[2] -= SHA256M_C;
14265 digest[3] -= SHA256M_D;
14266 digest[4] -= SHA256M_E;
14267 digest[5] -= SHA256M_F;
14268 digest[6] -= SHA256M_G;
14269 digest[7] -= SHA256M_H;
14270
14271 char *salt_buf_ptr = (char *) salt->salt_buf;
14272
14273 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14274
14275 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14276
14277 salt->salt_len = salt_len;
14278
14279 return (PARSER_OK);
14280 }
14281
14282 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14283 {
14284 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14285
14286 u32 *digest = (u32 *) hash_buf->digest;
14287
14288 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14289
14290 salt_t *salt = hash_buf->salt;
14291
14292 char *salt_buf = input_buf + 6;
14293
14294 char *digest_buf = strchr (salt_buf, '$');
14295
14296 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14297
14298 uint salt_len = digest_buf - salt_buf;
14299
14300 digest_buf++; // skip the '$' symbol
14301
14302 char *salt_buf_ptr = (char *) salt->salt_buf;
14303
14304 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14305
14306 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14307
14308 salt->salt_len = salt_len;
14309
14310 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14311 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14312 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14313 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14314
14315 digest[0] = byte_swap_32 (digest[0]);
14316 digest[1] = byte_swap_32 (digest[1]);
14317 digest[2] = byte_swap_32 (digest[2]);
14318 digest[3] = byte_swap_32 (digest[3]);
14319
14320 digest[0] -= MD5M_A;
14321 digest[1] -= MD5M_B;
14322 digest[2] -= MD5M_C;
14323 digest[3] -= MD5M_D;
14324
14325 return (PARSER_OK);
14326 }
14327
14328 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14329 {
14330 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14331
14332 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14333
14334 u32 *digest = (u32 *) hash_buf->digest;
14335
14336 salt_t *salt = hash_buf->salt;
14337
14338 char *salt_buf = input_buf + 3;
14339
14340 char *digest_buf = strchr (salt_buf, '$');
14341
14342 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14343
14344 uint salt_len = digest_buf - salt_buf;
14345
14346 digest_buf++; // skip the '$' symbol
14347
14348 char *salt_buf_ptr = (char *) salt->salt_buf;
14349
14350 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14351
14352 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14353
14354 salt_buf_ptr[salt_len] = 0x2d;
14355
14356 salt->salt_len = salt_len + 1;
14357
14358 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14359 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14360 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14361 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14362
14363 digest[0] = byte_swap_32 (digest[0]);
14364 digest[1] = byte_swap_32 (digest[1]);
14365 digest[2] = byte_swap_32 (digest[2]);
14366 digest[3] = byte_swap_32 (digest[3]);
14367
14368 digest[0] -= MD5M_A;
14369 digest[1] -= MD5M_B;
14370 digest[2] -= MD5M_C;
14371 digest[3] -= MD5M_D;
14372
14373 return (PARSER_OK);
14374 }
14375
14376 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14377 {
14378 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14379
14380 u32 *digest = (u32 *) hash_buf->digest;
14381
14382 u8 tmp_buf[100] = { 0 };
14383
14384 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14385
14386 memcpy (digest, tmp_buf, 20);
14387
14388 digest[0] = byte_swap_32 (digest[0]);
14389 digest[1] = byte_swap_32 (digest[1]);
14390 digest[2] = byte_swap_32 (digest[2]);
14391 digest[3] = byte_swap_32 (digest[3]);
14392 digest[4] = byte_swap_32 (digest[4]);
14393
14394 digest[0] -= SHA1M_A;
14395 digest[1] -= SHA1M_B;
14396 digest[2] -= SHA1M_C;
14397 digest[3] -= SHA1M_D;
14398 digest[4] -= SHA1M_E;
14399
14400 return (PARSER_OK);
14401 }
14402
14403 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14404 {
14405 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14406
14407 u32 *digest = (u32 *) hash_buf->digest;
14408
14409 salt_t *salt = hash_buf->salt;
14410
14411 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14412 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14413 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14414 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14415
14416 digest[0] = byte_swap_32 (digest[0]);
14417 digest[1] = byte_swap_32 (digest[1]);
14418 digest[2] = byte_swap_32 (digest[2]);
14419 digest[3] = byte_swap_32 (digest[3]);
14420
14421 digest[0] -= MD5M_A;
14422 digest[1] -= MD5M_B;
14423 digest[2] -= MD5M_C;
14424 digest[3] -= MD5M_D;
14425
14426 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14427
14428 uint salt_len = input_len - 32 - 1;
14429
14430 char *salt_buf = input_buf + 32 + 1;
14431
14432 char *salt_buf_ptr = (char *) salt->salt_buf;
14433
14434 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14435
14436 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14437
14438 /*
14439 * add static "salt" part
14440 */
14441
14442 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14443
14444 salt_len += 8;
14445
14446 salt->salt_len = salt_len;
14447
14448 return (PARSER_OK);
14449 }
14450
14451 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14452 {
14453 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14454
14455 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14456
14457 u32 *digest = (u32 *) hash_buf->digest;
14458
14459 salt_t *salt = hash_buf->salt;
14460
14461 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14462
14463 /**
14464 * parse line
14465 */
14466
14467 char *saltlen_pos = input_buf + 1 + 3 + 1;
14468
14469 char *saltbuf_pos = strchr (saltlen_pos, '$');
14470
14471 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14472
14473 uint saltlen_len = saltbuf_pos - saltlen_pos;
14474
14475 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14476
14477 saltbuf_pos++;
14478
14479 char *keylen_pos = strchr (saltbuf_pos, '$');
14480
14481 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14482
14483 uint saltbuf_len = keylen_pos - saltbuf_pos;
14484
14485 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14486
14487 keylen_pos++;
14488
14489 char *keybuf_pos = strchr (keylen_pos, '$');
14490
14491 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14492
14493 uint keylen_len = keybuf_pos - keylen_pos;
14494
14495 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14496
14497 keybuf_pos++;
14498
14499 char *databuf_pos = strchr (keybuf_pos, '$');
14500
14501 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14502
14503 uint keybuf_len = databuf_pos - keybuf_pos;
14504
14505 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14506
14507 databuf_pos++;
14508
14509 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14510
14511 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14512
14513 /**
14514 * copy data
14515 */
14516
14517 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14518 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14519 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14520 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14521
14522 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14523 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14524 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14525 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14526
14527 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14528 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14529 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14530 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14531
14532 salt->salt_len = 16;
14533 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14534
14535 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14536 {
14537 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14538 }
14539
14540 return (PARSER_OK);
14541 }
14542
14543 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14544 {
14545 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14546
14547 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14548
14549 u32 *digest = (u32 *) hash_buf->digest;
14550
14551 salt_t *salt = hash_buf->salt;
14552
14553 /**
14554 * parse line
14555 */
14556
14557 // first is the N salt parameter
14558
14559 char *N_pos = input_buf + 6;
14560
14561 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14562
14563 N_pos++;
14564
14565 salt->scrypt_N = atoi (N_pos);
14566
14567 // r
14568
14569 char *r_pos = strchr (N_pos, ':');
14570
14571 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14572
14573 r_pos++;
14574
14575 salt->scrypt_r = atoi (r_pos);
14576
14577 // p
14578
14579 char *p_pos = strchr (r_pos, ':');
14580
14581 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14582
14583 p_pos++;
14584
14585 salt->scrypt_p = atoi (p_pos);
14586
14587 // salt
14588
14589 char *saltbuf_pos = strchr (p_pos, ':');
14590
14591 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14592
14593 saltbuf_pos++;
14594
14595 char *hash_pos = strchr (saltbuf_pos, ':');
14596
14597 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14598
14599 hash_pos++;
14600
14601 // base64 decode
14602
14603 u8 tmp_buf[33] = { 0 };
14604
14605 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14606
14607 char *salt_buf_ptr = (char *) salt->salt_buf;
14608
14609 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14610
14611 salt->salt_len = tmp_len;
14612 salt->salt_iter = 1;
14613
14614 // digest - base64 decode
14615
14616 memset (tmp_buf, 0, sizeof (tmp_buf));
14617
14618 tmp_len = input_len - (hash_pos - input_buf);
14619
14620 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14621
14622 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14623
14624 memcpy (digest, tmp_buf, 32);
14625
14626 return (PARSER_OK);
14627 }
14628
14629 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14630 {
14631 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14632
14633 u32 *digest = (u32 *) hash_buf->digest;
14634
14635 salt_t *salt = hash_buf->salt;
14636
14637 /**
14638 * parse line
14639 */
14640
14641 char decrypted[76] = { 0 }; // iv + hash
14642
14643 juniper_decrypt_hash (input_buf, decrypted);
14644
14645 char *md5crypt_hash = decrypted + 12;
14646
14647 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14648
14649 salt->salt_iter = ROUNDS_MD5CRYPT;
14650
14651 char *salt_pos = md5crypt_hash + 3;
14652
14653 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14654
14655 salt->salt_len = hash_pos - salt_pos; // should be 8
14656
14657 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14658
14659 hash_pos++;
14660
14661 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14662
14663 return (PARSER_OK);
14664 }
14665
14666 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14667 {
14668 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14669
14670 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14671
14672 u32 *digest = (u32 *) hash_buf->digest;
14673
14674 salt_t *salt = hash_buf->salt;
14675
14676 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14677
14678 /**
14679 * parse line
14680 */
14681
14682 // first is *raw* salt
14683
14684 char *salt_pos = input_buf + 3;
14685
14686 char *hash_pos = strchr (salt_pos, '$');
14687
14688 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14689
14690 uint salt_len = hash_pos - salt_pos;
14691
14692 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14693
14694 hash_pos++;
14695
14696 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14697
14698 memcpy (salt_buf_ptr, salt_pos, 14);
14699
14700 salt_buf_ptr[17] = 0x01;
14701 salt_buf_ptr[18] = 0x80;
14702
14703 // add some stuff to normal salt to make sorted happy
14704
14705 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14706 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14707 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14708 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14709
14710 salt->salt_len = salt_len;
14711 salt->salt_iter = ROUNDS_CISCO8 - 1;
14712
14713 // base64 decode hash
14714
14715 u8 tmp_buf[100] = { 0 };
14716
14717 uint hash_len = input_len - 3 - salt_len - 1;
14718
14719 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14720
14721 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14722
14723 memcpy (digest, tmp_buf, 32);
14724
14725 digest[0] = byte_swap_32 (digest[0]);
14726 digest[1] = byte_swap_32 (digest[1]);
14727 digest[2] = byte_swap_32 (digest[2]);
14728 digest[3] = byte_swap_32 (digest[3]);
14729 digest[4] = byte_swap_32 (digest[4]);
14730 digest[5] = byte_swap_32 (digest[5]);
14731 digest[6] = byte_swap_32 (digest[6]);
14732 digest[7] = byte_swap_32 (digest[7]);
14733
14734 return (PARSER_OK);
14735 }
14736
14737 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14738 {
14739 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14740
14741 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14742
14743 u32 *digest = (u32 *) hash_buf->digest;
14744
14745 salt_t *salt = hash_buf->salt;
14746
14747 /**
14748 * parse line
14749 */
14750
14751 // first is *raw* salt
14752
14753 char *salt_pos = input_buf + 3;
14754
14755 char *hash_pos = strchr (salt_pos, '$');
14756
14757 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14758
14759 uint salt_len = hash_pos - salt_pos;
14760
14761 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14762
14763 salt->salt_len = salt_len;
14764 hash_pos++;
14765
14766 char *salt_buf_ptr = (char *) salt->salt_buf;
14767
14768 memcpy (salt_buf_ptr, salt_pos, salt_len);
14769 salt_buf_ptr[salt_len] = 0;
14770
14771 // base64 decode hash
14772
14773 u8 tmp_buf[100] = { 0 };
14774
14775 uint hash_len = input_len - 3 - salt_len - 1;
14776
14777 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14778
14779 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14780
14781 memcpy (digest, tmp_buf, 32);
14782
14783 // fixed:
14784 salt->scrypt_N = 16384;
14785 salt->scrypt_r = 1;
14786 salt->scrypt_p = 1;
14787 salt->salt_iter = 1;
14788
14789 return (PARSER_OK);
14790 }
14791
14792 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14793 {
14794 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14795
14796 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14797
14798 u32 *digest = (u32 *) hash_buf->digest;
14799
14800 salt_t *salt = hash_buf->salt;
14801
14802 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14803
14804 /**
14805 * parse line
14806 */
14807
14808 char *version_pos = input_buf + 8 + 1;
14809
14810 char *verifierHashSize_pos = strchr (version_pos, '*');
14811
14812 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14813
14814 u32 version_len = verifierHashSize_pos - version_pos;
14815
14816 if (version_len != 4) return (PARSER_SALT_LENGTH);
14817
14818 verifierHashSize_pos++;
14819
14820 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14821
14822 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14823
14824 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14825
14826 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14827
14828 keySize_pos++;
14829
14830 char *saltSize_pos = strchr (keySize_pos, '*');
14831
14832 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14833
14834 u32 keySize_len = saltSize_pos - keySize_pos;
14835
14836 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14837
14838 saltSize_pos++;
14839
14840 char *osalt_pos = strchr (saltSize_pos, '*');
14841
14842 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14843
14844 u32 saltSize_len = osalt_pos - saltSize_pos;
14845
14846 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14847
14848 osalt_pos++;
14849
14850 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14851
14852 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14853
14854 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14855
14856 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14857
14858 encryptedVerifier_pos++;
14859
14860 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14861
14862 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14863
14864 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14865
14866 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14867
14868 encryptedVerifierHash_pos++;
14869
14870 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;
14871
14872 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14873
14874 const uint version = atoi (version_pos);
14875
14876 if (version != 2007) return (PARSER_SALT_VALUE);
14877
14878 const uint verifierHashSize = atoi (verifierHashSize_pos);
14879
14880 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14881
14882 const uint keySize = atoi (keySize_pos);
14883
14884 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14885
14886 office2007->keySize = keySize;
14887
14888 const uint saltSize = atoi (saltSize_pos);
14889
14890 if (saltSize != 16) return (PARSER_SALT_VALUE);
14891
14892 /**
14893 * salt
14894 */
14895
14896 salt->salt_len = 16;
14897 salt->salt_iter = ROUNDS_OFFICE2007;
14898
14899 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14900 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14901 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14902 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14903
14904 /**
14905 * esalt
14906 */
14907
14908 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14909 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14910 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14911 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14912
14913 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14914 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14915 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14916 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14917 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14918
14919 /**
14920 * digest
14921 */
14922
14923 digest[0] = office2007->encryptedVerifierHash[0];
14924 digest[1] = office2007->encryptedVerifierHash[1];
14925 digest[2] = office2007->encryptedVerifierHash[2];
14926 digest[3] = office2007->encryptedVerifierHash[3];
14927
14928 return (PARSER_OK);
14929 }
14930
14931 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14932 {
14933 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14934
14935 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14936
14937 u32 *digest = (u32 *) hash_buf->digest;
14938
14939 salt_t *salt = hash_buf->salt;
14940
14941 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14942
14943 /**
14944 * parse line
14945 */
14946
14947 char *version_pos = input_buf + 8 + 1;
14948
14949 char *spinCount_pos = strchr (version_pos, '*');
14950
14951 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14952
14953 u32 version_len = spinCount_pos - version_pos;
14954
14955 if (version_len != 4) return (PARSER_SALT_LENGTH);
14956
14957 spinCount_pos++;
14958
14959 char *keySize_pos = strchr (spinCount_pos, '*');
14960
14961 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14962
14963 u32 spinCount_len = keySize_pos - spinCount_pos;
14964
14965 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14966
14967 keySize_pos++;
14968
14969 char *saltSize_pos = strchr (keySize_pos, '*');
14970
14971 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14972
14973 u32 keySize_len = saltSize_pos - keySize_pos;
14974
14975 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14976
14977 saltSize_pos++;
14978
14979 char *osalt_pos = strchr (saltSize_pos, '*');
14980
14981 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14982
14983 u32 saltSize_len = osalt_pos - saltSize_pos;
14984
14985 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14986
14987 osalt_pos++;
14988
14989 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14990
14991 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14992
14993 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14994
14995 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14996
14997 encryptedVerifier_pos++;
14998
14999 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15000
15001 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15002
15003 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15004
15005 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15006
15007 encryptedVerifierHash_pos++;
15008
15009 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;
15010
15011 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15012
15013 const uint version = atoi (version_pos);
15014
15015 if (version != 2010) return (PARSER_SALT_VALUE);
15016
15017 const uint spinCount = atoi (spinCount_pos);
15018
15019 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15020
15021 const uint keySize = atoi (keySize_pos);
15022
15023 if (keySize != 128) return (PARSER_SALT_VALUE);
15024
15025 const uint saltSize = atoi (saltSize_pos);
15026
15027 if (saltSize != 16) return (PARSER_SALT_VALUE);
15028
15029 /**
15030 * salt
15031 */
15032
15033 salt->salt_len = 16;
15034 salt->salt_iter = spinCount;
15035
15036 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15037 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15038 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15039 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15040
15041 /**
15042 * esalt
15043 */
15044
15045 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15046 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15047 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15048 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15049
15050 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15051 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15052 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15053 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15054 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15055 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15056 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15057 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15058
15059 /**
15060 * digest
15061 */
15062
15063 digest[0] = office2010->encryptedVerifierHash[0];
15064 digest[1] = office2010->encryptedVerifierHash[1];
15065 digest[2] = office2010->encryptedVerifierHash[2];
15066 digest[3] = office2010->encryptedVerifierHash[3];
15067
15068 return (PARSER_OK);
15069 }
15070
15071 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15072 {
15073 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15074
15075 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15076
15077 u32 *digest = (u32 *) hash_buf->digest;
15078
15079 salt_t *salt = hash_buf->salt;
15080
15081 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15082
15083 /**
15084 * parse line
15085 */
15086
15087 char *version_pos = input_buf + 8 + 1;
15088
15089 char *spinCount_pos = strchr (version_pos, '*');
15090
15091 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15092
15093 u32 version_len = spinCount_pos - version_pos;
15094
15095 if (version_len != 4) return (PARSER_SALT_LENGTH);
15096
15097 spinCount_pos++;
15098
15099 char *keySize_pos = strchr (spinCount_pos, '*');
15100
15101 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15102
15103 u32 spinCount_len = keySize_pos - spinCount_pos;
15104
15105 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15106
15107 keySize_pos++;
15108
15109 char *saltSize_pos = strchr (keySize_pos, '*');
15110
15111 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15112
15113 u32 keySize_len = saltSize_pos - keySize_pos;
15114
15115 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15116
15117 saltSize_pos++;
15118
15119 char *osalt_pos = strchr (saltSize_pos, '*');
15120
15121 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15122
15123 u32 saltSize_len = osalt_pos - saltSize_pos;
15124
15125 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15126
15127 osalt_pos++;
15128
15129 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15130
15131 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15132
15133 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15134
15135 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15136
15137 encryptedVerifier_pos++;
15138
15139 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15140
15141 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15142
15143 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15144
15145 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15146
15147 encryptedVerifierHash_pos++;
15148
15149 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;
15150
15151 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15152
15153 const uint version = atoi (version_pos);
15154
15155 if (version != 2013) return (PARSER_SALT_VALUE);
15156
15157 const uint spinCount = atoi (spinCount_pos);
15158
15159 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15160
15161 const uint keySize = atoi (keySize_pos);
15162
15163 if (keySize != 256) return (PARSER_SALT_VALUE);
15164
15165 const uint saltSize = atoi (saltSize_pos);
15166
15167 if (saltSize != 16) return (PARSER_SALT_VALUE);
15168
15169 /**
15170 * salt
15171 */
15172
15173 salt->salt_len = 16;
15174 salt->salt_iter = spinCount;
15175
15176 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15177 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15178 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15179 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15180
15181 /**
15182 * esalt
15183 */
15184
15185 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15186 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15187 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15188 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15189
15190 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15191 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15192 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15193 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15194 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15195 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15196 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15197 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15198
15199 /**
15200 * digest
15201 */
15202
15203 digest[0] = office2013->encryptedVerifierHash[0];
15204 digest[1] = office2013->encryptedVerifierHash[1];
15205 digest[2] = office2013->encryptedVerifierHash[2];
15206 digest[3] = office2013->encryptedVerifierHash[3];
15207
15208 return (PARSER_OK);
15209 }
15210
15211 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15212 {
15213 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15214
15215 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15216
15217 u32 *digest = (u32 *) hash_buf->digest;
15218
15219 salt_t *salt = hash_buf->salt;
15220
15221 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15222
15223 /**
15224 * parse line
15225 */
15226
15227 char *version_pos = input_buf + 11;
15228
15229 char *osalt_pos = strchr (version_pos, '*');
15230
15231 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15232
15233 u32 version_len = osalt_pos - version_pos;
15234
15235 if (version_len != 1) return (PARSER_SALT_LENGTH);
15236
15237 osalt_pos++;
15238
15239 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15240
15241 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15242
15243 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15244
15245 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15246
15247 encryptedVerifier_pos++;
15248
15249 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15250
15251 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15252
15253 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15254
15255 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15256
15257 encryptedVerifierHash_pos++;
15258
15259 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15260
15261 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15262
15263 const uint version = *version_pos - 0x30;
15264
15265 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15266
15267 /**
15268 * esalt
15269 */
15270
15271 oldoffice01->version = version;
15272
15273 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15274 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15275 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15276 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15277
15278 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15279 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15280 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15281 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15282
15283 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15284 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15285 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15286 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15287
15288 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15289 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15290 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15291 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15292
15293 /**
15294 * salt
15295 */
15296
15297 salt->salt_len = 16;
15298
15299 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15300 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15301 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15302 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15303
15304 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15305 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15306 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15307 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15308
15309 // this is a workaround as office produces multiple documents with the same salt
15310
15311 salt->salt_len += 32;
15312
15313 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15314 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15315 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15316 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15317 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15318 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15319 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15320 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15321
15322 /**
15323 * digest
15324 */
15325
15326 digest[0] = oldoffice01->encryptedVerifierHash[0];
15327 digest[1] = oldoffice01->encryptedVerifierHash[1];
15328 digest[2] = oldoffice01->encryptedVerifierHash[2];
15329 digest[3] = oldoffice01->encryptedVerifierHash[3];
15330
15331 return (PARSER_OK);
15332 }
15333
15334 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15335 {
15336 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15337 }
15338
15339 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15340 {
15341 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15342
15343 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15344
15345 u32 *digest = (u32 *) hash_buf->digest;
15346
15347 salt_t *salt = hash_buf->salt;
15348
15349 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15350
15351 /**
15352 * parse line
15353 */
15354
15355 char *version_pos = input_buf + 11;
15356
15357 char *osalt_pos = strchr (version_pos, '*');
15358
15359 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15360
15361 u32 version_len = osalt_pos - version_pos;
15362
15363 if (version_len != 1) return (PARSER_SALT_LENGTH);
15364
15365 osalt_pos++;
15366
15367 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15368
15369 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15370
15371 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15372
15373 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15374
15375 encryptedVerifier_pos++;
15376
15377 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15378
15379 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15380
15381 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15382
15383 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15384
15385 encryptedVerifierHash_pos++;
15386
15387 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15388
15389 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15390
15391 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15392
15393 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15394
15395 rc4key_pos++;
15396
15397 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15398
15399 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15400
15401 const uint version = *version_pos - 0x30;
15402
15403 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15404
15405 /**
15406 * esalt
15407 */
15408
15409 oldoffice01->version = version;
15410
15411 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15412 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15413 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15414 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15415
15416 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15417 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15418 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15419 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15420
15421 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15422 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15423 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15424 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15425
15426 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15427 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15428 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15429 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15430
15431 oldoffice01->rc4key[1] = 0;
15432 oldoffice01->rc4key[0] = 0;
15433
15434 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15435 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15436 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15437 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15438 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15439 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15440 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15441 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15442 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15443 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15444
15445 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15446 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15447
15448 /**
15449 * salt
15450 */
15451
15452 salt->salt_len = 16;
15453
15454 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15455 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15456 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15457 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15458
15459 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15460 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15461 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15462 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15463
15464 // this is a workaround as office produces multiple documents with the same salt
15465
15466 salt->salt_len += 32;
15467
15468 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15469 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15470 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15471 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15472 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15473 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15474 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15475 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15476
15477 /**
15478 * digest
15479 */
15480
15481 digest[0] = oldoffice01->rc4key[0];
15482 digest[1] = oldoffice01->rc4key[1];
15483 digest[2] = 0;
15484 digest[3] = 0;
15485
15486 return (PARSER_OK);
15487 }
15488
15489 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15490 {
15491 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15492
15493 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15494
15495 u32 *digest = (u32 *) hash_buf->digest;
15496
15497 salt_t *salt = hash_buf->salt;
15498
15499 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15500
15501 /**
15502 * parse line
15503 */
15504
15505 char *version_pos = input_buf + 11;
15506
15507 char *osalt_pos = strchr (version_pos, '*');
15508
15509 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15510
15511 u32 version_len = osalt_pos - version_pos;
15512
15513 if (version_len != 1) return (PARSER_SALT_LENGTH);
15514
15515 osalt_pos++;
15516
15517 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15518
15519 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15520
15521 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15522
15523 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15524
15525 encryptedVerifier_pos++;
15526
15527 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15528
15529 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15530
15531 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15532
15533 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15534
15535 encryptedVerifierHash_pos++;
15536
15537 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15538
15539 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15540
15541 const uint version = *version_pos - 0x30;
15542
15543 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15544
15545 /**
15546 * esalt
15547 */
15548
15549 oldoffice34->version = version;
15550
15551 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15552 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15553 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15554 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15555
15556 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15557 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15558 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15559 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15560
15561 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15562 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15563 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15564 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15565 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15566
15567 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15568 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15569 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15570 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15571 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15572
15573 /**
15574 * salt
15575 */
15576
15577 salt->salt_len = 16;
15578
15579 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15580 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15581 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15582 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15583
15584 // this is a workaround as office produces multiple documents with the same salt
15585
15586 salt->salt_len += 32;
15587
15588 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15589 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15590 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15591 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15592 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15593 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15594 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15595 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15596
15597 /**
15598 * digest
15599 */
15600
15601 digest[0] = oldoffice34->encryptedVerifierHash[0];
15602 digest[1] = oldoffice34->encryptedVerifierHash[1];
15603 digest[2] = oldoffice34->encryptedVerifierHash[2];
15604 digest[3] = oldoffice34->encryptedVerifierHash[3];
15605
15606 return (PARSER_OK);
15607 }
15608
15609 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15610 {
15611 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15612
15613 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15614 }
15615
15616 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15617 {
15618 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15619
15620 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15621
15622 u32 *digest = (u32 *) hash_buf->digest;
15623
15624 salt_t *salt = hash_buf->salt;
15625
15626 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15627
15628 /**
15629 * parse line
15630 */
15631
15632 char *version_pos = input_buf + 11;
15633
15634 char *osalt_pos = strchr (version_pos, '*');
15635
15636 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15637
15638 u32 version_len = osalt_pos - version_pos;
15639
15640 if (version_len != 1) return (PARSER_SALT_LENGTH);
15641
15642 osalt_pos++;
15643
15644 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15645
15646 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15647
15648 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15649
15650 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15651
15652 encryptedVerifier_pos++;
15653
15654 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15655
15656 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15657
15658 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15659
15660 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15661
15662 encryptedVerifierHash_pos++;
15663
15664 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15665
15666 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15667
15668 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15669
15670 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15671
15672 rc4key_pos++;
15673
15674 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15675
15676 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15677
15678 const uint version = *version_pos - 0x30;
15679
15680 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15681
15682 /**
15683 * esalt
15684 */
15685
15686 oldoffice34->version = version;
15687
15688 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15689 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15690 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15691 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15692
15693 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15694 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15695 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15696 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15697
15698 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15699 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15700 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15701 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15702 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15703
15704 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15705 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15706 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15707 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15708 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15709
15710 oldoffice34->rc4key[1] = 0;
15711 oldoffice34->rc4key[0] = 0;
15712
15713 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15714 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15715 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15716 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15717 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15718 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15719 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15720 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15721 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15722 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15723
15724 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15725 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15726
15727 /**
15728 * salt
15729 */
15730
15731 salt->salt_len = 16;
15732
15733 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15734 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15735 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15736 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15737
15738 // this is a workaround as office produces multiple documents with the same salt
15739
15740 salt->salt_len += 32;
15741
15742 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15743 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15744 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15745 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15746 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15747 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15748 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15749 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15750
15751 /**
15752 * digest
15753 */
15754
15755 digest[0] = oldoffice34->rc4key[0];
15756 digest[1] = oldoffice34->rc4key[1];
15757 digest[2] = 0;
15758 digest[3] = 0;
15759
15760 return (PARSER_OK);
15761 }
15762
15763 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15764 {
15765 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15766
15767 u32 *digest = (u32 *) hash_buf->digest;
15768
15769 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15770 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15771 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15772 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15773
15774 digest[0] = byte_swap_32 (digest[0]);
15775 digest[1] = byte_swap_32 (digest[1]);
15776 digest[2] = byte_swap_32 (digest[2]);
15777 digest[3] = byte_swap_32 (digest[3]);
15778
15779 return (PARSER_OK);
15780 }
15781
15782 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15783 {
15784 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15785
15786 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15787
15788 u32 *digest = (u32 *) hash_buf->digest;
15789
15790 salt_t *salt = hash_buf->salt;
15791
15792 char *signature_pos = input_buf;
15793
15794 char *salt_pos = strchr (signature_pos, '$');
15795
15796 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15797
15798 u32 signature_len = salt_pos - signature_pos;
15799
15800 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15801
15802 salt_pos++;
15803
15804 char *hash_pos = strchr (salt_pos, '$');
15805
15806 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15807
15808 u32 salt_len = hash_pos - salt_pos;
15809
15810 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15811
15812 hash_pos++;
15813
15814 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15815
15816 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15817
15818 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15819 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15820 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15821 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15822 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15823
15824 digest[0] -= SHA1M_A;
15825 digest[1] -= SHA1M_B;
15826 digest[2] -= SHA1M_C;
15827 digest[3] -= SHA1M_D;
15828 digest[4] -= SHA1M_E;
15829
15830 char *salt_buf_ptr = (char *) salt->salt_buf;
15831
15832 memcpy (salt_buf_ptr, salt_pos, salt_len);
15833
15834 salt->salt_len = salt_len;
15835
15836 return (PARSER_OK);
15837 }
15838
15839 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15840 {
15841 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15842
15843 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15844
15845 u32 *digest = (u32 *) hash_buf->digest;
15846
15847 salt_t *salt = hash_buf->salt;
15848
15849 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15850
15851 /**
15852 * parse line
15853 */
15854
15855 char *iter_pos = input_buf + 14;
15856
15857 const int iter = atoi (iter_pos);
15858
15859 if (iter < 1) return (PARSER_SALT_ITERATION);
15860
15861 salt->salt_iter = iter - 1;
15862
15863 char *salt_pos = strchr (iter_pos, '$');
15864
15865 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15866
15867 salt_pos++;
15868
15869 char *hash_pos = strchr (salt_pos, '$');
15870
15871 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15872
15873 const uint salt_len = hash_pos - salt_pos;
15874
15875 hash_pos++;
15876
15877 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15878
15879 memcpy (salt_buf_ptr, salt_pos, salt_len);
15880
15881 salt->salt_len = salt_len;
15882
15883 salt_buf_ptr[salt_len + 3] = 0x01;
15884 salt_buf_ptr[salt_len + 4] = 0x80;
15885
15886 // add some stuff to normal salt to make sorted happy
15887
15888 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15889 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15890 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15891 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15892 salt->salt_buf[4] = salt->salt_iter;
15893
15894 // base64 decode hash
15895
15896 u8 tmp_buf[100] = { 0 };
15897
15898 uint hash_len = input_len - (hash_pos - input_buf);
15899
15900 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15901
15902 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15903
15904 memcpy (digest, tmp_buf, 32);
15905
15906 digest[0] = byte_swap_32 (digest[0]);
15907 digest[1] = byte_swap_32 (digest[1]);
15908 digest[2] = byte_swap_32 (digest[2]);
15909 digest[3] = byte_swap_32 (digest[3]);
15910 digest[4] = byte_swap_32 (digest[4]);
15911 digest[5] = byte_swap_32 (digest[5]);
15912 digest[6] = byte_swap_32 (digest[6]);
15913 digest[7] = byte_swap_32 (digest[7]);
15914
15915 return (PARSER_OK);
15916 }
15917
15918 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15919 {
15920 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15921
15922 u32 *digest = (u32 *) hash_buf->digest;
15923
15924 salt_t *salt = hash_buf->salt;
15925
15926 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15927 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15928 digest[2] = 0;
15929 digest[3] = 0;
15930
15931 digest[0] = byte_swap_32 (digest[0]);
15932 digest[1] = byte_swap_32 (digest[1]);
15933
15934 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15935 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15936 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15937
15938 char iter_c = input_buf[17];
15939 char iter_d = input_buf[19];
15940
15941 // atm only defaults, let's see if there's more request
15942 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15943 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15944
15945 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15946
15947 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
15948 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
15949 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
15950 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
15951
15952 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15953 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15954 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15955 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15956
15957 salt->salt_len = 16;
15958
15959 return (PARSER_OK);
15960 }
15961
15962 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15963 {
15964 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15965
15966 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15967
15968 u32 *digest = (u32 *) hash_buf->digest;
15969
15970 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15971
15972 salt_t *salt = hash_buf->salt;
15973
15974 char *salt_pos = input_buf + 10;
15975
15976 char *hash_pos = strchr (salt_pos, '$');
15977
15978 uint salt_len = hash_pos - salt_pos;
15979
15980 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15981
15982 hash_pos++;
15983
15984 uint hash_len = input_len - 10 - salt_len - 1;
15985
15986 // base64 decode salt
15987
15988 u8 tmp_buf[100] = { 0 };
15989
15990 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
15991
15992 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15993
15994 tmp_buf[salt_len] = 0x80;
15995
15996 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15997
15998 salt->salt_len = salt_len;
15999
16000 // base64 decode salt
16001
16002 memset (tmp_buf, 0, sizeof (tmp_buf));
16003
16004 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16005
16006 uint user_len = hash_len - 32;
16007
16008 const u8 *tmp_hash = tmp_buf + user_len;
16009
16010 user_len--; // skip the trailing space
16011
16012 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16013 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16014 digest[2] = hex_to_u32 (&tmp_hash[16]);
16015 digest[3] = hex_to_u32 (&tmp_hash[24]);
16016
16017 digest[0] = byte_swap_32 (digest[0]);
16018 digest[1] = byte_swap_32 (digest[1]);
16019 digest[2] = byte_swap_32 (digest[2]);
16020 digest[3] = byte_swap_32 (digest[3]);
16021
16022 // store username for host only (output hash if cracked)
16023
16024 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16025 memcpy (cram_md5->user, tmp_buf, user_len);
16026
16027 return (PARSER_OK);
16028 }
16029
16030 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16031 {
16032 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16033
16034 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16035
16036 u32 *digest = (u32 *) hash_buf->digest;
16037
16038 salt_t *salt = hash_buf->salt;
16039
16040 char *iter_pos = input_buf + 10;
16041
16042 u32 iter = atoi (iter_pos);
16043
16044 if (iter < 1)
16045 {
16046 return (PARSER_SALT_ITERATION);
16047 }
16048
16049 iter--; // first iteration is special
16050
16051 salt->salt_iter = iter;
16052
16053 char *base64_pos = strchr (iter_pos, '}');
16054
16055 if (base64_pos == NULL)
16056 {
16057 return (PARSER_SIGNATURE_UNMATCHED);
16058 }
16059
16060 base64_pos++;
16061
16062 // base64 decode salt
16063
16064 u32 base64_len = input_len - (base64_pos - input_buf);
16065
16066 u8 tmp_buf[100] = { 0 };
16067
16068 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16069
16070 if (decoded_len < 24)
16071 {
16072 return (PARSER_SALT_LENGTH);
16073 }
16074
16075 // copy the salt
16076
16077 uint salt_len = decoded_len - 20;
16078
16079 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16080 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16081
16082 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16083
16084 salt->salt_len = salt_len;
16085
16086 // set digest
16087
16088 u32 *digest_ptr = (u32*) tmp_buf;
16089
16090 digest[0] = byte_swap_32 (digest_ptr[0]);
16091 digest[1] = byte_swap_32 (digest_ptr[1]);
16092 digest[2] = byte_swap_32 (digest_ptr[2]);
16093 digest[3] = byte_swap_32 (digest_ptr[3]);
16094 digest[4] = byte_swap_32 (digest_ptr[4]);
16095
16096 return (PARSER_OK);
16097 }
16098
16099 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16100 {
16101 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16102
16103 u32 *digest = (u32 *) hash_buf->digest;
16104
16105 salt_t *salt = hash_buf->salt;
16106
16107 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16108 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16109 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16110 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16111 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16112
16113 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16114
16115 uint salt_len = input_len - 40 - 1;
16116
16117 char *salt_buf = input_buf + 40 + 1;
16118
16119 char *salt_buf_ptr = (char *) salt->salt_buf;
16120
16121 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16122
16123 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16124
16125 salt->salt_len = salt_len;
16126
16127 return (PARSER_OK);
16128 }
16129
16130 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16131 {
16132 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16133
16134 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16135
16136 u32 *digest = (u32 *) hash_buf->digest;
16137
16138 salt_t *salt = hash_buf->salt;
16139
16140 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16141
16142 /**
16143 * parse line
16144 */
16145
16146 char *V_pos = input_buf + 5;
16147
16148 char *R_pos = strchr (V_pos, '*');
16149
16150 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16151
16152 u32 V_len = R_pos - V_pos;
16153
16154 R_pos++;
16155
16156 char *bits_pos = strchr (R_pos, '*');
16157
16158 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16159
16160 u32 R_len = bits_pos - R_pos;
16161
16162 bits_pos++;
16163
16164 char *P_pos = strchr (bits_pos, '*');
16165
16166 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16167
16168 u32 bits_len = P_pos - bits_pos;
16169
16170 P_pos++;
16171
16172 char *enc_md_pos = strchr (P_pos, '*');
16173
16174 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16175
16176 u32 P_len = enc_md_pos - P_pos;
16177
16178 enc_md_pos++;
16179
16180 char *id_len_pos = strchr (enc_md_pos, '*');
16181
16182 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16183
16184 u32 enc_md_len = id_len_pos - enc_md_pos;
16185
16186 id_len_pos++;
16187
16188 char *id_buf_pos = strchr (id_len_pos, '*');
16189
16190 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16191
16192 u32 id_len_len = id_buf_pos - id_len_pos;
16193
16194 id_buf_pos++;
16195
16196 char *u_len_pos = strchr (id_buf_pos, '*');
16197
16198 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16199
16200 u32 id_buf_len = u_len_pos - id_buf_pos;
16201
16202 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16203
16204 u_len_pos++;
16205
16206 char *u_buf_pos = strchr (u_len_pos, '*');
16207
16208 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16209
16210 u32 u_len_len = u_buf_pos - u_len_pos;
16211
16212 u_buf_pos++;
16213
16214 char *o_len_pos = strchr (u_buf_pos, '*');
16215
16216 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16217
16218 u32 u_buf_len = o_len_pos - u_buf_pos;
16219
16220 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16221
16222 o_len_pos++;
16223
16224 char *o_buf_pos = strchr (o_len_pos, '*');
16225
16226 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16227
16228 u32 o_len_len = o_buf_pos - o_len_pos;
16229
16230 o_buf_pos++;
16231
16232 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;
16233
16234 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16235
16236 // validate data
16237
16238 const int V = atoi (V_pos);
16239 const int R = atoi (R_pos);
16240 const int P = atoi (P_pos);
16241
16242 if (V != 1) return (PARSER_SALT_VALUE);
16243 if (R != 2) return (PARSER_SALT_VALUE);
16244
16245 const int enc_md = atoi (enc_md_pos);
16246
16247 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16248
16249 const int id_len = atoi (id_len_pos);
16250 const int u_len = atoi (u_len_pos);
16251 const int o_len = atoi (o_len_pos);
16252
16253 if (id_len != 16) return (PARSER_SALT_VALUE);
16254 if (u_len != 32) return (PARSER_SALT_VALUE);
16255 if (o_len != 32) return (PARSER_SALT_VALUE);
16256
16257 const int bits = atoi (bits_pos);
16258
16259 if (bits != 40) return (PARSER_SALT_VALUE);
16260
16261 // copy data to esalt
16262
16263 pdf->V = V;
16264 pdf->R = R;
16265 pdf->P = P;
16266
16267 pdf->enc_md = enc_md;
16268
16269 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16270 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16271 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16272 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16273 pdf->id_len = id_len;
16274
16275 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16276 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16277 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16278 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16279 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16280 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16281 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16282 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16283 pdf->u_len = u_len;
16284
16285 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16286 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16287 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16288 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16289 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16290 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16291 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16292 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16293 pdf->o_len = o_len;
16294
16295 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16296 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16297 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16298 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16299
16300 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16301 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16302 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16303 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16304 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16305 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16306 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16307 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16308
16309 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16310 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16311 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16312 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16313 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16314 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16315 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16316 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16317
16318 // we use ID for salt, maybe needs to change, we will see...
16319
16320 salt->salt_buf[0] = pdf->id_buf[0];
16321 salt->salt_buf[1] = pdf->id_buf[1];
16322 salt->salt_buf[2] = pdf->id_buf[2];
16323 salt->salt_buf[3] = pdf->id_buf[3];
16324 salt->salt_len = pdf->id_len;
16325
16326 digest[0] = pdf->u_buf[0];
16327 digest[1] = pdf->u_buf[1];
16328 digest[2] = pdf->u_buf[2];
16329 digest[3] = pdf->u_buf[3];
16330
16331 return (PARSER_OK);
16332 }
16333
16334 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16335 {
16336 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16337 }
16338
16339 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16340 {
16341 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16342
16343 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16344
16345 u32 *digest = (u32 *) hash_buf->digest;
16346
16347 salt_t *salt = hash_buf->salt;
16348
16349 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16350
16351 /**
16352 * parse line
16353 */
16354
16355 char *V_pos = input_buf + 5;
16356
16357 char *R_pos = strchr (V_pos, '*');
16358
16359 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16360
16361 u32 V_len = R_pos - V_pos;
16362
16363 R_pos++;
16364
16365 char *bits_pos = strchr (R_pos, '*');
16366
16367 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16368
16369 u32 R_len = bits_pos - R_pos;
16370
16371 bits_pos++;
16372
16373 char *P_pos = strchr (bits_pos, '*');
16374
16375 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16376
16377 u32 bits_len = P_pos - bits_pos;
16378
16379 P_pos++;
16380
16381 char *enc_md_pos = strchr (P_pos, '*');
16382
16383 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16384
16385 u32 P_len = enc_md_pos - P_pos;
16386
16387 enc_md_pos++;
16388
16389 char *id_len_pos = strchr (enc_md_pos, '*');
16390
16391 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16392
16393 u32 enc_md_len = id_len_pos - enc_md_pos;
16394
16395 id_len_pos++;
16396
16397 char *id_buf_pos = strchr (id_len_pos, '*');
16398
16399 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16400
16401 u32 id_len_len = id_buf_pos - id_len_pos;
16402
16403 id_buf_pos++;
16404
16405 char *u_len_pos = strchr (id_buf_pos, '*');
16406
16407 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16408
16409 u32 id_buf_len = u_len_pos - id_buf_pos;
16410
16411 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16412
16413 u_len_pos++;
16414
16415 char *u_buf_pos = strchr (u_len_pos, '*');
16416
16417 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16418
16419 u32 u_len_len = u_buf_pos - u_len_pos;
16420
16421 u_buf_pos++;
16422
16423 char *o_len_pos = strchr (u_buf_pos, '*');
16424
16425 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16426
16427 u32 u_buf_len = o_len_pos - u_buf_pos;
16428
16429 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16430
16431 o_len_pos++;
16432
16433 char *o_buf_pos = strchr (o_len_pos, '*');
16434
16435 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16436
16437 u32 o_len_len = o_buf_pos - o_len_pos;
16438
16439 o_buf_pos++;
16440
16441 char *rc4key_pos = strchr (o_buf_pos, ':');
16442
16443 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16444
16445 u32 o_buf_len = rc4key_pos - o_buf_pos;
16446
16447 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16448
16449 rc4key_pos++;
16450
16451 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;
16452
16453 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16454
16455 // validate data
16456
16457 const int V = atoi (V_pos);
16458 const int R = atoi (R_pos);
16459 const int P = atoi (P_pos);
16460
16461 if (V != 1) return (PARSER_SALT_VALUE);
16462 if (R != 2) return (PARSER_SALT_VALUE);
16463
16464 const int enc_md = atoi (enc_md_pos);
16465
16466 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16467
16468 const int id_len = atoi (id_len_pos);
16469 const int u_len = atoi (u_len_pos);
16470 const int o_len = atoi (o_len_pos);
16471
16472 if (id_len != 16) return (PARSER_SALT_VALUE);
16473 if (u_len != 32) return (PARSER_SALT_VALUE);
16474 if (o_len != 32) return (PARSER_SALT_VALUE);
16475
16476 const int bits = atoi (bits_pos);
16477
16478 if (bits != 40) return (PARSER_SALT_VALUE);
16479
16480 // copy data to esalt
16481
16482 pdf->V = V;
16483 pdf->R = R;
16484 pdf->P = P;
16485
16486 pdf->enc_md = enc_md;
16487
16488 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16489 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16490 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16491 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16492 pdf->id_len = id_len;
16493
16494 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16495 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16496 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16497 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16498 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16499 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16500 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16501 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16502 pdf->u_len = u_len;
16503
16504 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16505 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16506 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16507 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16508 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16509 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16510 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16511 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16512 pdf->o_len = o_len;
16513
16514 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16515 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16516 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16517 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16518
16519 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16520 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16521 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16522 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16523 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16524 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16525 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16526 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16527
16528 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16529 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16530 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16531 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16532 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16533 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16534 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16535 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16536
16537 pdf->rc4key[1] = 0;
16538 pdf->rc4key[0] = 0;
16539
16540 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16541 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16542 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16543 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16544 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16545 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16546 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16547 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16548 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16549 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16550
16551 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16552 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16553
16554 // we use ID for salt, maybe needs to change, we will see...
16555
16556 salt->salt_buf[0] = pdf->id_buf[0];
16557 salt->salt_buf[1] = pdf->id_buf[1];
16558 salt->salt_buf[2] = pdf->id_buf[2];
16559 salt->salt_buf[3] = pdf->id_buf[3];
16560 salt->salt_buf[4] = pdf->u_buf[0];
16561 salt->salt_buf[5] = pdf->u_buf[1];
16562 salt->salt_buf[6] = pdf->o_buf[0];
16563 salt->salt_buf[7] = pdf->o_buf[1];
16564 salt->salt_len = pdf->id_len + 16;
16565
16566 digest[0] = pdf->rc4key[0];
16567 digest[1] = pdf->rc4key[1];
16568 digest[2] = 0;
16569 digest[3] = 0;
16570
16571 return (PARSER_OK);
16572 }
16573
16574 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16575 {
16576 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16577
16578 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16579
16580 u32 *digest = (u32 *) hash_buf->digest;
16581
16582 salt_t *salt = hash_buf->salt;
16583
16584 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16585
16586 /**
16587 * parse line
16588 */
16589
16590 char *V_pos = input_buf + 5;
16591
16592 char *R_pos = strchr (V_pos, '*');
16593
16594 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16595
16596 u32 V_len = R_pos - V_pos;
16597
16598 R_pos++;
16599
16600 char *bits_pos = strchr (R_pos, '*');
16601
16602 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16603
16604 u32 R_len = bits_pos - R_pos;
16605
16606 bits_pos++;
16607
16608 char *P_pos = strchr (bits_pos, '*');
16609
16610 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16611
16612 u32 bits_len = P_pos - bits_pos;
16613
16614 P_pos++;
16615
16616 char *enc_md_pos = strchr (P_pos, '*');
16617
16618 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16619
16620 u32 P_len = enc_md_pos - P_pos;
16621
16622 enc_md_pos++;
16623
16624 char *id_len_pos = strchr (enc_md_pos, '*');
16625
16626 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16627
16628 u32 enc_md_len = id_len_pos - enc_md_pos;
16629
16630 id_len_pos++;
16631
16632 char *id_buf_pos = strchr (id_len_pos, '*');
16633
16634 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16635
16636 u32 id_len_len = id_buf_pos - id_len_pos;
16637
16638 id_buf_pos++;
16639
16640 char *u_len_pos = strchr (id_buf_pos, '*');
16641
16642 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16643
16644 u32 id_buf_len = u_len_pos - id_buf_pos;
16645
16646 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16647
16648 u_len_pos++;
16649
16650 char *u_buf_pos = strchr (u_len_pos, '*');
16651
16652 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16653
16654 u32 u_len_len = u_buf_pos - u_len_pos;
16655
16656 u_buf_pos++;
16657
16658 char *o_len_pos = strchr (u_buf_pos, '*');
16659
16660 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16661
16662 u32 u_buf_len = o_len_pos - u_buf_pos;
16663
16664 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16665
16666 o_len_pos++;
16667
16668 char *o_buf_pos = strchr (o_len_pos, '*');
16669
16670 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16671
16672 u32 o_len_len = o_buf_pos - o_len_pos;
16673
16674 o_buf_pos++;
16675
16676 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;
16677
16678 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16679
16680 // validate data
16681
16682 const int V = atoi (V_pos);
16683 const int R = atoi (R_pos);
16684 const int P = atoi (P_pos);
16685
16686 int vr_ok = 0;
16687
16688 if ((V == 2) && (R == 3)) vr_ok = 1;
16689 if ((V == 4) && (R == 4)) vr_ok = 1;
16690
16691 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16692
16693 const int id_len = atoi (id_len_pos);
16694 const int u_len = atoi (u_len_pos);
16695 const int o_len = atoi (o_len_pos);
16696
16697 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16698
16699 if (u_len != 32) return (PARSER_SALT_VALUE);
16700 if (o_len != 32) return (PARSER_SALT_VALUE);
16701
16702 const int bits = atoi (bits_pos);
16703
16704 if (bits != 128) return (PARSER_SALT_VALUE);
16705
16706 int enc_md = 1;
16707
16708 if (R >= 4)
16709 {
16710 enc_md = atoi (enc_md_pos);
16711 }
16712
16713 // copy data to esalt
16714
16715 pdf->V = V;
16716 pdf->R = R;
16717 pdf->P = P;
16718
16719 pdf->enc_md = enc_md;
16720
16721 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16722 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16723 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16724 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16725
16726 if (id_len == 32)
16727 {
16728 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16729 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16730 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16731 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16732 }
16733
16734 pdf->id_len = id_len;
16735
16736 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16737 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16738 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16739 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16740 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16741 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16742 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16743 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16744 pdf->u_len = u_len;
16745
16746 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16747 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16748 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16749 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16750 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16751 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16752 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16753 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16754 pdf->o_len = o_len;
16755
16756 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16757 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16758 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16759 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16760
16761 if (id_len == 32)
16762 {
16763 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16764 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16765 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16766 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16767 }
16768
16769 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16770 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16771 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16772 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16773 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16774 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16775 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16776 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16777
16778 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16779 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16780 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16781 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16782 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16783 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16784 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16785 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16786
16787 // precompute rc4 data for later use
16788
16789 uint padding[8] =
16790 {
16791 0x5e4ebf28,
16792 0x418a754e,
16793 0x564e0064,
16794 0x0801faff,
16795 0xb6002e2e,
16796 0x803e68d0,
16797 0xfea90c2f,
16798 0x7a695364
16799 };
16800
16801 // md5
16802
16803 uint salt_pc_block[32] = { 0 };
16804
16805 char *salt_pc_ptr = (char *) salt_pc_block;
16806
16807 memcpy (salt_pc_ptr, padding, 32);
16808 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16809
16810 uint salt_pc_digest[4] = { 0 };
16811
16812 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16813
16814 pdf->rc4data[0] = salt_pc_digest[0];
16815 pdf->rc4data[1] = salt_pc_digest[1];
16816
16817 // we use ID for salt, maybe needs to change, we will see...
16818
16819 salt->salt_buf[0] = pdf->id_buf[0];
16820 salt->salt_buf[1] = pdf->id_buf[1];
16821 salt->salt_buf[2] = pdf->id_buf[2];
16822 salt->salt_buf[3] = pdf->id_buf[3];
16823 salt->salt_buf[4] = pdf->u_buf[0];
16824 salt->salt_buf[5] = pdf->u_buf[1];
16825 salt->salt_buf[6] = pdf->o_buf[0];
16826 salt->salt_buf[7] = pdf->o_buf[1];
16827 salt->salt_len = pdf->id_len + 16;
16828
16829 salt->salt_iter = ROUNDS_PDF14;
16830
16831 digest[0] = pdf->u_buf[0];
16832 digest[1] = pdf->u_buf[1];
16833 digest[2] = 0;
16834 digest[3] = 0;
16835
16836 return (PARSER_OK);
16837 }
16838
16839 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16840 {
16841 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16842
16843 if (ret != PARSER_OK)
16844 {
16845 return ret;
16846 }
16847
16848 u32 *digest = (u32 *) hash_buf->digest;
16849
16850 salt_t *salt = hash_buf->salt;
16851
16852 digest[0] -= SHA256M_A;
16853 digest[1] -= SHA256M_B;
16854 digest[2] -= SHA256M_C;
16855 digest[3] -= SHA256M_D;
16856 digest[4] -= SHA256M_E;
16857 digest[5] -= SHA256M_F;
16858 digest[6] -= SHA256M_G;
16859 digest[7] -= SHA256M_H;
16860
16861 salt->salt_buf[2] = 0x80;
16862
16863 return (PARSER_OK);
16864 }
16865
16866 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16867 {
16868 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16869
16870 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16871
16872 u32 *digest = (u32 *) hash_buf->digest;
16873
16874 salt_t *salt = hash_buf->salt;
16875
16876 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16877
16878 /**
16879 * parse line
16880 */
16881
16882 char *V_pos = input_buf + 5;
16883
16884 char *R_pos = strchr (V_pos, '*');
16885
16886 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16887
16888 u32 V_len = R_pos - V_pos;
16889
16890 R_pos++;
16891
16892 char *bits_pos = strchr (R_pos, '*');
16893
16894 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16895
16896 u32 R_len = bits_pos - R_pos;
16897
16898 bits_pos++;
16899
16900 char *P_pos = strchr (bits_pos, '*');
16901
16902 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16903
16904 u32 bits_len = P_pos - bits_pos;
16905
16906 P_pos++;
16907
16908 char *enc_md_pos = strchr (P_pos, '*');
16909
16910 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16911
16912 u32 P_len = enc_md_pos - P_pos;
16913
16914 enc_md_pos++;
16915
16916 char *id_len_pos = strchr (enc_md_pos, '*');
16917
16918 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16919
16920 u32 enc_md_len = id_len_pos - enc_md_pos;
16921
16922 id_len_pos++;
16923
16924 char *id_buf_pos = strchr (id_len_pos, '*');
16925
16926 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16927
16928 u32 id_len_len = id_buf_pos - id_len_pos;
16929
16930 id_buf_pos++;
16931
16932 char *u_len_pos = strchr (id_buf_pos, '*');
16933
16934 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16935
16936 u32 id_buf_len = u_len_pos - id_buf_pos;
16937
16938 u_len_pos++;
16939
16940 char *u_buf_pos = strchr (u_len_pos, '*');
16941
16942 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16943
16944 u32 u_len_len = u_buf_pos - u_len_pos;
16945
16946 u_buf_pos++;
16947
16948 char *o_len_pos = strchr (u_buf_pos, '*');
16949
16950 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16951
16952 u32 u_buf_len = o_len_pos - u_buf_pos;
16953
16954 o_len_pos++;
16955
16956 char *o_buf_pos = strchr (o_len_pos, '*');
16957
16958 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16959
16960 u32 o_len_len = o_buf_pos - o_len_pos;
16961
16962 o_buf_pos++;
16963
16964 char *last = strchr (o_buf_pos, '*');
16965
16966 if (last == NULL) last = input_buf + input_len;
16967
16968 u32 o_buf_len = last - o_buf_pos;
16969
16970 // validate data
16971
16972 const int V = atoi (V_pos);
16973 const int R = atoi (R_pos);
16974
16975 int vr_ok = 0;
16976
16977 if ((V == 5) && (R == 5)) vr_ok = 1;
16978 if ((V == 5) && (R == 6)) vr_ok = 1;
16979
16980 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16981
16982 const int bits = atoi (bits_pos);
16983
16984 if (bits != 256) return (PARSER_SALT_VALUE);
16985
16986 int enc_md = atoi (enc_md_pos);
16987
16988 if (enc_md != 1) return (PARSER_SALT_VALUE);
16989
16990 const uint id_len = atoi (id_len_pos);
16991 const uint u_len = atoi (u_len_pos);
16992 const uint o_len = atoi (o_len_pos);
16993
16994 if (V_len > 6) return (PARSER_SALT_LENGTH);
16995 if (R_len > 6) return (PARSER_SALT_LENGTH);
16996 if (P_len > 6) return (PARSER_SALT_LENGTH);
16997 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16998 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16999 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17000 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17001 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17002
17003 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17004 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17005 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17006
17007 // copy data to esalt
17008
17009 if (u_len < 40) return (PARSER_SALT_VALUE);
17010
17011 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17012 {
17013 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17014 }
17015
17016 salt->salt_buf[0] = pdf->u_buf[8];
17017 salt->salt_buf[1] = pdf->u_buf[9];
17018
17019 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17020 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17021
17022 salt->salt_len = 8;
17023 salt->salt_iter = ROUNDS_PDF17L8;
17024
17025 digest[0] = pdf->u_buf[0];
17026 digest[1] = pdf->u_buf[1];
17027 digest[2] = pdf->u_buf[2];
17028 digest[3] = pdf->u_buf[3];
17029 digest[4] = pdf->u_buf[4];
17030 digest[5] = pdf->u_buf[5];
17031 digest[6] = pdf->u_buf[6];
17032 digest[7] = pdf->u_buf[7];
17033
17034 return (PARSER_OK);
17035 }
17036
17037 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17038 {
17039 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17040
17041 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17042
17043 u32 *digest = (u32 *) hash_buf->digest;
17044
17045 salt_t *salt = hash_buf->salt;
17046
17047 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17048
17049 /**
17050 * parse line
17051 */
17052
17053 // iterations
17054
17055 char *iter_pos = input_buf + 7;
17056
17057 u32 iter = atoi (iter_pos);
17058
17059 if (iter < 1) return (PARSER_SALT_ITERATION);
17060 if (iter > 999999) return (PARSER_SALT_ITERATION);
17061
17062 // first is *raw* salt
17063
17064 char *salt_pos = strchr (iter_pos, ':');
17065
17066 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17067
17068 salt_pos++;
17069
17070 char *hash_pos = strchr (salt_pos, ':');
17071
17072 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17073
17074 u32 salt_len = hash_pos - salt_pos;
17075
17076 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17077
17078 hash_pos++;
17079
17080 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17081
17082 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17083
17084 // decode salt
17085
17086 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17087
17088 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17089
17090 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17091
17092 salt_buf_ptr[salt_len + 3] = 0x01;
17093 salt_buf_ptr[salt_len + 4] = 0x80;
17094
17095 salt->salt_len = salt_len;
17096 salt->salt_iter = iter - 1;
17097
17098 // decode hash
17099
17100 u8 tmp_buf[100] = { 0 };
17101
17102 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17103
17104 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17105
17106 memcpy (digest, tmp_buf, 16);
17107
17108 digest[0] = byte_swap_32 (digest[0]);
17109 digest[1] = byte_swap_32 (digest[1]);
17110 digest[2] = byte_swap_32 (digest[2]);
17111 digest[3] = byte_swap_32 (digest[3]);
17112
17113 // add some stuff to normal salt to make sorted happy
17114
17115 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17116 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17117 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17118 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17119 salt->salt_buf[4] = salt->salt_iter;
17120
17121 return (PARSER_OK);
17122 }
17123
17124 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17125 {
17126 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17127
17128 u32 *digest = (u32 *) hash_buf->digest;
17129
17130 salt_t *salt = hash_buf->salt;
17131
17132 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17133 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17134 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17135 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17136
17137 digest[0] = byte_swap_32 (digest[0]);
17138 digest[1] = byte_swap_32 (digest[1]);
17139 digest[2] = byte_swap_32 (digest[2]);
17140 digest[3] = byte_swap_32 (digest[3]);
17141
17142 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17143
17144 uint salt_len = input_len - 32 - 1;
17145
17146 char *salt_buf = input_buf + 32 + 1;
17147
17148 char *salt_buf_ptr = (char *) salt->salt_buf;
17149
17150 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17151
17152 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17153
17154 salt->salt_len = salt_len;
17155
17156 return (PARSER_OK);
17157 }
17158
17159 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17160 {
17161 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17162
17163 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17164
17165 u32 *digest = (u32 *) hash_buf->digest;
17166
17167 salt_t *salt = hash_buf->salt;
17168
17169 char *user_pos = input_buf + 10;
17170
17171 char *salt_pos = strchr (user_pos, '*');
17172
17173 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17174
17175 salt_pos++;
17176
17177 char *hash_pos = strchr (salt_pos, '*');
17178
17179 hash_pos++;
17180
17181 uint hash_len = input_len - (hash_pos - input_buf);
17182
17183 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17184
17185 uint user_len = salt_pos - user_pos - 1;
17186
17187 uint salt_len = hash_pos - salt_pos - 1;
17188
17189 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17190
17191 /*
17192 * store digest
17193 */
17194
17195 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17196 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17197 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17198 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17199
17200 digest[0] = byte_swap_32 (digest[0]);
17201 digest[1] = byte_swap_32 (digest[1]);
17202 digest[2] = byte_swap_32 (digest[2]);
17203 digest[3] = byte_swap_32 (digest[3]);
17204
17205 digest[0] -= MD5M_A;
17206 digest[1] -= MD5M_B;
17207 digest[2] -= MD5M_C;
17208 digest[3] -= MD5M_D;
17209
17210 /*
17211 * store salt
17212 */
17213
17214 char *salt_buf_ptr = (char *) salt->salt_buf;
17215
17216 // first 4 bytes are the "challenge"
17217
17218 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17219 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17220 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17221 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17222
17223 // append the user name
17224
17225 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17226
17227 salt->salt_len = 4 + user_len;
17228
17229 return (PARSER_OK);
17230 }
17231
17232 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17233 {
17234 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17235
17236 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17237
17238 u32 *digest = (u32 *) hash_buf->digest;
17239
17240 salt_t *salt = hash_buf->salt;
17241
17242 char *salt_pos = input_buf + 9;
17243
17244 char *hash_pos = strchr (salt_pos, '*');
17245
17246 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17247
17248 hash_pos++;
17249
17250 uint hash_len = input_len - (hash_pos - input_buf);
17251
17252 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17253
17254 uint salt_len = hash_pos - salt_pos - 1;
17255
17256 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17257
17258 /*
17259 * store digest
17260 */
17261
17262 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17263 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17264 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17265 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17266 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17267
17268 /*
17269 * store salt
17270 */
17271
17272 char *salt_buf_ptr = (char *) salt->salt_buf;
17273
17274 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17275
17276 salt->salt_len = salt_len;
17277
17278 return (PARSER_OK);
17279 }
17280
17281 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17282 {
17283 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17284
17285 if (memcmp (SIGNATURE_BITCOIN_WALLET, 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 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17292
17293 /**
17294 * parse line
17295 */
17296
17297 char *cry_master_len_pos = input_buf + 9;
17298
17299 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17300
17301 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17302
17303 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17304
17305 cry_master_buf_pos++;
17306
17307 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17308
17309 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17310
17311 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17312
17313 cry_salt_len_pos++;
17314
17315 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17316
17317 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17318
17319 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17320
17321 cry_salt_buf_pos++;
17322
17323 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17324
17325 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17326
17327 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17328
17329 cry_rounds_pos++;
17330
17331 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17332
17333 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17334
17335 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17336
17337 ckey_len_pos++;
17338
17339 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17340
17341 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17342
17343 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17344
17345 ckey_buf_pos++;
17346
17347 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17348
17349 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17350
17351 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17352
17353 public_key_len_pos++;
17354
17355 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17356
17357 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17358
17359 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17360
17361 public_key_buf_pos++;
17362
17363 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;
17364
17365 const uint cry_master_len = atoi (cry_master_len_pos);
17366 const uint cry_salt_len = atoi (cry_salt_len_pos);
17367 const uint ckey_len = atoi (ckey_len_pos);
17368 const uint public_key_len = atoi (public_key_len_pos);
17369
17370 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17371 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17372 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17373 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17374
17375 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17376 {
17377 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17378
17379 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17380 }
17381
17382 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17383 {
17384 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17385
17386 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17387 }
17388
17389 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17390 {
17391 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17392
17393 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17394 }
17395
17396 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17397 bitcoin_wallet->ckey_len = ckey_len / 2;
17398 bitcoin_wallet->public_key_len = public_key_len / 2;
17399
17400 /*
17401 * store digest (should be unique enought, hopefully)
17402 */
17403
17404 digest[0] = bitcoin_wallet->cry_master_buf[0];
17405 digest[1] = bitcoin_wallet->cry_master_buf[1];
17406 digest[2] = bitcoin_wallet->cry_master_buf[2];
17407 digest[3] = bitcoin_wallet->cry_master_buf[3];
17408
17409 /*
17410 * store salt
17411 */
17412
17413 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17414
17415 const uint cry_rounds = atoi (cry_rounds_pos);
17416
17417 salt->salt_iter = cry_rounds - 1;
17418
17419 char *salt_buf_ptr = (char *) salt->salt_buf;
17420
17421 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17422
17423 salt->salt_len = salt_len;
17424
17425 return (PARSER_OK);
17426 }
17427
17428 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17429 {
17430 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17431
17432 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17433
17434 u32 *digest = (u32 *) hash_buf->digest;
17435
17436 salt_t *salt = hash_buf->salt;
17437
17438 sip_t *sip = (sip_t *) hash_buf->esalt;
17439
17440 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17441
17442 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17443
17444 memcpy (temp_input_buf, input_buf, input_len);
17445
17446 // URI_server:
17447
17448 char *URI_server_pos = temp_input_buf + 6;
17449
17450 char *URI_client_pos = strchr (URI_server_pos, '*');
17451
17452 if (URI_client_pos == NULL)
17453 {
17454 myfree (temp_input_buf);
17455
17456 return (PARSER_SEPARATOR_UNMATCHED);
17457 }
17458
17459 URI_client_pos[0] = 0;
17460 URI_client_pos++;
17461
17462 uint URI_server_len = strlen (URI_server_pos);
17463
17464 if (URI_server_len > 512)
17465 {
17466 myfree (temp_input_buf);
17467
17468 return (PARSER_SALT_LENGTH);
17469 }
17470
17471 // URI_client:
17472
17473 char *user_pos = strchr (URI_client_pos, '*');
17474
17475 if (user_pos == NULL)
17476 {
17477 myfree (temp_input_buf);
17478
17479 return (PARSER_SEPARATOR_UNMATCHED);
17480 }
17481
17482 user_pos[0] = 0;
17483 user_pos++;
17484
17485 uint URI_client_len = strlen (URI_client_pos);
17486
17487 if (URI_client_len > 512)
17488 {
17489 myfree (temp_input_buf);
17490
17491 return (PARSER_SALT_LENGTH);
17492 }
17493
17494 // user:
17495
17496 char *realm_pos = strchr (user_pos, '*');
17497
17498 if (realm_pos == NULL)
17499 {
17500 myfree (temp_input_buf);
17501
17502 return (PARSER_SEPARATOR_UNMATCHED);
17503 }
17504
17505 realm_pos[0] = 0;
17506 realm_pos++;
17507
17508 uint user_len = strlen (user_pos);
17509
17510 if (user_len > 116)
17511 {
17512 myfree (temp_input_buf);
17513
17514 return (PARSER_SALT_LENGTH);
17515 }
17516
17517 // realm:
17518
17519 char *method_pos = strchr (realm_pos, '*');
17520
17521 if (method_pos == NULL)
17522 {
17523 myfree (temp_input_buf);
17524
17525 return (PARSER_SEPARATOR_UNMATCHED);
17526 }
17527
17528 method_pos[0] = 0;
17529 method_pos++;
17530
17531 uint realm_len = strlen (realm_pos);
17532
17533 if (realm_len > 116)
17534 {
17535 myfree (temp_input_buf);
17536
17537 return (PARSER_SALT_LENGTH);
17538 }
17539
17540 // method:
17541
17542 char *URI_prefix_pos = strchr (method_pos, '*');
17543
17544 if (URI_prefix_pos == NULL)
17545 {
17546 myfree (temp_input_buf);
17547
17548 return (PARSER_SEPARATOR_UNMATCHED);
17549 }
17550
17551 URI_prefix_pos[0] = 0;
17552 URI_prefix_pos++;
17553
17554 uint method_len = strlen (method_pos);
17555
17556 if (method_len > 246)
17557 {
17558 myfree (temp_input_buf);
17559
17560 return (PARSER_SALT_LENGTH);
17561 }
17562
17563 // URI_prefix:
17564
17565 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17566
17567 if (URI_resource_pos == NULL)
17568 {
17569 myfree (temp_input_buf);
17570
17571 return (PARSER_SEPARATOR_UNMATCHED);
17572 }
17573
17574 URI_resource_pos[0] = 0;
17575 URI_resource_pos++;
17576
17577 uint URI_prefix_len = strlen (URI_prefix_pos);
17578
17579 if (URI_prefix_len > 245)
17580 {
17581 myfree (temp_input_buf);
17582
17583 return (PARSER_SALT_LENGTH);
17584 }
17585
17586 // URI_resource:
17587
17588 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17589
17590 if (URI_suffix_pos == NULL)
17591 {
17592 myfree (temp_input_buf);
17593
17594 return (PARSER_SEPARATOR_UNMATCHED);
17595 }
17596
17597 URI_suffix_pos[0] = 0;
17598 URI_suffix_pos++;
17599
17600 uint URI_resource_len = strlen (URI_resource_pos);
17601
17602 if (URI_resource_len < 1 || URI_resource_len > 246)
17603 {
17604 myfree (temp_input_buf);
17605
17606 return (PARSER_SALT_LENGTH);
17607 }
17608
17609 // URI_suffix:
17610
17611 char *nonce_pos = strchr (URI_suffix_pos, '*');
17612
17613 if (nonce_pos == NULL)
17614 {
17615 myfree (temp_input_buf);
17616
17617 return (PARSER_SEPARATOR_UNMATCHED);
17618 }
17619
17620 nonce_pos[0] = 0;
17621 nonce_pos++;
17622
17623 uint URI_suffix_len = strlen (URI_suffix_pos);
17624
17625 if (URI_suffix_len > 245)
17626 {
17627 myfree (temp_input_buf);
17628
17629 return (PARSER_SALT_LENGTH);
17630 }
17631
17632 // nonce:
17633
17634 char *nonce_client_pos = strchr (nonce_pos, '*');
17635
17636 if (nonce_client_pos == NULL)
17637 {
17638 myfree (temp_input_buf);
17639
17640 return (PARSER_SEPARATOR_UNMATCHED);
17641 }
17642
17643 nonce_client_pos[0] = 0;
17644 nonce_client_pos++;
17645
17646 uint nonce_len = strlen (nonce_pos);
17647
17648 if (nonce_len < 1 || nonce_len > 50)
17649 {
17650 myfree (temp_input_buf);
17651
17652 return (PARSER_SALT_LENGTH);
17653 }
17654
17655 // nonce_client:
17656
17657 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17658
17659 if (nonce_count_pos == NULL)
17660 {
17661 myfree (temp_input_buf);
17662
17663 return (PARSER_SEPARATOR_UNMATCHED);
17664 }
17665
17666 nonce_count_pos[0] = 0;
17667 nonce_count_pos++;
17668
17669 uint nonce_client_len = strlen (nonce_client_pos);
17670
17671 if (nonce_client_len > 50)
17672 {
17673 myfree (temp_input_buf);
17674
17675 return (PARSER_SALT_LENGTH);
17676 }
17677
17678 // nonce_count:
17679
17680 char *qop_pos = strchr (nonce_count_pos, '*');
17681
17682 if (qop_pos == NULL)
17683 {
17684 myfree (temp_input_buf);
17685
17686 return (PARSER_SEPARATOR_UNMATCHED);
17687 }
17688
17689 qop_pos[0] = 0;
17690 qop_pos++;
17691
17692 uint nonce_count_len = strlen (nonce_count_pos);
17693
17694 if (nonce_count_len > 50)
17695 {
17696 myfree (temp_input_buf);
17697
17698 return (PARSER_SALT_LENGTH);
17699 }
17700
17701 // qop:
17702
17703 char *directive_pos = strchr (qop_pos, '*');
17704
17705 if (directive_pos == NULL)
17706 {
17707 myfree (temp_input_buf);
17708
17709 return (PARSER_SEPARATOR_UNMATCHED);
17710 }
17711
17712 directive_pos[0] = 0;
17713 directive_pos++;
17714
17715 uint qop_len = strlen (qop_pos);
17716
17717 if (qop_len > 50)
17718 {
17719 myfree (temp_input_buf);
17720
17721 return (PARSER_SALT_LENGTH);
17722 }
17723
17724 // directive
17725
17726 char *digest_pos = strchr (directive_pos, '*');
17727
17728 if (digest_pos == NULL)
17729 {
17730 myfree (temp_input_buf);
17731
17732 return (PARSER_SEPARATOR_UNMATCHED);
17733 }
17734
17735 digest_pos[0] = 0;
17736 digest_pos++;
17737
17738 uint directive_len = strlen (directive_pos);
17739
17740 if (directive_len != 3)
17741 {
17742 myfree (temp_input_buf);
17743
17744 return (PARSER_SALT_LENGTH);
17745 }
17746
17747 if (memcmp (directive_pos, "MD5", 3))
17748 {
17749 log_info ("ERROR: only the MD5 directive is currently supported\n");
17750
17751 myfree (temp_input_buf);
17752
17753 return (PARSER_SIP_AUTH_DIRECTIVE);
17754 }
17755
17756 /*
17757 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17758 */
17759
17760 uint md5_len = 0;
17761
17762 uint md5_max_len = 4 * 64;
17763
17764 uint md5_remaining_len = md5_max_len;
17765
17766 uint tmp_md5_buf[64] = { 0 };
17767
17768 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17769
17770 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17771
17772 md5_len += method_len + 1;
17773 tmp_md5_ptr += method_len + 1;
17774
17775 if (URI_prefix_len > 0)
17776 {
17777 md5_remaining_len = md5_max_len - md5_len;
17778
17779 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17780
17781 md5_len += URI_prefix_len + 1;
17782 tmp_md5_ptr += URI_prefix_len + 1;
17783 }
17784
17785 md5_remaining_len = md5_max_len - md5_len;
17786
17787 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17788
17789 md5_len += URI_resource_len;
17790 tmp_md5_ptr += URI_resource_len;
17791
17792 if (URI_suffix_len > 0)
17793 {
17794 md5_remaining_len = md5_max_len - md5_len;
17795
17796 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17797
17798 md5_len += 1 + URI_suffix_len;
17799 }
17800
17801 uint tmp_digest[4] = { 0 };
17802
17803 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17804
17805 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17806 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17807 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17808 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17809
17810 /*
17811 * esalt
17812 */
17813
17814 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17815
17816 uint esalt_len = 0;
17817
17818 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17819
17820 // there are 2 possibilities for the esalt:
17821
17822 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17823 {
17824 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17825
17826 if (esalt_len > max_esalt_len)
17827 {
17828 myfree (temp_input_buf);
17829
17830 return (PARSER_SALT_LENGTH);
17831 }
17832
17833 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17834 nonce_pos,
17835 nonce_count_pos,
17836 nonce_client_pos,
17837 qop_pos,
17838 tmp_digest[0],
17839 tmp_digest[1],
17840 tmp_digest[2],
17841 tmp_digest[3]);
17842 }
17843 else
17844 {
17845 esalt_len = 1 + nonce_len + 1 + 32;
17846
17847 if (esalt_len > max_esalt_len)
17848 {
17849 myfree (temp_input_buf);
17850
17851 return (PARSER_SALT_LENGTH);
17852 }
17853
17854 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17855 nonce_pos,
17856 tmp_digest[0],
17857 tmp_digest[1],
17858 tmp_digest[2],
17859 tmp_digest[3]);
17860 }
17861
17862 // add 0x80 to esalt
17863
17864 esalt_buf_ptr[esalt_len] = 0x80;
17865
17866 sip->esalt_len = esalt_len;
17867
17868 /*
17869 * actual salt
17870 */
17871
17872 char *sip_salt_ptr = (char *) sip->salt_buf;
17873
17874 uint salt_len = user_len + 1 + realm_len + 1;
17875
17876 uint max_salt_len = 119;
17877
17878 if (salt_len > max_salt_len)
17879 {
17880 myfree (temp_input_buf);
17881
17882 return (PARSER_SALT_LENGTH);
17883 }
17884
17885 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17886
17887 sip->salt_len = salt_len;
17888
17889 /*
17890 * fake salt (for sorting)
17891 */
17892
17893 char *salt_buf_ptr = (char *) salt->salt_buf;
17894
17895 max_salt_len = 55;
17896
17897 uint fake_salt_len = salt_len;
17898
17899 if (fake_salt_len > max_salt_len)
17900 {
17901 fake_salt_len = max_salt_len;
17902 }
17903
17904 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17905
17906 salt->salt_len = fake_salt_len;
17907
17908 /*
17909 * digest
17910 */
17911
17912 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
17913 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
17914 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
17915 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
17916
17917 digest[0] = byte_swap_32 (digest[0]);
17918 digest[1] = byte_swap_32 (digest[1]);
17919 digest[2] = byte_swap_32 (digest[2]);
17920 digest[3] = byte_swap_32 (digest[3]);
17921
17922 myfree (temp_input_buf);
17923
17924 return (PARSER_OK);
17925 }
17926
17927 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17928 {
17929 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17930
17931 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17932
17933 u32 *digest = (u32 *) hash_buf->digest;
17934
17935 salt_t *salt = hash_buf->salt;
17936
17937 // digest
17938
17939 char *digest_pos = input_buf;
17940
17941 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
17942 digest[1] = 0;
17943 digest[2] = 0;
17944 digest[3] = 0;
17945
17946 // salt
17947
17948 char *salt_buf = input_buf + 8 + 1;
17949
17950 uint salt_len = 8;
17951
17952 char *salt_buf_ptr = (char *) salt->salt_buf;
17953
17954 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17955
17956 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17957
17958 salt->salt_len = salt_len;
17959
17960 return (PARSER_OK);
17961 }
17962
17963 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17964 {
17965 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17966
17967 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17968
17969 u32 *digest = (u32 *) hash_buf->digest;
17970
17971 salt_t *salt = hash_buf->salt;
17972
17973 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17974
17975 /**
17976 * parse line
17977 */
17978
17979 char *p_buf_pos = input_buf + 4;
17980
17981 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17982
17983 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17984
17985 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
17986
17987 NumCyclesPower_pos++;
17988
17989 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17990
17991 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17992
17993 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17994
17995 salt_len_pos++;
17996
17997 char *salt_buf_pos = strchr (salt_len_pos, '$');
17998
17999 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18000
18001 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18002
18003 salt_buf_pos++;
18004
18005 char *iv_len_pos = strchr (salt_buf_pos, '$');
18006
18007 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18008
18009 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18010
18011 iv_len_pos++;
18012
18013 char *iv_buf_pos = strchr (iv_len_pos, '$');
18014
18015 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18016
18017 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18018
18019 iv_buf_pos++;
18020
18021 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18022
18023 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18024
18025 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18026
18027 crc_buf_pos++;
18028
18029 char *data_len_pos = strchr (crc_buf_pos, '$');
18030
18031 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18032
18033 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18034
18035 data_len_pos++;
18036
18037 char *unpack_size_pos = strchr (data_len_pos, '$');
18038
18039 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18040
18041 u32 data_len_len = unpack_size_pos - data_len_pos;
18042
18043 unpack_size_pos++;
18044
18045 char *data_buf_pos = strchr (unpack_size_pos, '$');
18046
18047 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18048
18049 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18050
18051 data_buf_pos++;
18052
18053 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;
18054
18055 const uint iter = atoi (NumCyclesPower_pos);
18056 const uint crc = atoi (crc_buf_pos);
18057 const uint p_buf = atoi (p_buf_pos);
18058 const uint salt_len = atoi (salt_len_pos);
18059 const uint iv_len = atoi (iv_len_pos);
18060 const uint unpack_size = atoi (unpack_size_pos);
18061 const uint data_len = atoi (data_len_pos);
18062
18063 /**
18064 * verify some data
18065 */
18066
18067 if (p_buf != 0) return (PARSER_SALT_VALUE);
18068 if (salt_len != 0) return (PARSER_SALT_VALUE);
18069
18070 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18071
18072 if (data_len > 384) return (PARSER_SALT_VALUE);
18073
18074 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18075
18076 /**
18077 * store data
18078 */
18079
18080 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18081 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18082 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18083 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18084
18085 seven_zip->iv_len = iv_len;
18086
18087 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18088
18089 seven_zip->salt_len = 0;
18090
18091 seven_zip->crc = crc;
18092
18093 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18094 {
18095 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18096
18097 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18098 }
18099
18100 seven_zip->data_len = data_len;
18101
18102 seven_zip->unpack_size = unpack_size;
18103
18104 // real salt
18105
18106 salt->salt_buf[0] = seven_zip->data_buf[0];
18107 salt->salt_buf[1] = seven_zip->data_buf[1];
18108 salt->salt_buf[2] = seven_zip->data_buf[2];
18109 salt->salt_buf[3] = seven_zip->data_buf[3];
18110
18111 salt->salt_len = 16;
18112
18113 salt->salt_sign[0] = iter;
18114
18115 salt->salt_iter = 1 << iter;
18116
18117 /**
18118 * digest
18119 */
18120
18121 digest[0] = crc;
18122 digest[1] = 0;
18123 digest[2] = 0;
18124 digest[3] = 0;
18125
18126 return (PARSER_OK);
18127 }
18128
18129 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18130 {
18131 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18132
18133 u32 *digest = (u32 *) hash_buf->digest;
18134
18135 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18136 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18137 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18138 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18139 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18140 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18141 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18142 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18143
18144 digest[0] = byte_swap_32 (digest[0]);
18145 digest[1] = byte_swap_32 (digest[1]);
18146 digest[2] = byte_swap_32 (digest[2]);
18147 digest[3] = byte_swap_32 (digest[3]);
18148 digest[4] = byte_swap_32 (digest[4]);
18149 digest[5] = byte_swap_32 (digest[5]);
18150 digest[6] = byte_swap_32 (digest[6]);
18151 digest[7] = byte_swap_32 (digest[7]);
18152
18153 return (PARSER_OK);
18154 }
18155
18156 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18157 {
18158 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18159
18160 u32 *digest = (u32 *) hash_buf->digest;
18161
18162 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18163 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18164 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18165 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18166 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18167 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18168 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18169 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18170 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18171 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18172 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18173 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18174 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18175 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18176 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18177 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18178
18179 digest[ 0] = byte_swap_32 (digest[ 0]);
18180 digest[ 1] = byte_swap_32 (digest[ 1]);
18181 digest[ 2] = byte_swap_32 (digest[ 2]);
18182 digest[ 3] = byte_swap_32 (digest[ 3]);
18183 digest[ 4] = byte_swap_32 (digest[ 4]);
18184 digest[ 5] = byte_swap_32 (digest[ 5]);
18185 digest[ 6] = byte_swap_32 (digest[ 6]);
18186 digest[ 7] = byte_swap_32 (digest[ 7]);
18187 digest[ 8] = byte_swap_32 (digest[ 8]);
18188 digest[ 9] = byte_swap_32 (digest[ 9]);
18189 digest[10] = byte_swap_32 (digest[10]);
18190 digest[11] = byte_swap_32 (digest[11]);
18191 digest[12] = byte_swap_32 (digest[12]);
18192 digest[13] = byte_swap_32 (digest[13]);
18193 digest[14] = byte_swap_32 (digest[14]);
18194 digest[15] = byte_swap_32 (digest[15]);
18195
18196 return (PARSER_OK);
18197 }
18198
18199 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18200 {
18201 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18202
18203 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18204
18205 u32 *digest = (u32 *) hash_buf->digest;
18206
18207 salt_t *salt = hash_buf->salt;
18208
18209 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18210
18211 /**
18212 * parse line
18213 */
18214
18215 // iterations
18216
18217 char *iter_pos = input_buf + 4;
18218
18219 u32 iter = atoi (iter_pos);
18220
18221 if (iter < 1) return (PARSER_SALT_ITERATION);
18222 if (iter > 999999) return (PARSER_SALT_ITERATION);
18223
18224 // first is *raw* salt
18225
18226 char *salt_pos = strchr (iter_pos, ':');
18227
18228 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18229
18230 salt_pos++;
18231
18232 char *hash_pos = strchr (salt_pos, ':');
18233
18234 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18235
18236 u32 salt_len = hash_pos - salt_pos;
18237
18238 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18239
18240 hash_pos++;
18241
18242 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18243
18244 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18245
18246 // decode salt
18247
18248 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18249
18250 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18251
18252 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18253
18254 salt_buf_ptr[salt_len + 3] = 0x01;
18255 salt_buf_ptr[salt_len + 4] = 0x80;
18256
18257 salt->salt_len = salt_len;
18258 salt->salt_iter = iter - 1;
18259
18260 // decode hash
18261
18262 u8 tmp_buf[100] = { 0 };
18263
18264 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18265
18266 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18267
18268 memcpy (digest, tmp_buf, 16);
18269
18270 // add some stuff to normal salt to make sorted happy
18271
18272 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18273 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18274 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18275 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18276 salt->salt_buf[4] = salt->salt_iter;
18277
18278 return (PARSER_OK);
18279 }
18280
18281 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18282 {
18283 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18284
18285 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18286
18287 u32 *digest = (u32 *) hash_buf->digest;
18288
18289 salt_t *salt = hash_buf->salt;
18290
18291 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18292
18293 /**
18294 * parse line
18295 */
18296
18297 // iterations
18298
18299 char *iter_pos = input_buf + 5;
18300
18301 u32 iter = atoi (iter_pos);
18302
18303 if (iter < 1) return (PARSER_SALT_ITERATION);
18304 if (iter > 999999) return (PARSER_SALT_ITERATION);
18305
18306 // first is *raw* salt
18307
18308 char *salt_pos = strchr (iter_pos, ':');
18309
18310 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18311
18312 salt_pos++;
18313
18314 char *hash_pos = strchr (salt_pos, ':');
18315
18316 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18317
18318 u32 salt_len = hash_pos - salt_pos;
18319
18320 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18321
18322 hash_pos++;
18323
18324 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18325
18326 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18327
18328 // decode salt
18329
18330 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18331
18332 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18333
18334 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18335
18336 salt_buf_ptr[salt_len + 3] = 0x01;
18337 salt_buf_ptr[salt_len + 4] = 0x80;
18338
18339 salt->salt_len = salt_len;
18340 salt->salt_iter = iter - 1;
18341
18342 // decode hash
18343
18344 u8 tmp_buf[100] = { 0 };
18345
18346 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18347
18348 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18349
18350 memcpy (digest, tmp_buf, 16);
18351
18352 digest[0] = byte_swap_32 (digest[0]);
18353 digest[1] = byte_swap_32 (digest[1]);
18354 digest[2] = byte_swap_32 (digest[2]);
18355 digest[3] = byte_swap_32 (digest[3]);
18356
18357 // add some stuff to normal salt to make sorted happy
18358
18359 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18360 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18361 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18362 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18363 salt->salt_buf[4] = salt->salt_iter;
18364
18365 return (PARSER_OK);
18366 }
18367
18368 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18369 {
18370 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18371
18372 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18373
18374 u64 *digest = (u64 *) hash_buf->digest;
18375
18376 salt_t *salt = hash_buf->salt;
18377
18378 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18379
18380 /**
18381 * parse line
18382 */
18383
18384 // iterations
18385
18386 char *iter_pos = input_buf + 7;
18387
18388 u32 iter = atoi (iter_pos);
18389
18390 if (iter < 1) return (PARSER_SALT_ITERATION);
18391 if (iter > 999999) return (PARSER_SALT_ITERATION);
18392
18393 // first is *raw* salt
18394
18395 char *salt_pos = strchr (iter_pos, ':');
18396
18397 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18398
18399 salt_pos++;
18400
18401 char *hash_pos = strchr (salt_pos, ':');
18402
18403 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18404
18405 u32 salt_len = hash_pos - salt_pos;
18406
18407 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18408
18409 hash_pos++;
18410
18411 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18412
18413 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18414
18415 // decode salt
18416
18417 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18418
18419 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18420
18421 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18422
18423 salt_buf_ptr[salt_len + 3] = 0x01;
18424 salt_buf_ptr[salt_len + 4] = 0x80;
18425
18426 salt->salt_len = salt_len;
18427 salt->salt_iter = iter - 1;
18428
18429 // decode hash
18430
18431 u8 tmp_buf[100] = { 0 };
18432
18433 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18434
18435 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18436
18437 memcpy (digest, tmp_buf, 64);
18438
18439 digest[0] = byte_swap_64 (digest[0]);
18440 digest[1] = byte_swap_64 (digest[1]);
18441 digest[2] = byte_swap_64 (digest[2]);
18442 digest[3] = byte_swap_64 (digest[3]);
18443 digest[4] = byte_swap_64 (digest[4]);
18444 digest[5] = byte_swap_64 (digest[5]);
18445 digest[6] = byte_swap_64 (digest[6]);
18446 digest[7] = byte_swap_64 (digest[7]);
18447
18448 // add some stuff to normal salt to make sorted happy
18449
18450 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18451 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18452 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18453 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18454 salt->salt_buf[4] = salt->salt_iter;
18455
18456 return (PARSER_OK);
18457 }
18458
18459 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18460 {
18461 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18462
18463 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18464
18465 uint *digest = (uint *) hash_buf->digest;
18466
18467 salt_t *salt = hash_buf->salt;
18468
18469 /**
18470 * parse line
18471 */
18472
18473 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18474
18475 char *hash_pos = strchr (salt_pos, '$');
18476
18477 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18478
18479 u32 salt_len = hash_pos - salt_pos;
18480
18481 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18482
18483 hash_pos++;
18484
18485 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18486
18487 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18488
18489 // decode hash
18490
18491 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18492 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18493 digest[ 2] = 0;
18494 digest[ 3] = 0;
18495 digest[ 4] = 0;
18496 digest[ 5] = 0;
18497 digest[ 6] = 0;
18498 digest[ 7] = 0;
18499 digest[ 8] = 0;
18500 digest[ 9] = 0;
18501 digest[10] = 0;
18502 digest[11] = 0;
18503 digest[12] = 0;
18504 digest[13] = 0;
18505 digest[14] = 0;
18506 digest[15] = 0;
18507
18508 // decode salt
18509
18510 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18511 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18512
18513 salt->salt_iter = ROUNDS_ECRYPTFS;
18514 salt->salt_len = 8;
18515
18516 return (PARSER_OK);
18517 }
18518
18519 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18520 {
18521 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18522
18523 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18524
18525 unsigned char c19 = itoa64_to_int (input_buf[19]);
18526
18527 if (c19 & 3) return (PARSER_HASH_VALUE);
18528
18529 salt_t *salt = hash_buf->salt;
18530
18531 u32 *digest = (u32 *) hash_buf->digest;
18532
18533 // iteration count
18534
18535 salt->salt_iter = itoa64_to_int (input_buf[1])
18536 | itoa64_to_int (input_buf[2]) << 6
18537 | itoa64_to_int (input_buf[3]) << 12
18538 | itoa64_to_int (input_buf[4]) << 18;
18539
18540 // set salt
18541
18542 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18543 | itoa64_to_int (input_buf[6]) << 6
18544 | itoa64_to_int (input_buf[7]) << 12
18545 | itoa64_to_int (input_buf[8]) << 18;
18546
18547 salt->salt_len = 4;
18548
18549 u8 tmp_buf[100] = { 0 };
18550
18551 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18552
18553 memcpy (digest, tmp_buf, 8);
18554
18555 uint tt;
18556
18557 IP (digest[0], digest[1], tt);
18558
18559 digest[0] = rotr32 (digest[0], 31);
18560 digest[1] = rotr32 (digest[1], 31);
18561 digest[2] = 0;
18562 digest[3] = 0;
18563
18564 return (PARSER_OK);
18565 }
18566
18567 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18568 {
18569 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18570
18571 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18572
18573 u32 *digest = (u32 *) hash_buf->digest;
18574
18575 salt_t *salt = hash_buf->salt;
18576
18577 /**
18578 * parse line
18579 */
18580
18581 char *type_pos = input_buf + 6 + 1;
18582
18583 char *salt_pos = strchr (type_pos, '*');
18584
18585 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18586
18587 u32 type_len = salt_pos - type_pos;
18588
18589 if (type_len != 1) return (PARSER_SALT_LENGTH);
18590
18591 salt_pos++;
18592
18593 char *crypted_pos = strchr (salt_pos, '*');
18594
18595 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18596
18597 u32 salt_len = crypted_pos - salt_pos;
18598
18599 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18600
18601 crypted_pos++;
18602
18603 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18604
18605 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18606
18607 /**
18608 * copy data
18609 */
18610
18611 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18612 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18613
18614 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18615 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18616
18617 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18618 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18619 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18620 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18621
18622 salt->salt_len = 24;
18623 salt->salt_iter = ROUNDS_RAR3;
18624
18625 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18626 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18627
18628 digest[0] = 0xc43d7b00;
18629 digest[1] = 0x40070000;
18630 digest[2] = 0;
18631 digest[3] = 0;
18632
18633 return (PARSER_OK);
18634 }
18635
18636 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18637 {
18638 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18639
18640 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18641
18642 u32 *digest = (u32 *) hash_buf->digest;
18643
18644 salt_t *salt = hash_buf->salt;
18645
18646 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18647
18648 /**
18649 * parse line
18650 */
18651
18652 char *param0_pos = input_buf + 1 + 4 + 1;
18653
18654 char *param1_pos = strchr (param0_pos, '$');
18655
18656 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18657
18658 u32 param0_len = param1_pos - param0_pos;
18659
18660 param1_pos++;
18661
18662 char *param2_pos = strchr (param1_pos, '$');
18663
18664 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18665
18666 u32 param1_len = param2_pos - param1_pos;
18667
18668 param2_pos++;
18669
18670 char *param3_pos = strchr (param2_pos, '$');
18671
18672 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18673
18674 u32 param2_len = param3_pos - param2_pos;
18675
18676 param3_pos++;
18677
18678 char *param4_pos = strchr (param3_pos, '$');
18679
18680 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18681
18682 u32 param3_len = param4_pos - param3_pos;
18683
18684 param4_pos++;
18685
18686 char *param5_pos = strchr (param4_pos, '$');
18687
18688 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18689
18690 u32 param4_len = param5_pos - param4_pos;
18691
18692 param5_pos++;
18693
18694 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18695
18696 char *salt_buf = param1_pos;
18697 char *iv = param3_pos;
18698 char *pswcheck = param5_pos;
18699
18700 const uint salt_len = atoi (param0_pos);
18701 const uint iterations = atoi (param2_pos);
18702 const uint pswcheck_len = atoi (param4_pos);
18703
18704 /**
18705 * verify some data
18706 */
18707
18708 if (param1_len != 32) return (PARSER_SALT_VALUE);
18709 if (param3_len != 32) return (PARSER_SALT_VALUE);
18710 if (param5_len != 16) return (PARSER_SALT_VALUE);
18711
18712 if (salt_len != 16) return (PARSER_SALT_VALUE);
18713 if (iterations == 0) return (PARSER_SALT_VALUE);
18714 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18715
18716 /**
18717 * store data
18718 */
18719
18720 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18721 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18722 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18723 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18724
18725 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18726 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18727 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18728 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18729
18730 salt->salt_len = 16;
18731
18732 salt->salt_sign[0] = iterations;
18733
18734 salt->salt_iter = ((1 << iterations) + 32) - 1;
18735
18736 /**
18737 * digest buf
18738 */
18739
18740 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18741 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18742 digest[2] = 0;
18743 digest[3] = 0;
18744
18745 return (PARSER_OK);
18746 }
18747
18748 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18749 {
18750 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
18751
18752 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18753
18754 u32 *digest = (u32 *) hash_buf->digest;
18755
18756 salt_t *salt = hash_buf->salt;
18757
18758 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
18759
18760 /**
18761 * parse line
18762 */
18763
18764 /* Skip '$' */
18765 char *account_pos = input_buf + 11 + 1;
18766
18767 char *data_pos;
18768
18769 uint data_len;
18770
18771 if (account_pos[0] == '*')
18772 {
18773 account_pos++;
18774
18775 data_pos = strchr (account_pos, '*');
18776
18777 /* Skip '*' */
18778 data_pos++;
18779
18780 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18781
18782 uint account_len = data_pos - account_pos + 1;
18783
18784 if (account_len >= 512) return (PARSER_SALT_LENGTH);
18785
18786 /* Skip '$' */
18787 data_pos++;
18788
18789 data_len = input_len - 11 - 1 - account_len - 2;
18790
18791 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
18792 }
18793 else
18794 {
18795 /* assume $krb5tgs$23$checksum$edata2 */
18796 data_pos = account_pos;
18797
18798 memcpy (krb5tgs->account_info, "**", 3);
18799
18800 data_len = input_len - 11 - 1 - 1;
18801 }
18802
18803 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
18804
18805 char *checksum_ptr = (char *) krb5tgs->checksum;
18806
18807 for (uint i = 0; i < 16 * 2; i += 2)
18808 {
18809 const char p0 = data_pos[i + 0];
18810 const char p1 = data_pos[i + 1];
18811
18812 *checksum_ptr++ = hex_convert (p1) << 0
18813 | hex_convert (p0) << 4;
18814 }
18815
18816 char *edata_ptr = (char *) krb5tgs->edata2;
18817
18818 /* skip '$' */
18819 for (uint i = 16 * 2 + 1; i < input_len; i += 2)
18820 {
18821 const char p0 = data_pos[i + 0];
18822 const char p1 = data_pos[i + 1];
18823 *edata_ptr++ = hex_convert (p1) << 0
18824 | hex_convert (p0) << 4;
18825 }
18826
18827 /* this is needed for hmac_md5 */
18828 *edata_ptr++ = 0x80;
18829
18830 krb5tgs->edata2_len = (data_len - 32) / 2 ;
18831
18832 salt->salt_buf[0] = krb5tgs->checksum[0];
18833 salt->salt_buf[1] = krb5tgs->checksum[1];
18834 salt->salt_buf[2] = krb5tgs->checksum[2];
18835 salt->salt_buf[3] = krb5tgs->checksum[3];
18836
18837 salt->salt_len = 32;
18838
18839 digest[0] = krb5tgs->checksum[0];
18840 digest[1] = krb5tgs->checksum[1];
18841 digest[2] = krb5tgs->checksum[2];
18842 digest[3] = krb5tgs->checksum[3];
18843
18844 return (PARSER_OK);
18845 }
18846
18847 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18848 {
18849 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18850
18851 u32 *digest = (u32 *) hash_buf->digest;
18852
18853 salt_t *salt = hash_buf->salt;
18854
18855 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18856 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18857 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18858 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18859 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18860 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18861 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18862 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18863
18864 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18865
18866 uint salt_len = input_len - 64 - 1;
18867
18868 char *salt_buf = input_buf + 64 + 1;
18869
18870 char *salt_buf_ptr = (char *) salt->salt_buf;
18871
18872 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18873
18874 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18875
18876 salt->salt_len = salt_len;
18877
18878 /**
18879 * we can precompute the first sha256 transform
18880 */
18881
18882 uint w[16] = { 0 };
18883
18884 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18885 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18886 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18887 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18888 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18889 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18890 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18891 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18892 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18893 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18894 w[10] = byte_swap_32 (salt->salt_buf[10]);
18895 w[11] = byte_swap_32 (salt->salt_buf[11]);
18896 w[12] = byte_swap_32 (salt->salt_buf[12]);
18897 w[13] = byte_swap_32 (salt->salt_buf[13]);
18898 w[14] = byte_swap_32 (salt->salt_buf[14]);
18899 w[15] = byte_swap_32 (salt->salt_buf[15]);
18900
18901 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
18902
18903 sha256_64 (w, pc256);
18904
18905 salt->salt_buf_pc[0] = pc256[0];
18906 salt->salt_buf_pc[1] = pc256[1];
18907 salt->salt_buf_pc[2] = pc256[2];
18908 salt->salt_buf_pc[3] = pc256[3];
18909 salt->salt_buf_pc[4] = pc256[4];
18910 salt->salt_buf_pc[5] = pc256[5];
18911 salt->salt_buf_pc[6] = pc256[6];
18912 salt->salt_buf_pc[7] = pc256[7];
18913
18914 digest[0] -= pc256[0];
18915 digest[1] -= pc256[1];
18916 digest[2] -= pc256[2];
18917 digest[3] -= pc256[3];
18918 digest[4] -= pc256[4];
18919 digest[5] -= pc256[5];
18920 digest[6] -= pc256[6];
18921 digest[7] -= pc256[7];
18922
18923 return (PARSER_OK);
18924 }
18925
18926 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18927 {
18928 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18929
18930 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18931
18932 u32 *digest = (u32 *) hash_buf->digest;
18933
18934 salt_t *salt = hash_buf->salt;
18935
18936 /**
18937 * parse line
18938 */
18939
18940 char *data_len_pos = input_buf + 1 + 10 + 1;
18941
18942 char *data_buf_pos = strchr (data_len_pos, '$');
18943
18944 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18945
18946 u32 data_len_len = data_buf_pos - data_len_pos;
18947
18948 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18949 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18950
18951 data_buf_pos++;
18952
18953 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18954
18955 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18956
18957 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18958
18959 u32 data_len = atoi (data_len_pos);
18960
18961 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18962
18963 /**
18964 * salt
18965 */
18966
18967 char *salt_pos = data_buf_pos;
18968
18969 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18970 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18971 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
18972 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
18973
18974 // this is actually the CT, which is also the hash later (if matched)
18975
18976 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
18977 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
18978 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
18979 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
18980
18981 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18982
18983 salt->salt_iter = 10 - 1;
18984
18985 /**
18986 * digest buf
18987 */
18988
18989 digest[0] = salt->salt_buf[4];
18990 digest[1] = salt->salt_buf[5];
18991 digest[2] = salt->salt_buf[6];
18992 digest[3] = salt->salt_buf[7];
18993
18994 return (PARSER_OK);
18995 }
18996
18997 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18998 {
18999 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
19000
19001 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19002
19003 u32 *digest = (u32 *) hash_buf->digest;
19004
19005 salt_t *salt = hash_buf->salt;
19006
19007 /**
19008 * parse line
19009 */
19010
19011 char *salt_pos = input_buf + 11 + 1;
19012
19013 char *iter_pos = strchr (salt_pos, ',');
19014
19015 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19016
19017 u32 salt_len = iter_pos - salt_pos;
19018
19019 if (salt_len != 20) return (PARSER_SALT_LENGTH);
19020
19021 iter_pos++;
19022
19023 char *hash_pos = strchr (iter_pos, ',');
19024
19025 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19026
19027 u32 iter_len = hash_pos - iter_pos;
19028
19029 if (iter_len > 5) return (PARSER_SALT_LENGTH);
19030
19031 hash_pos++;
19032
19033 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
19034
19035 if (hash_len != 64) return (PARSER_HASH_LENGTH);
19036
19037 /**
19038 * salt
19039 */
19040
19041 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
19042 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
19043 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
19044 salt->salt_buf[3] = 0x00018000;
19045
19046 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19047 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19048 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
19049 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
19050
19051 salt->salt_len = salt_len / 2;
19052
19053 salt->salt_iter = atoi (iter_pos) - 1;
19054
19055 /**
19056 * digest buf
19057 */
19058
19059 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19060 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19061 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19062 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19063 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19064 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19065 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19066 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19067
19068 return (PARSER_OK);
19069 }
19070
19071 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19072 {
19073 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
19074
19075 u32 *digest = (u32 *) hash_buf->digest;
19076
19077 salt_t *salt = hash_buf->salt;
19078
19079 /**
19080 * parse line
19081 */
19082
19083 char *hash_pos = input_buf + 64;
19084 char *salt1_pos = input_buf + 128;
19085 char *salt2_pos = input_buf;
19086
19087 /**
19088 * salt
19089 */
19090
19091 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
19092 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
19093 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
19094 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
19095
19096 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
19097 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
19098 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
19099 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
19100
19101 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
19102 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
19103 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
19104 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
19105
19106 salt->salt_len = 48;
19107
19108 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
19109
19110 /**
19111 * digest buf
19112 */
19113
19114 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19115 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19116 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19117 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19118 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19119 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19120 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19121 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19122
19123 return (PARSER_OK);
19124 }
19125
19126 /**
19127 * parallel running threads
19128 */
19129
19130 #ifdef WIN
19131
19132 BOOL WINAPI sigHandler_default (DWORD sig)
19133 {
19134 switch (sig)
19135 {
19136 case CTRL_CLOSE_EVENT:
19137
19138 /*
19139 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
19140 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
19141 * function otherwise it is too late (e.g. after returning from this function)
19142 */
19143
19144 myabort ();
19145
19146 SetConsoleCtrlHandler (NULL, TRUE);
19147
19148 hc_sleep (10);
19149
19150 return TRUE;
19151
19152 case CTRL_C_EVENT:
19153 case CTRL_LOGOFF_EVENT:
19154 case CTRL_SHUTDOWN_EVENT:
19155
19156 myabort ();
19157
19158 SetConsoleCtrlHandler (NULL, TRUE);
19159
19160 return TRUE;
19161 }
19162
19163 return FALSE;
19164 }
19165
19166 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19167 {
19168 switch (sig)
19169 {
19170 case CTRL_CLOSE_EVENT:
19171
19172 myabort ();
19173
19174 SetConsoleCtrlHandler (NULL, TRUE);
19175
19176 hc_sleep (10);
19177
19178 return TRUE;
19179
19180 case CTRL_C_EVENT:
19181 case CTRL_LOGOFF_EVENT:
19182 case CTRL_SHUTDOWN_EVENT:
19183
19184 myquit ();
19185
19186 SetConsoleCtrlHandler (NULL, TRUE);
19187
19188 return TRUE;
19189 }
19190
19191 return FALSE;
19192 }
19193
19194 void hc_signal (BOOL WINAPI (callback) (DWORD))
19195 {
19196 if (callback == NULL)
19197 {
19198 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19199 }
19200 else
19201 {
19202 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19203 }
19204 }
19205
19206 #else
19207
19208 void sigHandler_default (int sig)
19209 {
19210 myabort ();
19211
19212 signal (sig, NULL);
19213 }
19214
19215 void sigHandler_benchmark (int sig)
19216 {
19217 myquit ();
19218
19219 signal (sig, NULL);
19220 }
19221
19222 void hc_signal (void (callback) (int))
19223 {
19224 if (callback == NULL) callback = SIG_DFL;
19225
19226 signal (SIGINT, callback);
19227 signal (SIGTERM, callback);
19228 signal (SIGABRT, callback);
19229 }
19230
19231 #endif
19232
19233 void status_display ();
19234
19235 void *thread_keypress (void *p)
19236 {
19237 int benchmark = *((int *) p);
19238
19239 uint quiet = data.quiet;
19240
19241 tty_break();
19242
19243 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19244 {
19245 int ch = tty_getchar();
19246
19247 if (ch == -1) break;
19248
19249 if (ch == 0) continue;
19250
19251 #ifdef _POSIX
19252 if (ch != '\n')
19253 #endif
19254
19255 hc_thread_mutex_lock (mux_display);
19256
19257 log_info ("");
19258
19259 switch (ch)
19260 {
19261 case 's':
19262 case '\n':
19263
19264 log_info ("");
19265
19266 status_display ();
19267
19268 log_info ("");
19269
19270 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19271 if (quiet == 0) fflush (stdout);
19272
19273 break;
19274
19275 case 'b':
19276
19277 log_info ("");
19278
19279 bypass ();
19280
19281 log_info ("");
19282
19283 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19284 if (quiet == 0) fflush (stdout);
19285
19286 break;
19287
19288 case 'p':
19289
19290 log_info ("");
19291
19292 SuspendThreads ();
19293
19294 log_info ("");
19295
19296 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19297 if (quiet == 0) fflush (stdout);
19298
19299 break;
19300
19301 case 'r':
19302
19303 log_info ("");
19304
19305 ResumeThreads ();
19306
19307 log_info ("");
19308
19309 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19310 if (quiet == 0) fflush (stdout);
19311
19312 break;
19313
19314 case 'c':
19315
19316 log_info ("");
19317
19318 if (benchmark == 1) break;
19319
19320 stop_at_checkpoint ();
19321
19322 log_info ("");
19323
19324 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19325 if (quiet == 0) fflush (stdout);
19326
19327 break;
19328
19329 case 'q':
19330
19331 log_info ("");
19332
19333 if (benchmark == 1)
19334 {
19335 myquit ();
19336 }
19337 else
19338 {
19339 myabort ();
19340 }
19341
19342 break;
19343 }
19344
19345 hc_thread_mutex_unlock (mux_display);
19346 }
19347
19348 tty_fix();
19349
19350 return (p);
19351 }
19352
19353 /**
19354 * rules common
19355 */
19356
19357 bool class_num (const u8 c)
19358 {
19359 return ((c >= '0') && (c <= '9'));
19360 }
19361
19362 bool class_lower (const u8 c)
19363 {
19364 return ((c >= 'a') && (c <= 'z'));
19365 }
19366
19367 bool class_upper (const u8 c)
19368 {
19369 return ((c >= 'A') && (c <= 'Z'));
19370 }
19371
19372 bool class_alpha (const u8 c)
19373 {
19374 return (class_lower (c) || class_upper (c));
19375 }
19376
19377 int conv_ctoi (const u8 c)
19378 {
19379 if (class_num (c))
19380 {
19381 return c - '0';
19382 }
19383 else if (class_upper (c))
19384 {
19385 return c - 'A' + 10;
19386 }
19387
19388 return -1;
19389 }
19390
19391 int conv_itoc (const u8 c)
19392 {
19393 if (c < 10)
19394 {
19395 return c + '0';
19396 }
19397 else if (c < 37)
19398 {
19399 return c + 'A' - 10;
19400 }
19401
19402 return -1;
19403 }
19404
19405 /**
19406 * device rules
19407 */
19408
19409 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19410 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19411 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19412 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19413 #define MAX_KERNEL_RULES 255
19414 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19415 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19416 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19417
19418 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19419 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19420 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19421 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19422
19423 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19424 {
19425 uint rule_pos;
19426 uint rule_cnt;
19427
19428 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19429 {
19430 switch (rule_buf[rule_pos])
19431 {
19432 case ' ':
19433 rule_cnt--;
19434 break;
19435
19436 case RULE_OP_MANGLE_NOOP:
19437 SET_NAME (rule, rule_buf[rule_pos]);
19438 break;
19439
19440 case RULE_OP_MANGLE_LREST:
19441 SET_NAME (rule, rule_buf[rule_pos]);
19442 break;
19443
19444 case RULE_OP_MANGLE_UREST:
19445 SET_NAME (rule, rule_buf[rule_pos]);
19446 break;
19447
19448 case RULE_OP_MANGLE_LREST_UFIRST:
19449 SET_NAME (rule, rule_buf[rule_pos]);
19450 break;
19451
19452 case RULE_OP_MANGLE_UREST_LFIRST:
19453 SET_NAME (rule, rule_buf[rule_pos]);
19454 break;
19455
19456 case RULE_OP_MANGLE_TREST:
19457 SET_NAME (rule, rule_buf[rule_pos]);
19458 break;
19459
19460 case RULE_OP_MANGLE_TOGGLE_AT:
19461 SET_NAME (rule, rule_buf[rule_pos]);
19462 SET_P0_CONV (rule, rule_buf[rule_pos]);
19463 break;
19464
19465 case RULE_OP_MANGLE_REVERSE:
19466 SET_NAME (rule, rule_buf[rule_pos]);
19467 break;
19468
19469 case RULE_OP_MANGLE_DUPEWORD:
19470 SET_NAME (rule, rule_buf[rule_pos]);
19471 break;
19472
19473 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19474 SET_NAME (rule, rule_buf[rule_pos]);
19475 SET_P0_CONV (rule, rule_buf[rule_pos]);
19476 break;
19477
19478 case RULE_OP_MANGLE_REFLECT:
19479 SET_NAME (rule, rule_buf[rule_pos]);
19480 break;
19481
19482 case RULE_OP_MANGLE_ROTATE_LEFT:
19483 SET_NAME (rule, rule_buf[rule_pos]);
19484 break;
19485
19486 case RULE_OP_MANGLE_ROTATE_RIGHT:
19487 SET_NAME (rule, rule_buf[rule_pos]);
19488 break;
19489
19490 case RULE_OP_MANGLE_APPEND:
19491 SET_NAME (rule, rule_buf[rule_pos]);
19492 SET_P0 (rule, rule_buf[rule_pos]);
19493 break;
19494
19495 case RULE_OP_MANGLE_PREPEND:
19496 SET_NAME (rule, rule_buf[rule_pos]);
19497 SET_P0 (rule, rule_buf[rule_pos]);
19498 break;
19499
19500 case RULE_OP_MANGLE_DELETE_FIRST:
19501 SET_NAME (rule, rule_buf[rule_pos]);
19502 break;
19503
19504 case RULE_OP_MANGLE_DELETE_LAST:
19505 SET_NAME (rule, rule_buf[rule_pos]);
19506 break;
19507
19508 case RULE_OP_MANGLE_DELETE_AT:
19509 SET_NAME (rule, rule_buf[rule_pos]);
19510 SET_P0_CONV (rule, rule_buf[rule_pos]);
19511 break;
19512
19513 case RULE_OP_MANGLE_EXTRACT:
19514 SET_NAME (rule, rule_buf[rule_pos]);
19515 SET_P0_CONV (rule, rule_buf[rule_pos]);
19516 SET_P1_CONV (rule, rule_buf[rule_pos]);
19517 break;
19518
19519 case RULE_OP_MANGLE_OMIT:
19520 SET_NAME (rule, rule_buf[rule_pos]);
19521 SET_P0_CONV (rule, rule_buf[rule_pos]);
19522 SET_P1_CONV (rule, rule_buf[rule_pos]);
19523 break;
19524
19525 case RULE_OP_MANGLE_INSERT:
19526 SET_NAME (rule, rule_buf[rule_pos]);
19527 SET_P0_CONV (rule, rule_buf[rule_pos]);
19528 SET_P1 (rule, rule_buf[rule_pos]);
19529 break;
19530
19531 case RULE_OP_MANGLE_OVERSTRIKE:
19532 SET_NAME (rule, rule_buf[rule_pos]);
19533 SET_P0_CONV (rule, rule_buf[rule_pos]);
19534 SET_P1 (rule, rule_buf[rule_pos]);
19535 break;
19536
19537 case RULE_OP_MANGLE_TRUNCATE_AT:
19538 SET_NAME (rule, rule_buf[rule_pos]);
19539 SET_P0_CONV (rule, rule_buf[rule_pos]);
19540 break;
19541
19542 case RULE_OP_MANGLE_REPLACE:
19543 SET_NAME (rule, rule_buf[rule_pos]);
19544 SET_P0 (rule, rule_buf[rule_pos]);
19545 SET_P1 (rule, rule_buf[rule_pos]);
19546 break;
19547
19548 case RULE_OP_MANGLE_PURGECHAR:
19549 return (-1);
19550 break;
19551
19552 case RULE_OP_MANGLE_TOGGLECASE_REC:
19553 return (-1);
19554 break;
19555
19556 case RULE_OP_MANGLE_DUPECHAR_FIRST:
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_DUPECHAR_LAST:
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_DUPECHAR_ALL:
19567 SET_NAME (rule, rule_buf[rule_pos]);
19568 break;
19569
19570 case RULE_OP_MANGLE_SWITCH_FIRST:
19571 SET_NAME (rule, rule_buf[rule_pos]);
19572 break;
19573
19574 case RULE_OP_MANGLE_SWITCH_LAST:
19575 SET_NAME (rule, rule_buf[rule_pos]);
19576 break;
19577
19578 case RULE_OP_MANGLE_SWITCH_AT:
19579 SET_NAME (rule, rule_buf[rule_pos]);
19580 SET_P0_CONV (rule, rule_buf[rule_pos]);
19581 SET_P1_CONV (rule, rule_buf[rule_pos]);
19582 break;
19583
19584 case RULE_OP_MANGLE_CHR_SHIFTL:
19585 SET_NAME (rule, rule_buf[rule_pos]);
19586 SET_P0_CONV (rule, rule_buf[rule_pos]);
19587 break;
19588
19589 case RULE_OP_MANGLE_CHR_SHIFTR:
19590 SET_NAME (rule, rule_buf[rule_pos]);
19591 SET_P0_CONV (rule, rule_buf[rule_pos]);
19592 break;
19593
19594 case RULE_OP_MANGLE_CHR_INCR:
19595 SET_NAME (rule, rule_buf[rule_pos]);
19596 SET_P0_CONV (rule, rule_buf[rule_pos]);
19597 break;
19598
19599 case RULE_OP_MANGLE_CHR_DECR:
19600 SET_NAME (rule, rule_buf[rule_pos]);
19601 SET_P0_CONV (rule, rule_buf[rule_pos]);
19602 break;
19603
19604 case RULE_OP_MANGLE_REPLACE_NP1:
19605 SET_NAME (rule, rule_buf[rule_pos]);
19606 SET_P0_CONV (rule, rule_buf[rule_pos]);
19607 break;
19608
19609 case RULE_OP_MANGLE_REPLACE_NM1:
19610 SET_NAME (rule, rule_buf[rule_pos]);
19611 SET_P0_CONV (rule, rule_buf[rule_pos]);
19612 break;
19613
19614 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19615 SET_NAME (rule, rule_buf[rule_pos]);
19616 SET_P0_CONV (rule, rule_buf[rule_pos]);
19617 break;
19618
19619 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19620 SET_NAME (rule, rule_buf[rule_pos]);
19621 SET_P0_CONV (rule, rule_buf[rule_pos]);
19622 break;
19623
19624 case RULE_OP_MANGLE_TITLE:
19625 SET_NAME (rule, rule_buf[rule_pos]);
19626 break;
19627
19628 default:
19629 return (-1);
19630 break;
19631 }
19632 }
19633
19634 if (rule_pos < rule_len) return (-1);
19635
19636 return (0);
19637 }
19638
19639 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19640 {
19641 uint rule_cnt;
19642 uint rule_pos;
19643 uint rule_len = BUFSIZ - 1; // maximum possible len
19644
19645 char rule_cmd;
19646
19647 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19648 {
19649 GET_NAME (rule);
19650
19651 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19652
19653 switch (rule_cmd)
19654 {
19655 case RULE_OP_MANGLE_NOOP:
19656 rule_buf[rule_pos] = rule_cmd;
19657 break;
19658
19659 case RULE_OP_MANGLE_LREST:
19660 rule_buf[rule_pos] = rule_cmd;
19661 break;
19662
19663 case RULE_OP_MANGLE_UREST:
19664 rule_buf[rule_pos] = rule_cmd;
19665 break;
19666
19667 case RULE_OP_MANGLE_LREST_UFIRST:
19668 rule_buf[rule_pos] = rule_cmd;
19669 break;
19670
19671 case RULE_OP_MANGLE_UREST_LFIRST:
19672 rule_buf[rule_pos] = rule_cmd;
19673 break;
19674
19675 case RULE_OP_MANGLE_TREST:
19676 rule_buf[rule_pos] = rule_cmd;
19677 break;
19678
19679 case RULE_OP_MANGLE_TOGGLE_AT:
19680 rule_buf[rule_pos] = rule_cmd;
19681 GET_P0_CONV (rule);
19682 break;
19683
19684 case RULE_OP_MANGLE_REVERSE:
19685 rule_buf[rule_pos] = rule_cmd;
19686 break;
19687
19688 case RULE_OP_MANGLE_DUPEWORD:
19689 rule_buf[rule_pos] = rule_cmd;
19690 break;
19691
19692 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19693 rule_buf[rule_pos] = rule_cmd;
19694 GET_P0_CONV (rule);
19695 break;
19696
19697 case RULE_OP_MANGLE_REFLECT:
19698 rule_buf[rule_pos] = rule_cmd;
19699 break;
19700
19701 case RULE_OP_MANGLE_ROTATE_LEFT:
19702 rule_buf[rule_pos] = rule_cmd;
19703 break;
19704
19705 case RULE_OP_MANGLE_ROTATE_RIGHT:
19706 rule_buf[rule_pos] = rule_cmd;
19707 break;
19708
19709 case RULE_OP_MANGLE_APPEND:
19710 rule_buf[rule_pos] = rule_cmd;
19711 GET_P0 (rule);
19712 break;
19713
19714 case RULE_OP_MANGLE_PREPEND:
19715 rule_buf[rule_pos] = rule_cmd;
19716 GET_P0 (rule);
19717 break;
19718
19719 case RULE_OP_MANGLE_DELETE_FIRST:
19720 rule_buf[rule_pos] = rule_cmd;
19721 break;
19722
19723 case RULE_OP_MANGLE_DELETE_LAST:
19724 rule_buf[rule_pos] = rule_cmd;
19725 break;
19726
19727 case RULE_OP_MANGLE_DELETE_AT:
19728 rule_buf[rule_pos] = rule_cmd;
19729 GET_P0_CONV (rule);
19730 break;
19731
19732 case RULE_OP_MANGLE_EXTRACT:
19733 rule_buf[rule_pos] = rule_cmd;
19734 GET_P0_CONV (rule);
19735 GET_P1_CONV (rule);
19736 break;
19737
19738 case RULE_OP_MANGLE_OMIT:
19739 rule_buf[rule_pos] = rule_cmd;
19740 GET_P0_CONV (rule);
19741 GET_P1_CONV (rule);
19742 break;
19743
19744 case RULE_OP_MANGLE_INSERT:
19745 rule_buf[rule_pos] = rule_cmd;
19746 GET_P0_CONV (rule);
19747 GET_P1 (rule);
19748 break;
19749
19750 case RULE_OP_MANGLE_OVERSTRIKE:
19751 rule_buf[rule_pos] = rule_cmd;
19752 GET_P0_CONV (rule);
19753 GET_P1 (rule);
19754 break;
19755
19756 case RULE_OP_MANGLE_TRUNCATE_AT:
19757 rule_buf[rule_pos] = rule_cmd;
19758 GET_P0_CONV (rule);
19759 break;
19760
19761 case RULE_OP_MANGLE_REPLACE:
19762 rule_buf[rule_pos] = rule_cmd;
19763 GET_P0 (rule);
19764 GET_P1 (rule);
19765 break;
19766
19767 case RULE_OP_MANGLE_PURGECHAR:
19768 return (-1);
19769 break;
19770
19771 case RULE_OP_MANGLE_TOGGLECASE_REC:
19772 return (-1);
19773 break;
19774
19775 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19776 rule_buf[rule_pos] = rule_cmd;
19777 GET_P0_CONV (rule);
19778 break;
19779
19780 case RULE_OP_MANGLE_DUPECHAR_LAST:
19781 rule_buf[rule_pos] = rule_cmd;
19782 GET_P0_CONV (rule);
19783 break;
19784
19785 case RULE_OP_MANGLE_DUPECHAR_ALL:
19786 rule_buf[rule_pos] = rule_cmd;
19787 break;
19788
19789 case RULE_OP_MANGLE_SWITCH_FIRST:
19790 rule_buf[rule_pos] = rule_cmd;
19791 break;
19792
19793 case RULE_OP_MANGLE_SWITCH_LAST:
19794 rule_buf[rule_pos] = rule_cmd;
19795 break;
19796
19797 case RULE_OP_MANGLE_SWITCH_AT:
19798 rule_buf[rule_pos] = rule_cmd;
19799 GET_P0_CONV (rule);
19800 GET_P1_CONV (rule);
19801 break;
19802
19803 case RULE_OP_MANGLE_CHR_SHIFTL:
19804 rule_buf[rule_pos] = rule_cmd;
19805 GET_P0_CONV (rule);
19806 break;
19807
19808 case RULE_OP_MANGLE_CHR_SHIFTR:
19809 rule_buf[rule_pos] = rule_cmd;
19810 GET_P0_CONV (rule);
19811 break;
19812
19813 case RULE_OP_MANGLE_CHR_INCR:
19814 rule_buf[rule_pos] = rule_cmd;
19815 GET_P0_CONV (rule);
19816 break;
19817
19818 case RULE_OP_MANGLE_CHR_DECR:
19819 rule_buf[rule_pos] = rule_cmd;
19820 GET_P0_CONV (rule);
19821 break;
19822
19823 case RULE_OP_MANGLE_REPLACE_NP1:
19824 rule_buf[rule_pos] = rule_cmd;
19825 GET_P0_CONV (rule);
19826 break;
19827
19828 case RULE_OP_MANGLE_REPLACE_NM1:
19829 rule_buf[rule_pos] = rule_cmd;
19830 GET_P0_CONV (rule);
19831 break;
19832
19833 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19834 rule_buf[rule_pos] = rule_cmd;
19835 GET_P0_CONV (rule);
19836 break;
19837
19838 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19839 rule_buf[rule_pos] = rule_cmd;
19840 GET_P0_CONV (rule);
19841 break;
19842
19843 case RULE_OP_MANGLE_TITLE:
19844 rule_buf[rule_pos] = rule_cmd;
19845 break;
19846
19847 case 0:
19848 return rule_pos - 1;
19849 break;
19850
19851 default:
19852 return (-1);
19853 break;
19854 }
19855 }
19856
19857 if (rule_cnt > 0)
19858 {
19859 return rule_pos;
19860 }
19861
19862 return (-1);
19863 }
19864
19865 /**
19866 * CPU rules : this is from hashcat sources, cpu based rules
19867 */
19868
19869 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19870 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19871
19872 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19873 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19874 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19875
19876 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19877 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19878 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19879
19880 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19881 {
19882 int pos;
19883
19884 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19885
19886 return (arr_len);
19887 }
19888
19889 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19890 {
19891 int pos;
19892
19893 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19894
19895 return (arr_len);
19896 }
19897
19898 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19899 {
19900 int pos;
19901
19902 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19903
19904 return (arr_len);
19905 }
19906
19907 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19908 {
19909 int l;
19910 int r;
19911
19912 for (l = 0; l < arr_len; l++)
19913 {
19914 r = arr_len - 1 - l;
19915
19916 if (l >= r) break;
19917
19918 MANGLE_SWITCH (arr, l, r);
19919 }
19920
19921 return (arr_len);
19922 }
19923
19924 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19925 {
19926 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19927
19928 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19929
19930 return (arr_len * 2);
19931 }
19932
19933 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19934 {
19935 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19936
19937 int orig_len = arr_len;
19938
19939 int i;
19940
19941 for (i = 0; i < times; i++)
19942 {
19943 memcpy (&arr[arr_len], arr, orig_len);
19944
19945 arr_len += orig_len;
19946 }
19947
19948 return (arr_len);
19949 }
19950
19951 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19952 {
19953 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19954
19955 mangle_double (arr, arr_len);
19956
19957 mangle_reverse (arr + arr_len, arr_len);
19958
19959 return (arr_len * 2);
19960 }
19961
19962 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19963 {
19964 int l;
19965 int r;
19966
19967 for (l = 0, r = arr_len - 1; r > 0; r--)
19968 {
19969 MANGLE_SWITCH (arr, l, r);
19970 }
19971
19972 return (arr_len);
19973 }
19974
19975 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19976 {
19977 int l;
19978 int r;
19979
19980 for (l = 0, r = arr_len - 1; l < r; l++)
19981 {
19982 MANGLE_SWITCH (arr, l, r);
19983 }
19984
19985 return (arr_len);
19986 }
19987
19988 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19989 {
19990 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19991
19992 arr[arr_len] = c;
19993
19994 return (arr_len + 1);
19995 }
19996
19997 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19998 {
19999 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20000
20001 int arr_pos;
20002
20003 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20004 {
20005 arr[arr_pos + 1] = arr[arr_pos];
20006 }
20007
20008 arr[0] = c;
20009
20010 return (arr_len + 1);
20011 }
20012
20013 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
20014 {
20015 if (upos >= arr_len) return (arr_len);
20016
20017 int arr_pos;
20018
20019 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
20020 {
20021 arr[arr_pos] = arr[arr_pos + 1];
20022 }
20023
20024 return (arr_len - 1);
20025 }
20026
20027 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20028 {
20029 if (upos >= arr_len) return (arr_len);
20030
20031 if ((upos + ulen) > arr_len) return (arr_len);
20032
20033 int arr_pos;
20034
20035 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
20036 {
20037 arr[arr_pos] = arr[upos + arr_pos];
20038 }
20039
20040 return (ulen);
20041 }
20042
20043 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20044 {
20045 if (upos >= arr_len) return (arr_len);
20046
20047 if ((upos + ulen) >= arr_len) return (arr_len);
20048
20049 int arr_pos;
20050
20051 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
20052 {
20053 arr[arr_pos] = arr[arr_pos + ulen];
20054 }
20055
20056 return (arr_len - ulen);
20057 }
20058
20059 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20060 {
20061 if (upos >= arr_len) return (arr_len);
20062
20063 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20064
20065 int arr_pos;
20066
20067 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
20068 {
20069 arr[arr_pos + 1] = arr[arr_pos];
20070 }
20071
20072 arr[upos] = c;
20073
20074 return (arr_len + 1);
20075 }
20076
20077 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)
20078 {
20079 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20080
20081 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
20082
20083 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
20084
20085 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
20086
20087 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
20088
20089 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
20090
20091 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
20092
20093 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
20094
20095 return (arr_len + arr2_cpy);
20096 }
20097
20098 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20099 {
20100 if (upos >= arr_len) return (arr_len);
20101
20102 arr[upos] = c;
20103
20104 return (arr_len);
20105 }
20106
20107 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
20108 {
20109 if (upos >= arr_len) return (arr_len);
20110
20111 memset (arr + upos, 0, arr_len - upos);
20112
20113 return (upos);
20114 }
20115
20116 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
20117 {
20118 int arr_pos;
20119
20120 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
20121 {
20122 if (arr[arr_pos] != oldc) continue;
20123
20124 arr[arr_pos] = newc;
20125 }
20126
20127 return (arr_len);
20128 }
20129
20130 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
20131 {
20132 int arr_pos;
20133
20134 int ret_len;
20135
20136 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
20137 {
20138 if (arr[arr_pos] == c) continue;
20139
20140 arr[ret_len] = arr[arr_pos];
20141
20142 ret_len++;
20143 }
20144
20145 return (ret_len);
20146 }
20147
20148 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
20149 {
20150 if (ulen > arr_len) return (arr_len);
20151
20152 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20153
20154 char cs[100] = { 0 };
20155
20156 memcpy (cs, arr, ulen);
20157
20158 int i;
20159
20160 for (i = 0; i < ulen; i++)
20161 {
20162 char c = cs[i];
20163
20164 arr_len = mangle_insert (arr, arr_len, i, c);
20165 }
20166
20167 return (arr_len);
20168 }
20169
20170 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20171 {
20172 if (ulen > arr_len) return (arr_len);
20173
20174 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20175
20176 int upos = arr_len - ulen;
20177
20178 int i;
20179
20180 for (i = 0; i < ulen; i++)
20181 {
20182 char c = arr[upos + i];
20183
20184 arr_len = mangle_append (arr, arr_len, c);
20185 }
20186
20187 return (arr_len);
20188 }
20189
20190 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20191 {
20192 if ( arr_len == 0) return (arr_len);
20193 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20194
20195 char c = arr[upos];
20196
20197 int i;
20198
20199 for (i = 0; i < ulen; i++)
20200 {
20201 arr_len = mangle_insert (arr, arr_len, upos, c);
20202 }
20203
20204 return (arr_len);
20205 }
20206
20207 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20208 {
20209 if ( arr_len == 0) return (arr_len);
20210 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20211
20212 int arr_pos;
20213
20214 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20215 {
20216 int new_pos = arr_pos * 2;
20217
20218 arr[new_pos] = arr[arr_pos];
20219
20220 arr[new_pos + 1] = arr[arr_pos];
20221 }
20222
20223 return (arr_len * 2);
20224 }
20225
20226 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20227 {
20228 if (upos >= arr_len) return (arr_len);
20229 if (upos2 >= arr_len) return (arr_len);
20230
20231 MANGLE_SWITCH (arr, upos, upos2);
20232
20233 return (arr_len);
20234 }
20235
20236 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20237 {
20238 MANGLE_SWITCH (arr, upos, upos2);
20239
20240 return (arr_len);
20241 }
20242
20243 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20244 {
20245 if (upos >= arr_len) return (arr_len);
20246
20247 arr[upos] <<= 1;
20248
20249 return (arr_len);
20250 }
20251
20252 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20253 {
20254 if (upos >= arr_len) return (arr_len);
20255
20256 arr[upos] >>= 1;
20257
20258 return (arr_len);
20259 }
20260
20261 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20262 {
20263 if (upos >= arr_len) return (arr_len);
20264
20265 arr[upos] += 1;
20266
20267 return (arr_len);
20268 }
20269
20270 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20271 {
20272 if (upos >= arr_len) return (arr_len);
20273
20274 arr[upos] -= 1;
20275
20276 return (arr_len);
20277 }
20278
20279 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20280 {
20281 int upper_next = 1;
20282
20283 int pos;
20284
20285 for (pos = 0; pos < arr_len; pos++)
20286 {
20287 if (arr[pos] == ' ')
20288 {
20289 upper_next = 1;
20290
20291 continue;
20292 }
20293
20294 if (upper_next)
20295 {
20296 upper_next = 0;
20297
20298 MANGLE_UPPER_AT (arr, pos);
20299 }
20300 else
20301 {
20302 MANGLE_LOWER_AT (arr, pos);
20303 }
20304 }
20305
20306 return (arr_len);
20307 }
20308
20309 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20310 {
20311 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20312
20313 u32 j;
20314
20315 u32 rule_pos = 0;
20316
20317 for (j = 0; j < rp_gen_num; j++)
20318 {
20319 u32 r = 0;
20320 u32 p1 = 0;
20321 u32 p2 = 0;
20322 u32 p3 = 0;
20323
20324 switch ((char) get_random_num (0, 9))
20325 {
20326 case 0:
20327 r = get_random_num (0, sizeof (grp_op_nop));
20328 rule_buf[rule_pos++] = grp_op_nop[r];
20329 break;
20330
20331 case 1:
20332 r = get_random_num (0, sizeof (grp_op_pos_p0));
20333 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20334 p1 = get_random_num (0, sizeof (grp_pos));
20335 rule_buf[rule_pos++] = grp_pos[p1];
20336 break;
20337
20338 case 2:
20339 r = get_random_num (0, sizeof (grp_op_pos_p1));
20340 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20341 p1 = get_random_num (1, 6);
20342 rule_buf[rule_pos++] = grp_pos[p1];
20343 break;
20344
20345 case 3:
20346 r = get_random_num (0, sizeof (grp_op_chr));
20347 rule_buf[rule_pos++] = grp_op_chr[r];
20348 p1 = get_random_num (0x20, 0x7e);
20349 rule_buf[rule_pos++] = (char) p1;
20350 break;
20351
20352 case 4:
20353 r = get_random_num (0, sizeof (grp_op_chr_chr));
20354 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20355 p1 = get_random_num (0x20, 0x7e);
20356 rule_buf[rule_pos++] = (char) p1;
20357 p2 = get_random_num (0x20, 0x7e);
20358 while (p1 == p2)
20359 p2 = get_random_num (0x20, 0x7e);
20360 rule_buf[rule_pos++] = (char) p2;
20361 break;
20362
20363 case 5:
20364 r = get_random_num (0, sizeof (grp_op_pos_chr));
20365 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20366 p1 = get_random_num (0, sizeof (grp_pos));
20367 rule_buf[rule_pos++] = grp_pos[p1];
20368 p2 = get_random_num (0x20, 0x7e);
20369 rule_buf[rule_pos++] = (char) p2;
20370 break;
20371
20372 case 6:
20373 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20374 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20375 p1 = get_random_num (0, sizeof (grp_pos));
20376 rule_buf[rule_pos++] = grp_pos[p1];
20377 p2 = get_random_num (0, sizeof (grp_pos));
20378 while (p1 == p2)
20379 p2 = get_random_num (0, sizeof (grp_pos));
20380 rule_buf[rule_pos++] = grp_pos[p2];
20381 break;
20382
20383 case 7:
20384 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20385 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20386 p1 = get_random_num (0, sizeof (grp_pos));
20387 rule_buf[rule_pos++] = grp_pos[p1];
20388 p2 = get_random_num (1, sizeof (grp_pos));
20389 while (p1 == p2)
20390 p2 = get_random_num (1, sizeof (grp_pos));
20391 rule_buf[rule_pos++] = grp_pos[p2];
20392 break;
20393
20394 case 8:
20395 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20396 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20397 p1 = get_random_num (0, sizeof (grp_pos));
20398 rule_buf[rule_pos++] = grp_pos[p1];
20399 p2 = get_random_num (1, sizeof (grp_pos));
20400 rule_buf[rule_pos++] = grp_pos[p1];
20401 p3 = get_random_num (0, sizeof (grp_pos));
20402 rule_buf[rule_pos++] = grp_pos[p3];
20403 break;
20404 }
20405 }
20406
20407 return (rule_pos);
20408 }
20409
20410 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20411 {
20412 char mem[BLOCK_SIZE] = { 0 };
20413
20414 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20415
20416 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20417
20418 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20419
20420 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20421
20422 int out_len = in_len;
20423 int mem_len = in_len;
20424
20425 memcpy (out, in, out_len);
20426
20427 int rule_pos;
20428
20429 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20430 {
20431 int upos, upos2;
20432 int ulen;
20433
20434 switch (rule[rule_pos])
20435 {
20436 case ' ':
20437 break;
20438
20439 case RULE_OP_MANGLE_NOOP:
20440 break;
20441
20442 case RULE_OP_MANGLE_LREST:
20443 out_len = mangle_lrest (out, out_len);
20444 break;
20445
20446 case RULE_OP_MANGLE_UREST:
20447 out_len = mangle_urest (out, out_len);
20448 break;
20449
20450 case RULE_OP_MANGLE_LREST_UFIRST:
20451 out_len = mangle_lrest (out, out_len);
20452 if (out_len) MANGLE_UPPER_AT (out, 0);
20453 break;
20454
20455 case RULE_OP_MANGLE_UREST_LFIRST:
20456 out_len = mangle_urest (out, out_len);
20457 if (out_len) MANGLE_LOWER_AT (out, 0);
20458 break;
20459
20460 case RULE_OP_MANGLE_TREST:
20461 out_len = mangle_trest (out, out_len);
20462 break;
20463
20464 case RULE_OP_MANGLE_TOGGLE_AT:
20465 NEXT_RULEPOS (rule_pos);
20466 NEXT_RPTOI (rule, rule_pos, upos);
20467 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20468 break;
20469
20470 case RULE_OP_MANGLE_REVERSE:
20471 out_len = mangle_reverse (out, out_len);
20472 break;
20473
20474 case RULE_OP_MANGLE_DUPEWORD:
20475 out_len = mangle_double (out, out_len);
20476 break;
20477
20478 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20479 NEXT_RULEPOS (rule_pos);
20480 NEXT_RPTOI (rule, rule_pos, ulen);
20481 out_len = mangle_double_times (out, out_len, ulen);
20482 break;
20483
20484 case RULE_OP_MANGLE_REFLECT:
20485 out_len = mangle_reflect (out, out_len);
20486 break;
20487
20488 case RULE_OP_MANGLE_ROTATE_LEFT:
20489 mangle_rotate_left (out, out_len);
20490 break;
20491
20492 case RULE_OP_MANGLE_ROTATE_RIGHT:
20493 mangle_rotate_right (out, out_len);
20494 break;
20495
20496 case RULE_OP_MANGLE_APPEND:
20497 NEXT_RULEPOS (rule_pos);
20498 out_len = mangle_append (out, out_len, rule[rule_pos]);
20499 break;
20500
20501 case RULE_OP_MANGLE_PREPEND:
20502 NEXT_RULEPOS (rule_pos);
20503 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20504 break;
20505
20506 case RULE_OP_MANGLE_DELETE_FIRST:
20507 out_len = mangle_delete_at (out, out_len, 0);
20508 break;
20509
20510 case RULE_OP_MANGLE_DELETE_LAST:
20511 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20512 break;
20513
20514 case RULE_OP_MANGLE_DELETE_AT:
20515 NEXT_RULEPOS (rule_pos);
20516 NEXT_RPTOI (rule, rule_pos, upos);
20517 out_len = mangle_delete_at (out, out_len, upos);
20518 break;
20519
20520 case RULE_OP_MANGLE_EXTRACT:
20521 NEXT_RULEPOS (rule_pos);
20522 NEXT_RPTOI (rule, rule_pos, upos);
20523 NEXT_RULEPOS (rule_pos);
20524 NEXT_RPTOI (rule, rule_pos, ulen);
20525 out_len = mangle_extract (out, out_len, upos, ulen);
20526 break;
20527
20528 case RULE_OP_MANGLE_OMIT:
20529 NEXT_RULEPOS (rule_pos);
20530 NEXT_RPTOI (rule, rule_pos, upos);
20531 NEXT_RULEPOS (rule_pos);
20532 NEXT_RPTOI (rule, rule_pos, ulen);
20533 out_len = mangle_omit (out, out_len, upos, ulen);
20534 break;
20535
20536 case RULE_OP_MANGLE_INSERT:
20537 NEXT_RULEPOS (rule_pos);
20538 NEXT_RPTOI (rule, rule_pos, upos);
20539 NEXT_RULEPOS (rule_pos);
20540 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20541 break;
20542
20543 case RULE_OP_MANGLE_OVERSTRIKE:
20544 NEXT_RULEPOS (rule_pos);
20545 NEXT_RPTOI (rule, rule_pos, upos);
20546 NEXT_RULEPOS (rule_pos);
20547 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20548 break;
20549
20550 case RULE_OP_MANGLE_TRUNCATE_AT:
20551 NEXT_RULEPOS (rule_pos);
20552 NEXT_RPTOI (rule, rule_pos, upos);
20553 out_len = mangle_truncate_at (out, out_len, upos);
20554 break;
20555
20556 case RULE_OP_MANGLE_REPLACE:
20557 NEXT_RULEPOS (rule_pos);
20558 NEXT_RULEPOS (rule_pos);
20559 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20560 break;
20561
20562 case RULE_OP_MANGLE_PURGECHAR:
20563 NEXT_RULEPOS (rule_pos);
20564 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20565 break;
20566
20567 case RULE_OP_MANGLE_TOGGLECASE_REC:
20568 /* todo */
20569 break;
20570
20571 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20572 NEXT_RULEPOS (rule_pos);
20573 NEXT_RPTOI (rule, rule_pos, ulen);
20574 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20575 break;
20576
20577 case RULE_OP_MANGLE_DUPECHAR_LAST:
20578 NEXT_RULEPOS (rule_pos);
20579 NEXT_RPTOI (rule, rule_pos, ulen);
20580 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20581 break;
20582
20583 case RULE_OP_MANGLE_DUPECHAR_ALL:
20584 out_len = mangle_dupechar (out, out_len);
20585 break;
20586
20587 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20588 NEXT_RULEPOS (rule_pos);
20589 NEXT_RPTOI (rule, rule_pos, ulen);
20590 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20591 break;
20592
20593 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20594 NEXT_RULEPOS (rule_pos);
20595 NEXT_RPTOI (rule, rule_pos, ulen);
20596 out_len = mangle_dupeblock_append (out, out_len, ulen);
20597 break;
20598
20599 case RULE_OP_MANGLE_SWITCH_FIRST:
20600 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20601 break;
20602
20603 case RULE_OP_MANGLE_SWITCH_LAST:
20604 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20605 break;
20606
20607 case RULE_OP_MANGLE_SWITCH_AT:
20608 NEXT_RULEPOS (rule_pos);
20609 NEXT_RPTOI (rule, rule_pos, upos);
20610 NEXT_RULEPOS (rule_pos);
20611 NEXT_RPTOI (rule, rule_pos, upos2);
20612 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20613 break;
20614
20615 case RULE_OP_MANGLE_CHR_SHIFTL:
20616 NEXT_RULEPOS (rule_pos);
20617 NEXT_RPTOI (rule, rule_pos, upos);
20618 mangle_chr_shiftl (out, out_len, upos);
20619 break;
20620
20621 case RULE_OP_MANGLE_CHR_SHIFTR:
20622 NEXT_RULEPOS (rule_pos);
20623 NEXT_RPTOI (rule, rule_pos, upos);
20624 mangle_chr_shiftr (out, out_len, upos);
20625 break;
20626
20627 case RULE_OP_MANGLE_CHR_INCR:
20628 NEXT_RULEPOS (rule_pos);
20629 NEXT_RPTOI (rule, rule_pos, upos);
20630 mangle_chr_incr (out, out_len, upos);
20631 break;
20632
20633 case RULE_OP_MANGLE_CHR_DECR:
20634 NEXT_RULEPOS (rule_pos);
20635 NEXT_RPTOI (rule, rule_pos, upos);
20636 mangle_chr_decr (out, out_len, upos);
20637 break;
20638
20639 case RULE_OP_MANGLE_REPLACE_NP1:
20640 NEXT_RULEPOS (rule_pos);
20641 NEXT_RPTOI (rule, rule_pos, upos);
20642 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20643 break;
20644
20645 case RULE_OP_MANGLE_REPLACE_NM1:
20646 NEXT_RULEPOS (rule_pos);
20647 NEXT_RPTOI (rule, rule_pos, upos);
20648 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20649 break;
20650
20651 case RULE_OP_MANGLE_TITLE:
20652 out_len = mangle_title (out, out_len);
20653 break;
20654
20655 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20656 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20657 NEXT_RULEPOS (rule_pos);
20658 NEXT_RPTOI (rule, rule_pos, upos);
20659 NEXT_RULEPOS (rule_pos);
20660 NEXT_RPTOI (rule, rule_pos, ulen);
20661 NEXT_RULEPOS (rule_pos);
20662 NEXT_RPTOI (rule, rule_pos, upos2);
20663 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20664 break;
20665
20666 case RULE_OP_MANGLE_APPEND_MEMORY:
20667 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20668 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20669 memcpy (out + out_len, mem, mem_len);
20670 out_len += mem_len;
20671 break;
20672
20673 case RULE_OP_MANGLE_PREPEND_MEMORY:
20674 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20675 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20676 memcpy (mem + mem_len, out, out_len);
20677 out_len += mem_len;
20678 memcpy (out, mem, out_len);
20679 break;
20680
20681 case RULE_OP_MEMORIZE_WORD:
20682 memcpy (mem, out, out_len);
20683 mem_len = out_len;
20684 break;
20685
20686 case RULE_OP_REJECT_LESS:
20687 NEXT_RULEPOS (rule_pos);
20688 NEXT_RPTOI (rule, rule_pos, upos);
20689 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20690 break;
20691
20692 case RULE_OP_REJECT_GREATER:
20693 NEXT_RULEPOS (rule_pos);
20694 NEXT_RPTOI (rule, rule_pos, upos);
20695 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20696 break;
20697
20698 case RULE_OP_REJECT_CONTAIN:
20699 NEXT_RULEPOS (rule_pos);
20700 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20701 break;
20702
20703 case RULE_OP_REJECT_NOT_CONTAIN:
20704 NEXT_RULEPOS (rule_pos);
20705 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20706 break;
20707
20708 case RULE_OP_REJECT_EQUAL_FIRST:
20709 NEXT_RULEPOS (rule_pos);
20710 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20711 break;
20712
20713 case RULE_OP_REJECT_EQUAL_LAST:
20714 NEXT_RULEPOS (rule_pos);
20715 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20716 break;
20717
20718 case RULE_OP_REJECT_EQUAL_AT:
20719 NEXT_RULEPOS (rule_pos);
20720 NEXT_RPTOI (rule, rule_pos, upos);
20721 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20722 NEXT_RULEPOS (rule_pos);
20723 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20724 break;
20725
20726 case RULE_OP_REJECT_CONTAINS:
20727 NEXT_RULEPOS (rule_pos);
20728 NEXT_RPTOI (rule, rule_pos, upos);
20729 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20730 NEXT_RULEPOS (rule_pos);
20731 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20732 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20733 break;
20734
20735 case RULE_OP_REJECT_MEMORY:
20736 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20737 break;
20738
20739 default:
20740 return (RULE_RC_SYNTAX_ERROR);
20741 break;
20742 }
20743 }
20744
20745 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20746
20747 return (out_len);
20748 }