15927576912daaf5b59a6c418fb4f3e4c0a647c0
[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[256] = { 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 < 32; i++, ptr_data += 2)
8316 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8317
8318 *ptr_data = 0;
8319
8320 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8321 SIGNATURE_KRB5TGS,
8322 (char *) krb5tgs->account_info,
8323 data,
8324 data + 33);
8325 }
8326 else
8327 {
8328 if (hash_type == HASH_TYPE_MD4)
8329 {
8330 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8331 digest_buf[0],
8332 digest_buf[1],
8333 digest_buf[2],
8334 digest_buf[3]);
8335 }
8336 else if (hash_type == HASH_TYPE_MD5)
8337 {
8338 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8339 digest_buf[0],
8340 digest_buf[1],
8341 digest_buf[2],
8342 digest_buf[3]);
8343 }
8344 else if (hash_type == HASH_TYPE_SHA1)
8345 {
8346 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8347 digest_buf[0],
8348 digest_buf[1],
8349 digest_buf[2],
8350 digest_buf[3],
8351 digest_buf[4]);
8352 }
8353 else if (hash_type == HASH_TYPE_SHA256)
8354 {
8355 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8356 digest_buf[0],
8357 digest_buf[1],
8358 digest_buf[2],
8359 digest_buf[3],
8360 digest_buf[4],
8361 digest_buf[5],
8362 digest_buf[6],
8363 digest_buf[7]);
8364 }
8365 else if (hash_type == HASH_TYPE_SHA384)
8366 {
8367 uint *ptr = digest_buf;
8368
8369 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8370 ptr[ 1], ptr[ 0],
8371 ptr[ 3], ptr[ 2],
8372 ptr[ 5], ptr[ 4],
8373 ptr[ 7], ptr[ 6],
8374 ptr[ 9], ptr[ 8],
8375 ptr[11], ptr[10]);
8376 }
8377 else if (hash_type == HASH_TYPE_SHA512)
8378 {
8379 uint *ptr = digest_buf;
8380
8381 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8382 ptr[ 1], ptr[ 0],
8383 ptr[ 3], ptr[ 2],
8384 ptr[ 5], ptr[ 4],
8385 ptr[ 7], ptr[ 6],
8386 ptr[ 9], ptr[ 8],
8387 ptr[11], ptr[10],
8388 ptr[13], ptr[12],
8389 ptr[15], ptr[14]);
8390 }
8391 else if (hash_type == HASH_TYPE_LM)
8392 {
8393 snprintf (out_buf, len-1, "%08x%08x",
8394 digest_buf[0],
8395 digest_buf[1]);
8396 }
8397 else if (hash_type == HASH_TYPE_ORACLEH)
8398 {
8399 snprintf (out_buf, len-1, "%08X%08X",
8400 digest_buf[0],
8401 digest_buf[1]);
8402 }
8403 else if (hash_type == HASH_TYPE_BCRYPT)
8404 {
8405 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8406 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8407
8408 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8409
8410 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8411 }
8412 else if (hash_type == HASH_TYPE_KECCAK)
8413 {
8414 uint *ptr = digest_buf;
8415
8416 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",
8417 ptr[ 1], ptr[ 0],
8418 ptr[ 3], ptr[ 2],
8419 ptr[ 5], ptr[ 4],
8420 ptr[ 7], ptr[ 6],
8421 ptr[ 9], ptr[ 8],
8422 ptr[11], ptr[10],
8423 ptr[13], ptr[12],
8424 ptr[15], ptr[14],
8425 ptr[17], ptr[16],
8426 ptr[19], ptr[18],
8427 ptr[21], ptr[20],
8428 ptr[23], ptr[22],
8429 ptr[25], ptr[24],
8430 ptr[27], ptr[26],
8431 ptr[29], ptr[28],
8432 ptr[31], ptr[30],
8433 ptr[33], ptr[32],
8434 ptr[35], ptr[34],
8435 ptr[37], ptr[36],
8436 ptr[39], ptr[38],
8437 ptr[41], ptr[30],
8438 ptr[43], ptr[42],
8439 ptr[45], ptr[44],
8440 ptr[47], ptr[46],
8441 ptr[49], ptr[48]
8442 );
8443
8444 out_buf[salt.keccak_mdlen * 2] = 0;
8445 }
8446 else if (hash_type == HASH_TYPE_RIPEMD160)
8447 {
8448 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8449 digest_buf[0],
8450 digest_buf[1],
8451 digest_buf[2],
8452 digest_buf[3],
8453 digest_buf[4]);
8454 }
8455 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8456 {
8457 digest_buf[ 0] = digest_buf[ 0];
8458 digest_buf[ 1] = digest_buf[ 1];
8459 digest_buf[ 2] = digest_buf[ 2];
8460 digest_buf[ 3] = digest_buf[ 3];
8461 digest_buf[ 4] = digest_buf[ 4];
8462 digest_buf[ 5] = digest_buf[ 5];
8463 digest_buf[ 6] = digest_buf[ 6];
8464 digest_buf[ 7] = digest_buf[ 7];
8465 digest_buf[ 8] = digest_buf[ 8];
8466 digest_buf[ 9] = digest_buf[ 9];
8467 digest_buf[10] = digest_buf[10];
8468 digest_buf[11] = digest_buf[11];
8469 digest_buf[12] = digest_buf[12];
8470 digest_buf[13] = digest_buf[13];
8471 digest_buf[14] = digest_buf[14];
8472 digest_buf[15] = digest_buf[15];
8473
8474 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8475 digest_buf[ 0],
8476 digest_buf[ 1],
8477 digest_buf[ 2],
8478 digest_buf[ 3],
8479 digest_buf[ 4],
8480 digest_buf[ 5],
8481 digest_buf[ 6],
8482 digest_buf[ 7],
8483 digest_buf[ 8],
8484 digest_buf[ 9],
8485 digest_buf[10],
8486 digest_buf[11],
8487 digest_buf[12],
8488 digest_buf[13],
8489 digest_buf[14],
8490 digest_buf[15]);
8491 }
8492 else if (hash_type == HASH_TYPE_GOST)
8493 {
8494 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8495 digest_buf[0],
8496 digest_buf[1],
8497 digest_buf[2],
8498 digest_buf[3],
8499 digest_buf[4],
8500 digest_buf[5],
8501 digest_buf[6],
8502 digest_buf[7]);
8503 }
8504 else if (hash_type == HASH_TYPE_MYSQL)
8505 {
8506 snprintf (out_buf, len-1, "%08x%08x",
8507 digest_buf[0],
8508 digest_buf[1]);
8509 }
8510 else if (hash_type == HASH_TYPE_LOTUS5)
8511 {
8512 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8513 digest_buf[0],
8514 digest_buf[1],
8515 digest_buf[2],
8516 digest_buf[3]);
8517 }
8518 else if (hash_type == HASH_TYPE_LOTUS6)
8519 {
8520 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8521 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8522 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8523 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8524
8525 char buf[16] = { 0 };
8526
8527 memcpy (buf + 0, salt.salt_buf, 5);
8528 memcpy (buf + 5, digest_buf, 9);
8529
8530 buf[3] -= -4;
8531
8532 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8533
8534 tmp_buf[18] = salt.salt_buf_pc[7];
8535 tmp_buf[19] = 0;
8536
8537 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8538 }
8539 else if (hash_type == HASH_TYPE_LOTUS8)
8540 {
8541 char buf[52] = { 0 };
8542
8543 // salt
8544
8545 memcpy (buf + 0, salt.salt_buf, 16);
8546
8547 buf[3] -= -4;
8548
8549 // iteration
8550
8551 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8552
8553 // chars
8554
8555 buf[26] = salt.salt_buf_pc[0];
8556 buf[27] = salt.salt_buf_pc[1];
8557
8558 // digest
8559
8560 memcpy (buf + 28, digest_buf, 8);
8561
8562 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8563
8564 tmp_buf[49] = 0;
8565
8566 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8567 }
8568 else if (hash_type == HASH_TYPE_CRC32)
8569 {
8570 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8571 }
8572 }
8573
8574 if (salt_type == SALT_TYPE_INTERN)
8575 {
8576 size_t pos = strlen (out_buf);
8577
8578 out_buf[pos] = data.separator;
8579
8580 char *ptr = (char *) salt.salt_buf;
8581
8582 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8583
8584 out_buf[pos + 1 + salt.salt_len] = 0;
8585 }
8586 }
8587
8588 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8589 {
8590 memset (hccap, 0, sizeof (hccap_t));
8591
8592 salt_t *salt = &data.salts_buf[salt_pos];
8593
8594 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8595
8596 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8597 wpa_t *wpa = &wpas[salt_pos];
8598
8599 hccap->keyver = wpa->keyver;
8600
8601 hccap->eapol_size = wpa->eapol_size;
8602
8603 if (wpa->keyver != 1)
8604 {
8605 uint eapol_tmp[64] = { 0 };
8606
8607 for (uint i = 0; i < 64; i++)
8608 {
8609 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8610 }
8611
8612 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8613 }
8614 else
8615 {
8616 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8617 }
8618
8619 uint pke_tmp[25] = { 0 };
8620
8621 for (int i = 5; i < 25; i++)
8622 {
8623 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8624 }
8625
8626 char *pke_ptr = (char *) pke_tmp;
8627
8628 memcpy (hccap->mac1, pke_ptr + 23, 6);
8629 memcpy (hccap->mac2, pke_ptr + 29, 6);
8630 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8631 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8632
8633 char *digests_buf_ptr = (char *) data.digests_buf;
8634
8635 uint dgst_size = data.dgst_size;
8636
8637 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8638
8639 if (wpa->keyver != 1)
8640 {
8641 uint digest_tmp[4] = { 0 };
8642
8643 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8644 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8645 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8646 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8647
8648 memcpy (hccap->keymic, digest_tmp, 16);
8649 }
8650 else
8651 {
8652 memcpy (hccap->keymic, digest_ptr, 16);
8653 }
8654 }
8655
8656 void SuspendThreads ()
8657 {
8658 if (data.devices_status == STATUS_RUNNING)
8659 {
8660 hc_timer_set (&data.timer_paused);
8661
8662 data.devices_status = STATUS_PAUSED;
8663
8664 log_info ("Paused");
8665 }
8666 }
8667
8668 void ResumeThreads ()
8669 {
8670 if (data.devices_status == STATUS_PAUSED)
8671 {
8672 float ms_paused;
8673
8674 hc_timer_get (data.timer_paused, ms_paused);
8675
8676 data.ms_paused += ms_paused;
8677
8678 data.devices_status = STATUS_RUNNING;
8679
8680 log_info ("Resumed");
8681 }
8682 }
8683
8684 void bypass ()
8685 {
8686 if (data.devices_status != STATUS_RUNNING) return;
8687
8688 data.devices_status = STATUS_BYPASS;
8689
8690 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8691 }
8692
8693 void stop_at_checkpoint ()
8694 {
8695 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8696 {
8697 if (data.devices_status != STATUS_RUNNING) return;
8698 }
8699
8700 // this feature only makes sense if --restore-disable was not specified
8701
8702 if (data.restore_disable == 1)
8703 {
8704 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8705
8706 return;
8707 }
8708
8709 // check if monitoring of Restore Point updates should be enabled or disabled
8710
8711 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8712 {
8713 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8714
8715 // save the current restore point value
8716
8717 data.checkpoint_cur_words = get_lowest_words_done ();
8718
8719 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8720 }
8721 else
8722 {
8723 data.devices_status = STATUS_RUNNING;
8724
8725 // reset the global value for checkpoint checks
8726
8727 data.checkpoint_cur_words = 0;
8728
8729 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8730 }
8731 }
8732
8733 void myabort ()
8734 {
8735 if (data.devices_status == STATUS_INIT) return;
8736 if (data.devices_status == STATUS_STARTING) return;
8737
8738 data.devices_status = STATUS_ABORTED;
8739 }
8740
8741 void myquit ()
8742 {
8743 if (data.devices_status == STATUS_INIT) return;
8744 if (data.devices_status == STATUS_STARTING) return;
8745
8746 data.devices_status = STATUS_QUIT;
8747 }
8748
8749 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8750 {
8751 FILE *fp = fopen (kernel_file, "rb");
8752
8753 if (fp != NULL)
8754 {
8755 struct stat st;
8756
8757 memset (&st, 0, sizeof (st));
8758
8759 stat (kernel_file, &st);
8760
8761 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8762
8763 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8764
8765 if (num_read != (size_t) st.st_size)
8766 {
8767 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8768
8769 exit (-1);
8770 }
8771
8772 fclose (fp);
8773
8774 buf[st.st_size] = 0;
8775
8776 for (int i = 0; i < num_devices; i++)
8777 {
8778 kernel_lengths[i] = (size_t) st.st_size;
8779
8780 kernel_sources[i] = buf;
8781 }
8782 }
8783 else
8784 {
8785 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8786
8787 exit (-1);
8788 }
8789
8790 return;
8791 }
8792
8793 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8794 {
8795 if (binary_size > 0)
8796 {
8797 FILE *fp = fopen (dst, "wb");
8798
8799 lock_file (fp);
8800 fwrite (binary, sizeof (u8), binary_size, fp);
8801
8802 fflush (fp);
8803 fclose (fp);
8804 }
8805 }
8806
8807 /**
8808 * restore
8809 */
8810
8811 restore_data_t *init_restore (int argc, char **argv)
8812 {
8813 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8814
8815 if (data.restore_disable == 0)
8816 {
8817 FILE *fp = fopen (data.eff_restore_file, "rb");
8818
8819 if (fp)
8820 {
8821 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8822
8823 if (nread != 1)
8824 {
8825 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8826
8827 exit (-1);
8828 }
8829
8830 fclose (fp);
8831
8832 if (rd->pid)
8833 {
8834 char pidbin[BUFSIZ] = { 0 };
8835
8836 int pidbin_len = -1;
8837
8838 #ifdef _POSIX
8839 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8840
8841 FILE *fd = fopen (pidbin, "rb");
8842
8843 if (fd)
8844 {
8845 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8846
8847 pidbin[pidbin_len] = 0;
8848
8849 fclose (fd);
8850
8851 char *argv0_r = strrchr (argv[0], '/');
8852
8853 char *pidbin_r = strrchr (pidbin, '/');
8854
8855 if (argv0_r == NULL) argv0_r = argv[0];
8856
8857 if (pidbin_r == NULL) pidbin_r = pidbin;
8858
8859 if (strcmp (argv0_r, pidbin_r) == 0)
8860 {
8861 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8862
8863 exit (-1);
8864 }
8865 }
8866
8867 #elif _WIN
8868 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8869
8870 char pidbin2[BUFSIZ] = { 0 };
8871
8872 int pidbin2_len = -1;
8873
8874 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8875 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8876
8877 pidbin[pidbin_len] = 0;
8878 pidbin2[pidbin2_len] = 0;
8879
8880 if (pidbin2_len)
8881 {
8882 if (strcmp (pidbin, pidbin2) == 0)
8883 {
8884 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8885
8886 exit (-1);
8887 }
8888 }
8889 #endif
8890 }
8891
8892 if (rd->version_bin < RESTORE_MIN)
8893 {
8894 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8895
8896 exit (-1);
8897 }
8898 }
8899 }
8900
8901 memset (rd, 0, sizeof (restore_data_t));
8902
8903 rd->version_bin = VERSION_BIN;
8904
8905 #ifdef _POSIX
8906 rd->pid = getpid ();
8907 #elif _WIN
8908 rd->pid = GetCurrentProcessId ();
8909 #endif
8910
8911 if (getcwd (rd->cwd, 255) == NULL)
8912 {
8913 myfree (rd);
8914
8915 return (NULL);
8916 }
8917
8918 rd->argc = argc;
8919 rd->argv = argv;
8920
8921 return (rd);
8922 }
8923
8924 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8925 {
8926 FILE *fp = fopen (eff_restore_file, "rb");
8927
8928 if (fp == NULL)
8929 {
8930 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8931
8932 exit (-1);
8933 }
8934
8935 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8936 {
8937 log_error ("ERROR: cannot read %s", eff_restore_file);
8938
8939 exit (-1);
8940 }
8941
8942 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8943
8944 for (uint i = 0; i < rd->argc; i++)
8945 {
8946 char buf[BUFSIZ] = { 0 };
8947
8948 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8949 {
8950 log_error ("ERROR: cannot read %s", eff_restore_file);
8951
8952 exit (-1);
8953 }
8954
8955 size_t len = strlen (buf);
8956
8957 if (len) buf[len - 1] = 0;
8958
8959 rd->argv[i] = mystrdup (buf);
8960 }
8961
8962 fclose (fp);
8963
8964 char new_cwd[1024] = { 0 };
8965
8966 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8967
8968 if (nwd == NULL)
8969 {
8970 log_error ("Restore file is corrupted");
8971 }
8972
8973 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8974 {
8975 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8976 {
8977 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8978
8979 exit (-1);
8980 }
8981
8982 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8983 }
8984
8985 if (chdir (rd->cwd))
8986 {
8987 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8988
8989 exit (-1);
8990 }
8991 }
8992
8993 u64 get_lowest_words_done ()
8994 {
8995 u64 words_cur = -1;
8996
8997 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8998 {
8999 hc_device_param_t *device_param = &data.devices_param[device_id];
9000
9001 if (device_param->skipped) continue;
9002
9003 const u64 words_done = device_param->words_done;
9004
9005 if (words_done < words_cur) words_cur = words_done;
9006 }
9007
9008 // It's possible that a device's workload isn't finished right after a restore-case.
9009 // In that case, this function would return 0 and overwrite the real restore point
9010 // There's also data.words_cur which is set to rd->words_cur but it changes while
9011 // the attack is running therefore we should stick to rd->words_cur.
9012 // Note that -s influences rd->words_cur we should keep a close look on that.
9013
9014 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9015
9016 return words_cur;
9017 }
9018
9019 void write_restore (const char *new_restore_file, restore_data_t *rd)
9020 {
9021 u64 words_cur = get_lowest_words_done ();
9022
9023 rd->words_cur = words_cur;
9024
9025 FILE *fp = fopen (new_restore_file, "wb");
9026
9027 if (fp == NULL)
9028 {
9029 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9030
9031 exit (-1);
9032 }
9033
9034 if (setvbuf (fp, NULL, _IONBF, 0))
9035 {
9036 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9037
9038 exit (-1);
9039 }
9040
9041 fwrite (rd, sizeof (restore_data_t), 1, fp);
9042
9043 for (uint i = 0; i < rd->argc; i++)
9044 {
9045 fprintf (fp, "%s", rd->argv[i]);
9046 fputc ('\n', fp);
9047 }
9048
9049 fflush (fp);
9050
9051 fsync (fileno (fp));
9052
9053 fclose (fp);
9054 }
9055
9056 void cycle_restore ()
9057 {
9058 const char *eff_restore_file = data.eff_restore_file;
9059 const char *new_restore_file = data.new_restore_file;
9060
9061 restore_data_t *rd = data.rd;
9062
9063 write_restore (new_restore_file, rd);
9064
9065 struct stat st;
9066
9067 memset (&st, 0, sizeof(st));
9068
9069 if (stat (eff_restore_file, &st) == 0)
9070 {
9071 if (unlink (eff_restore_file))
9072 {
9073 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
9074 }
9075 }
9076
9077 if (rename (new_restore_file, eff_restore_file))
9078 {
9079 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9080 }
9081 }
9082
9083 void check_checkpoint ()
9084 {
9085 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9086
9087 u64 words_cur = get_lowest_words_done ();
9088
9089 if (words_cur != data.checkpoint_cur_words)
9090 {
9091 myabort ();
9092 }
9093 }
9094
9095 /**
9096 * tuning db
9097 */
9098
9099 void tuning_db_destroy (tuning_db_t *tuning_db)
9100 {
9101 int i;
9102
9103 for (i = 0; i < tuning_db->alias_cnt; i++)
9104 {
9105 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9106
9107 myfree (alias->device_name);
9108 myfree (alias->alias_name);
9109 }
9110
9111 for (i = 0; i < tuning_db->entry_cnt; i++)
9112 {
9113 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9114
9115 myfree (entry->device_name);
9116 }
9117
9118 myfree (tuning_db->alias_buf);
9119 myfree (tuning_db->entry_buf);
9120
9121 myfree (tuning_db);
9122 }
9123
9124 tuning_db_t *tuning_db_alloc (FILE *fp)
9125 {
9126 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9127
9128 int num_lines = count_lines (fp);
9129
9130 // a bit over-allocated
9131
9132 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9133 tuning_db->alias_cnt = 0;
9134
9135 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9136 tuning_db->entry_cnt = 0;
9137
9138 return tuning_db;
9139 }
9140
9141 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9142 {
9143 FILE *fp = fopen (tuning_db_file, "rb");
9144
9145 if (fp == NULL)
9146 {
9147 log_error ("%s: %s", tuning_db_file, strerror (errno));
9148
9149 exit (-1);
9150 }
9151
9152 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9153
9154 rewind (fp);
9155
9156 int line_num = 0;
9157
9158 while (!feof (fp))
9159 {
9160 char buf[BUFSIZ];
9161
9162 char *line_buf = fgets (buf, sizeof (buf) - 1, fp);
9163
9164 if (line_buf == NULL) break;
9165
9166 line_num++;
9167
9168 const int line_len = in_superchop (line_buf);
9169
9170 if (line_len == 0) continue;
9171
9172 if (line_buf[0] == '#') continue;
9173
9174 // start processing
9175
9176 char *token_ptr[7] = { NULL };
9177
9178 int token_cnt = 0;
9179
9180 char *next = strtok (line_buf, "\t ");
9181
9182 token_ptr[token_cnt] = next;
9183
9184 token_cnt++;
9185
9186 while ((next = strtok (NULL, "\t ")) != NULL)
9187 {
9188 token_ptr[token_cnt] = next;
9189
9190 token_cnt++;
9191 }
9192
9193 if (token_cnt == 2)
9194 {
9195 char *device_name = token_ptr[0];
9196 char *alias_name = token_ptr[1];
9197
9198 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9199
9200 alias->device_name = mystrdup (device_name);
9201 alias->alias_name = mystrdup (alias_name);
9202
9203 tuning_db->alias_cnt++;
9204 }
9205 else if (token_cnt == 6)
9206 {
9207 if ((token_ptr[1][0] != '0') &&
9208 (token_ptr[1][0] != '1') &&
9209 (token_ptr[1][0] != '3') &&
9210 (token_ptr[1][0] != '*'))
9211 {
9212 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9213
9214 continue;
9215 }
9216
9217 if ((token_ptr[3][0] != '1') &&
9218 (token_ptr[3][0] != '2') &&
9219 (token_ptr[3][0] != '4') &&
9220 (token_ptr[3][0] != '8') &&
9221 (token_ptr[3][0] != 'N'))
9222 {
9223 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9224
9225 continue;
9226 }
9227
9228 char *device_name = token_ptr[0];
9229
9230 int attack_mode = -1;
9231 int hash_type = -1;
9232 int vector_width = -1;
9233 int kernel_accel = -1;
9234 int kernel_loops = -1;
9235
9236 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9237 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9238 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9239
9240 if (token_ptr[4][0] != 'A')
9241 {
9242 kernel_accel = atoi (token_ptr[4]);
9243
9244 if ((kernel_accel < 1) || (kernel_accel > 1024))
9245 {
9246 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9247
9248 continue;
9249 }
9250 }
9251 else
9252 {
9253 kernel_accel = 0;
9254 }
9255
9256 if (token_ptr[5][0] != 'A')
9257 {
9258 kernel_loops = atoi (token_ptr[5]);
9259
9260 if ((kernel_loops < 1) || (kernel_loops > 1024))
9261 {
9262 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9263
9264 continue;
9265 }
9266 }
9267 else
9268 {
9269 kernel_loops = 0;
9270 }
9271
9272 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9273
9274 entry->device_name = mystrdup (device_name);
9275 entry->attack_mode = attack_mode;
9276 entry->hash_type = hash_type;
9277 entry->vector_width = vector_width;
9278 entry->kernel_accel = kernel_accel;
9279 entry->kernel_loops = kernel_loops;
9280
9281 tuning_db->entry_cnt++;
9282 }
9283 else
9284 {
9285 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9286
9287 continue;
9288 }
9289 }
9290
9291 fclose (fp);
9292
9293 // todo: print loaded 'cnt' message
9294
9295 // sort the database
9296
9297 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9298 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9299
9300 return tuning_db;
9301 }
9302
9303 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, char *device_name, int attack_mode, int hash_type)
9304 {
9305 static tuning_db_entry_t s;
9306
9307 // first we need to convert all spaces in the device_name to underscore
9308
9309 char *device_name_nospace = strdup (device_name);
9310
9311 int device_name_length = strlen (device_name_nospace);
9312
9313 int i;
9314
9315 for (i = 0; i < device_name_length; i++)
9316 {
9317 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9318 }
9319
9320 // find out if there's an alias configured
9321
9322 tuning_db_alias_t a;
9323
9324 a.device_name = device_name_nospace;
9325
9326 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);
9327
9328 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9329
9330 // attack-mode 6 and 7 are attack-mode 1 basically
9331
9332 if (attack_mode == 6) attack_mode = 1;
9333 if (attack_mode == 7) attack_mode = 1;
9334
9335 // bsearch is not ideal but fast enough
9336
9337 s.device_name = device_name_nospace;
9338 s.attack_mode = attack_mode;
9339 s.hash_type = hash_type;
9340
9341 tuning_db_entry_t *entry = NULL;
9342
9343 // this will produce all 2^3 combinations required
9344
9345 for (i = 0; i < 8; i++)
9346 {
9347 s.device_name = (i & 1) ? "*" : device_name_nospace;
9348 s.attack_mode = (i & 2) ? -1 : attack_mode;
9349 s.hash_type = (i & 4) ? -1 : hash_type;
9350
9351 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9352
9353 if (entry != NULL) break;
9354
9355 // in non-wildcard mode also check the alias_name
9356
9357 if (((i & 1) == 0) && (alias_name != NULL))
9358 {
9359 s.device_name = alias_name;
9360
9361 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9362
9363 if (entry != NULL) break;
9364 }
9365 }
9366
9367 // free converted device_name
9368
9369 myfree (device_name_nospace);
9370
9371 return entry;
9372 }
9373
9374 /**
9375 * parser
9376 */
9377
9378 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9379 {
9380 u8 tmp[256] = { 0 };
9381
9382 if (salt_len > sizeof (tmp))
9383 {
9384 return UINT_MAX;
9385 }
9386
9387 memcpy (tmp, in, salt_len);
9388
9389 if (data.opts_type & OPTS_TYPE_ST_HEX)
9390 {
9391 if ((salt_len % 2) == 0)
9392 {
9393 u32 new_salt_len = salt_len / 2;
9394
9395 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9396 {
9397 u8 p0 = tmp[j + 0];
9398 u8 p1 = tmp[j + 1];
9399
9400 tmp[i] = hex_convert (p1) << 0;
9401 tmp[i] |= hex_convert (p0) << 4;
9402 }
9403
9404 salt_len = new_salt_len;
9405 }
9406 else
9407 {
9408 return UINT_MAX;
9409 }
9410 }
9411 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9412 {
9413 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9414 }
9415
9416 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9417
9418 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9419 {
9420 if (salt_len < 20)
9421 {
9422 u32 *tmp_uint = (u32 *) tmp;
9423
9424 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9425 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9426 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9427 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9428 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9429 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9430 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9431 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9432 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9433 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9434
9435 salt_len = salt_len * 2;
9436 }
9437 else
9438 {
9439 return UINT_MAX;
9440 }
9441 }
9442
9443 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9444 {
9445 lowercase (tmp, salt_len);
9446 }
9447
9448 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9449 {
9450 uppercase (tmp, salt_len);
9451 }
9452
9453 u32 len = salt_len;
9454
9455 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9456 {
9457 tmp[len++] = 0x80;
9458 }
9459
9460 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9461 {
9462 tmp[len++] = 0x01;
9463 }
9464
9465 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9466 {
9467 u32 *tmp_uint = (uint *) tmp;
9468
9469 u32 max = len / 4;
9470
9471 if (len % 4) max++;
9472
9473 for (u32 i = 0; i < max; i++)
9474 {
9475 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9476 }
9477
9478 // Important: we may need to increase the length of memcpy since
9479 // we don't want to "loose" some swapped bytes (could happen if
9480 // they do not perfectly fit in the 4-byte blocks)
9481 // Memcpy does always copy the bytes in the BE order, but since
9482 // we swapped them, some important bytes could be in positions
9483 // we normally skip with the original len
9484
9485 if (len % 4) len += 4 - (len % 4);
9486 }
9487
9488 memcpy (out, tmp, len);
9489
9490 return (salt_len);
9491 }
9492
9493 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9494 {
9495 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9496
9497 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9498
9499 u32 *digest = (u32 *) hash_buf->digest;
9500
9501 salt_t *salt = hash_buf->salt;
9502
9503 memcpy ((char *) salt->salt_sign, input_buf, 6);
9504
9505 char *iter_pos = input_buf + 4;
9506
9507 salt->salt_iter = 1 << atoi (iter_pos);
9508
9509 char *salt_pos = strchr (iter_pos, '$');
9510
9511 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9512
9513 salt_pos++;
9514
9515 uint salt_len = 16;
9516
9517 salt->salt_len = salt_len;
9518
9519 u8 tmp_buf[100] = { 0 };
9520
9521 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9522
9523 char *salt_buf_ptr = (char *) salt->salt_buf;
9524
9525 memcpy (salt_buf_ptr, tmp_buf, 16);
9526
9527 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9528 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9529 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9530 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9531
9532 char *hash_pos = salt_pos + 22;
9533
9534 memset (tmp_buf, 0, sizeof (tmp_buf));
9535
9536 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9537
9538 memcpy (digest, tmp_buf, 24);
9539
9540 digest[0] = byte_swap_32 (digest[0]);
9541 digest[1] = byte_swap_32 (digest[1]);
9542 digest[2] = byte_swap_32 (digest[2]);
9543 digest[3] = byte_swap_32 (digest[3]);
9544 digest[4] = byte_swap_32 (digest[4]);
9545 digest[5] = byte_swap_32 (digest[5]);
9546
9547 digest[5] &= ~0xff; // its just 23 not 24 !
9548
9549 return (PARSER_OK);
9550 }
9551
9552 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9553 {
9554 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9555
9556 u32 *digest = (u32 *) hash_buf->digest;
9557
9558 u8 tmp_buf[100] = { 0 };
9559
9560 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9561
9562 memcpy (digest, tmp_buf, 32);
9563
9564 digest[0] = byte_swap_32 (digest[0]);
9565 digest[1] = byte_swap_32 (digest[1]);
9566 digest[2] = byte_swap_32 (digest[2]);
9567 digest[3] = byte_swap_32 (digest[3]);
9568 digest[4] = byte_swap_32 (digest[4]);
9569 digest[5] = byte_swap_32 (digest[5]);
9570 digest[6] = byte_swap_32 (digest[6]);
9571 digest[7] = byte_swap_32 (digest[7]);
9572
9573 digest[0] -= SHA256M_A;
9574 digest[1] -= SHA256M_B;
9575 digest[2] -= SHA256M_C;
9576 digest[3] -= SHA256M_D;
9577 digest[4] -= SHA256M_E;
9578 digest[5] -= SHA256M_F;
9579 digest[6] -= SHA256M_G;
9580 digest[7] -= SHA256M_H;
9581
9582 return (PARSER_OK);
9583 }
9584
9585 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9586 {
9587 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9588
9589 u32 *digest = (u32 *) hash_buf->digest;
9590
9591 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9592 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9593
9594 digest[0] = byte_swap_32 (digest[0]);
9595 digest[1] = byte_swap_32 (digest[1]);
9596
9597 uint tt;
9598
9599 IP (digest[0], digest[1], tt);
9600
9601 digest[0] = digest[0];
9602 digest[1] = digest[1];
9603 digest[2] = 0;
9604 digest[3] = 0;
9605
9606 return (PARSER_OK);
9607 }
9608
9609 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9610 {
9611 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9612
9613 u32 *digest = (u32 *) hash_buf->digest;
9614
9615 salt_t *salt = hash_buf->salt;
9616
9617 char *hash_pos = input_buf + 8;
9618
9619 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9620 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9621 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9622 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9623 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9624
9625 digest[0] -= SHA1M_A;
9626 digest[1] -= SHA1M_B;
9627 digest[2] -= SHA1M_C;
9628 digest[3] -= SHA1M_D;
9629 digest[4] -= SHA1M_E;
9630
9631 uint salt_len = 8;
9632
9633 char *salt_buf_ptr = (char *) salt->salt_buf;
9634
9635 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9636
9637 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9638
9639 salt->salt_len = salt_len;
9640
9641 return (PARSER_OK);
9642 }
9643
9644 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9645 {
9646 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9647
9648 u64 *digest = (u64 *) hash_buf->digest;
9649
9650 salt_t *salt = hash_buf->salt;
9651
9652 char *hash_pos = input_buf + 8;
9653
9654 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9655 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9656 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9657 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9658 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9659 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9660 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9661 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9662
9663 digest[0] -= SHA512M_A;
9664 digest[1] -= SHA512M_B;
9665 digest[2] -= SHA512M_C;
9666 digest[3] -= SHA512M_D;
9667 digest[4] -= SHA512M_E;
9668 digest[5] -= SHA512M_F;
9669 digest[6] -= SHA512M_G;
9670 digest[7] -= SHA512M_H;
9671
9672 uint salt_len = 8;
9673
9674 char *salt_buf_ptr = (char *) salt->salt_buf;
9675
9676 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9677
9678 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9679
9680 salt->salt_len = salt_len;
9681
9682 return (PARSER_OK);
9683 }
9684
9685 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9686 {
9687 if (data.opts_type & OPTS_TYPE_ST_HEX)
9688 {
9689 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9690 }
9691 else
9692 {
9693 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9694 }
9695
9696 u32 *digest = (u32 *) hash_buf->digest;
9697
9698 salt_t *salt = hash_buf->salt;
9699
9700 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9701 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9702 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9703 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9704
9705 digest[0] = byte_swap_32 (digest[0]);
9706 digest[1] = byte_swap_32 (digest[1]);
9707 digest[2] = byte_swap_32 (digest[2]);
9708 digest[3] = byte_swap_32 (digest[3]);
9709
9710 digest[0] -= MD5M_A;
9711 digest[1] -= MD5M_B;
9712 digest[2] -= MD5M_C;
9713 digest[3] -= MD5M_D;
9714
9715 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9716
9717 uint salt_len = input_len - 32 - 1;
9718
9719 char *salt_buf = input_buf + 32 + 1;
9720
9721 char *salt_buf_ptr = (char *) salt->salt_buf;
9722
9723 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9724
9725 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9726
9727 salt->salt_len = salt_len;
9728
9729 return (PARSER_OK);
9730 }
9731
9732 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9733 {
9734 if (data.opts_type & OPTS_TYPE_ST_HEX)
9735 {
9736 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9737 }
9738 else
9739 {
9740 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9741 }
9742
9743 // unscramble
9744
9745 char clean_input_buf[32] = { 0 };
9746
9747 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9748 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9749
9750 for (int i = 0, j = 0, k = 0; i < 30; i++)
9751 {
9752 if (i == pos[j])
9753 {
9754 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9755
9756 j++;
9757 }
9758 else
9759 {
9760 clean_input_buf[k] = input_buf[i];
9761
9762 k++;
9763 }
9764 }
9765
9766 // base64 decode
9767
9768 u32 *digest = (u32 *) hash_buf->digest;
9769
9770 salt_t *salt = hash_buf->salt;
9771
9772 u32 a, b, c, d, e, f;
9773
9774 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9775 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9776 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9777 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9778 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9779 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9780
9781 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9782 | (((d << 12) | (e << 6) | (f)) << 0);
9783
9784 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9785 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9786 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9787 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9788 e = base64_to_int (clean_input_buf[10] & 0x7f);
9789 f = base64_to_int (clean_input_buf[11] & 0x7f);
9790
9791 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9792 | (((d << 12) | (e << 6) | (f)) << 0);
9793
9794 a = base64_to_int (clean_input_buf[12] & 0x7f);
9795 b = base64_to_int (clean_input_buf[13] & 0x7f);
9796 c = base64_to_int (clean_input_buf[14] & 0x7f);
9797 d = base64_to_int (clean_input_buf[15] & 0x7f);
9798 e = base64_to_int (clean_input_buf[16] & 0x7f);
9799 f = base64_to_int (clean_input_buf[17] & 0x7f);
9800
9801 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9802 | (((d << 12) | (e << 6) | (f)) << 0);
9803
9804 a = base64_to_int (clean_input_buf[18] & 0x7f);
9805 b = base64_to_int (clean_input_buf[19] & 0x7f);
9806 c = base64_to_int (clean_input_buf[20] & 0x7f);
9807 d = base64_to_int (clean_input_buf[21] & 0x7f);
9808 e = base64_to_int (clean_input_buf[22] & 0x7f);
9809 f = base64_to_int (clean_input_buf[23] & 0x7f);
9810
9811 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9812 | (((d << 12) | (e << 6) | (f)) << 0);
9813
9814 digest[0] = byte_swap_32 (digest[0]);
9815 digest[1] = byte_swap_32 (digest[1]);
9816 digest[2] = byte_swap_32 (digest[2]);
9817 digest[3] = byte_swap_32 (digest[3]);
9818
9819 digest[0] -= MD5M_A;
9820 digest[1] -= MD5M_B;
9821 digest[2] -= MD5M_C;
9822 digest[3] -= MD5M_D;
9823
9824 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9825
9826 uint salt_len = input_len - 30 - 1;
9827
9828 char *salt_buf = input_buf + 30 + 1;
9829
9830 char *salt_buf_ptr = (char *) salt->salt_buf;
9831
9832 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9833
9834 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9835 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9836
9837 salt->salt_len = salt_len;
9838
9839 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9840
9841 salt->salt_len += 22;
9842
9843 return (PARSER_OK);
9844 }
9845
9846 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9847 {
9848 if (data.opts_type & OPTS_TYPE_ST_HEX)
9849 {
9850 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9851 }
9852 else
9853 {
9854 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9855 }
9856
9857 u32 *digest = (u32 *) hash_buf->digest;
9858
9859 salt_t *salt = hash_buf->salt;
9860
9861 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9862 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9863 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9864 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9865 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
9866
9867 digest[0] -= SHA1M_A;
9868 digest[1] -= SHA1M_B;
9869 digest[2] -= SHA1M_C;
9870 digest[3] -= SHA1M_D;
9871 digest[4] -= SHA1M_E;
9872
9873 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9874
9875 uint salt_len = input_len - 40 - 1;
9876
9877 char *salt_buf = input_buf + 40 + 1;
9878
9879 char *salt_buf_ptr = (char *) salt->salt_buf;
9880
9881 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9882
9883 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9884
9885 salt->salt_len = salt_len;
9886
9887 return (PARSER_OK);
9888 }
9889
9890 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9891 {
9892 if (data.opts_type & OPTS_TYPE_ST_HEX)
9893 {
9894 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9895 }
9896 else
9897 {
9898 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9899 }
9900
9901 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9902
9903 char *iter_pos = input_buf + 6;
9904
9905 salt_t *salt = hash_buf->salt;
9906
9907 uint iter = atoi (iter_pos);
9908
9909 if (iter < 1)
9910 {
9911 iter = ROUNDS_DCC2;
9912 }
9913
9914 salt->salt_iter = iter - 1;
9915
9916 char *salt_pos = strchr (iter_pos, '#');
9917
9918 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9919
9920 salt_pos++;
9921
9922 char *digest_pos = strchr (salt_pos, '#');
9923
9924 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9925
9926 digest_pos++;
9927
9928 uint salt_len = digest_pos - salt_pos - 1;
9929
9930 u32 *digest = (u32 *) hash_buf->digest;
9931
9932 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
9933 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
9934 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
9935 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
9936
9937 char *salt_buf_ptr = (char *) salt->salt_buf;
9938
9939 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9940
9941 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9942
9943 salt->salt_len = salt_len;
9944
9945 return (PARSER_OK);
9946 }
9947
9948 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9949 {
9950 u32 *digest = (u32 *) hash_buf->digest;
9951
9952 salt_t *salt = hash_buf->salt;
9953
9954 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9955
9956 hccap_t in;
9957
9958 memcpy (&in, input_buf, input_len);
9959
9960 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9961
9962 memcpy (digest, in.keymic, 16);
9963
9964 /*
9965 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9966 The phrase "Pairwise key expansion"
9967 Access Point Address (referred to as Authenticator Address AA)
9968 Supplicant Address (referred to as Supplicant Address SA)
9969 Access Point Nonce (referred to as Authenticator Anonce)
9970 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9971 */
9972
9973 uint salt_len = strlen (in.essid);
9974
9975 memcpy (salt->salt_buf, in.essid, salt_len);
9976
9977 salt->salt_len = salt_len;
9978
9979 salt->salt_iter = ROUNDS_WPA2 - 1;
9980
9981 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9982
9983 memcpy (pke_ptr, "Pairwise key expansion", 23);
9984
9985 if (memcmp (in.mac1, in.mac2, 6) < 0)
9986 {
9987 memcpy (pke_ptr + 23, in.mac1, 6);
9988 memcpy (pke_ptr + 29, in.mac2, 6);
9989 }
9990 else
9991 {
9992 memcpy (pke_ptr + 23, in.mac2, 6);
9993 memcpy (pke_ptr + 29, in.mac1, 6);
9994 }
9995
9996 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9997 {
9998 memcpy (pke_ptr + 35, in.nonce1, 32);
9999 memcpy (pke_ptr + 67, in.nonce2, 32);
10000 }
10001 else
10002 {
10003 memcpy (pke_ptr + 35, in.nonce2, 32);
10004 memcpy (pke_ptr + 67, in.nonce1, 32);
10005 }
10006
10007 for (int i = 0; i < 25; i++)
10008 {
10009 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10010 }
10011
10012 wpa->keyver = in.keyver;
10013
10014 if (wpa->keyver > 255)
10015 {
10016 log_info ("ATTENTION!");
10017 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10018 log_info (" This could be due to a recent aircrack-ng bug.");
10019 log_info (" The key version was automatically reset to a reasonable value.");
10020 log_info ("");
10021
10022 wpa->keyver &= 0xff;
10023 }
10024
10025 wpa->eapol_size = in.eapol_size;
10026
10027 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10028
10029 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10030
10031 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10032
10033 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10034
10035 if (wpa->keyver == 1)
10036 {
10037 // nothing to do
10038 }
10039 else
10040 {
10041 digest[0] = byte_swap_32 (digest[0]);
10042 digest[1] = byte_swap_32 (digest[1]);
10043 digest[2] = byte_swap_32 (digest[2]);
10044 digest[3] = byte_swap_32 (digest[3]);
10045
10046 for (int i = 0; i < 64; i++)
10047 {
10048 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10049 }
10050 }
10051
10052 salt->salt_buf[10] = digest[1];
10053 salt->salt_buf[11] = digest[2];
10054
10055 return (PARSER_OK);
10056 }
10057
10058 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10059 {
10060 u32 *digest = (u32 *) hash_buf->digest;
10061
10062 salt_t *salt = hash_buf->salt;
10063
10064 if (input_len == 0)
10065 {
10066 log_error ("Password Safe v2 container not specified");
10067
10068 exit (-1);
10069 }
10070
10071 FILE *fp = fopen (input_buf, "rb");
10072
10073 if (fp == NULL)
10074 {
10075 log_error ("%s: %s", input_buf, strerror (errno));
10076
10077 exit (-1);
10078 }
10079
10080 psafe2_hdr buf;
10081
10082 memset (&buf, 0, sizeof (psafe2_hdr));
10083
10084 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10085
10086 fclose (fp);
10087
10088 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10089
10090 salt->salt_buf[0] = buf.random[0];
10091 salt->salt_buf[1] = buf.random[1];
10092
10093 salt->salt_len = 8;
10094 salt->salt_iter = 1000;
10095
10096 digest[0] = byte_swap_32 (buf.hash[0]);
10097 digest[1] = byte_swap_32 (buf.hash[1]);
10098 digest[2] = byte_swap_32 (buf.hash[2]);
10099 digest[3] = byte_swap_32 (buf.hash[3]);
10100 digest[4] = byte_swap_32 (buf.hash[4]);
10101
10102 return (PARSER_OK);
10103 }
10104
10105 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10106 {
10107 u32 *digest = (u32 *) hash_buf->digest;
10108
10109 salt_t *salt = hash_buf->salt;
10110
10111 if (input_len == 0)
10112 {
10113 log_error (".psafe3 not specified");
10114
10115 exit (-1);
10116 }
10117
10118 FILE *fp = fopen (input_buf, "rb");
10119
10120 if (fp == NULL)
10121 {
10122 log_error ("%s: %s", input_buf, strerror (errno));
10123
10124 exit (-1);
10125 }
10126
10127 psafe3_t in;
10128
10129 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10130
10131 fclose (fp);
10132
10133 data.hashfile = input_buf; // we will need this in case it gets cracked
10134
10135 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10136
10137 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10138
10139 salt->salt_iter = in.iterations + 1;
10140
10141 salt->salt_buf[0] = in.salt_buf[0];
10142 salt->salt_buf[1] = in.salt_buf[1];
10143 salt->salt_buf[2] = in.salt_buf[2];
10144 salt->salt_buf[3] = in.salt_buf[3];
10145 salt->salt_buf[4] = in.salt_buf[4];
10146 salt->salt_buf[5] = in.salt_buf[5];
10147 salt->salt_buf[6] = in.salt_buf[6];
10148 salt->salt_buf[7] = in.salt_buf[7];
10149
10150 salt->salt_len = 32;
10151
10152 digest[0] = in.hash_buf[0];
10153 digest[1] = in.hash_buf[1];
10154 digest[2] = in.hash_buf[2];
10155 digest[3] = in.hash_buf[3];
10156 digest[4] = in.hash_buf[4];
10157 digest[5] = in.hash_buf[5];
10158 digest[6] = in.hash_buf[6];
10159 digest[7] = in.hash_buf[7];
10160
10161 digest[0] = byte_swap_32 (digest[0]);
10162 digest[1] = byte_swap_32 (digest[1]);
10163 digest[2] = byte_swap_32 (digest[2]);
10164 digest[3] = byte_swap_32 (digest[3]);
10165 digest[4] = byte_swap_32 (digest[4]);
10166 digest[5] = byte_swap_32 (digest[5]);
10167 digest[6] = byte_swap_32 (digest[6]);
10168 digest[7] = byte_swap_32 (digest[7]);
10169
10170 return (PARSER_OK);
10171 }
10172
10173 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10174 {
10175 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10176
10177 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10178
10179 u32 *digest = (u32 *) hash_buf->digest;
10180
10181 salt_t *salt = hash_buf->salt;
10182
10183 char *iter_pos = input_buf + 3;
10184
10185 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10186
10187 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10188
10189 memcpy ((char *) salt->salt_sign, input_buf, 4);
10190
10191 salt->salt_iter = salt_iter;
10192
10193 char *salt_pos = iter_pos + 1;
10194
10195 uint salt_len = 8;
10196
10197 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10198
10199 salt->salt_len = salt_len;
10200
10201 char *hash_pos = salt_pos + salt_len;
10202
10203 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10204
10205 return (PARSER_OK);
10206 }
10207
10208 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10209 {
10210 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10211
10212 u32 *digest = (u32 *) hash_buf->digest;
10213
10214 salt_t *salt = hash_buf->salt;
10215
10216 char *salt_pos = input_buf + 3;
10217
10218 uint iterations_len = 0;
10219
10220 if (memcmp (salt_pos, "rounds=", 7) == 0)
10221 {
10222 salt_pos += 7;
10223
10224 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10225
10226 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10227 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10228
10229 salt_pos[0] = 0x0;
10230
10231 salt->salt_iter = atoi (salt_pos - iterations_len);
10232
10233 salt_pos += 1;
10234
10235 iterations_len += 8;
10236 }
10237 else
10238 {
10239 salt->salt_iter = ROUNDS_MD5CRYPT;
10240 }
10241
10242 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10243
10244 char *hash_pos = strchr (salt_pos, '$');
10245
10246 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10247
10248 uint salt_len = hash_pos - salt_pos;
10249
10250 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10251
10252 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10253
10254 salt->salt_len = salt_len;
10255
10256 hash_pos++;
10257
10258 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10259
10260 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10261
10262 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10263
10264 return (PARSER_OK);
10265 }
10266
10267 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10268 {
10269 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10270
10271 u32 *digest = (u32 *) hash_buf->digest;
10272
10273 salt_t *salt = hash_buf->salt;
10274
10275 char *salt_pos = input_buf + 6;
10276
10277 uint iterations_len = 0;
10278
10279 if (memcmp (salt_pos, "rounds=", 7) == 0)
10280 {
10281 salt_pos += 7;
10282
10283 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10284
10285 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10286 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10287
10288 salt_pos[0] = 0x0;
10289
10290 salt->salt_iter = atoi (salt_pos - iterations_len);
10291
10292 salt_pos += 1;
10293
10294 iterations_len += 8;
10295 }
10296 else
10297 {
10298 salt->salt_iter = ROUNDS_MD5CRYPT;
10299 }
10300
10301 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10302
10303 char *hash_pos = strchr (salt_pos, '$');
10304
10305 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10306
10307 uint salt_len = hash_pos - salt_pos;
10308
10309 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10310
10311 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10312
10313 salt->salt_len = salt_len;
10314
10315 hash_pos++;
10316
10317 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10318
10319 return (PARSER_OK);
10320 }
10321
10322 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10323 {
10324 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10325
10326 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10327
10328 u32 *digest = (u32 *) hash_buf->digest;
10329
10330 salt_t *salt = hash_buf->salt;
10331
10332 char *salt_pos = input_buf + 14;
10333
10334 char *hash_pos = strchr (salt_pos, '*');
10335
10336 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10337
10338 hash_pos++;
10339
10340 uint salt_len = hash_pos - salt_pos - 1;
10341
10342 char *salt_buf_ptr = (char *) salt->salt_buf;
10343
10344 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10345
10346 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10347
10348 salt->salt_len = salt_len;
10349
10350 u8 tmp_buf[100] = { 0 };
10351
10352 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10353
10354 memcpy (digest, tmp_buf, 20);
10355
10356 digest[0] = byte_swap_32 (digest[0]);
10357 digest[1] = byte_swap_32 (digest[1]);
10358 digest[2] = byte_swap_32 (digest[2]);
10359 digest[3] = byte_swap_32 (digest[3]);
10360 digest[4] = byte_swap_32 (digest[4]);
10361
10362 digest[0] -= SHA1M_A;
10363 digest[1] -= SHA1M_B;
10364 digest[2] -= SHA1M_C;
10365 digest[3] -= SHA1M_D;
10366 digest[4] -= SHA1M_E;
10367
10368 return (PARSER_OK);
10369 }
10370
10371 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10372 {
10373 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10374
10375 unsigned char c12 = itoa64_to_int (input_buf[12]);
10376
10377 if (c12 & 3) return (PARSER_HASH_VALUE);
10378
10379 u32 *digest = (u32 *) hash_buf->digest;
10380
10381 salt_t *salt = hash_buf->salt;
10382
10383 // for ascii_digest
10384 salt->salt_sign[0] = input_buf[0];
10385 salt->salt_sign[1] = input_buf[1];
10386
10387 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10388 | itoa64_to_int (input_buf[1]) << 6;
10389
10390 salt->salt_len = 2;
10391
10392 u8 tmp_buf[100] = { 0 };
10393
10394 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10395
10396 memcpy (digest, tmp_buf, 8);
10397
10398 uint tt;
10399
10400 IP (digest[0], digest[1], tt);
10401
10402 digest[2] = 0;
10403 digest[3] = 0;
10404
10405 return (PARSER_OK);
10406 }
10407
10408 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10409 {
10410 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10411
10412 u32 *digest = (u32 *) hash_buf->digest;
10413
10414 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10415 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10416 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10417 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10418
10419 digest[0] = byte_swap_32 (digest[0]);
10420 digest[1] = byte_swap_32 (digest[1]);
10421 digest[2] = byte_swap_32 (digest[2]);
10422 digest[3] = byte_swap_32 (digest[3]);
10423
10424 digest[0] -= MD4M_A;
10425 digest[1] -= MD4M_B;
10426 digest[2] -= MD4M_C;
10427 digest[3] -= MD4M_D;
10428
10429 return (PARSER_OK);
10430 }
10431
10432 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10433 {
10434 if (data.opts_type & OPTS_TYPE_ST_HEX)
10435 {
10436 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10437 }
10438 else
10439 {
10440 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10441 }
10442
10443 u32 *digest = (u32 *) hash_buf->digest;
10444
10445 salt_t *salt = hash_buf->salt;
10446
10447 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10448 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10449 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10450 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10451
10452 digest[0] = byte_swap_32 (digest[0]);
10453 digest[1] = byte_swap_32 (digest[1]);
10454 digest[2] = byte_swap_32 (digest[2]);
10455 digest[3] = byte_swap_32 (digest[3]);
10456
10457 digest[0] -= MD4M_A;
10458 digest[1] -= MD4M_B;
10459 digest[2] -= MD4M_C;
10460 digest[3] -= MD4M_D;
10461
10462 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10463
10464 uint salt_len = input_len - 32 - 1;
10465
10466 char *salt_buf = input_buf + 32 + 1;
10467
10468 char *salt_buf_ptr = (char *) salt->salt_buf;
10469
10470 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10471
10472 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10473
10474 salt->salt_len = salt_len;
10475
10476 return (PARSER_OK);
10477 }
10478
10479 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10480 {
10481 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10482
10483 u32 *digest = (u32 *) hash_buf->digest;
10484
10485 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10486 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10487 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10488 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10489
10490 digest[0] = byte_swap_32 (digest[0]);
10491 digest[1] = byte_swap_32 (digest[1]);
10492 digest[2] = byte_swap_32 (digest[2]);
10493 digest[3] = byte_swap_32 (digest[3]);
10494
10495 digest[0] -= MD5M_A;
10496 digest[1] -= MD5M_B;
10497 digest[2] -= MD5M_C;
10498 digest[3] -= MD5M_D;
10499
10500 return (PARSER_OK);
10501 }
10502
10503 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10504 {
10505 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10506
10507 u32 *digest = (u32 *) hash_buf->digest;
10508
10509 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10510 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10511 digest[2] = 0;
10512 digest[3] = 0;
10513
10514 digest[0] = byte_swap_32 (digest[0]);
10515 digest[1] = byte_swap_32 (digest[1]);
10516
10517 return (PARSER_OK);
10518 }
10519
10520 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10521 {
10522 if (data.opts_type & OPTS_TYPE_ST_HEX)
10523 {
10524 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10525 }
10526 else
10527 {
10528 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10529 }
10530
10531 u32 *digest = (u32 *) hash_buf->digest;
10532
10533 salt_t *salt = hash_buf->salt;
10534
10535 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10536 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10537 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10538 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10539
10540 digest[0] = byte_swap_32 (digest[0]);
10541 digest[1] = byte_swap_32 (digest[1]);
10542 digest[2] = byte_swap_32 (digest[2]);
10543 digest[3] = byte_swap_32 (digest[3]);
10544
10545 digest[0] -= MD5M_A;
10546 digest[1] -= MD5M_B;
10547 digest[2] -= MD5M_C;
10548 digest[3] -= MD5M_D;
10549
10550 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10551
10552 uint salt_len = input_len - 32 - 1;
10553
10554 char *salt_buf = input_buf + 32 + 1;
10555
10556 char *salt_buf_ptr = (char *) salt->salt_buf;
10557
10558 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10559
10560 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10561
10562 salt->salt_len = salt_len;
10563
10564 return (PARSER_OK);
10565 }
10566
10567 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10568 {
10569 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10570
10571 u32 *digest = (u32 *) hash_buf->digest;
10572
10573 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10574 | itoa64_to_int (input_buf[ 1]) << 6
10575 | itoa64_to_int (input_buf[ 2]) << 12
10576 | itoa64_to_int (input_buf[ 3]) << 18;
10577 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10578 | itoa64_to_int (input_buf[ 5]) << 6
10579 | itoa64_to_int (input_buf[ 6]) << 12
10580 | itoa64_to_int (input_buf[ 7]) << 18;
10581 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10582 | itoa64_to_int (input_buf[ 9]) << 6
10583 | itoa64_to_int (input_buf[10]) << 12
10584 | itoa64_to_int (input_buf[11]) << 18;
10585 digest[3] = itoa64_to_int (input_buf[12]) << 0
10586 | itoa64_to_int (input_buf[13]) << 6
10587 | itoa64_to_int (input_buf[14]) << 12
10588 | itoa64_to_int (input_buf[15]) << 18;
10589
10590 digest[0] -= MD5M_A;
10591 digest[1] -= MD5M_B;
10592 digest[2] -= MD5M_C;
10593 digest[3] -= MD5M_D;
10594
10595 digest[0] &= 0x00ffffff;
10596 digest[1] &= 0x00ffffff;
10597 digest[2] &= 0x00ffffff;
10598 digest[3] &= 0x00ffffff;
10599
10600 return (PARSER_OK);
10601 }
10602
10603 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10604 {
10605 if (data.opts_type & OPTS_TYPE_ST_HEX)
10606 {
10607 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10608 }
10609 else
10610 {
10611 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10612 }
10613
10614 u32 *digest = (u32 *) hash_buf->digest;
10615
10616 salt_t *salt = hash_buf->salt;
10617
10618 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10619 | itoa64_to_int (input_buf[ 1]) << 6
10620 | itoa64_to_int (input_buf[ 2]) << 12
10621 | itoa64_to_int (input_buf[ 3]) << 18;
10622 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10623 | itoa64_to_int (input_buf[ 5]) << 6
10624 | itoa64_to_int (input_buf[ 6]) << 12
10625 | itoa64_to_int (input_buf[ 7]) << 18;
10626 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10627 | itoa64_to_int (input_buf[ 9]) << 6
10628 | itoa64_to_int (input_buf[10]) << 12
10629 | itoa64_to_int (input_buf[11]) << 18;
10630 digest[3] = itoa64_to_int (input_buf[12]) << 0
10631 | itoa64_to_int (input_buf[13]) << 6
10632 | itoa64_to_int (input_buf[14]) << 12
10633 | itoa64_to_int (input_buf[15]) << 18;
10634
10635 digest[0] -= MD5M_A;
10636 digest[1] -= MD5M_B;
10637 digest[2] -= MD5M_C;
10638 digest[3] -= MD5M_D;
10639
10640 digest[0] &= 0x00ffffff;
10641 digest[1] &= 0x00ffffff;
10642 digest[2] &= 0x00ffffff;
10643 digest[3] &= 0x00ffffff;
10644
10645 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10646
10647 uint salt_len = input_len - 16 - 1;
10648
10649 char *salt_buf = input_buf + 16 + 1;
10650
10651 char *salt_buf_ptr = (char *) salt->salt_buf;
10652
10653 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10654
10655 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10656
10657 salt->salt_len = salt_len;
10658
10659 return (PARSER_OK);
10660 }
10661
10662 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10663 {
10664 key[0] = (nthash[0] >> 0);
10665 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10666 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10667 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10668 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10669 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10670 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10671 key[7] = (nthash[6] << 1);
10672
10673 key[0] |= 0x01;
10674 key[1] |= 0x01;
10675 key[2] |= 0x01;
10676 key[3] |= 0x01;
10677 key[4] |= 0x01;
10678 key[5] |= 0x01;
10679 key[6] |= 0x01;
10680 key[7] |= 0x01;
10681 }
10682
10683 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10684 {
10685 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10686
10687 u32 *digest = (u32 *) hash_buf->digest;
10688
10689 salt_t *salt = hash_buf->salt;
10690
10691 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10692
10693 /**
10694 * parse line
10695 */
10696
10697 char *user_pos = input_buf;
10698
10699 char *unused_pos = strchr (user_pos, ':');
10700
10701 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10702
10703 uint user_len = unused_pos - user_pos;
10704
10705 if (user_len > 60) return (PARSER_SALT_LENGTH);
10706
10707 unused_pos++;
10708
10709 char *domain_pos = strchr (unused_pos, ':');
10710
10711 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10712
10713 uint unused_len = domain_pos - unused_pos;
10714
10715 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10716
10717 domain_pos++;
10718
10719 char *srvchall_pos = strchr (domain_pos, ':');
10720
10721 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10722
10723 uint domain_len = srvchall_pos - domain_pos;
10724
10725 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10726
10727 srvchall_pos++;
10728
10729 char *hash_pos = strchr (srvchall_pos, ':');
10730
10731 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10732
10733 uint srvchall_len = hash_pos - srvchall_pos;
10734
10735 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10736
10737 hash_pos++;
10738
10739 char *clichall_pos = strchr (hash_pos, ':');
10740
10741 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10742
10743 uint hash_len = clichall_pos - hash_pos;
10744
10745 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10746
10747 clichall_pos++;
10748
10749 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10750
10751 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10752
10753 /**
10754 * store some data for later use
10755 */
10756
10757 netntlm->user_len = user_len * 2;
10758 netntlm->domain_len = domain_len * 2;
10759 netntlm->srvchall_len = srvchall_len / 2;
10760 netntlm->clichall_len = clichall_len / 2;
10761
10762 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10763 char *chall_ptr = (char *) netntlm->chall_buf;
10764
10765 /**
10766 * handle username and domainname
10767 */
10768
10769 for (uint i = 0; i < user_len; i++)
10770 {
10771 *userdomain_ptr++ = user_pos[i];
10772 *userdomain_ptr++ = 0;
10773 }
10774
10775 for (uint i = 0; i < domain_len; i++)
10776 {
10777 *userdomain_ptr++ = domain_pos[i];
10778 *userdomain_ptr++ = 0;
10779 }
10780
10781 /**
10782 * handle server challenge encoding
10783 */
10784
10785 for (uint i = 0; i < srvchall_len; i += 2)
10786 {
10787 const char p0 = srvchall_pos[i + 0];
10788 const char p1 = srvchall_pos[i + 1];
10789
10790 *chall_ptr++ = hex_convert (p1) << 0
10791 | hex_convert (p0) << 4;
10792 }
10793
10794 /**
10795 * handle client challenge encoding
10796 */
10797
10798 for (uint i = 0; i < clichall_len; i += 2)
10799 {
10800 const char p0 = clichall_pos[i + 0];
10801 const char p1 = clichall_pos[i + 1];
10802
10803 *chall_ptr++ = hex_convert (p1) << 0
10804 | hex_convert (p0) << 4;
10805 }
10806
10807 /**
10808 * store data
10809 */
10810
10811 char *salt_buf_ptr = (char *) salt->salt_buf;
10812
10813 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10814
10815 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10816
10817 salt->salt_len = salt_len;
10818
10819 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10820 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10821 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10822 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10823
10824 digest[0] = byte_swap_32 (digest[0]);
10825 digest[1] = byte_swap_32 (digest[1]);
10826 digest[2] = byte_swap_32 (digest[2]);
10827 digest[3] = byte_swap_32 (digest[3]);
10828
10829 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10830
10831 uint digest_tmp[2] = { 0 };
10832
10833 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10834 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
10835
10836 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10837 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10838
10839 /* special case 2: ESS */
10840
10841 if (srvchall_len == 48)
10842 {
10843 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10844 {
10845 uint w[16] = { 0 };
10846
10847 w[ 0] = netntlm->chall_buf[6];
10848 w[ 1] = netntlm->chall_buf[7];
10849 w[ 2] = netntlm->chall_buf[0];
10850 w[ 3] = netntlm->chall_buf[1];
10851 w[ 4] = 0x80;
10852 w[14] = 16 * 8;
10853
10854 uint dgst[4] = { 0 };
10855
10856 dgst[0] = MAGIC_A;
10857 dgst[1] = MAGIC_B;
10858 dgst[2] = MAGIC_C;
10859 dgst[3] = MAGIC_D;
10860
10861 md5_64 (w, dgst);
10862
10863 salt->salt_buf[0] = dgst[0];
10864 salt->salt_buf[1] = dgst[1];
10865 }
10866 }
10867
10868 /* precompute netntlmv1 exploit start */
10869
10870 for (uint i = 0; i < 0x10000; i++)
10871 {
10872 uint key_md4[2] = { i, 0 };
10873 uint key_des[2] = { 0, 0 };
10874
10875 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
10876
10877 uint Kc[16] = { 0 };
10878 uint Kd[16] = { 0 };
10879
10880 _des_keysetup (key_des, Kc, Kd, c_skb);
10881
10882 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10883
10884 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10885
10886 if (data3[0] != digest_tmp[0]) continue;
10887 if (data3[1] != digest_tmp[1]) continue;
10888
10889 salt->salt_buf[2] = i;
10890
10891 salt->salt_len = 24;
10892
10893 break;
10894 }
10895
10896 salt->salt_buf_pc[0] = digest_tmp[0];
10897 salt->salt_buf_pc[1] = digest_tmp[1];
10898
10899 /* precompute netntlmv1 exploit stop */
10900
10901 u32 tt;
10902
10903 IP (digest[0], digest[1], tt);
10904 IP (digest[2], digest[3], tt);
10905
10906 digest[0] = rotr32 (digest[0], 29);
10907 digest[1] = rotr32 (digest[1], 29);
10908 digest[2] = rotr32 (digest[2], 29);
10909 digest[3] = rotr32 (digest[3], 29);
10910
10911 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10912
10913 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
10914 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
10915
10916 return (PARSER_OK);
10917 }
10918
10919 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10920 {
10921 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10922
10923 u32 *digest = (u32 *) hash_buf->digest;
10924
10925 salt_t *salt = hash_buf->salt;
10926
10927 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10928
10929 /**
10930 * parse line
10931 */
10932
10933 char *user_pos = input_buf;
10934
10935 char *unused_pos = strchr (user_pos, ':');
10936
10937 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10938
10939 uint user_len = unused_pos - user_pos;
10940
10941 if (user_len > 60) return (PARSER_SALT_LENGTH);
10942
10943 unused_pos++;
10944
10945 char *domain_pos = strchr (unused_pos, ':');
10946
10947 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10948
10949 uint unused_len = domain_pos - unused_pos;
10950
10951 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10952
10953 domain_pos++;
10954
10955 char *srvchall_pos = strchr (domain_pos, ':');
10956
10957 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10958
10959 uint domain_len = srvchall_pos - domain_pos;
10960
10961 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10962
10963 srvchall_pos++;
10964
10965 char *hash_pos = strchr (srvchall_pos, ':');
10966
10967 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10968
10969 uint srvchall_len = hash_pos - srvchall_pos;
10970
10971 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10972
10973 hash_pos++;
10974
10975 char *clichall_pos = strchr (hash_pos, ':');
10976
10977 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10978
10979 uint hash_len = clichall_pos - hash_pos;
10980
10981 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10982
10983 clichall_pos++;
10984
10985 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10986
10987 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10988
10989 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10990
10991 /**
10992 * store some data for later use
10993 */
10994
10995 netntlm->user_len = user_len * 2;
10996 netntlm->domain_len = domain_len * 2;
10997 netntlm->srvchall_len = srvchall_len / 2;
10998 netntlm->clichall_len = clichall_len / 2;
10999
11000 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11001 char *chall_ptr = (char *) netntlm->chall_buf;
11002
11003 /**
11004 * handle username and domainname
11005 */
11006
11007 for (uint i = 0; i < user_len; i++)
11008 {
11009 *userdomain_ptr++ = toupper (user_pos[i]);
11010 *userdomain_ptr++ = 0;
11011 }
11012
11013 for (uint i = 0; i < domain_len; i++)
11014 {
11015 *userdomain_ptr++ = domain_pos[i];
11016 *userdomain_ptr++ = 0;
11017 }
11018
11019 *userdomain_ptr++ = 0x80;
11020
11021 /**
11022 * handle server challenge encoding
11023 */
11024
11025 for (uint i = 0; i < srvchall_len; i += 2)
11026 {
11027 const char p0 = srvchall_pos[i + 0];
11028 const char p1 = srvchall_pos[i + 1];
11029
11030 *chall_ptr++ = hex_convert (p1) << 0
11031 | hex_convert (p0) << 4;
11032 }
11033
11034 /**
11035 * handle client challenge encoding
11036 */
11037
11038 for (uint i = 0; i < clichall_len; i += 2)
11039 {
11040 const char p0 = clichall_pos[i + 0];
11041 const char p1 = clichall_pos[i + 1];
11042
11043 *chall_ptr++ = hex_convert (p1) << 0
11044 | hex_convert (p0) << 4;
11045 }
11046
11047 *chall_ptr++ = 0x80;
11048
11049 /**
11050 * handle hash itself
11051 */
11052
11053 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11054 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11055 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11056 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11057
11058 digest[0] = byte_swap_32 (digest[0]);
11059 digest[1] = byte_swap_32 (digest[1]);
11060 digest[2] = byte_swap_32 (digest[2]);
11061 digest[3] = byte_swap_32 (digest[3]);
11062
11063 /**
11064 * reuse challange data as salt_buf, its the buffer that is most likely unique
11065 */
11066
11067 salt->salt_buf[0] = 0;
11068 salt->salt_buf[1] = 0;
11069 salt->salt_buf[2] = 0;
11070 salt->salt_buf[3] = 0;
11071 salt->salt_buf[4] = 0;
11072 salt->salt_buf[5] = 0;
11073 salt->salt_buf[6] = 0;
11074 salt->salt_buf[7] = 0;
11075
11076 uint *uptr;
11077
11078 uptr = (uint *) netntlm->userdomain_buf;
11079
11080 for (uint i = 0; i < 16; i += 16)
11081 {
11082 md5_64 (uptr, salt->salt_buf);
11083 }
11084
11085 uptr = (uint *) netntlm->chall_buf;
11086
11087 for (uint i = 0; i < 256; i += 16)
11088 {
11089 md5_64 (uptr, salt->salt_buf);
11090 }
11091
11092 salt->salt_len = 16;
11093
11094 return (PARSER_OK);
11095 }
11096
11097 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11098 {
11099 if (data.opts_type & OPTS_TYPE_ST_HEX)
11100 {
11101 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11102 }
11103 else
11104 {
11105 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11106 }
11107
11108 u32 *digest = (u32 *) hash_buf->digest;
11109
11110 salt_t *salt = hash_buf->salt;
11111
11112 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11113 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11114 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11115 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11116
11117 digest[0] = byte_swap_32 (digest[0]);
11118 digest[1] = byte_swap_32 (digest[1]);
11119 digest[2] = byte_swap_32 (digest[2]);
11120 digest[3] = byte_swap_32 (digest[3]);
11121
11122 digest[0] -= MD5M_A;
11123 digest[1] -= MD5M_B;
11124 digest[2] -= MD5M_C;
11125 digest[3] -= MD5M_D;
11126
11127 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11128
11129 uint salt_len = input_len - 32 - 1;
11130
11131 char *salt_buf = input_buf + 32 + 1;
11132
11133 char *salt_buf_ptr = (char *) salt->salt_buf;
11134
11135 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11136
11137 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11138
11139 salt->salt_len = salt_len;
11140
11141 return (PARSER_OK);
11142 }
11143
11144 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11145 {
11146 if (data.opts_type & OPTS_TYPE_ST_HEX)
11147 {
11148 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11149 }
11150 else
11151 {
11152 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11153 }
11154
11155 u32 *digest = (u32 *) hash_buf->digest;
11156
11157 salt_t *salt = hash_buf->salt;
11158
11159 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11160 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11161 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11162 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11163
11164 digest[0] = byte_swap_32 (digest[0]);
11165 digest[1] = byte_swap_32 (digest[1]);
11166 digest[2] = byte_swap_32 (digest[2]);
11167 digest[3] = byte_swap_32 (digest[3]);
11168
11169 digest[0] -= MD5M_A;
11170 digest[1] -= MD5M_B;
11171 digest[2] -= MD5M_C;
11172 digest[3] -= MD5M_D;
11173
11174 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11175
11176 uint salt_len = input_len - 32 - 1;
11177
11178 char *salt_buf = input_buf + 32 + 1;
11179
11180 char *salt_buf_ptr = (char *) salt->salt_buf;
11181
11182 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11183
11184 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11185
11186 salt->salt_len = salt_len;
11187
11188 return (PARSER_OK);
11189 }
11190
11191 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11192 {
11193 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11194
11195 u32 *digest = (u32 *) hash_buf->digest;
11196
11197 salt_t *salt = hash_buf->salt;
11198
11199 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11200 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11201 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11202 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11203
11204 digest[0] = byte_swap_32 (digest[0]);
11205 digest[1] = byte_swap_32 (digest[1]);
11206 digest[2] = byte_swap_32 (digest[2]);
11207 digest[3] = byte_swap_32 (digest[3]);
11208
11209 digest[0] -= MD5M_A;
11210 digest[1] -= MD5M_B;
11211 digest[2] -= MD5M_C;
11212 digest[3] -= MD5M_D;
11213
11214 /**
11215 * This is a virtual salt. While the algorithm is basically not salted
11216 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11217 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11218 */
11219
11220 char *salt_buf_ptr = (char *) salt->salt_buf;
11221
11222 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11223
11224 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11225
11226 salt->salt_len = salt_len;
11227
11228 return (PARSER_OK);
11229 }
11230
11231 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11232 {
11233 if (data.opts_type & OPTS_TYPE_ST_HEX)
11234 {
11235 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11236 }
11237 else
11238 {
11239 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11240 }
11241
11242 u32 *digest = (u32 *) hash_buf->digest;
11243
11244 salt_t *salt = hash_buf->salt;
11245
11246 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11247 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11248 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11249 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11250
11251 digest[0] = byte_swap_32 (digest[0]);
11252 digest[1] = byte_swap_32 (digest[1]);
11253 digest[2] = byte_swap_32 (digest[2]);
11254 digest[3] = byte_swap_32 (digest[3]);
11255
11256 digest[0] -= MD5M_A;
11257 digest[1] -= MD5M_B;
11258 digest[2] -= MD5M_C;
11259 digest[3] -= MD5M_D;
11260
11261 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11262
11263 uint salt_len = input_len - 32 - 1;
11264
11265 char *salt_buf = input_buf + 32 + 1;
11266
11267 char *salt_buf_ptr = (char *) salt->salt_buf;
11268
11269 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11270
11271 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11272
11273 salt->salt_len = salt_len;
11274
11275 return (PARSER_OK);
11276 }
11277
11278 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11279 {
11280 if (data.opts_type & OPTS_TYPE_ST_HEX)
11281 {
11282 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11283 }
11284 else
11285 {
11286 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11287 }
11288
11289 u32 *digest = (u32 *) hash_buf->digest;
11290
11291 salt_t *salt = hash_buf->salt;
11292
11293 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11294 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11295 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11296 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11297
11298 digest[0] = byte_swap_32 (digest[0]);
11299 digest[1] = byte_swap_32 (digest[1]);
11300 digest[2] = byte_swap_32 (digest[2]);
11301 digest[3] = byte_swap_32 (digest[3]);
11302
11303 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11304
11305 uint salt_len = input_len - 32 - 1;
11306
11307 char *salt_buf = input_buf + 32 + 1;
11308
11309 char *salt_buf_ptr = (char *) salt->salt_buf;
11310
11311 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11312
11313 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11314
11315 salt->salt_len = salt_len;
11316
11317 return (PARSER_OK);
11318 }
11319
11320 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11321 {
11322 if (data.opts_type & OPTS_TYPE_ST_HEX)
11323 {
11324 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11325 }
11326 else
11327 {
11328 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11329 }
11330
11331 u32 *digest = (u32 *) hash_buf->digest;
11332
11333 salt_t *salt = hash_buf->salt;
11334
11335 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11336 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11337 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11338 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11339
11340 digest[0] = byte_swap_32 (digest[0]);
11341 digest[1] = byte_swap_32 (digest[1]);
11342 digest[2] = byte_swap_32 (digest[2]);
11343 digest[3] = byte_swap_32 (digest[3]);
11344
11345 digest[0] -= MD4M_A;
11346 digest[1] -= MD4M_B;
11347 digest[2] -= MD4M_C;
11348 digest[3] -= MD4M_D;
11349
11350 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11351
11352 uint salt_len = input_len - 32 - 1;
11353
11354 char *salt_buf = input_buf + 32 + 1;
11355
11356 char *salt_buf_ptr = (char *) salt->salt_buf;
11357
11358 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11359
11360 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11361
11362 salt->salt_len = salt_len;
11363
11364 return (PARSER_OK);
11365 }
11366
11367 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11368 {
11369 if (data.opts_type & OPTS_TYPE_ST_HEX)
11370 {
11371 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11372 }
11373 else
11374 {
11375 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11376 }
11377
11378 u32 *digest = (u32 *) hash_buf->digest;
11379
11380 salt_t *salt = hash_buf->salt;
11381
11382 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11383 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11384 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11385 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11386
11387 digest[0] = byte_swap_32 (digest[0]);
11388 digest[1] = byte_swap_32 (digest[1]);
11389 digest[2] = byte_swap_32 (digest[2]);
11390 digest[3] = byte_swap_32 (digest[3]);
11391
11392 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11393
11394 uint salt_len = input_len - 32 - 1;
11395
11396 char *salt_buf = input_buf + 32 + 1;
11397
11398 uint salt_pc_block[16] = { 0 };
11399
11400 char *salt_pc_block_ptr = (char *) salt_pc_block;
11401
11402 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11403
11404 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11405
11406 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11407
11408 salt_pc_block[14] = salt_len * 8;
11409
11410 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11411
11412 md5_64 (salt_pc_block, salt_pc_digest);
11413
11414 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11415 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11416 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11417 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11418
11419 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11420
11421 memcpy (salt_buf_ptr, salt_buf, salt_len);
11422
11423 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11424
11425 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11426 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11427 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11428 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11429
11430 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11431
11432 return (PARSER_OK);
11433 }
11434
11435 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11436 {
11437 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11438
11439 u32 *digest = (u32 *) hash_buf->digest;
11440
11441 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11442 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11443 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11444 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11445 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11446
11447 digest[0] -= SHA1M_A;
11448 digest[1] -= SHA1M_B;
11449 digest[2] -= SHA1M_C;
11450 digest[3] -= SHA1M_D;
11451 digest[4] -= SHA1M_E;
11452
11453 return (PARSER_OK);
11454 }
11455
11456 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11457 {
11458 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11459
11460 u32 *digest = (u32 *) hash_buf->digest;
11461
11462 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11463 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11464 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11465 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11466 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11467
11468 return (PARSER_OK);
11469 }
11470
11471 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11472 {
11473 if (data.opts_type & OPTS_TYPE_ST_HEX)
11474 {
11475 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11476 }
11477 else
11478 {
11479 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11480 }
11481
11482 u32 *digest = (u32 *) hash_buf->digest;
11483
11484 salt_t *salt = hash_buf->salt;
11485
11486 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11487 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11488 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11489 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11490 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11491
11492 digest[0] -= SHA1M_A;
11493 digest[1] -= SHA1M_B;
11494 digest[2] -= SHA1M_C;
11495 digest[3] -= SHA1M_D;
11496 digest[4] -= SHA1M_E;
11497
11498 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11499
11500 uint salt_len = input_len - 40 - 1;
11501
11502 char *salt_buf = input_buf + 40 + 1;
11503
11504 char *salt_buf_ptr = (char *) salt->salt_buf;
11505
11506 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11507
11508 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11509
11510 salt->salt_len = salt_len;
11511
11512 return (PARSER_OK);
11513 }
11514
11515 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11516 {
11517 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11518
11519 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11520
11521 u32 *digest = (u32 *) hash_buf->digest;
11522
11523 u8 tmp_buf[100] = { 0 };
11524
11525 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11526
11527 memcpy (digest, tmp_buf, 20);
11528
11529 digest[0] = byte_swap_32 (digest[0]);
11530 digest[1] = byte_swap_32 (digest[1]);
11531 digest[2] = byte_swap_32 (digest[2]);
11532 digest[3] = byte_swap_32 (digest[3]);
11533 digest[4] = byte_swap_32 (digest[4]);
11534
11535 digest[0] -= SHA1M_A;
11536 digest[1] -= SHA1M_B;
11537 digest[2] -= SHA1M_C;
11538 digest[3] -= SHA1M_D;
11539 digest[4] -= SHA1M_E;
11540
11541 return (PARSER_OK);
11542 }
11543
11544 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11545 {
11546 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11547
11548 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11549
11550 u32 *digest = (u32 *) hash_buf->digest;
11551
11552 salt_t *salt = hash_buf->salt;
11553
11554 u8 tmp_buf[100] = { 0 };
11555
11556 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11557
11558 memcpy (digest, tmp_buf, 20);
11559
11560 salt->salt_len = tmp_len - 20;
11561
11562 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11563
11564 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11565 {
11566 char *ptr = (char *) salt->salt_buf;
11567
11568 ptr[salt->salt_len] = 0x80;
11569 }
11570
11571 digest[0] = byte_swap_32 (digest[0]);
11572 digest[1] = byte_swap_32 (digest[1]);
11573 digest[2] = byte_swap_32 (digest[2]);
11574 digest[3] = byte_swap_32 (digest[3]);
11575 digest[4] = byte_swap_32 (digest[4]);
11576
11577 digest[0] -= SHA1M_A;
11578 digest[1] -= SHA1M_B;
11579 digest[2] -= SHA1M_C;
11580 digest[3] -= SHA1M_D;
11581 digest[4] -= SHA1M_E;
11582
11583 return (PARSER_OK);
11584 }
11585
11586 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11587 {
11588 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11589
11590 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11591
11592 u32 *digest = (u32 *) hash_buf->digest;
11593
11594 salt_t *salt = hash_buf->salt;
11595
11596 char *salt_buf = input_buf + 6;
11597
11598 uint salt_len = 8;
11599
11600 char *salt_buf_ptr = (char *) salt->salt_buf;
11601
11602 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11603
11604 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11605
11606 salt->salt_len = salt_len;
11607
11608 char *hash_pos = input_buf + 6 + 8 + 40;
11609
11610 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11611 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11612 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11613 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11614 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11615
11616 digest[0] -= SHA1M_A;
11617 digest[1] -= SHA1M_B;
11618 digest[2] -= SHA1M_C;
11619 digest[3] -= SHA1M_D;
11620 digest[4] -= SHA1M_E;
11621
11622 return (PARSER_OK);
11623 }
11624
11625 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11626 {
11627 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11628
11629 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11630
11631 u32 *digest = (u32 *) hash_buf->digest;
11632
11633 salt_t *salt = hash_buf->salt;
11634
11635 char *salt_buf = input_buf + 6;
11636
11637 uint salt_len = 8;
11638
11639 char *salt_buf_ptr = (char *) salt->salt_buf;
11640
11641 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11642
11643 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11644
11645 salt->salt_len = salt_len;
11646
11647 char *hash_pos = input_buf + 6 + 8;
11648
11649 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11650 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11651 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11652 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11653 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11654
11655 digest[0] -= SHA1M_A;
11656 digest[1] -= SHA1M_B;
11657 digest[2] -= SHA1M_C;
11658 digest[3] -= SHA1M_D;
11659 digest[4] -= SHA1M_E;
11660
11661 return (PARSER_OK);
11662 }
11663
11664 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11665 {
11666 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11667
11668 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11669
11670 u64 *digest = (u64 *) hash_buf->digest;
11671
11672 salt_t *salt = hash_buf->salt;
11673
11674 char *salt_buf = input_buf + 6;
11675
11676 uint salt_len = 8;
11677
11678 char *salt_buf_ptr = (char *) salt->salt_buf;
11679
11680 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11681
11682 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11683
11684 salt->salt_len = salt_len;
11685
11686 char *hash_pos = input_buf + 6 + 8;
11687
11688 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11689 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11690 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11691 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11692 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11693 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11694 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11695 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11696
11697 digest[0] -= SHA512M_A;
11698 digest[1] -= SHA512M_B;
11699 digest[2] -= SHA512M_C;
11700 digest[3] -= SHA512M_D;
11701 digest[4] -= SHA512M_E;
11702 digest[5] -= SHA512M_F;
11703 digest[6] -= SHA512M_G;
11704 digest[7] -= SHA512M_H;
11705
11706 return (PARSER_OK);
11707 }
11708
11709 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11710 {
11711 if (data.opts_type & OPTS_TYPE_ST_HEX)
11712 {
11713 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11714 }
11715 else
11716 {
11717 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11718 }
11719
11720 u32 *digest = (u32 *) hash_buf->digest;
11721
11722 salt_t *salt = hash_buf->salt;
11723
11724 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11725 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11726 digest[2] = 0;
11727 digest[3] = 0;
11728
11729 digest[0] = byte_swap_32 (digest[0]);
11730 digest[1] = byte_swap_32 (digest[1]);
11731
11732 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11733
11734 uint salt_len = input_len - 16 - 1;
11735
11736 char *salt_buf = input_buf + 16 + 1;
11737
11738 char *salt_buf_ptr = (char *) salt->salt_buf;
11739
11740 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11741
11742 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11743
11744 salt->salt_len = salt_len;
11745
11746 return (PARSER_OK);
11747 }
11748
11749 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11750 {
11751 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11752
11753 u32 *digest = (u32 *) hash_buf->digest;
11754
11755 salt_t *salt = hash_buf->salt;
11756
11757 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11758 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11759 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11760 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11761 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11762
11763 digest[0] -= SHA1M_A;
11764 digest[1] -= SHA1M_B;
11765 digest[2] -= SHA1M_C;
11766 digest[3] -= SHA1M_D;
11767 digest[4] -= SHA1M_E;
11768
11769 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11770
11771 uint salt_len = input_len - 40 - 1;
11772
11773 char *salt_buf = input_buf + 40 + 1;
11774
11775 char *salt_buf_ptr = (char *) salt->salt_buf;
11776
11777 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11778
11779 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11780
11781 salt->salt_len = salt_len;
11782
11783 return (PARSER_OK);
11784 }
11785
11786 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11787 {
11788 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11789
11790 u32 *digest = (u32 *) hash_buf->digest;
11791
11792 salt_t *salt = hash_buf->salt;
11793
11794 char *hash_pos = input_buf;
11795
11796 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11797 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11798 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11799 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11800 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
11801 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
11802 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
11803 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
11804 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
11805 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
11806 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
11807 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
11808 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
11809 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
11810 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
11811 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
11812
11813 char *salt_pos = input_buf + 128;
11814
11815 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
11816 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
11817 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
11818 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
11819
11820 salt->salt_iter = ROUNDS_ORACLET - 1;
11821 salt->salt_len = 16;
11822
11823 return (PARSER_OK);
11824 }
11825
11826 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11827 {
11828 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11829
11830 u32 *digest = (u32 *) hash_buf->digest;
11831
11832 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11833 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11834 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11835 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11836 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11837 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11838 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11839 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11840
11841 digest[0] -= SHA256M_A;
11842 digest[1] -= SHA256M_B;
11843 digest[2] -= SHA256M_C;
11844 digest[3] -= SHA256M_D;
11845 digest[4] -= SHA256M_E;
11846 digest[5] -= SHA256M_F;
11847 digest[6] -= SHA256M_G;
11848 digest[7] -= SHA256M_H;
11849
11850 return (PARSER_OK);
11851 }
11852
11853 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11854 {
11855 if (data.opts_type & OPTS_TYPE_ST_HEX)
11856 {
11857 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11858 }
11859 else
11860 {
11861 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11862 }
11863
11864 u32 *digest = (u32 *) hash_buf->digest;
11865
11866 salt_t *salt = hash_buf->salt;
11867
11868 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11869 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11870 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11871 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11872 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11873 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11874 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11875 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11876
11877 digest[0] -= SHA256M_A;
11878 digest[1] -= SHA256M_B;
11879 digest[2] -= SHA256M_C;
11880 digest[3] -= SHA256M_D;
11881 digest[4] -= SHA256M_E;
11882 digest[5] -= SHA256M_F;
11883 digest[6] -= SHA256M_G;
11884 digest[7] -= SHA256M_H;
11885
11886 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11887
11888 uint salt_len = input_len - 64 - 1;
11889
11890 char *salt_buf = input_buf + 64 + 1;
11891
11892 char *salt_buf_ptr = (char *) salt->salt_buf;
11893
11894 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11895
11896 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11897
11898 salt->salt_len = salt_len;
11899
11900 return (PARSER_OK);
11901 }
11902
11903 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11904 {
11905 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11906
11907 u64 *digest = (u64 *) hash_buf->digest;
11908
11909 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11910 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11911 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11912 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11913 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11914 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11915 digest[6] = 0;
11916 digest[7] = 0;
11917
11918 digest[0] -= SHA384M_A;
11919 digest[1] -= SHA384M_B;
11920 digest[2] -= SHA384M_C;
11921 digest[3] -= SHA384M_D;
11922 digest[4] -= SHA384M_E;
11923 digest[5] -= SHA384M_F;
11924 digest[6] -= 0;
11925 digest[7] -= 0;
11926
11927 return (PARSER_OK);
11928 }
11929
11930 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11931 {
11932 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11933
11934 u64 *digest = (u64 *) hash_buf->digest;
11935
11936 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11937 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11938 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11939 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11940 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11941 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11942 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11943 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11944
11945 digest[0] -= SHA512M_A;
11946 digest[1] -= SHA512M_B;
11947 digest[2] -= SHA512M_C;
11948 digest[3] -= SHA512M_D;
11949 digest[4] -= SHA512M_E;
11950 digest[5] -= SHA512M_F;
11951 digest[6] -= SHA512M_G;
11952 digest[7] -= SHA512M_H;
11953
11954 return (PARSER_OK);
11955 }
11956
11957 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11958 {
11959 if (data.opts_type & OPTS_TYPE_ST_HEX)
11960 {
11961 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11962 }
11963 else
11964 {
11965 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11966 }
11967
11968 u64 *digest = (u64 *) hash_buf->digest;
11969
11970 salt_t *salt = hash_buf->salt;
11971
11972 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11973 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11974 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11975 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11976 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11977 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11978 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11979 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11980
11981 digest[0] -= SHA512M_A;
11982 digest[1] -= SHA512M_B;
11983 digest[2] -= SHA512M_C;
11984 digest[3] -= SHA512M_D;
11985 digest[4] -= SHA512M_E;
11986 digest[5] -= SHA512M_F;
11987 digest[6] -= SHA512M_G;
11988 digest[7] -= SHA512M_H;
11989
11990 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11991
11992 uint salt_len = input_len - 128 - 1;
11993
11994 char *salt_buf = input_buf + 128 + 1;
11995
11996 char *salt_buf_ptr = (char *) salt->salt_buf;
11997
11998 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11999
12000 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12001
12002 salt->salt_len = salt_len;
12003
12004 return (PARSER_OK);
12005 }
12006
12007 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12008 {
12009 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12010
12011 u64 *digest = (u64 *) hash_buf->digest;
12012
12013 salt_t *salt = hash_buf->salt;
12014
12015 char *salt_pos = input_buf + 3;
12016
12017 uint iterations_len = 0;
12018
12019 if (memcmp (salt_pos, "rounds=", 7) == 0)
12020 {
12021 salt_pos += 7;
12022
12023 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12024
12025 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12026 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12027
12028 salt_pos[0] = 0x0;
12029
12030 salt->salt_iter = atoi (salt_pos - iterations_len);
12031
12032 salt_pos += 1;
12033
12034 iterations_len += 8;
12035 }
12036 else
12037 {
12038 salt->salt_iter = ROUNDS_SHA512CRYPT;
12039 }
12040
12041 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12042
12043 char *hash_pos = strchr (salt_pos, '$');
12044
12045 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12046
12047 uint salt_len = hash_pos - salt_pos;
12048
12049 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12050
12051 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12052
12053 salt->salt_len = salt_len;
12054
12055 hash_pos++;
12056
12057 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12058
12059 return (PARSER_OK);
12060 }
12061
12062 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12063 {
12064 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12065
12066 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12067
12068 u64 *digest = (u64 *) hash_buf->digest;
12069
12070 salt_t *salt = hash_buf->salt;
12071
12072 uint keccak_mdlen = input_len / 2;
12073
12074 for (uint i = 0; i < keccak_mdlen / 8; i++)
12075 {
12076 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12077
12078 digest[i] = byte_swap_64 (digest[i]);
12079 }
12080
12081 salt->keccak_mdlen = keccak_mdlen;
12082
12083 return (PARSER_OK);
12084 }
12085
12086 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12087 {
12088 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12089
12090 u32 *digest = (u32 *) hash_buf->digest;
12091
12092 salt_t *salt = hash_buf->salt;
12093
12094 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12095
12096 /**
12097 * Parse that strange long line
12098 */
12099
12100 char *in_off[9];
12101
12102 size_t in_len[9] = { 0 };
12103
12104 in_off[0] = strtok (input_buf, ":");
12105
12106 in_len[0] = strlen (in_off[0]);
12107
12108 size_t i;
12109
12110 for (i = 1; i < 9; i++)
12111 {
12112 in_off[i] = strtok (NULL, ":");
12113
12114 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12115
12116 in_len[i] = strlen (in_off[i]);
12117 }
12118
12119 char *ptr = (char *) ikepsk->msg_buf;
12120
12121 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12122 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12123 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12124 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12125 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12126 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12127
12128 *ptr = 0x80;
12129
12130 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12131
12132 ptr = (char *) ikepsk->nr_buf;
12133
12134 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12135 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12136
12137 *ptr = 0x80;
12138
12139 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12140
12141 /**
12142 * Store to database
12143 */
12144
12145 ptr = in_off[8];
12146
12147 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12148 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12149 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12150 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12151
12152 digest[0] = byte_swap_32 (digest[0]);
12153 digest[1] = byte_swap_32 (digest[1]);
12154 digest[2] = byte_swap_32 (digest[2]);
12155 digest[3] = byte_swap_32 (digest[3]);
12156
12157 salt->salt_len = 32;
12158
12159 salt->salt_buf[0] = ikepsk->nr_buf[0];
12160 salt->salt_buf[1] = ikepsk->nr_buf[1];
12161 salt->salt_buf[2] = ikepsk->nr_buf[2];
12162 salt->salt_buf[3] = ikepsk->nr_buf[3];
12163 salt->salt_buf[4] = ikepsk->nr_buf[4];
12164 salt->salt_buf[5] = ikepsk->nr_buf[5];
12165 salt->salt_buf[6] = ikepsk->nr_buf[6];
12166 salt->salt_buf[7] = ikepsk->nr_buf[7];
12167
12168 return (PARSER_OK);
12169 }
12170
12171 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12172 {
12173 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12174
12175 u32 *digest = (u32 *) hash_buf->digest;
12176
12177 salt_t *salt = hash_buf->salt;
12178
12179 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12180
12181 /**
12182 * Parse that strange long line
12183 */
12184
12185 char *in_off[9];
12186
12187 size_t in_len[9] = { 0 };
12188
12189 in_off[0] = strtok (input_buf, ":");
12190
12191 in_len[0] = strlen (in_off[0]);
12192
12193 size_t i;
12194
12195 for (i = 1; i < 9; i++)
12196 {
12197 in_off[i] = strtok (NULL, ":");
12198
12199 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12200
12201 in_len[i] = strlen (in_off[i]);
12202 }
12203
12204 char *ptr = (char *) ikepsk->msg_buf;
12205
12206 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12207 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12208 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12209 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12210 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12211 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12212
12213 *ptr = 0x80;
12214
12215 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12216
12217 ptr = (char *) ikepsk->nr_buf;
12218
12219 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12220 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12221
12222 *ptr = 0x80;
12223
12224 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12225
12226 /**
12227 * Store to database
12228 */
12229
12230 ptr = in_off[8];
12231
12232 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12233 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12234 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12235 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12236 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12237
12238 salt->salt_len = 32;
12239
12240 salt->salt_buf[0] = ikepsk->nr_buf[0];
12241 salt->salt_buf[1] = ikepsk->nr_buf[1];
12242 salt->salt_buf[2] = ikepsk->nr_buf[2];
12243 salt->salt_buf[3] = ikepsk->nr_buf[3];
12244 salt->salt_buf[4] = ikepsk->nr_buf[4];
12245 salt->salt_buf[5] = ikepsk->nr_buf[5];
12246 salt->salt_buf[6] = ikepsk->nr_buf[6];
12247 salt->salt_buf[7] = ikepsk->nr_buf[7];
12248
12249 return (PARSER_OK);
12250 }
12251
12252 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12253 {
12254 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12255
12256 u32 *digest = (u32 *) hash_buf->digest;
12257
12258 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12259 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12260 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12261 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12262 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12263
12264 digest[0] = byte_swap_32 (digest[0]);
12265 digest[1] = byte_swap_32 (digest[1]);
12266 digest[2] = byte_swap_32 (digest[2]);
12267 digest[3] = byte_swap_32 (digest[3]);
12268 digest[4] = byte_swap_32 (digest[4]);
12269
12270 return (PARSER_OK);
12271 }
12272
12273 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12274 {
12275 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12276
12277 u32 *digest = (u32 *) hash_buf->digest;
12278
12279 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12280 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12281 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12282 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12283 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12284 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12285 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12286 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12287 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12288 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12289 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12290 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12291 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12292 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12293 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12294 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12295
12296 return (PARSER_OK);
12297 }
12298
12299 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12300 {
12301 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12302
12303 u32 *digest = (u32 *) hash_buf->digest;
12304
12305 salt_t *salt = hash_buf->salt;
12306
12307 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12308 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12309 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12310 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12311 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12312
12313 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12314
12315 uint salt_len = input_len - 40 - 1;
12316
12317 char *salt_buf = input_buf + 40 + 1;
12318
12319 char *salt_buf_ptr = (char *) salt->salt_buf;
12320
12321 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12322
12323 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12324
12325 salt->salt_len = salt_len;
12326
12327 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12328
12329 return (PARSER_OK);
12330 }
12331
12332 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12333 {
12334 u32 *digest = (u32 *) hash_buf->digest;
12335
12336 salt_t *salt = hash_buf->salt;
12337
12338 tc_t *tc = (tc_t *) hash_buf->esalt;
12339
12340 if (input_len == 0)
12341 {
12342 log_error ("TrueCrypt container not specified");
12343
12344 exit (-1);
12345 }
12346
12347 FILE *fp = fopen (input_buf, "rb");
12348
12349 if (fp == NULL)
12350 {
12351 log_error ("%s: %s", input_buf, strerror (errno));
12352
12353 exit (-1);
12354 }
12355
12356 char buf[512] = { 0 };
12357
12358 int n = fread (buf, 1, sizeof (buf), fp);
12359
12360 fclose (fp);
12361
12362 if (n != 512) return (PARSER_TC_FILE_SIZE);
12363
12364 memcpy (tc->salt_buf, buf, 64);
12365
12366 memcpy (tc->data_buf, buf + 64, 512 - 64);
12367
12368 salt->salt_buf[0] = tc->salt_buf[0];
12369
12370 salt->salt_len = 4;
12371
12372 salt->salt_iter = 1000 - 1;
12373
12374 digest[0] = tc->data_buf[0];
12375
12376 return (PARSER_OK);
12377 }
12378
12379 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12380 {
12381 u32 *digest = (u32 *) hash_buf->digest;
12382
12383 salt_t *salt = hash_buf->salt;
12384
12385 tc_t *tc = (tc_t *) hash_buf->esalt;
12386
12387 if (input_len == 0)
12388 {
12389 log_error ("TrueCrypt container not specified");
12390
12391 exit (-1);
12392 }
12393
12394 FILE *fp = fopen (input_buf, "rb");
12395
12396 if (fp == NULL)
12397 {
12398 log_error ("%s: %s", input_buf, strerror (errno));
12399
12400 exit (-1);
12401 }
12402
12403 char buf[512] = { 0 };
12404
12405 int n = fread (buf, 1, sizeof (buf), fp);
12406
12407 fclose (fp);
12408
12409 if (n != 512) return (PARSER_TC_FILE_SIZE);
12410
12411 memcpy (tc->salt_buf, buf, 64);
12412
12413 memcpy (tc->data_buf, buf + 64, 512 - 64);
12414
12415 salt->salt_buf[0] = tc->salt_buf[0];
12416
12417 salt->salt_len = 4;
12418
12419 salt->salt_iter = 2000 - 1;
12420
12421 digest[0] = tc->data_buf[0];
12422
12423 return (PARSER_OK);
12424 }
12425
12426 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12427 {
12428 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12429
12430 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12431
12432 u32 *digest = (u32 *) hash_buf->digest;
12433
12434 salt_t *salt = hash_buf->salt;
12435
12436 char *salt_pos = input_buf + 6;
12437
12438 char *hash_pos = strchr (salt_pos, '$');
12439
12440 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12441
12442 uint salt_len = hash_pos - salt_pos;
12443
12444 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12445
12446 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12447
12448 salt->salt_len = salt_len;
12449
12450 salt->salt_iter = 1000;
12451
12452 hash_pos++;
12453
12454 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12455
12456 return (PARSER_OK);
12457 }
12458
12459 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12460 {
12461 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12462
12463 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12464
12465 u32 *digest = (u32 *) hash_buf->digest;
12466
12467 salt_t *salt = hash_buf->salt;
12468
12469 char *iter_pos = input_buf + 7;
12470
12471 char *salt_pos = strchr (iter_pos, '$');
12472
12473 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12474
12475 salt_pos++;
12476
12477 char *hash_pos = strchr (salt_pos, '$');
12478
12479 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12480
12481 uint salt_len = hash_pos - salt_pos;
12482
12483 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12484
12485 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12486
12487 salt->salt_len = salt_len;
12488
12489 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12490
12491 salt->salt_sign[0] = atoi (salt_iter);
12492
12493 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12494
12495 hash_pos++;
12496
12497 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12498
12499 digest[0] = byte_swap_32 (digest[0]);
12500 digest[1] = byte_swap_32 (digest[1]);
12501 digest[2] = byte_swap_32 (digest[2]);
12502 digest[3] = byte_swap_32 (digest[3]);
12503 digest[4] = byte_swap_32 (digest[4]);
12504
12505 return (PARSER_OK);
12506 }
12507
12508 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12509 {
12510 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12511
12512 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12513
12514 u32 *digest = (u32 *) hash_buf->digest;
12515
12516 salt_t *salt = hash_buf->salt;
12517
12518 char *iter_pos = input_buf + 9;
12519
12520 char *salt_pos = strchr (iter_pos, '$');
12521
12522 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12523
12524 salt_pos++;
12525
12526 char *hash_pos = strchr (salt_pos, '$');
12527
12528 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12529
12530 uint salt_len = hash_pos - salt_pos;
12531
12532 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12533
12534 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12535
12536 salt->salt_len = salt_len;
12537
12538 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12539
12540 salt->salt_sign[0] = atoi (salt_iter);
12541
12542 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12543
12544 hash_pos++;
12545
12546 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12547
12548 digest[0] = byte_swap_32 (digest[0]);
12549 digest[1] = byte_swap_32 (digest[1]);
12550 digest[2] = byte_swap_32 (digest[2]);
12551 digest[3] = byte_swap_32 (digest[3]);
12552 digest[4] = byte_swap_32 (digest[4]);
12553 digest[5] = byte_swap_32 (digest[5]);
12554 digest[6] = byte_swap_32 (digest[6]);
12555 digest[7] = byte_swap_32 (digest[7]);
12556
12557 return (PARSER_OK);
12558 }
12559
12560 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12561 {
12562 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12563
12564 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12565
12566 u64 *digest = (u64 *) hash_buf->digest;
12567
12568 salt_t *salt = hash_buf->salt;
12569
12570 char *iter_pos = input_buf + 9;
12571
12572 char *salt_pos = strchr (iter_pos, '$');
12573
12574 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12575
12576 salt_pos++;
12577
12578 char *hash_pos = strchr (salt_pos, '$');
12579
12580 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12581
12582 uint salt_len = hash_pos - salt_pos;
12583
12584 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12585
12586 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12587
12588 salt->salt_len = salt_len;
12589
12590 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12591
12592 salt->salt_sign[0] = atoi (salt_iter);
12593
12594 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12595
12596 hash_pos++;
12597
12598 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12599
12600 digest[0] = byte_swap_64 (digest[0]);
12601 digest[1] = byte_swap_64 (digest[1]);
12602 digest[2] = byte_swap_64 (digest[2]);
12603 digest[3] = byte_swap_64 (digest[3]);
12604 digest[4] = byte_swap_64 (digest[4]);
12605 digest[5] = byte_swap_64 (digest[5]);
12606 digest[6] = byte_swap_64 (digest[6]);
12607 digest[7] = byte_swap_64 (digest[7]);
12608
12609 return (PARSER_OK);
12610 }
12611
12612 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12613 {
12614 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12615
12616 u32 *digest = (u32 *) hash_buf->digest;
12617
12618 salt_t *salt = hash_buf->salt;
12619
12620 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12621
12622 /**
12623 * parse line
12624 */
12625
12626 char *iterations_pos = input_buf;
12627
12628 char *saltbuf_pos = strchr (iterations_pos, ':');
12629
12630 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12631
12632 uint iterations_len = saltbuf_pos - iterations_pos;
12633
12634 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12635
12636 saltbuf_pos++;
12637
12638 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12639
12640 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12641
12642 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12643
12644 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12645
12646 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12647
12648 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12649
12650 cipherbuf_pos++;
12651
12652 /**
12653 * pbkdf2 iterations
12654 */
12655
12656 salt->salt_iter = atoi (iterations_pos) - 1;
12657
12658 /**
12659 * handle salt encoding
12660 */
12661
12662 char *saltbuf_ptr = (char *) salt->salt_buf;
12663
12664 for (uint i = 0; i < saltbuf_len; i += 2)
12665 {
12666 const char p0 = saltbuf_pos[i + 0];
12667 const char p1 = saltbuf_pos[i + 1];
12668
12669 *saltbuf_ptr++ = hex_convert (p1) << 0
12670 | hex_convert (p0) << 4;
12671 }
12672
12673 salt->salt_len = saltbuf_len / 2;
12674
12675 /**
12676 * handle cipher encoding
12677 */
12678
12679 uint *tmp = (uint *) mymalloc (32);
12680
12681 char *cipherbuf_ptr = (char *) tmp;
12682
12683 for (uint i = 2016; i < cipherbuf_len; i += 2)
12684 {
12685 const char p0 = cipherbuf_pos[i + 0];
12686 const char p1 = cipherbuf_pos[i + 1];
12687
12688 *cipherbuf_ptr++ = hex_convert (p1) << 0
12689 | hex_convert (p0) << 4;
12690 }
12691
12692 // iv is stored at salt_buf 4 (length 16)
12693 // data is stored at salt_buf 8 (length 16)
12694
12695 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12696 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12697 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12698 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12699
12700 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12701 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12702 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12703 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12704
12705 free (tmp);
12706
12707 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12708 {
12709 const char p0 = cipherbuf_pos[j + 0];
12710 const char p1 = cipherbuf_pos[j + 1];
12711
12712 agilekey->cipher[i] = hex_convert (p1) << 0
12713 | hex_convert (p0) << 4;
12714 }
12715
12716 /**
12717 * digest buf
12718 */
12719
12720 digest[0] = 0x10101010;
12721 digest[1] = 0x10101010;
12722 digest[2] = 0x10101010;
12723 digest[3] = 0x10101010;
12724
12725 return (PARSER_OK);
12726 }
12727
12728 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12729 {
12730 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12731
12732 u32 *digest = (u32 *) hash_buf->digest;
12733
12734 salt_t *salt = hash_buf->salt;
12735
12736 char *hashbuf_pos = input_buf;
12737
12738 char *iterations_pos = strchr (hashbuf_pos, ':');
12739
12740 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12741
12742 uint hash_len = iterations_pos - hashbuf_pos;
12743
12744 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12745
12746 iterations_pos++;
12747
12748 char *saltbuf_pos = strchr (iterations_pos, ':');
12749
12750 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12751
12752 uint iterations_len = saltbuf_pos - iterations_pos;
12753
12754 saltbuf_pos++;
12755
12756 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12757
12758 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12759
12760 char *salt_buf_ptr = (char *) salt->salt_buf;
12761
12762 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12763
12764 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12765
12766 salt->salt_len = salt_len;
12767
12768 salt->salt_iter = atoi (iterations_pos) - 1;
12769
12770 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12771 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12772 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12773 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12774
12775 return (PARSER_OK);
12776 }
12777
12778 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12779 {
12780 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12781
12782 u32 *digest = (u32 *) hash_buf->digest;
12783
12784 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12785 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12786 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12787 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12788 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12789 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12790 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12791 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12792
12793 digest[0] = byte_swap_32 (digest[0]);
12794 digest[1] = byte_swap_32 (digest[1]);
12795 digest[2] = byte_swap_32 (digest[2]);
12796 digest[3] = byte_swap_32 (digest[3]);
12797 digest[4] = byte_swap_32 (digest[4]);
12798 digest[5] = byte_swap_32 (digest[5]);
12799 digest[6] = byte_swap_32 (digest[6]);
12800 digest[7] = byte_swap_32 (digest[7]);
12801
12802 return (PARSER_OK);
12803 }
12804
12805 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12806 {
12807 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12808
12809 u32 *digest = (u32 *) hash_buf->digest;
12810
12811 salt_t *salt = hash_buf->salt;
12812
12813 char *salt_pos = input_buf + 3;
12814
12815 uint iterations_len = 0;
12816
12817 if (memcmp (salt_pos, "rounds=", 7) == 0)
12818 {
12819 salt_pos += 7;
12820
12821 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12822
12823 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12824 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12825
12826 salt_pos[0] = 0x0;
12827
12828 salt->salt_iter = atoi (salt_pos - iterations_len);
12829
12830 salt_pos += 1;
12831
12832 iterations_len += 8;
12833 }
12834 else
12835 {
12836 salt->salt_iter = ROUNDS_SHA256CRYPT;
12837 }
12838
12839 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12840
12841 char *hash_pos = strchr (salt_pos, '$');
12842
12843 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12844
12845 uint salt_len = hash_pos - salt_pos;
12846
12847 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12848
12849 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12850
12851 salt->salt_len = salt_len;
12852
12853 hash_pos++;
12854
12855 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12856
12857 return (PARSER_OK);
12858 }
12859
12860 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12861 {
12862 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12863
12864 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12865
12866 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12867
12868 u64 *digest = (u64 *) hash_buf->digest;
12869
12870 salt_t *salt = hash_buf->salt;
12871
12872 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12873
12874 char *iter_pos = input_buf + 4;
12875
12876 char *salt_pos = strchr (iter_pos, '$');
12877
12878 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12879
12880 salt_pos++;
12881
12882 char *hash_pos = strchr (salt_pos, '$');
12883
12884 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12885
12886 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12887
12888 hash_pos++;
12889
12890 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12891 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12892 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12893 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12894 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12895 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12896 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12897 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12898
12899 uint salt_len = hash_pos - salt_pos - 1;
12900
12901 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12902
12903 salt->salt_len = salt_len / 2;
12904
12905 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12906 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12907 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12908 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12909 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
12910 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
12911 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
12912 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
12913
12914 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12915 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12916 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12917 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12918 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12919 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12920 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12921 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12922 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12923 pbkdf2_sha512->salt_buf[9] = 0x80;
12924
12925 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12926
12927 salt->salt_iter = atoi (iter_pos) - 1;
12928
12929 return (PARSER_OK);
12930 }
12931
12932 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12933 {
12934 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12935
12936 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12937
12938 u32 *digest = (u32 *) hash_buf->digest;
12939
12940 salt_t *salt = hash_buf->salt;
12941
12942 char *salt_pos = input_buf + 14;
12943
12944 char *hash_pos = strchr (salt_pos, '*');
12945
12946 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12947
12948 hash_pos++;
12949
12950 uint salt_len = hash_pos - salt_pos - 1;
12951
12952 char *salt_buf_ptr = (char *) salt->salt_buf;
12953
12954 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12955
12956 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12957
12958 salt->salt_len = salt_len;
12959
12960 u8 tmp_buf[100] = { 0 };
12961
12962 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
12963
12964 memcpy (digest, tmp_buf, 32);
12965
12966 digest[0] = byte_swap_32 (digest[0]);
12967 digest[1] = byte_swap_32 (digest[1]);
12968 digest[2] = byte_swap_32 (digest[2]);
12969 digest[3] = byte_swap_32 (digest[3]);
12970 digest[4] = byte_swap_32 (digest[4]);
12971 digest[5] = byte_swap_32 (digest[5]);
12972 digest[6] = byte_swap_32 (digest[6]);
12973 digest[7] = byte_swap_32 (digest[7]);
12974
12975 digest[0] -= SHA256M_A;
12976 digest[1] -= SHA256M_B;
12977 digest[2] -= SHA256M_C;
12978 digest[3] -= SHA256M_D;
12979 digest[4] -= SHA256M_E;
12980 digest[5] -= SHA256M_F;
12981 digest[6] -= SHA256M_G;
12982 digest[7] -= SHA256M_H;
12983
12984 return (PARSER_OK);
12985 }
12986
12987 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12988 {
12989 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12990
12991 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12992
12993 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12994
12995 u64 *digest = (u64 *) hash_buf->digest;
12996
12997 salt_t *salt = hash_buf->salt;
12998
12999 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13000
13001 char *iter_pos = input_buf + 19;
13002
13003 char *salt_pos = strchr (iter_pos, '.');
13004
13005 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13006
13007 salt_pos++;
13008
13009 char *hash_pos = strchr (salt_pos, '.');
13010
13011 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13012
13013 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13014
13015 hash_pos++;
13016
13017 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13018 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13019 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13020 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13021 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13022 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13023 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13024 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13025
13026 uint salt_len = hash_pos - salt_pos - 1;
13027
13028 salt_len /= 2;
13029
13030 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13031
13032 uint i;
13033
13034 for (i = 0; i < salt_len; i++)
13035 {
13036 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13037 }
13038
13039 salt_buf_ptr[salt_len + 3] = 0x01;
13040 salt_buf_ptr[salt_len + 4] = 0x80;
13041
13042 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13043
13044 salt->salt_len = salt_len;
13045
13046 salt->salt_iter = atoi (iter_pos) - 1;
13047
13048 return (PARSER_OK);
13049 }
13050
13051 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13052 {
13053 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13054
13055 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13056
13057 u64 *digest = (u64 *) hash_buf->digest;
13058
13059 salt_t *salt = hash_buf->salt;
13060
13061 u8 tmp_buf[120] = { 0 };
13062
13063 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13064
13065 memcpy (digest, tmp_buf, 64);
13066
13067 digest[0] = byte_swap_64 (digest[0]);
13068 digest[1] = byte_swap_64 (digest[1]);
13069 digest[2] = byte_swap_64 (digest[2]);
13070 digest[3] = byte_swap_64 (digest[3]);
13071 digest[4] = byte_swap_64 (digest[4]);
13072 digest[5] = byte_swap_64 (digest[5]);
13073 digest[6] = byte_swap_64 (digest[6]);
13074 digest[7] = byte_swap_64 (digest[7]);
13075
13076 digest[0] -= SHA512M_A;
13077 digest[1] -= SHA512M_B;
13078 digest[2] -= SHA512M_C;
13079 digest[3] -= SHA512M_D;
13080 digest[4] -= SHA512M_E;
13081 digest[5] -= SHA512M_F;
13082 digest[6] -= SHA512M_G;
13083 digest[7] -= SHA512M_H;
13084
13085 salt->salt_len = tmp_len - 64;
13086
13087 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13088
13089 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13090 {
13091 char *ptr = (char *) salt->salt_buf;
13092
13093 ptr[salt->salt_len] = 0x80;
13094 }
13095
13096 return (PARSER_OK);
13097 }
13098
13099 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13100 {
13101 if (data.opts_type & OPTS_TYPE_ST_HEX)
13102 {
13103 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13104 }
13105 else
13106 {
13107 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13108 }
13109
13110 u32 *digest = (u32 *) hash_buf->digest;
13111
13112 salt_t *salt = hash_buf->salt;
13113
13114 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13115 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13116 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13117 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13118
13119 digest[0] = byte_swap_32 (digest[0]);
13120 digest[1] = byte_swap_32 (digest[1]);
13121 digest[2] = byte_swap_32 (digest[2]);
13122 digest[3] = byte_swap_32 (digest[3]);
13123
13124 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13125
13126 uint salt_len = input_len - 32 - 1;
13127
13128 char *salt_buf = input_buf + 32 + 1;
13129
13130 char *salt_buf_ptr = (char *) salt->salt_buf;
13131
13132 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13133
13134 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13135
13136 salt->salt_len = salt_len;
13137
13138 return (PARSER_OK);
13139 }
13140
13141 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13142 {
13143 if (data.opts_type & OPTS_TYPE_ST_HEX)
13144 {
13145 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13146 }
13147 else
13148 {
13149 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13150 }
13151
13152 u32 *digest = (u32 *) hash_buf->digest;
13153
13154 salt_t *salt = hash_buf->salt;
13155
13156 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13157 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13158 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13159 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13160 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13161
13162 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13163
13164 uint salt_len = input_len - 40 - 1;
13165
13166 char *salt_buf = input_buf + 40 + 1;
13167
13168 char *salt_buf_ptr = (char *) salt->salt_buf;
13169
13170 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13171
13172 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13173
13174 salt->salt_len = salt_len;
13175
13176 return (PARSER_OK);
13177 }
13178
13179 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13180 {
13181 if (data.opts_type & OPTS_TYPE_ST_HEX)
13182 {
13183 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13184 }
13185 else
13186 {
13187 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13188 }
13189
13190 u32 *digest = (u32 *) hash_buf->digest;
13191
13192 salt_t *salt = hash_buf->salt;
13193
13194 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13195 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13196 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13197 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13198 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13199 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13200 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13201 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13202
13203 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13204
13205 uint salt_len = input_len - 64 - 1;
13206
13207 char *salt_buf = input_buf + 64 + 1;
13208
13209 char *salt_buf_ptr = (char *) salt->salt_buf;
13210
13211 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13212
13213 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13214
13215 salt->salt_len = salt_len;
13216
13217 return (PARSER_OK);
13218 }
13219
13220 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13221 {
13222 if (data.opts_type & OPTS_TYPE_ST_HEX)
13223 {
13224 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13225 }
13226 else
13227 {
13228 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13229 }
13230
13231 u64 *digest = (u64 *) hash_buf->digest;
13232
13233 salt_t *salt = hash_buf->salt;
13234
13235 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13236 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13237 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13238 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13239 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13240 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13241 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13242 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13243
13244 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13245
13246 uint salt_len = input_len - 128 - 1;
13247
13248 char *salt_buf = input_buf + 128 + 1;
13249
13250 char *salt_buf_ptr = (char *) salt->salt_buf;
13251
13252 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13253
13254 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13255
13256 salt->salt_len = salt_len;
13257
13258 return (PARSER_OK);
13259 }
13260
13261 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13262 {
13263 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13264
13265 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13266
13267 u32 *digest = (u32 *) hash_buf->digest;
13268
13269 salt_t *salt = hash_buf->salt;
13270
13271 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13272
13273 /**
13274 * parse line
13275 */
13276
13277 char *user_pos = input_buf + 10 + 1;
13278
13279 char *realm_pos = strchr (user_pos, '$');
13280
13281 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13282
13283 uint user_len = realm_pos - user_pos;
13284
13285 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13286
13287 realm_pos++;
13288
13289 char *salt_pos = strchr (realm_pos, '$');
13290
13291 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13292
13293 uint realm_len = salt_pos - realm_pos;
13294
13295 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13296
13297 salt_pos++;
13298
13299 char *data_pos = strchr (salt_pos, '$');
13300
13301 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13302
13303 uint salt_len = data_pos - salt_pos;
13304
13305 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13306
13307 data_pos++;
13308
13309 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13310
13311 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13312
13313 /**
13314 * copy data
13315 */
13316
13317 memcpy (krb5pa->user, user_pos, user_len);
13318 memcpy (krb5pa->realm, realm_pos, realm_len);
13319 memcpy (krb5pa->salt, salt_pos, salt_len);
13320
13321 char *timestamp_ptr = (char *) krb5pa->timestamp;
13322
13323 for (uint i = 0; i < (36 * 2); i += 2)
13324 {
13325 const char p0 = data_pos[i + 0];
13326 const char p1 = data_pos[i + 1];
13327
13328 *timestamp_ptr++ = hex_convert (p1) << 0
13329 | hex_convert (p0) << 4;
13330 }
13331
13332 char *checksum_ptr = (char *) krb5pa->checksum;
13333
13334 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13335 {
13336 const char p0 = data_pos[i + 0];
13337 const char p1 = data_pos[i + 1];
13338
13339 *checksum_ptr++ = hex_convert (p1) << 0
13340 | hex_convert (p0) << 4;
13341 }
13342
13343 /**
13344 * copy some data to generic buffers to make sorting happy
13345 */
13346
13347 salt->salt_buf[0] = krb5pa->timestamp[0];
13348 salt->salt_buf[1] = krb5pa->timestamp[1];
13349 salt->salt_buf[2] = krb5pa->timestamp[2];
13350 salt->salt_buf[3] = krb5pa->timestamp[3];
13351 salt->salt_buf[4] = krb5pa->timestamp[4];
13352 salt->salt_buf[5] = krb5pa->timestamp[5];
13353 salt->salt_buf[6] = krb5pa->timestamp[6];
13354 salt->salt_buf[7] = krb5pa->timestamp[7];
13355 salt->salt_buf[8] = krb5pa->timestamp[8];
13356
13357 salt->salt_len = 36;
13358
13359 digest[0] = krb5pa->checksum[0];
13360 digest[1] = krb5pa->checksum[1];
13361 digest[2] = krb5pa->checksum[2];
13362 digest[3] = krb5pa->checksum[3];
13363
13364 return (PARSER_OK);
13365 }
13366
13367 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13368 {
13369 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13370
13371 u32 *digest = (u32 *) hash_buf->digest;
13372
13373 salt_t *salt = hash_buf->salt;
13374
13375 /**
13376 * parse line
13377 */
13378
13379 char *salt_pos = input_buf;
13380
13381 char *hash_pos = strchr (salt_pos, '$');
13382
13383 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13384
13385 uint salt_len = hash_pos - salt_pos;
13386
13387 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13388
13389 hash_pos++;
13390
13391 uint hash_len = input_len - 1 - salt_len;
13392
13393 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13394
13395 /**
13396 * valid some data
13397 */
13398
13399 uint user_len = 0;
13400
13401 for (uint i = 0; i < salt_len; i++)
13402 {
13403 if (salt_pos[i] == ' ') continue;
13404
13405 user_len++;
13406 }
13407
13408 // SAP user names cannot be longer than 12 characters
13409 if (user_len > 12) return (PARSER_SALT_LENGTH);
13410
13411 // SAP user name cannot start with ! or ?
13412 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13413
13414 /**
13415 * copy data
13416 */
13417
13418 char *salt_buf_ptr = (char *) salt->salt_buf;
13419
13420 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13421
13422 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13423
13424 salt->salt_len = salt_len;
13425
13426 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13427 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13428 digest[2] = 0;
13429 digest[3] = 0;
13430
13431 digest[0] = byte_swap_32 (digest[0]);
13432 digest[1] = byte_swap_32 (digest[1]);
13433
13434 return (PARSER_OK);
13435 }
13436
13437 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13438 {
13439 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13440
13441 u32 *digest = (u32 *) hash_buf->digest;
13442
13443 salt_t *salt = hash_buf->salt;
13444
13445 /**
13446 * parse line
13447 */
13448
13449 char *salt_pos = input_buf;
13450
13451 char *hash_pos = strchr (salt_pos, '$');
13452
13453 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13454
13455 uint salt_len = hash_pos - salt_pos;
13456
13457 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13458
13459 hash_pos++;
13460
13461 uint hash_len = input_len - 1 - salt_len;
13462
13463 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13464
13465 /**
13466 * valid some data
13467 */
13468
13469 uint user_len = 0;
13470
13471 for (uint i = 0; i < salt_len; i++)
13472 {
13473 if (salt_pos[i] == ' ') continue;
13474
13475 user_len++;
13476 }
13477
13478 // SAP user names cannot be longer than 12 characters
13479 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13480 // so far nobody complained so we stay with this because it helps in optimization
13481 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13482
13483 if (user_len > 12) return (PARSER_SALT_LENGTH);
13484
13485 // SAP user name cannot start with ! or ?
13486 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13487
13488 /**
13489 * copy data
13490 */
13491
13492 char *salt_buf_ptr = (char *) salt->salt_buf;
13493
13494 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13495
13496 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13497
13498 salt->salt_len = salt_len;
13499
13500 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13501 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13502 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13503 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13504 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13505
13506 return (PARSER_OK);
13507 }
13508
13509 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13510 {
13511 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13512
13513 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13514
13515 u64 *digest = (u64 *) hash_buf->digest;
13516
13517 salt_t *salt = hash_buf->salt;
13518
13519 char *iter_pos = input_buf + 3;
13520
13521 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13522
13523 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13524
13525 memcpy ((char *) salt->salt_sign, input_buf, 4);
13526
13527 salt->salt_iter = salt_iter;
13528
13529 char *salt_pos = iter_pos + 1;
13530
13531 uint salt_len = 8;
13532
13533 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13534
13535 salt->salt_len = salt_len;
13536
13537 char *hash_pos = salt_pos + salt_len;
13538
13539 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13540
13541 // ugly hack start
13542
13543 char *tmp = (char *) salt->salt_buf_pc;
13544
13545 tmp[0] = hash_pos[42];
13546
13547 // ugly hack end
13548
13549 digest[ 0] = byte_swap_64 (digest[ 0]);
13550 digest[ 1] = byte_swap_64 (digest[ 1]);
13551 digest[ 2] = byte_swap_64 (digest[ 2]);
13552 digest[ 3] = byte_swap_64 (digest[ 3]);
13553 digest[ 4] = 0;
13554 digest[ 5] = 0;
13555 digest[ 6] = 0;
13556 digest[ 7] = 0;
13557
13558 return (PARSER_OK);
13559 }
13560
13561 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13562 {
13563 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13564
13565 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13566
13567 u32 *digest = (u32 *) hash_buf->digest;
13568
13569 salt_t *salt = hash_buf->salt;
13570
13571 char *salt_buf = input_buf + 6;
13572
13573 uint salt_len = 16;
13574
13575 char *salt_buf_ptr = (char *) salt->salt_buf;
13576
13577 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13578
13579 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13580
13581 salt->salt_len = salt_len;
13582
13583 char *hash_pos = input_buf + 6 + 16;
13584
13585 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13586 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13587 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13588 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13589 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13590 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13591 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13592 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13593
13594 return (PARSER_OK);
13595 }
13596
13597 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13598 {
13599 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13600
13601 u32 *digest = (u32 *) hash_buf->digest;
13602
13603 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13604 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13605 digest[2] = 0;
13606 digest[3] = 0;
13607
13608 return (PARSER_OK);
13609 }
13610
13611 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13612 {
13613 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13614
13615 u32 *digest = (u32 *) hash_buf->digest;
13616
13617 salt_t *salt = hash_buf->salt;
13618
13619 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13620
13621 char *saltbuf_pos = input_buf;
13622
13623 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13624
13625 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13626
13627 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13628
13629 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13630 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13631
13632 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13633
13634 hashbuf_pos++;
13635
13636 uint hashbuf_len = input_len - saltbuf_len - 1;
13637
13638 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13639
13640 char *salt_ptr = (char *) saltbuf_pos;
13641 char *rakp_ptr = (char *) rakp->salt_buf;
13642
13643 uint i;
13644 uint j;
13645
13646 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13647 {
13648 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13649 }
13650
13651 rakp_ptr[j] = 0x80;
13652
13653 rakp->salt_len = j;
13654
13655 for (i = 0; i < 64; i++)
13656 {
13657 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13658 }
13659
13660 salt->salt_buf[0] = rakp->salt_buf[0];
13661 salt->salt_buf[1] = rakp->salt_buf[1];
13662 salt->salt_buf[2] = rakp->salt_buf[2];
13663 salt->salt_buf[3] = rakp->salt_buf[3];
13664 salt->salt_buf[4] = rakp->salt_buf[4];
13665 salt->salt_buf[5] = rakp->salt_buf[5];
13666 salt->salt_buf[6] = rakp->salt_buf[6];
13667 salt->salt_buf[7] = rakp->salt_buf[7];
13668
13669 salt->salt_len = 32; // muss min. 32 haben
13670
13671 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13672 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13673 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13674 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13675 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13676
13677 return (PARSER_OK);
13678 }
13679
13680 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13681 {
13682 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13683
13684 u32 *digest = (u32 *) hash_buf->digest;
13685
13686 salt_t *salt = hash_buf->salt;
13687
13688 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13689
13690 char *salt_pos = input_buf + 1;
13691
13692 memcpy (salt->salt_buf, salt_pos, 8);
13693
13694 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13695 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13696
13697 salt->salt_len = 8;
13698
13699 char *hash_pos = salt_pos + 8;
13700
13701 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13702 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13703 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13704 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13705 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13706
13707 digest[0] -= SHA1M_A;
13708 digest[1] -= SHA1M_B;
13709 digest[2] -= SHA1M_C;
13710 digest[3] -= SHA1M_D;
13711 digest[4] -= SHA1M_E;
13712
13713 return (PARSER_OK);
13714 }
13715
13716 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13717 {
13718 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13719
13720 u32 *digest = (u32 *) hash_buf->digest;
13721
13722 salt_t *salt = hash_buf->salt;
13723
13724 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13725 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13726 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13727 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13728
13729 digest[0] = byte_swap_32 (digest[0]);
13730 digest[1] = byte_swap_32 (digest[1]);
13731 digest[2] = byte_swap_32 (digest[2]);
13732 digest[3] = byte_swap_32 (digest[3]);
13733
13734 digest[0] -= MD5M_A;
13735 digest[1] -= MD5M_B;
13736 digest[2] -= MD5M_C;
13737 digest[3] -= MD5M_D;
13738
13739 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13740
13741 char *salt_buf_ptr = input_buf + 32 + 1;
13742
13743 u32 *salt_buf = salt->salt_buf;
13744
13745 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13746 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13747 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13748 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13749
13750 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13751 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13752 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13753 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13754
13755 salt->salt_len = 16 + 1;
13756
13757 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13758
13759 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13760
13761 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13762
13763 return (PARSER_OK);
13764 }
13765
13766 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13767 {
13768 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13769
13770 u32 *digest = (u32 *) hash_buf->digest;
13771
13772 salt_t *salt = hash_buf->salt;
13773
13774 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13775
13776 /**
13777 * parse line
13778 */
13779
13780 char *hashbuf_pos = input_buf;
13781
13782 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13783
13784 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13785
13786 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13787
13788 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13789
13790 saltbuf_pos++;
13791
13792 char *iteration_pos = strchr (saltbuf_pos, ':');
13793
13794 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13795
13796 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13797
13798 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13799
13800 iteration_pos++;
13801
13802 char *databuf_pos = strchr (iteration_pos, ':');
13803
13804 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13805
13806 const uint iteration_len = databuf_pos - iteration_pos;
13807
13808 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13809 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13810
13811 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13812
13813 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13814 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13815
13816 databuf_pos++;
13817
13818 // digest
13819
13820 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13821 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13822 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13823 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13824 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13825 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
13826 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
13827 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
13828
13829 // salt
13830
13831 char *saltbuf_ptr = (char *) salt->salt_buf;
13832
13833 for (uint i = 0; i < saltbuf_len; i += 2)
13834 {
13835 const char p0 = saltbuf_pos[i + 0];
13836 const char p1 = saltbuf_pos[i + 1];
13837
13838 *saltbuf_ptr++ = hex_convert (p1) << 0
13839 | hex_convert (p0) << 4;
13840 }
13841
13842 salt->salt_buf[4] = 0x01000000;
13843 salt->salt_buf[5] = 0x80;
13844
13845 salt->salt_len = saltbuf_len / 2;
13846
13847 // iteration
13848
13849 salt->salt_iter = atoi (iteration_pos) - 1;
13850
13851 // data
13852
13853 char *databuf_ptr = (char *) cloudkey->data_buf;
13854
13855 for (uint i = 0; i < databuf_len; i += 2)
13856 {
13857 const char p0 = databuf_pos[i + 0];
13858 const char p1 = databuf_pos[i + 1];
13859
13860 *databuf_ptr++ = hex_convert (p1) << 0
13861 | hex_convert (p0) << 4;
13862 }
13863
13864 *databuf_ptr++ = 0x80;
13865
13866 for (uint i = 0; i < 512; i++)
13867 {
13868 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13869 }
13870
13871 cloudkey->data_len = databuf_len / 2;
13872
13873 return (PARSER_OK);
13874 }
13875
13876 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13877 {
13878 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13879
13880 u32 *digest = (u32 *) hash_buf->digest;
13881
13882 salt_t *salt = hash_buf->salt;
13883
13884 /**
13885 * parse line
13886 */
13887
13888 char *hashbuf_pos = input_buf;
13889
13890 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13891
13892 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13893
13894 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13895
13896 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13897
13898 domainbuf_pos++;
13899
13900 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13901
13902 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13903
13904 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13905
13906 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13907
13908 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13909
13910 saltbuf_pos++;
13911
13912 char *iteration_pos = strchr (saltbuf_pos, ':');
13913
13914 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13915
13916 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13917
13918 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13919
13920 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13921
13922 iteration_pos++;
13923
13924 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13925
13926 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13927 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13928
13929 // ok, the plan for this algorithm is the following:
13930 // we have 2 salts here, the domain-name and a random salt
13931 // while both are used in the initial transformation,
13932 // only the random salt is used in the following iterations
13933 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13934 // and one that includes only the real salt (stored into salt_buf[]).
13935 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13936
13937 u8 tmp_buf[100] = { 0 };
13938
13939 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
13940
13941 memcpy (digest, tmp_buf, 20);
13942
13943 digest[0] = byte_swap_32 (digest[0]);
13944 digest[1] = byte_swap_32 (digest[1]);
13945 digest[2] = byte_swap_32 (digest[2]);
13946 digest[3] = byte_swap_32 (digest[3]);
13947 digest[4] = byte_swap_32 (digest[4]);
13948
13949 // domain
13950
13951 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13952
13953 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13954
13955 char *len_ptr = NULL;
13956
13957 for (uint i = 0; i < domainbuf_len; i++)
13958 {
13959 if (salt_buf_pc_ptr[i] == '.')
13960 {
13961 len_ptr = &salt_buf_pc_ptr[i];
13962
13963 *len_ptr = 0;
13964 }
13965 else
13966 {
13967 *len_ptr += 1;
13968 }
13969 }
13970
13971 salt->salt_buf_pc[7] = domainbuf_len;
13972
13973 // "real" salt
13974
13975 char *salt_buf_ptr = (char *) salt->salt_buf;
13976
13977 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13978
13979 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13980
13981 salt->salt_len = salt_len;
13982
13983 // iteration
13984
13985 salt->salt_iter = atoi (iteration_pos);
13986
13987 return (PARSER_OK);
13988 }
13989
13990 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13991 {
13992 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13993
13994 u32 *digest = (u32 *) hash_buf->digest;
13995
13996 salt_t *salt = hash_buf->salt;
13997
13998 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13999 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14000 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14001 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14002 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14003
14004 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14005
14006 uint salt_len = input_len - 40 - 1;
14007
14008 char *salt_buf = input_buf + 40 + 1;
14009
14010 char *salt_buf_ptr = (char *) salt->salt_buf;
14011
14012 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14013
14014 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14015
14016 salt->salt_len = salt_len;
14017
14018 return (PARSER_OK);
14019 }
14020
14021 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14022 {
14023 const u8 ascii_to_ebcdic[] =
14024 {
14025 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14026 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14027 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14028 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14029 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14030 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14031 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14032 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14033 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14034 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14035 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14036 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14037 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14038 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14039 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14040 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14041 };
14042
14043 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14044
14045 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14046
14047 u32 *digest = (u32 *) hash_buf->digest;
14048
14049 salt_t *salt = hash_buf->salt;
14050
14051 char *salt_pos = input_buf + 6 + 1;
14052
14053 char *digest_pos = strchr (salt_pos, '*');
14054
14055 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14056
14057 uint salt_len = digest_pos - salt_pos;
14058
14059 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14060
14061 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14062
14063 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14064
14065 digest_pos++;
14066
14067 char *salt_buf_ptr = (char *) salt->salt_buf;
14068 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14069
14070 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14071
14072 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14073
14074 salt->salt_len = salt_len;
14075
14076 for (uint i = 0; i < salt_len; i++)
14077 {
14078 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14079 }
14080 for (uint i = salt_len; i < 8; i++)
14081 {
14082 salt_buf_pc_ptr[i] = 0x40;
14083 }
14084
14085 uint tt;
14086
14087 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14088
14089 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14090 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14091
14092 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14093 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14094
14095 digest[0] = byte_swap_32 (digest[0]);
14096 digest[1] = byte_swap_32 (digest[1]);
14097
14098 IP (digest[0], digest[1], tt);
14099
14100 digest[0] = rotr32 (digest[0], 29);
14101 digest[1] = rotr32 (digest[1], 29);
14102 digest[2] = 0;
14103 digest[3] = 0;
14104
14105 return (PARSER_OK);
14106 }
14107
14108 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14109 {
14110 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14111
14112 u32 *digest = (u32 *) hash_buf->digest;
14113
14114 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14115 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14116 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14117 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14118
14119 digest[0] = byte_swap_32 (digest[0]);
14120 digest[1] = byte_swap_32 (digest[1]);
14121 digest[2] = byte_swap_32 (digest[2]);
14122 digest[3] = byte_swap_32 (digest[3]);
14123
14124 return (PARSER_OK);
14125 }
14126
14127 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14128 {
14129 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14130
14131 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14132
14133 u32 *digest = (u32 *) hash_buf->digest;
14134
14135 salt_t *salt = hash_buf->salt;
14136
14137 u8 tmp_buf[120] = { 0 };
14138
14139 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14140
14141 tmp_buf[3] += -4; // dont ask!
14142
14143 memcpy (salt->salt_buf, tmp_buf, 5);
14144
14145 salt->salt_len = 5;
14146
14147 memcpy (digest, tmp_buf + 5, 9);
14148
14149 // yes, only 9 byte are needed to crack, but 10 to display
14150
14151 salt->salt_buf_pc[7] = input_buf[20];
14152
14153 return (PARSER_OK);
14154 }
14155
14156 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14157 {
14158 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14159
14160 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) 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 // salt
14173
14174 memcpy (salt->salt_buf, tmp_buf, 16);
14175
14176 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)
14177
14178 // iteration
14179
14180 char tmp_iter_buf[11] = { 0 };
14181
14182 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14183
14184 tmp_iter_buf[10] = 0;
14185
14186 salt->salt_iter = atoi (tmp_iter_buf);
14187
14188 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14189 {
14190 return (PARSER_SALT_ITERATION);
14191 }
14192
14193 salt->salt_iter--; // first round in init
14194
14195 // 2 additional bytes for display only
14196
14197 salt->salt_buf_pc[0] = tmp_buf[26];
14198 salt->salt_buf_pc[1] = tmp_buf[27];
14199
14200 // digest
14201
14202 memcpy (digest, tmp_buf + 28, 8);
14203
14204 digest[0] = byte_swap_32 (digest[0]);
14205 digest[1] = byte_swap_32 (digest[1]);
14206 digest[2] = 0;
14207 digest[3] = 0;
14208
14209 return (PARSER_OK);
14210 }
14211
14212 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14213 {
14214 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14215
14216 u32 *digest = (u32 *) hash_buf->digest;
14217
14218 salt_t *salt = hash_buf->salt;
14219
14220 char *salt_buf_pos = input_buf;
14221
14222 char *hash_buf_pos = salt_buf_pos + 6;
14223
14224 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14225 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14226 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14227 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14228 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14229 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14230 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14231 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14232
14233 digest[0] -= SHA256M_A;
14234 digest[1] -= SHA256M_B;
14235 digest[2] -= SHA256M_C;
14236 digest[3] -= SHA256M_D;
14237 digest[4] -= SHA256M_E;
14238 digest[5] -= SHA256M_F;
14239 digest[6] -= SHA256M_G;
14240 digest[7] -= SHA256M_H;
14241
14242 char *salt_buf_ptr = (char *) salt->salt_buf;
14243
14244 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14245
14246 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14247
14248 salt->salt_len = salt_len;
14249
14250 return (PARSER_OK);
14251 }
14252
14253 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14254 {
14255 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14256
14257 u32 *digest = (u32 *) hash_buf->digest;
14258
14259 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14260
14261 salt_t *salt = hash_buf->salt;
14262
14263 char *salt_buf = input_buf + 6;
14264
14265 char *digest_buf = strchr (salt_buf, '$');
14266
14267 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14268
14269 uint salt_len = digest_buf - salt_buf;
14270
14271 digest_buf++; // skip the '$' symbol
14272
14273 char *salt_buf_ptr = (char *) salt->salt_buf;
14274
14275 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14276
14277 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14278
14279 salt->salt_len = salt_len;
14280
14281 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14282 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14283 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14284 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14285
14286 digest[0] = byte_swap_32 (digest[0]);
14287 digest[1] = byte_swap_32 (digest[1]);
14288 digest[2] = byte_swap_32 (digest[2]);
14289 digest[3] = byte_swap_32 (digest[3]);
14290
14291 digest[0] -= MD5M_A;
14292 digest[1] -= MD5M_B;
14293 digest[2] -= MD5M_C;
14294 digest[3] -= MD5M_D;
14295
14296 return (PARSER_OK);
14297 }
14298
14299 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14300 {
14301 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14302
14303 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14304
14305 u32 *digest = (u32 *) hash_buf->digest;
14306
14307 salt_t *salt = hash_buf->salt;
14308
14309 char *salt_buf = input_buf + 3;
14310
14311 char *digest_buf = strchr (salt_buf, '$');
14312
14313 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14314
14315 uint salt_len = digest_buf - salt_buf;
14316
14317 digest_buf++; // skip the '$' symbol
14318
14319 char *salt_buf_ptr = (char *) salt->salt_buf;
14320
14321 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14322
14323 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14324
14325 salt_buf_ptr[salt_len] = 0x2d;
14326
14327 salt->salt_len = salt_len + 1;
14328
14329 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14330 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14331 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14332 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14333
14334 digest[0] = byte_swap_32 (digest[0]);
14335 digest[1] = byte_swap_32 (digest[1]);
14336 digest[2] = byte_swap_32 (digest[2]);
14337 digest[3] = byte_swap_32 (digest[3]);
14338
14339 digest[0] -= MD5M_A;
14340 digest[1] -= MD5M_B;
14341 digest[2] -= MD5M_C;
14342 digest[3] -= MD5M_D;
14343
14344 return (PARSER_OK);
14345 }
14346
14347 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14348 {
14349 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14350
14351 u32 *digest = (u32 *) hash_buf->digest;
14352
14353 u8 tmp_buf[100] = { 0 };
14354
14355 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14356
14357 memcpy (digest, tmp_buf, 20);
14358
14359 digest[0] = byte_swap_32 (digest[0]);
14360 digest[1] = byte_swap_32 (digest[1]);
14361 digest[2] = byte_swap_32 (digest[2]);
14362 digest[3] = byte_swap_32 (digest[3]);
14363 digest[4] = byte_swap_32 (digest[4]);
14364
14365 digest[0] -= SHA1M_A;
14366 digest[1] -= SHA1M_B;
14367 digest[2] -= SHA1M_C;
14368 digest[3] -= SHA1M_D;
14369 digest[4] -= SHA1M_E;
14370
14371 return (PARSER_OK);
14372 }
14373
14374 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14375 {
14376 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14377
14378 u32 *digest = (u32 *) hash_buf->digest;
14379
14380 salt_t *salt = hash_buf->salt;
14381
14382 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14383 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14384 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14385 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14386
14387 digest[0] = byte_swap_32 (digest[0]);
14388 digest[1] = byte_swap_32 (digest[1]);
14389 digest[2] = byte_swap_32 (digest[2]);
14390 digest[3] = byte_swap_32 (digest[3]);
14391
14392 digest[0] -= MD5M_A;
14393 digest[1] -= MD5M_B;
14394 digest[2] -= MD5M_C;
14395 digest[3] -= MD5M_D;
14396
14397 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14398
14399 uint salt_len = input_len - 32 - 1;
14400
14401 char *salt_buf = input_buf + 32 + 1;
14402
14403 char *salt_buf_ptr = (char *) salt->salt_buf;
14404
14405 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14406
14407 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14408
14409 /*
14410 * add static "salt" part
14411 */
14412
14413 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14414
14415 salt_len += 8;
14416
14417 salt->salt_len = salt_len;
14418
14419 return (PARSER_OK);
14420 }
14421
14422 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14423 {
14424 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14425
14426 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14427
14428 u32 *digest = (u32 *) hash_buf->digest;
14429
14430 salt_t *salt = hash_buf->salt;
14431
14432 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14433
14434 /**
14435 * parse line
14436 */
14437
14438 char *saltlen_pos = input_buf + 1 + 3 + 1;
14439
14440 char *saltbuf_pos = strchr (saltlen_pos, '$');
14441
14442 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14443
14444 uint saltlen_len = saltbuf_pos - saltlen_pos;
14445
14446 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14447
14448 saltbuf_pos++;
14449
14450 char *keylen_pos = strchr (saltbuf_pos, '$');
14451
14452 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14453
14454 uint saltbuf_len = keylen_pos - saltbuf_pos;
14455
14456 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14457
14458 keylen_pos++;
14459
14460 char *keybuf_pos = strchr (keylen_pos, '$');
14461
14462 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14463
14464 uint keylen_len = keybuf_pos - keylen_pos;
14465
14466 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14467
14468 keybuf_pos++;
14469
14470 char *databuf_pos = strchr (keybuf_pos, '$');
14471
14472 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14473
14474 uint keybuf_len = databuf_pos - keybuf_pos;
14475
14476 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14477
14478 databuf_pos++;
14479
14480 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14481
14482 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14483
14484 /**
14485 * copy data
14486 */
14487
14488 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14489 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14490 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14491 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14492
14493 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14494 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14495 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14496 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14497
14498 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14499 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14500 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14501 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14502
14503 salt->salt_len = 16;
14504 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14505
14506 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14507 {
14508 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14509 }
14510
14511 return (PARSER_OK);
14512 }
14513
14514 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14515 {
14516 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14517
14518 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14519
14520 u32 *digest = (u32 *) hash_buf->digest;
14521
14522 salt_t *salt = hash_buf->salt;
14523
14524 /**
14525 * parse line
14526 */
14527
14528 // first is the N salt parameter
14529
14530 char *N_pos = input_buf + 6;
14531
14532 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14533
14534 N_pos++;
14535
14536 salt->scrypt_N = atoi (N_pos);
14537
14538 // r
14539
14540 char *r_pos = strchr (N_pos, ':');
14541
14542 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14543
14544 r_pos++;
14545
14546 salt->scrypt_r = atoi (r_pos);
14547
14548 // p
14549
14550 char *p_pos = strchr (r_pos, ':');
14551
14552 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14553
14554 p_pos++;
14555
14556 salt->scrypt_p = atoi (p_pos);
14557
14558 // salt
14559
14560 char *saltbuf_pos = strchr (p_pos, ':');
14561
14562 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14563
14564 saltbuf_pos++;
14565
14566 char *hash_pos = strchr (saltbuf_pos, ':');
14567
14568 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14569
14570 hash_pos++;
14571
14572 // base64 decode
14573
14574 u8 tmp_buf[33] = { 0 };
14575
14576 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14577
14578 char *salt_buf_ptr = (char *) salt->salt_buf;
14579
14580 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14581
14582 salt->salt_len = tmp_len;
14583 salt->salt_iter = 1;
14584
14585 // digest - base64 decode
14586
14587 memset (tmp_buf, 0, sizeof (tmp_buf));
14588
14589 tmp_len = input_len - (hash_pos - input_buf);
14590
14591 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14592
14593 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14594
14595 memcpy (digest, tmp_buf, 32);
14596
14597 return (PARSER_OK);
14598 }
14599
14600 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14601 {
14602 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14603
14604 u32 *digest = (u32 *) hash_buf->digest;
14605
14606 salt_t *salt = hash_buf->salt;
14607
14608 /**
14609 * parse line
14610 */
14611
14612 char decrypted[76] = { 0 }; // iv + hash
14613
14614 juniper_decrypt_hash (input_buf, decrypted);
14615
14616 char *md5crypt_hash = decrypted + 12;
14617
14618 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14619
14620 salt->salt_iter = ROUNDS_MD5CRYPT;
14621
14622 char *salt_pos = md5crypt_hash + 3;
14623
14624 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14625
14626 salt->salt_len = hash_pos - salt_pos; // should be 8
14627
14628 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14629
14630 hash_pos++;
14631
14632 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14633
14634 return (PARSER_OK);
14635 }
14636
14637 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14638 {
14639 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14640
14641 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14642
14643 u32 *digest = (u32 *) hash_buf->digest;
14644
14645 salt_t *salt = hash_buf->salt;
14646
14647 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14648
14649 /**
14650 * parse line
14651 */
14652
14653 // first is *raw* salt
14654
14655 char *salt_pos = input_buf + 3;
14656
14657 char *hash_pos = strchr (salt_pos, '$');
14658
14659 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14660
14661 uint salt_len = hash_pos - salt_pos;
14662
14663 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14664
14665 hash_pos++;
14666
14667 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14668
14669 memcpy (salt_buf_ptr, salt_pos, 14);
14670
14671 salt_buf_ptr[17] = 0x01;
14672 salt_buf_ptr[18] = 0x80;
14673
14674 // add some stuff to normal salt to make sorted happy
14675
14676 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14677 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14678 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14679 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14680
14681 salt->salt_len = salt_len;
14682 salt->salt_iter = ROUNDS_CISCO8 - 1;
14683
14684 // base64 decode hash
14685
14686 u8 tmp_buf[100] = { 0 };
14687
14688 uint hash_len = input_len - 3 - salt_len - 1;
14689
14690 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14691
14692 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14693
14694 memcpy (digest, tmp_buf, 32);
14695
14696 digest[0] = byte_swap_32 (digest[0]);
14697 digest[1] = byte_swap_32 (digest[1]);
14698 digest[2] = byte_swap_32 (digest[2]);
14699 digest[3] = byte_swap_32 (digest[3]);
14700 digest[4] = byte_swap_32 (digest[4]);
14701 digest[5] = byte_swap_32 (digest[5]);
14702 digest[6] = byte_swap_32 (digest[6]);
14703 digest[7] = byte_swap_32 (digest[7]);
14704
14705 return (PARSER_OK);
14706 }
14707
14708 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14709 {
14710 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14711
14712 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14713
14714 u32 *digest = (u32 *) hash_buf->digest;
14715
14716 salt_t *salt = hash_buf->salt;
14717
14718 /**
14719 * parse line
14720 */
14721
14722 // first is *raw* salt
14723
14724 char *salt_pos = input_buf + 3;
14725
14726 char *hash_pos = strchr (salt_pos, '$');
14727
14728 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14729
14730 uint salt_len = hash_pos - salt_pos;
14731
14732 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14733
14734 salt->salt_len = salt_len;
14735 hash_pos++;
14736
14737 char *salt_buf_ptr = (char *) salt->salt_buf;
14738
14739 memcpy (salt_buf_ptr, salt_pos, salt_len);
14740 salt_buf_ptr[salt_len] = 0;
14741
14742 // base64 decode hash
14743
14744 u8 tmp_buf[100] = { 0 };
14745
14746 uint hash_len = input_len - 3 - salt_len - 1;
14747
14748 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14749
14750 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14751
14752 memcpy (digest, tmp_buf, 32);
14753
14754 // fixed:
14755 salt->scrypt_N = 16384;
14756 salt->scrypt_r = 1;
14757 salt->scrypt_p = 1;
14758 salt->salt_iter = 1;
14759
14760 return (PARSER_OK);
14761 }
14762
14763 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14764 {
14765 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14766
14767 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14768
14769 u32 *digest = (u32 *) hash_buf->digest;
14770
14771 salt_t *salt = hash_buf->salt;
14772
14773 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14774
14775 /**
14776 * parse line
14777 */
14778
14779 char *version_pos = input_buf + 8 + 1;
14780
14781 char *verifierHashSize_pos = strchr (version_pos, '*');
14782
14783 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14784
14785 u32 version_len = verifierHashSize_pos - version_pos;
14786
14787 if (version_len != 4) return (PARSER_SALT_LENGTH);
14788
14789 verifierHashSize_pos++;
14790
14791 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14792
14793 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14794
14795 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14796
14797 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14798
14799 keySize_pos++;
14800
14801 char *saltSize_pos = strchr (keySize_pos, '*');
14802
14803 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14804
14805 u32 keySize_len = saltSize_pos - keySize_pos;
14806
14807 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14808
14809 saltSize_pos++;
14810
14811 char *osalt_pos = strchr (saltSize_pos, '*');
14812
14813 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14814
14815 u32 saltSize_len = osalt_pos - saltSize_pos;
14816
14817 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14818
14819 osalt_pos++;
14820
14821 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14822
14823 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14824
14825 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14826
14827 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14828
14829 encryptedVerifier_pos++;
14830
14831 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14832
14833 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14834
14835 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14836
14837 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14838
14839 encryptedVerifierHash_pos++;
14840
14841 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;
14842
14843 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14844
14845 const uint version = atoi (version_pos);
14846
14847 if (version != 2007) return (PARSER_SALT_VALUE);
14848
14849 const uint verifierHashSize = atoi (verifierHashSize_pos);
14850
14851 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14852
14853 const uint keySize = atoi (keySize_pos);
14854
14855 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14856
14857 office2007->keySize = keySize;
14858
14859 const uint saltSize = atoi (saltSize_pos);
14860
14861 if (saltSize != 16) return (PARSER_SALT_VALUE);
14862
14863 /**
14864 * salt
14865 */
14866
14867 salt->salt_len = 16;
14868 salt->salt_iter = ROUNDS_OFFICE2007;
14869
14870 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14871 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14872 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14873 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14874
14875 /**
14876 * esalt
14877 */
14878
14879 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14880 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14881 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14882 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14883
14884 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14885 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14886 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14887 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14888 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14889
14890 /**
14891 * digest
14892 */
14893
14894 digest[0] = office2007->encryptedVerifierHash[0];
14895 digest[1] = office2007->encryptedVerifierHash[1];
14896 digest[2] = office2007->encryptedVerifierHash[2];
14897 digest[3] = office2007->encryptedVerifierHash[3];
14898
14899 return (PARSER_OK);
14900 }
14901
14902 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14903 {
14904 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14905
14906 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14907
14908 u32 *digest = (u32 *) hash_buf->digest;
14909
14910 salt_t *salt = hash_buf->salt;
14911
14912 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14913
14914 /**
14915 * parse line
14916 */
14917
14918 char *version_pos = input_buf + 8 + 1;
14919
14920 char *spinCount_pos = strchr (version_pos, '*');
14921
14922 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14923
14924 u32 version_len = spinCount_pos - version_pos;
14925
14926 if (version_len != 4) return (PARSER_SALT_LENGTH);
14927
14928 spinCount_pos++;
14929
14930 char *keySize_pos = strchr (spinCount_pos, '*');
14931
14932 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14933
14934 u32 spinCount_len = keySize_pos - spinCount_pos;
14935
14936 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14937
14938 keySize_pos++;
14939
14940 char *saltSize_pos = strchr (keySize_pos, '*');
14941
14942 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14943
14944 u32 keySize_len = saltSize_pos - keySize_pos;
14945
14946 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14947
14948 saltSize_pos++;
14949
14950 char *osalt_pos = strchr (saltSize_pos, '*');
14951
14952 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14953
14954 u32 saltSize_len = osalt_pos - saltSize_pos;
14955
14956 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14957
14958 osalt_pos++;
14959
14960 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14961
14962 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14963
14964 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14965
14966 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14967
14968 encryptedVerifier_pos++;
14969
14970 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14971
14972 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14973
14974 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14975
14976 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14977
14978 encryptedVerifierHash_pos++;
14979
14980 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;
14981
14982 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14983
14984 const uint version = atoi (version_pos);
14985
14986 if (version != 2010) return (PARSER_SALT_VALUE);
14987
14988 const uint spinCount = atoi (spinCount_pos);
14989
14990 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14991
14992 const uint keySize = atoi (keySize_pos);
14993
14994 if (keySize != 128) return (PARSER_SALT_VALUE);
14995
14996 const uint saltSize = atoi (saltSize_pos);
14997
14998 if (saltSize != 16) return (PARSER_SALT_VALUE);
14999
15000 /**
15001 * salt
15002 */
15003
15004 salt->salt_len = 16;
15005 salt->salt_iter = spinCount;
15006
15007 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15008 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15009 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15010 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15011
15012 /**
15013 * esalt
15014 */
15015
15016 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15017 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15018 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15019 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15020
15021 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15022 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15023 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15024 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15025 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15026 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15027 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15028 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15029
15030 /**
15031 * digest
15032 */
15033
15034 digest[0] = office2010->encryptedVerifierHash[0];
15035 digest[1] = office2010->encryptedVerifierHash[1];
15036 digest[2] = office2010->encryptedVerifierHash[2];
15037 digest[3] = office2010->encryptedVerifierHash[3];
15038
15039 return (PARSER_OK);
15040 }
15041
15042 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15043 {
15044 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15045
15046 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15047
15048 u32 *digest = (u32 *) hash_buf->digest;
15049
15050 salt_t *salt = hash_buf->salt;
15051
15052 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15053
15054 /**
15055 * parse line
15056 */
15057
15058 char *version_pos = input_buf + 8 + 1;
15059
15060 char *spinCount_pos = strchr (version_pos, '*');
15061
15062 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15063
15064 u32 version_len = spinCount_pos - version_pos;
15065
15066 if (version_len != 4) return (PARSER_SALT_LENGTH);
15067
15068 spinCount_pos++;
15069
15070 char *keySize_pos = strchr (spinCount_pos, '*');
15071
15072 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15073
15074 u32 spinCount_len = keySize_pos - spinCount_pos;
15075
15076 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15077
15078 keySize_pos++;
15079
15080 char *saltSize_pos = strchr (keySize_pos, '*');
15081
15082 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15083
15084 u32 keySize_len = saltSize_pos - keySize_pos;
15085
15086 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15087
15088 saltSize_pos++;
15089
15090 char *osalt_pos = strchr (saltSize_pos, '*');
15091
15092 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15093
15094 u32 saltSize_len = osalt_pos - saltSize_pos;
15095
15096 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15097
15098 osalt_pos++;
15099
15100 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15101
15102 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15103
15104 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15105
15106 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15107
15108 encryptedVerifier_pos++;
15109
15110 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15111
15112 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15113
15114 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15115
15116 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15117
15118 encryptedVerifierHash_pos++;
15119
15120 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;
15121
15122 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15123
15124 const uint version = atoi (version_pos);
15125
15126 if (version != 2013) return (PARSER_SALT_VALUE);
15127
15128 const uint spinCount = atoi (spinCount_pos);
15129
15130 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15131
15132 const uint keySize = atoi (keySize_pos);
15133
15134 if (keySize != 256) return (PARSER_SALT_VALUE);
15135
15136 const uint saltSize = atoi (saltSize_pos);
15137
15138 if (saltSize != 16) return (PARSER_SALT_VALUE);
15139
15140 /**
15141 * salt
15142 */
15143
15144 salt->salt_len = 16;
15145 salt->salt_iter = spinCount;
15146
15147 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15148 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15149 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15150 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15151
15152 /**
15153 * esalt
15154 */
15155
15156 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15157 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15158 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15159 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15160
15161 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15162 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15163 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15164 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15165 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15166 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15167 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15168 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15169
15170 /**
15171 * digest
15172 */
15173
15174 digest[0] = office2013->encryptedVerifierHash[0];
15175 digest[1] = office2013->encryptedVerifierHash[1];
15176 digest[2] = office2013->encryptedVerifierHash[2];
15177 digest[3] = office2013->encryptedVerifierHash[3];
15178
15179 return (PARSER_OK);
15180 }
15181
15182 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15183 {
15184 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15185
15186 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15187
15188 u32 *digest = (u32 *) hash_buf->digest;
15189
15190 salt_t *salt = hash_buf->salt;
15191
15192 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15193
15194 /**
15195 * parse line
15196 */
15197
15198 char *version_pos = input_buf + 11;
15199
15200 char *osalt_pos = strchr (version_pos, '*');
15201
15202 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15203
15204 u32 version_len = osalt_pos - version_pos;
15205
15206 if (version_len != 1) return (PARSER_SALT_LENGTH);
15207
15208 osalt_pos++;
15209
15210 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15211
15212 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15213
15214 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15215
15216 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15217
15218 encryptedVerifier_pos++;
15219
15220 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15221
15222 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15223
15224 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15225
15226 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15227
15228 encryptedVerifierHash_pos++;
15229
15230 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15231
15232 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15233
15234 const uint version = *version_pos - 0x30;
15235
15236 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15237
15238 /**
15239 * esalt
15240 */
15241
15242 oldoffice01->version = version;
15243
15244 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15245 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15246 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15247 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15248
15249 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15250 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15251 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15252 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15253
15254 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15255 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15256 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15257 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15258
15259 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15260 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15261 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15262 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15263
15264 /**
15265 * salt
15266 */
15267
15268 salt->salt_len = 16;
15269
15270 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15271 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15272 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15273 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15274
15275 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15276 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15277 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15278 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15279
15280 // this is a workaround as office produces multiple documents with the same salt
15281
15282 salt->salt_len += 32;
15283
15284 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15285 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15286 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15287 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15288 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15289 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15290 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15291 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15292
15293 /**
15294 * digest
15295 */
15296
15297 digest[0] = oldoffice01->encryptedVerifierHash[0];
15298 digest[1] = oldoffice01->encryptedVerifierHash[1];
15299 digest[2] = oldoffice01->encryptedVerifierHash[2];
15300 digest[3] = oldoffice01->encryptedVerifierHash[3];
15301
15302 return (PARSER_OK);
15303 }
15304
15305 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15306 {
15307 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15308 }
15309
15310 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15311 {
15312 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15313
15314 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15315
15316 u32 *digest = (u32 *) hash_buf->digest;
15317
15318 salt_t *salt = hash_buf->salt;
15319
15320 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15321
15322 /**
15323 * parse line
15324 */
15325
15326 char *version_pos = input_buf + 11;
15327
15328 char *osalt_pos = strchr (version_pos, '*');
15329
15330 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15331
15332 u32 version_len = osalt_pos - version_pos;
15333
15334 if (version_len != 1) return (PARSER_SALT_LENGTH);
15335
15336 osalt_pos++;
15337
15338 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15339
15340 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15341
15342 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15343
15344 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15345
15346 encryptedVerifier_pos++;
15347
15348 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15349
15350 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15351
15352 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15353
15354 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15355
15356 encryptedVerifierHash_pos++;
15357
15358 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15359
15360 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15361
15362 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15363
15364 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15365
15366 rc4key_pos++;
15367
15368 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15369
15370 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15371
15372 const uint version = *version_pos - 0x30;
15373
15374 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15375
15376 /**
15377 * esalt
15378 */
15379
15380 oldoffice01->version = version;
15381
15382 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15383 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15384 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15385 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15386
15387 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15388 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15389 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15390 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15391
15392 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15393 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15394 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15395 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15396
15397 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15398 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15399 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15400 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15401
15402 oldoffice01->rc4key[1] = 0;
15403 oldoffice01->rc4key[0] = 0;
15404
15405 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15406 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15407 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15408 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15409 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15410 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15411 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15412 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15413 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15414 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15415
15416 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15417 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15418
15419 /**
15420 * salt
15421 */
15422
15423 salt->salt_len = 16;
15424
15425 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15426 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15427 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15428 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15429
15430 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15431 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15432 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15433 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15434
15435 // this is a workaround as office produces multiple documents with the same salt
15436
15437 salt->salt_len += 32;
15438
15439 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15440 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15441 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15442 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15443 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15444 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15445 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15446 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15447
15448 /**
15449 * digest
15450 */
15451
15452 digest[0] = oldoffice01->rc4key[0];
15453 digest[1] = oldoffice01->rc4key[1];
15454 digest[2] = 0;
15455 digest[3] = 0;
15456
15457 return (PARSER_OK);
15458 }
15459
15460 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15461 {
15462 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15463
15464 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15465
15466 u32 *digest = (u32 *) hash_buf->digest;
15467
15468 salt_t *salt = hash_buf->salt;
15469
15470 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15471
15472 /**
15473 * parse line
15474 */
15475
15476 char *version_pos = input_buf + 11;
15477
15478 char *osalt_pos = strchr (version_pos, '*');
15479
15480 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15481
15482 u32 version_len = osalt_pos - version_pos;
15483
15484 if (version_len != 1) return (PARSER_SALT_LENGTH);
15485
15486 osalt_pos++;
15487
15488 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15489
15490 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15491
15492 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15493
15494 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15495
15496 encryptedVerifier_pos++;
15497
15498 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15499
15500 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15501
15502 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15503
15504 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15505
15506 encryptedVerifierHash_pos++;
15507
15508 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15509
15510 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15511
15512 const uint version = *version_pos - 0x30;
15513
15514 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15515
15516 /**
15517 * esalt
15518 */
15519
15520 oldoffice34->version = version;
15521
15522 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15523 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15524 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15525 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15526
15527 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15528 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15529 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15530 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15531
15532 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15533 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15534 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15535 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15536 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15537
15538 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15539 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15540 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15541 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15542 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15543
15544 /**
15545 * salt
15546 */
15547
15548 salt->salt_len = 16;
15549
15550 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15551 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15552 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15553 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15554
15555 // this is a workaround as office produces multiple documents with the same salt
15556
15557 salt->salt_len += 32;
15558
15559 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15560 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15561 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15562 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15563 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15564 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15565 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15566 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15567
15568 /**
15569 * digest
15570 */
15571
15572 digest[0] = oldoffice34->encryptedVerifierHash[0];
15573 digest[1] = oldoffice34->encryptedVerifierHash[1];
15574 digest[2] = oldoffice34->encryptedVerifierHash[2];
15575 digest[3] = oldoffice34->encryptedVerifierHash[3];
15576
15577 return (PARSER_OK);
15578 }
15579
15580 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15581 {
15582 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15583
15584 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15585 }
15586
15587 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15588 {
15589 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15590
15591 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15592
15593 u32 *digest = (u32 *) hash_buf->digest;
15594
15595 salt_t *salt = hash_buf->salt;
15596
15597 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15598
15599 /**
15600 * parse line
15601 */
15602
15603 char *version_pos = input_buf + 11;
15604
15605 char *osalt_pos = strchr (version_pos, '*');
15606
15607 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15608
15609 u32 version_len = osalt_pos - version_pos;
15610
15611 if (version_len != 1) return (PARSER_SALT_LENGTH);
15612
15613 osalt_pos++;
15614
15615 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15616
15617 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15618
15619 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15620
15621 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15622
15623 encryptedVerifier_pos++;
15624
15625 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15626
15627 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15628
15629 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15630
15631 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15632
15633 encryptedVerifierHash_pos++;
15634
15635 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15636
15637 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15638
15639 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15640
15641 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15642
15643 rc4key_pos++;
15644
15645 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15646
15647 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15648
15649 const uint version = *version_pos - 0x30;
15650
15651 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15652
15653 /**
15654 * esalt
15655 */
15656
15657 oldoffice34->version = version;
15658
15659 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15660 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15661 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15662 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15663
15664 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15665 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15666 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15667 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15668
15669 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15670 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15671 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15672 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15673 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15674
15675 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15676 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15677 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15678 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15679 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15680
15681 oldoffice34->rc4key[1] = 0;
15682 oldoffice34->rc4key[0] = 0;
15683
15684 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15685 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15686 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15687 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15688 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15689 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15690 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15691 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15692 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15693 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15694
15695 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15696 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15697
15698 /**
15699 * salt
15700 */
15701
15702 salt->salt_len = 16;
15703
15704 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15705 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15706 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15707 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15708
15709 // this is a workaround as office produces multiple documents with the same salt
15710
15711 salt->salt_len += 32;
15712
15713 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15714 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15715 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15716 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15717 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15718 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15719 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15720 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15721
15722 /**
15723 * digest
15724 */
15725
15726 digest[0] = oldoffice34->rc4key[0];
15727 digest[1] = oldoffice34->rc4key[1];
15728 digest[2] = 0;
15729 digest[3] = 0;
15730
15731 return (PARSER_OK);
15732 }
15733
15734 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15735 {
15736 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15737
15738 u32 *digest = (u32 *) hash_buf->digest;
15739
15740 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15741 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15742 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15743 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15744
15745 digest[0] = byte_swap_32 (digest[0]);
15746 digest[1] = byte_swap_32 (digest[1]);
15747 digest[2] = byte_swap_32 (digest[2]);
15748 digest[3] = byte_swap_32 (digest[3]);
15749
15750 return (PARSER_OK);
15751 }
15752
15753 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15754 {
15755 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15756
15757 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15758
15759 u32 *digest = (u32 *) hash_buf->digest;
15760
15761 salt_t *salt = hash_buf->salt;
15762
15763 char *signature_pos = input_buf;
15764
15765 char *salt_pos = strchr (signature_pos, '$');
15766
15767 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15768
15769 u32 signature_len = salt_pos - signature_pos;
15770
15771 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15772
15773 salt_pos++;
15774
15775 char *hash_pos = strchr (salt_pos, '$');
15776
15777 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15778
15779 u32 salt_len = hash_pos - salt_pos;
15780
15781 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15782
15783 hash_pos++;
15784
15785 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15786
15787 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15788
15789 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15790 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15791 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15792 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15793 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15794
15795 digest[0] -= SHA1M_A;
15796 digest[1] -= SHA1M_B;
15797 digest[2] -= SHA1M_C;
15798 digest[3] -= SHA1M_D;
15799 digest[4] -= SHA1M_E;
15800
15801 char *salt_buf_ptr = (char *) salt->salt_buf;
15802
15803 memcpy (salt_buf_ptr, salt_pos, salt_len);
15804
15805 salt->salt_len = salt_len;
15806
15807 return (PARSER_OK);
15808 }
15809
15810 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15811 {
15812 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15813
15814 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15815
15816 u32 *digest = (u32 *) hash_buf->digest;
15817
15818 salt_t *salt = hash_buf->salt;
15819
15820 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15821
15822 /**
15823 * parse line
15824 */
15825
15826 char *iter_pos = input_buf + 14;
15827
15828 const int iter = atoi (iter_pos);
15829
15830 if (iter < 1) return (PARSER_SALT_ITERATION);
15831
15832 salt->salt_iter = iter - 1;
15833
15834 char *salt_pos = strchr (iter_pos, '$');
15835
15836 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15837
15838 salt_pos++;
15839
15840 char *hash_pos = strchr (salt_pos, '$');
15841
15842 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15843
15844 const uint salt_len = hash_pos - salt_pos;
15845
15846 hash_pos++;
15847
15848 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15849
15850 memcpy (salt_buf_ptr, salt_pos, salt_len);
15851
15852 salt->salt_len = salt_len;
15853
15854 salt_buf_ptr[salt_len + 3] = 0x01;
15855 salt_buf_ptr[salt_len + 4] = 0x80;
15856
15857 // add some stuff to normal salt to make sorted happy
15858
15859 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15860 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15861 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15862 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15863 salt->salt_buf[4] = salt->salt_iter;
15864
15865 // base64 decode hash
15866
15867 u8 tmp_buf[100] = { 0 };
15868
15869 uint hash_len = input_len - (hash_pos - input_buf);
15870
15871 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15872
15873 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15874
15875 memcpy (digest, tmp_buf, 32);
15876
15877 digest[0] = byte_swap_32 (digest[0]);
15878 digest[1] = byte_swap_32 (digest[1]);
15879 digest[2] = byte_swap_32 (digest[2]);
15880 digest[3] = byte_swap_32 (digest[3]);
15881 digest[4] = byte_swap_32 (digest[4]);
15882 digest[5] = byte_swap_32 (digest[5]);
15883 digest[6] = byte_swap_32 (digest[6]);
15884 digest[7] = byte_swap_32 (digest[7]);
15885
15886 return (PARSER_OK);
15887 }
15888
15889 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15890 {
15891 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15892
15893 u32 *digest = (u32 *) hash_buf->digest;
15894
15895 salt_t *salt = hash_buf->salt;
15896
15897 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15898 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15899 digest[2] = 0;
15900 digest[3] = 0;
15901
15902 digest[0] = byte_swap_32 (digest[0]);
15903 digest[1] = byte_swap_32 (digest[1]);
15904
15905 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15906 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15907 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15908
15909 char iter_c = input_buf[17];
15910 char iter_d = input_buf[19];
15911
15912 // atm only defaults, let's see if there's more request
15913 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15914 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15915
15916 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15917
15918 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
15919 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
15920 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
15921 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
15922
15923 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15924 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15925 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15926 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15927
15928 salt->salt_len = 16;
15929
15930 return (PARSER_OK);
15931 }
15932
15933 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15934 {
15935 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15936
15937 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15938
15939 u32 *digest = (u32 *) hash_buf->digest;
15940
15941 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15942
15943 salt_t *salt = hash_buf->salt;
15944
15945 char *salt_pos = input_buf + 10;
15946
15947 char *hash_pos = strchr (salt_pos, '$');
15948
15949 uint salt_len = hash_pos - salt_pos;
15950
15951 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15952
15953 hash_pos++;
15954
15955 uint hash_len = input_len - 10 - salt_len - 1;
15956
15957 // base64 decode salt
15958
15959 u8 tmp_buf[100] = { 0 };
15960
15961 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
15962
15963 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15964
15965 tmp_buf[salt_len] = 0x80;
15966
15967 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15968
15969 salt->salt_len = salt_len;
15970
15971 // base64 decode salt
15972
15973 memset (tmp_buf, 0, sizeof (tmp_buf));
15974
15975 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15976
15977 uint user_len = hash_len - 32;
15978
15979 const u8 *tmp_hash = tmp_buf + user_len;
15980
15981 user_len--; // skip the trailing space
15982
15983 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
15984 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
15985 digest[2] = hex_to_u32 (&tmp_hash[16]);
15986 digest[3] = hex_to_u32 (&tmp_hash[24]);
15987
15988 digest[0] = byte_swap_32 (digest[0]);
15989 digest[1] = byte_swap_32 (digest[1]);
15990 digest[2] = byte_swap_32 (digest[2]);
15991 digest[3] = byte_swap_32 (digest[3]);
15992
15993 // store username for host only (output hash if cracked)
15994
15995 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15996 memcpy (cram_md5->user, tmp_buf, user_len);
15997
15998 return (PARSER_OK);
15999 }
16000
16001 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16002 {
16003 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16004
16005 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16006
16007 u32 *digest = (u32 *) hash_buf->digest;
16008
16009 salt_t *salt = hash_buf->salt;
16010
16011 char *iter_pos = input_buf + 10;
16012
16013 u32 iter = atoi (iter_pos);
16014
16015 if (iter < 1)
16016 {
16017 return (PARSER_SALT_ITERATION);
16018 }
16019
16020 iter--; // first iteration is special
16021
16022 salt->salt_iter = iter;
16023
16024 char *base64_pos = strchr (iter_pos, '}');
16025
16026 if (base64_pos == NULL)
16027 {
16028 return (PARSER_SIGNATURE_UNMATCHED);
16029 }
16030
16031 base64_pos++;
16032
16033 // base64 decode salt
16034
16035 u32 base64_len = input_len - (base64_pos - input_buf);
16036
16037 u8 tmp_buf[100] = { 0 };
16038
16039 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16040
16041 if (decoded_len < 24)
16042 {
16043 return (PARSER_SALT_LENGTH);
16044 }
16045
16046 // copy the salt
16047
16048 uint salt_len = decoded_len - 20;
16049
16050 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16051 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16052
16053 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16054
16055 salt->salt_len = salt_len;
16056
16057 // set digest
16058
16059 u32 *digest_ptr = (u32*) tmp_buf;
16060
16061 digest[0] = byte_swap_32 (digest_ptr[0]);
16062 digest[1] = byte_swap_32 (digest_ptr[1]);
16063 digest[2] = byte_swap_32 (digest_ptr[2]);
16064 digest[3] = byte_swap_32 (digest_ptr[3]);
16065 digest[4] = byte_swap_32 (digest_ptr[4]);
16066
16067 return (PARSER_OK);
16068 }
16069
16070 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16071 {
16072 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16073
16074 u32 *digest = (u32 *) hash_buf->digest;
16075
16076 salt_t *salt = hash_buf->salt;
16077
16078 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16079 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16080 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16081 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16082 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16083
16084 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16085
16086 uint salt_len = input_len - 40 - 1;
16087
16088 char *salt_buf = input_buf + 40 + 1;
16089
16090 char *salt_buf_ptr = (char *) salt->salt_buf;
16091
16092 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16093
16094 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16095
16096 salt->salt_len = salt_len;
16097
16098 return (PARSER_OK);
16099 }
16100
16101 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16102 {
16103 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16104
16105 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16106
16107 u32 *digest = (u32 *) hash_buf->digest;
16108
16109 salt_t *salt = hash_buf->salt;
16110
16111 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16112
16113 /**
16114 * parse line
16115 */
16116
16117 char *V_pos = input_buf + 5;
16118
16119 char *R_pos = strchr (V_pos, '*');
16120
16121 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16122
16123 u32 V_len = R_pos - V_pos;
16124
16125 R_pos++;
16126
16127 char *bits_pos = strchr (R_pos, '*');
16128
16129 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16130
16131 u32 R_len = bits_pos - R_pos;
16132
16133 bits_pos++;
16134
16135 char *P_pos = strchr (bits_pos, '*');
16136
16137 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16138
16139 u32 bits_len = P_pos - bits_pos;
16140
16141 P_pos++;
16142
16143 char *enc_md_pos = strchr (P_pos, '*');
16144
16145 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16146
16147 u32 P_len = enc_md_pos - P_pos;
16148
16149 enc_md_pos++;
16150
16151 char *id_len_pos = strchr (enc_md_pos, '*');
16152
16153 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16154
16155 u32 enc_md_len = id_len_pos - enc_md_pos;
16156
16157 id_len_pos++;
16158
16159 char *id_buf_pos = strchr (id_len_pos, '*');
16160
16161 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16162
16163 u32 id_len_len = id_buf_pos - id_len_pos;
16164
16165 id_buf_pos++;
16166
16167 char *u_len_pos = strchr (id_buf_pos, '*');
16168
16169 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16170
16171 u32 id_buf_len = u_len_pos - id_buf_pos;
16172
16173 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16174
16175 u_len_pos++;
16176
16177 char *u_buf_pos = strchr (u_len_pos, '*');
16178
16179 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16180
16181 u32 u_len_len = u_buf_pos - u_len_pos;
16182
16183 u_buf_pos++;
16184
16185 char *o_len_pos = strchr (u_buf_pos, '*');
16186
16187 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16188
16189 u32 u_buf_len = o_len_pos - u_buf_pos;
16190
16191 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16192
16193 o_len_pos++;
16194
16195 char *o_buf_pos = strchr (o_len_pos, '*');
16196
16197 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16198
16199 u32 o_len_len = o_buf_pos - o_len_pos;
16200
16201 o_buf_pos++;
16202
16203 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;
16204
16205 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16206
16207 // validate data
16208
16209 const int V = atoi (V_pos);
16210 const int R = atoi (R_pos);
16211 const int P = atoi (P_pos);
16212
16213 if (V != 1) return (PARSER_SALT_VALUE);
16214 if (R != 2) return (PARSER_SALT_VALUE);
16215
16216 const int enc_md = atoi (enc_md_pos);
16217
16218 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16219
16220 const int id_len = atoi (id_len_pos);
16221 const int u_len = atoi (u_len_pos);
16222 const int o_len = atoi (o_len_pos);
16223
16224 if (id_len != 16) return (PARSER_SALT_VALUE);
16225 if (u_len != 32) return (PARSER_SALT_VALUE);
16226 if (o_len != 32) return (PARSER_SALT_VALUE);
16227
16228 const int bits = atoi (bits_pos);
16229
16230 if (bits != 40) return (PARSER_SALT_VALUE);
16231
16232 // copy data to esalt
16233
16234 pdf->V = V;
16235 pdf->R = R;
16236 pdf->P = P;
16237
16238 pdf->enc_md = enc_md;
16239
16240 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16241 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16242 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16243 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16244 pdf->id_len = id_len;
16245
16246 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16247 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16248 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16249 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16250 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16251 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16252 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16253 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16254 pdf->u_len = u_len;
16255
16256 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16257 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16258 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16259 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16260 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16261 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16262 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16263 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16264 pdf->o_len = o_len;
16265
16266 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16267 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16268 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16269 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16270
16271 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16272 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16273 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16274 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16275 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16276 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16277 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16278 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16279
16280 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16281 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16282 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16283 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16284 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16285 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16286 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16287 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16288
16289 // we use ID for salt, maybe needs to change, we will see...
16290
16291 salt->salt_buf[0] = pdf->id_buf[0];
16292 salt->salt_buf[1] = pdf->id_buf[1];
16293 salt->salt_buf[2] = pdf->id_buf[2];
16294 salt->salt_buf[3] = pdf->id_buf[3];
16295 salt->salt_len = pdf->id_len;
16296
16297 digest[0] = pdf->u_buf[0];
16298 digest[1] = pdf->u_buf[1];
16299 digest[2] = pdf->u_buf[2];
16300 digest[3] = pdf->u_buf[3];
16301
16302 return (PARSER_OK);
16303 }
16304
16305 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16306 {
16307 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16308 }
16309
16310 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16311 {
16312 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16313
16314 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16315
16316 u32 *digest = (u32 *) hash_buf->digest;
16317
16318 salt_t *salt = hash_buf->salt;
16319
16320 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16321
16322 /**
16323 * parse line
16324 */
16325
16326 char *V_pos = input_buf + 5;
16327
16328 char *R_pos = strchr (V_pos, '*');
16329
16330 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16331
16332 u32 V_len = R_pos - V_pos;
16333
16334 R_pos++;
16335
16336 char *bits_pos = strchr (R_pos, '*');
16337
16338 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16339
16340 u32 R_len = bits_pos - R_pos;
16341
16342 bits_pos++;
16343
16344 char *P_pos = strchr (bits_pos, '*');
16345
16346 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16347
16348 u32 bits_len = P_pos - bits_pos;
16349
16350 P_pos++;
16351
16352 char *enc_md_pos = strchr (P_pos, '*');
16353
16354 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16355
16356 u32 P_len = enc_md_pos - P_pos;
16357
16358 enc_md_pos++;
16359
16360 char *id_len_pos = strchr (enc_md_pos, '*');
16361
16362 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16363
16364 u32 enc_md_len = id_len_pos - enc_md_pos;
16365
16366 id_len_pos++;
16367
16368 char *id_buf_pos = strchr (id_len_pos, '*');
16369
16370 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16371
16372 u32 id_len_len = id_buf_pos - id_len_pos;
16373
16374 id_buf_pos++;
16375
16376 char *u_len_pos = strchr (id_buf_pos, '*');
16377
16378 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16379
16380 u32 id_buf_len = u_len_pos - id_buf_pos;
16381
16382 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16383
16384 u_len_pos++;
16385
16386 char *u_buf_pos = strchr (u_len_pos, '*');
16387
16388 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16389
16390 u32 u_len_len = u_buf_pos - u_len_pos;
16391
16392 u_buf_pos++;
16393
16394 char *o_len_pos = strchr (u_buf_pos, '*');
16395
16396 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16397
16398 u32 u_buf_len = o_len_pos - u_buf_pos;
16399
16400 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16401
16402 o_len_pos++;
16403
16404 char *o_buf_pos = strchr (o_len_pos, '*');
16405
16406 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16407
16408 u32 o_len_len = o_buf_pos - o_len_pos;
16409
16410 o_buf_pos++;
16411
16412 char *rc4key_pos = strchr (o_buf_pos, ':');
16413
16414 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16415
16416 u32 o_buf_len = rc4key_pos - o_buf_pos;
16417
16418 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16419
16420 rc4key_pos++;
16421
16422 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;
16423
16424 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16425
16426 // validate data
16427
16428 const int V = atoi (V_pos);
16429 const int R = atoi (R_pos);
16430 const int P = atoi (P_pos);
16431
16432 if (V != 1) return (PARSER_SALT_VALUE);
16433 if (R != 2) return (PARSER_SALT_VALUE);
16434
16435 const int enc_md = atoi (enc_md_pos);
16436
16437 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16438
16439 const int id_len = atoi (id_len_pos);
16440 const int u_len = atoi (u_len_pos);
16441 const int o_len = atoi (o_len_pos);
16442
16443 if (id_len != 16) return (PARSER_SALT_VALUE);
16444 if (u_len != 32) return (PARSER_SALT_VALUE);
16445 if (o_len != 32) return (PARSER_SALT_VALUE);
16446
16447 const int bits = atoi (bits_pos);
16448
16449 if (bits != 40) return (PARSER_SALT_VALUE);
16450
16451 // copy data to esalt
16452
16453 pdf->V = V;
16454 pdf->R = R;
16455 pdf->P = P;
16456
16457 pdf->enc_md = enc_md;
16458
16459 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16460 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16461 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16462 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16463 pdf->id_len = id_len;
16464
16465 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16466 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16467 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16468 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16469 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16470 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16471 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16472 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16473 pdf->u_len = u_len;
16474
16475 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16476 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16477 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16478 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16479 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16480 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16481 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16482 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16483 pdf->o_len = o_len;
16484
16485 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16486 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16487 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16488 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16489
16490 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16491 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16492 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16493 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16494 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16495 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16496 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16497 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16498
16499 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16500 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16501 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16502 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16503 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16504 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16505 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16506 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16507
16508 pdf->rc4key[1] = 0;
16509 pdf->rc4key[0] = 0;
16510
16511 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16512 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16513 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16514 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16515 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16516 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16517 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16518 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16519 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16520 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16521
16522 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16523 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16524
16525 // we use ID for salt, maybe needs to change, we will see...
16526
16527 salt->salt_buf[0] = pdf->id_buf[0];
16528 salt->salt_buf[1] = pdf->id_buf[1];
16529 salt->salt_buf[2] = pdf->id_buf[2];
16530 salt->salt_buf[3] = pdf->id_buf[3];
16531 salt->salt_buf[4] = pdf->u_buf[0];
16532 salt->salt_buf[5] = pdf->u_buf[1];
16533 salt->salt_buf[6] = pdf->o_buf[0];
16534 salt->salt_buf[7] = pdf->o_buf[1];
16535 salt->salt_len = pdf->id_len + 16;
16536
16537 digest[0] = pdf->rc4key[0];
16538 digest[1] = pdf->rc4key[1];
16539 digest[2] = 0;
16540 digest[3] = 0;
16541
16542 return (PARSER_OK);
16543 }
16544
16545 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16546 {
16547 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16548
16549 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16550
16551 u32 *digest = (u32 *) hash_buf->digest;
16552
16553 salt_t *salt = hash_buf->salt;
16554
16555 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16556
16557 /**
16558 * parse line
16559 */
16560
16561 char *V_pos = input_buf + 5;
16562
16563 char *R_pos = strchr (V_pos, '*');
16564
16565 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16566
16567 u32 V_len = R_pos - V_pos;
16568
16569 R_pos++;
16570
16571 char *bits_pos = strchr (R_pos, '*');
16572
16573 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16574
16575 u32 R_len = bits_pos - R_pos;
16576
16577 bits_pos++;
16578
16579 char *P_pos = strchr (bits_pos, '*');
16580
16581 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16582
16583 u32 bits_len = P_pos - bits_pos;
16584
16585 P_pos++;
16586
16587 char *enc_md_pos = strchr (P_pos, '*');
16588
16589 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16590
16591 u32 P_len = enc_md_pos - P_pos;
16592
16593 enc_md_pos++;
16594
16595 char *id_len_pos = strchr (enc_md_pos, '*');
16596
16597 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16598
16599 u32 enc_md_len = id_len_pos - enc_md_pos;
16600
16601 id_len_pos++;
16602
16603 char *id_buf_pos = strchr (id_len_pos, '*');
16604
16605 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16606
16607 u32 id_len_len = id_buf_pos - id_len_pos;
16608
16609 id_buf_pos++;
16610
16611 char *u_len_pos = strchr (id_buf_pos, '*');
16612
16613 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16614
16615 u32 id_buf_len = u_len_pos - id_buf_pos;
16616
16617 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16618
16619 u_len_pos++;
16620
16621 char *u_buf_pos = strchr (u_len_pos, '*');
16622
16623 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16624
16625 u32 u_len_len = u_buf_pos - u_len_pos;
16626
16627 u_buf_pos++;
16628
16629 char *o_len_pos = strchr (u_buf_pos, '*');
16630
16631 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16632
16633 u32 u_buf_len = o_len_pos - u_buf_pos;
16634
16635 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16636
16637 o_len_pos++;
16638
16639 char *o_buf_pos = strchr (o_len_pos, '*');
16640
16641 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16642
16643 u32 o_len_len = o_buf_pos - o_len_pos;
16644
16645 o_buf_pos++;
16646
16647 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;
16648
16649 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16650
16651 // validate data
16652
16653 const int V = atoi (V_pos);
16654 const int R = atoi (R_pos);
16655 const int P = atoi (P_pos);
16656
16657 int vr_ok = 0;
16658
16659 if ((V == 2) && (R == 3)) vr_ok = 1;
16660 if ((V == 4) && (R == 4)) vr_ok = 1;
16661
16662 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16663
16664 const int id_len = atoi (id_len_pos);
16665 const int u_len = atoi (u_len_pos);
16666 const int o_len = atoi (o_len_pos);
16667
16668 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16669
16670 if (u_len != 32) return (PARSER_SALT_VALUE);
16671 if (o_len != 32) return (PARSER_SALT_VALUE);
16672
16673 const int bits = atoi (bits_pos);
16674
16675 if (bits != 128) return (PARSER_SALT_VALUE);
16676
16677 int enc_md = 1;
16678
16679 if (R >= 4)
16680 {
16681 enc_md = atoi (enc_md_pos);
16682 }
16683
16684 // copy data to esalt
16685
16686 pdf->V = V;
16687 pdf->R = R;
16688 pdf->P = P;
16689
16690 pdf->enc_md = enc_md;
16691
16692 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16693 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16694 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16695 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16696
16697 if (id_len == 32)
16698 {
16699 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16700 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16701 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16702 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16703 }
16704
16705 pdf->id_len = id_len;
16706
16707 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16708 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16709 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16710 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16711 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16712 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16713 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16714 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16715 pdf->u_len = u_len;
16716
16717 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16718 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16719 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16720 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16721 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16722 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16723 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16724 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16725 pdf->o_len = o_len;
16726
16727 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16728 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16729 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16730 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16731
16732 if (id_len == 32)
16733 {
16734 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16735 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16736 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16737 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16738 }
16739
16740 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16741 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16742 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16743 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16744 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16745 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16746 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16747 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16748
16749 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16750 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16751 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16752 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16753 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16754 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16755 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16756 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16757
16758 // precompute rc4 data for later use
16759
16760 uint padding[8] =
16761 {
16762 0x5e4ebf28,
16763 0x418a754e,
16764 0x564e0064,
16765 0x0801faff,
16766 0xb6002e2e,
16767 0x803e68d0,
16768 0xfea90c2f,
16769 0x7a695364
16770 };
16771
16772 // md5
16773
16774 uint salt_pc_block[32] = { 0 };
16775
16776 char *salt_pc_ptr = (char *) salt_pc_block;
16777
16778 memcpy (salt_pc_ptr, padding, 32);
16779 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16780
16781 uint salt_pc_digest[4] = { 0 };
16782
16783 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16784
16785 pdf->rc4data[0] = salt_pc_digest[0];
16786 pdf->rc4data[1] = salt_pc_digest[1];
16787
16788 // we use ID for salt, maybe needs to change, we will see...
16789
16790 salt->salt_buf[0] = pdf->id_buf[0];
16791 salt->salt_buf[1] = pdf->id_buf[1];
16792 salt->salt_buf[2] = pdf->id_buf[2];
16793 salt->salt_buf[3] = pdf->id_buf[3];
16794 salt->salt_buf[4] = pdf->u_buf[0];
16795 salt->salt_buf[5] = pdf->u_buf[1];
16796 salt->salt_buf[6] = pdf->o_buf[0];
16797 salt->salt_buf[7] = pdf->o_buf[1];
16798 salt->salt_len = pdf->id_len + 16;
16799
16800 salt->salt_iter = ROUNDS_PDF14;
16801
16802 digest[0] = pdf->u_buf[0];
16803 digest[1] = pdf->u_buf[1];
16804 digest[2] = 0;
16805 digest[3] = 0;
16806
16807 return (PARSER_OK);
16808 }
16809
16810 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16811 {
16812 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16813
16814 if (ret != PARSER_OK)
16815 {
16816 return ret;
16817 }
16818
16819 u32 *digest = (u32 *) hash_buf->digest;
16820
16821 salt_t *salt = hash_buf->salt;
16822
16823 digest[0] -= SHA256M_A;
16824 digest[1] -= SHA256M_B;
16825 digest[2] -= SHA256M_C;
16826 digest[3] -= SHA256M_D;
16827 digest[4] -= SHA256M_E;
16828 digest[5] -= SHA256M_F;
16829 digest[6] -= SHA256M_G;
16830 digest[7] -= SHA256M_H;
16831
16832 salt->salt_buf[2] = 0x80;
16833
16834 return (PARSER_OK);
16835 }
16836
16837 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16838 {
16839 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16840
16841 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16842
16843 u32 *digest = (u32 *) hash_buf->digest;
16844
16845 salt_t *salt = hash_buf->salt;
16846
16847 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16848
16849 /**
16850 * parse line
16851 */
16852
16853 char *V_pos = input_buf + 5;
16854
16855 char *R_pos = strchr (V_pos, '*');
16856
16857 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16858
16859 u32 V_len = R_pos - V_pos;
16860
16861 R_pos++;
16862
16863 char *bits_pos = strchr (R_pos, '*');
16864
16865 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16866
16867 u32 R_len = bits_pos - R_pos;
16868
16869 bits_pos++;
16870
16871 char *P_pos = strchr (bits_pos, '*');
16872
16873 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16874
16875 u32 bits_len = P_pos - bits_pos;
16876
16877 P_pos++;
16878
16879 char *enc_md_pos = strchr (P_pos, '*');
16880
16881 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16882
16883 u32 P_len = enc_md_pos - P_pos;
16884
16885 enc_md_pos++;
16886
16887 char *id_len_pos = strchr (enc_md_pos, '*');
16888
16889 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16890
16891 u32 enc_md_len = id_len_pos - enc_md_pos;
16892
16893 id_len_pos++;
16894
16895 char *id_buf_pos = strchr (id_len_pos, '*');
16896
16897 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16898
16899 u32 id_len_len = id_buf_pos - id_len_pos;
16900
16901 id_buf_pos++;
16902
16903 char *u_len_pos = strchr (id_buf_pos, '*');
16904
16905 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16906
16907 u32 id_buf_len = u_len_pos - id_buf_pos;
16908
16909 u_len_pos++;
16910
16911 char *u_buf_pos = strchr (u_len_pos, '*');
16912
16913 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16914
16915 u32 u_len_len = u_buf_pos - u_len_pos;
16916
16917 u_buf_pos++;
16918
16919 char *o_len_pos = strchr (u_buf_pos, '*');
16920
16921 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16922
16923 u32 u_buf_len = o_len_pos - u_buf_pos;
16924
16925 o_len_pos++;
16926
16927 char *o_buf_pos = strchr (o_len_pos, '*');
16928
16929 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16930
16931 u32 o_len_len = o_buf_pos - o_len_pos;
16932
16933 o_buf_pos++;
16934
16935 char *last = strchr (o_buf_pos, '*');
16936
16937 if (last == NULL) last = input_buf + input_len;
16938
16939 u32 o_buf_len = last - o_buf_pos;
16940
16941 // validate data
16942
16943 const int V = atoi (V_pos);
16944 const int R = atoi (R_pos);
16945
16946 int vr_ok = 0;
16947
16948 if ((V == 5) && (R == 5)) vr_ok = 1;
16949 if ((V == 5) && (R == 6)) vr_ok = 1;
16950
16951 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16952
16953 const int bits = atoi (bits_pos);
16954
16955 if (bits != 256) return (PARSER_SALT_VALUE);
16956
16957 int enc_md = atoi (enc_md_pos);
16958
16959 if (enc_md != 1) return (PARSER_SALT_VALUE);
16960
16961 const uint id_len = atoi (id_len_pos);
16962 const uint u_len = atoi (u_len_pos);
16963 const uint o_len = atoi (o_len_pos);
16964
16965 if (V_len > 6) return (PARSER_SALT_LENGTH);
16966 if (R_len > 6) return (PARSER_SALT_LENGTH);
16967 if (P_len > 6) return (PARSER_SALT_LENGTH);
16968 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16969 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16970 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16971 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16972 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16973
16974 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16975 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16976 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16977
16978 // copy data to esalt
16979
16980 if (u_len < 40) return (PARSER_SALT_VALUE);
16981
16982 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16983 {
16984 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
16985 }
16986
16987 salt->salt_buf[0] = pdf->u_buf[8];
16988 salt->salt_buf[1] = pdf->u_buf[9];
16989
16990 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16991 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16992
16993 salt->salt_len = 8;
16994 salt->salt_iter = ROUNDS_PDF17L8;
16995
16996 digest[0] = pdf->u_buf[0];
16997 digest[1] = pdf->u_buf[1];
16998 digest[2] = pdf->u_buf[2];
16999 digest[3] = pdf->u_buf[3];
17000 digest[4] = pdf->u_buf[4];
17001 digest[5] = pdf->u_buf[5];
17002 digest[6] = pdf->u_buf[6];
17003 digest[7] = pdf->u_buf[7];
17004
17005 return (PARSER_OK);
17006 }
17007
17008 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17009 {
17010 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17011
17012 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17013
17014 u32 *digest = (u32 *) hash_buf->digest;
17015
17016 salt_t *salt = hash_buf->salt;
17017
17018 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17019
17020 /**
17021 * parse line
17022 */
17023
17024 // iterations
17025
17026 char *iter_pos = input_buf + 7;
17027
17028 u32 iter = atoi (iter_pos);
17029
17030 if (iter < 1) return (PARSER_SALT_ITERATION);
17031 if (iter > 999999) return (PARSER_SALT_ITERATION);
17032
17033 // first is *raw* salt
17034
17035 char *salt_pos = strchr (iter_pos, ':');
17036
17037 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17038
17039 salt_pos++;
17040
17041 char *hash_pos = strchr (salt_pos, ':');
17042
17043 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17044
17045 u32 salt_len = hash_pos - salt_pos;
17046
17047 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17048
17049 hash_pos++;
17050
17051 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17052
17053 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17054
17055 // decode salt
17056
17057 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17058
17059 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17060
17061 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17062
17063 salt_buf_ptr[salt_len + 3] = 0x01;
17064 salt_buf_ptr[salt_len + 4] = 0x80;
17065
17066 salt->salt_len = salt_len;
17067 salt->salt_iter = iter - 1;
17068
17069 // decode hash
17070
17071 u8 tmp_buf[100] = { 0 };
17072
17073 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17074
17075 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17076
17077 memcpy (digest, tmp_buf, 16);
17078
17079 digest[0] = byte_swap_32 (digest[0]);
17080 digest[1] = byte_swap_32 (digest[1]);
17081 digest[2] = byte_swap_32 (digest[2]);
17082 digest[3] = byte_swap_32 (digest[3]);
17083
17084 // add some stuff to normal salt to make sorted happy
17085
17086 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17087 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17088 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17089 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17090 salt->salt_buf[4] = salt->salt_iter;
17091
17092 return (PARSER_OK);
17093 }
17094
17095 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17096 {
17097 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17098
17099 u32 *digest = (u32 *) hash_buf->digest;
17100
17101 salt_t *salt = hash_buf->salt;
17102
17103 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17104 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17105 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17106 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
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 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17114
17115 uint salt_len = input_len - 32 - 1;
17116
17117 char *salt_buf = input_buf + 32 + 1;
17118
17119 char *salt_buf_ptr = (char *) salt->salt_buf;
17120
17121 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17122
17123 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17124
17125 salt->salt_len = salt_len;
17126
17127 return (PARSER_OK);
17128 }
17129
17130 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17131 {
17132 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17133
17134 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17135
17136 u32 *digest = (u32 *) hash_buf->digest;
17137
17138 salt_t *salt = hash_buf->salt;
17139
17140 char *user_pos = input_buf + 10;
17141
17142 char *salt_pos = strchr (user_pos, '*');
17143
17144 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17145
17146 salt_pos++;
17147
17148 char *hash_pos = strchr (salt_pos, '*');
17149
17150 hash_pos++;
17151
17152 uint hash_len = input_len - (hash_pos - input_buf);
17153
17154 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17155
17156 uint user_len = salt_pos - user_pos - 1;
17157
17158 uint salt_len = hash_pos - salt_pos - 1;
17159
17160 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17161
17162 /*
17163 * store digest
17164 */
17165
17166 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17167 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17168 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17169 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17170
17171 digest[0] = byte_swap_32 (digest[0]);
17172 digest[1] = byte_swap_32 (digest[1]);
17173 digest[2] = byte_swap_32 (digest[2]);
17174 digest[3] = byte_swap_32 (digest[3]);
17175
17176 digest[0] -= MD5M_A;
17177 digest[1] -= MD5M_B;
17178 digest[2] -= MD5M_C;
17179 digest[3] -= MD5M_D;
17180
17181 /*
17182 * store salt
17183 */
17184
17185 char *salt_buf_ptr = (char *) salt->salt_buf;
17186
17187 // first 4 bytes are the "challenge"
17188
17189 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17190 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17191 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17192 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17193
17194 // append the user name
17195
17196 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17197
17198 salt->salt_len = 4 + user_len;
17199
17200 return (PARSER_OK);
17201 }
17202
17203 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17204 {
17205 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17206
17207 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17208
17209 u32 *digest = (u32 *) hash_buf->digest;
17210
17211 salt_t *salt = hash_buf->salt;
17212
17213 char *salt_pos = input_buf + 9;
17214
17215 char *hash_pos = strchr (salt_pos, '*');
17216
17217 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17218
17219 hash_pos++;
17220
17221 uint hash_len = input_len - (hash_pos - input_buf);
17222
17223 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17224
17225 uint salt_len = hash_pos - salt_pos - 1;
17226
17227 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17228
17229 /*
17230 * store digest
17231 */
17232
17233 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17234 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17235 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17236 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17237 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17238
17239 /*
17240 * store salt
17241 */
17242
17243 char *salt_buf_ptr = (char *) salt->salt_buf;
17244
17245 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17246
17247 salt->salt_len = salt_len;
17248
17249 return (PARSER_OK);
17250 }
17251
17252 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17253 {
17254 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17255
17256 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17257
17258 u32 *digest = (u32 *) hash_buf->digest;
17259
17260 salt_t *salt = hash_buf->salt;
17261
17262 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17263
17264 /**
17265 * parse line
17266 */
17267
17268 char *cry_master_len_pos = input_buf + 9;
17269
17270 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17271
17272 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17273
17274 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17275
17276 cry_master_buf_pos++;
17277
17278 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17279
17280 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17281
17282 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17283
17284 cry_salt_len_pos++;
17285
17286 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17287
17288 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17289
17290 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17291
17292 cry_salt_buf_pos++;
17293
17294 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17295
17296 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17297
17298 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17299
17300 cry_rounds_pos++;
17301
17302 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17303
17304 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17305
17306 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17307
17308 ckey_len_pos++;
17309
17310 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17311
17312 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17313
17314 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17315
17316 ckey_buf_pos++;
17317
17318 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17319
17320 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17321
17322 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17323
17324 public_key_len_pos++;
17325
17326 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17327
17328 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17329
17330 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17331
17332 public_key_buf_pos++;
17333
17334 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;
17335
17336 const uint cry_master_len = atoi (cry_master_len_pos);
17337 const uint cry_salt_len = atoi (cry_salt_len_pos);
17338 const uint ckey_len = atoi (ckey_len_pos);
17339 const uint public_key_len = atoi (public_key_len_pos);
17340
17341 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17342 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17343 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17344 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17345
17346 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17347 {
17348 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17349
17350 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17351 }
17352
17353 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17354 {
17355 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17356
17357 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17358 }
17359
17360 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17361 {
17362 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17363
17364 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17365 }
17366
17367 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17368 bitcoin_wallet->ckey_len = ckey_len / 2;
17369 bitcoin_wallet->public_key_len = public_key_len / 2;
17370
17371 /*
17372 * store digest (should be unique enought, hopefully)
17373 */
17374
17375 digest[0] = bitcoin_wallet->cry_master_buf[0];
17376 digest[1] = bitcoin_wallet->cry_master_buf[1];
17377 digest[2] = bitcoin_wallet->cry_master_buf[2];
17378 digest[3] = bitcoin_wallet->cry_master_buf[3];
17379
17380 /*
17381 * store salt
17382 */
17383
17384 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17385
17386 const uint cry_rounds = atoi (cry_rounds_pos);
17387
17388 salt->salt_iter = cry_rounds - 1;
17389
17390 char *salt_buf_ptr = (char *) salt->salt_buf;
17391
17392 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17393
17394 salt->salt_len = salt_len;
17395
17396 return (PARSER_OK);
17397 }
17398
17399 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17400 {
17401 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17402
17403 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17404
17405 u32 *digest = (u32 *) hash_buf->digest;
17406
17407 salt_t *salt = hash_buf->salt;
17408
17409 sip_t *sip = (sip_t *) hash_buf->esalt;
17410
17411 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17412
17413 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17414
17415 memcpy (temp_input_buf, input_buf, input_len);
17416
17417 // URI_server:
17418
17419 char *URI_server_pos = temp_input_buf + 6;
17420
17421 char *URI_client_pos = strchr (URI_server_pos, '*');
17422
17423 if (URI_client_pos == NULL)
17424 {
17425 myfree (temp_input_buf);
17426
17427 return (PARSER_SEPARATOR_UNMATCHED);
17428 }
17429
17430 URI_client_pos[0] = 0;
17431 URI_client_pos++;
17432
17433 uint URI_server_len = strlen (URI_server_pos);
17434
17435 if (URI_server_len > 512)
17436 {
17437 myfree (temp_input_buf);
17438
17439 return (PARSER_SALT_LENGTH);
17440 }
17441
17442 // URI_client:
17443
17444 char *user_pos = strchr (URI_client_pos, '*');
17445
17446 if (user_pos == NULL)
17447 {
17448 myfree (temp_input_buf);
17449
17450 return (PARSER_SEPARATOR_UNMATCHED);
17451 }
17452
17453 user_pos[0] = 0;
17454 user_pos++;
17455
17456 uint URI_client_len = strlen (URI_client_pos);
17457
17458 if (URI_client_len > 512)
17459 {
17460 myfree (temp_input_buf);
17461
17462 return (PARSER_SALT_LENGTH);
17463 }
17464
17465 // user:
17466
17467 char *realm_pos = strchr (user_pos, '*');
17468
17469 if (realm_pos == NULL)
17470 {
17471 myfree (temp_input_buf);
17472
17473 return (PARSER_SEPARATOR_UNMATCHED);
17474 }
17475
17476 realm_pos[0] = 0;
17477 realm_pos++;
17478
17479 uint user_len = strlen (user_pos);
17480
17481 if (user_len > 116)
17482 {
17483 myfree (temp_input_buf);
17484
17485 return (PARSER_SALT_LENGTH);
17486 }
17487
17488 // realm:
17489
17490 char *method_pos = strchr (realm_pos, '*');
17491
17492 if (method_pos == NULL)
17493 {
17494 myfree (temp_input_buf);
17495
17496 return (PARSER_SEPARATOR_UNMATCHED);
17497 }
17498
17499 method_pos[0] = 0;
17500 method_pos++;
17501
17502 uint realm_len = strlen (realm_pos);
17503
17504 if (realm_len > 116)
17505 {
17506 myfree (temp_input_buf);
17507
17508 return (PARSER_SALT_LENGTH);
17509 }
17510
17511 // method:
17512
17513 char *URI_prefix_pos = strchr (method_pos, '*');
17514
17515 if (URI_prefix_pos == NULL)
17516 {
17517 myfree (temp_input_buf);
17518
17519 return (PARSER_SEPARATOR_UNMATCHED);
17520 }
17521
17522 URI_prefix_pos[0] = 0;
17523 URI_prefix_pos++;
17524
17525 uint method_len = strlen (method_pos);
17526
17527 if (method_len > 246)
17528 {
17529 myfree (temp_input_buf);
17530
17531 return (PARSER_SALT_LENGTH);
17532 }
17533
17534 // URI_prefix:
17535
17536 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17537
17538 if (URI_resource_pos == NULL)
17539 {
17540 myfree (temp_input_buf);
17541
17542 return (PARSER_SEPARATOR_UNMATCHED);
17543 }
17544
17545 URI_resource_pos[0] = 0;
17546 URI_resource_pos++;
17547
17548 uint URI_prefix_len = strlen (URI_prefix_pos);
17549
17550 if (URI_prefix_len > 245)
17551 {
17552 myfree (temp_input_buf);
17553
17554 return (PARSER_SALT_LENGTH);
17555 }
17556
17557 // URI_resource:
17558
17559 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17560
17561 if (URI_suffix_pos == NULL)
17562 {
17563 myfree (temp_input_buf);
17564
17565 return (PARSER_SEPARATOR_UNMATCHED);
17566 }
17567
17568 URI_suffix_pos[0] = 0;
17569 URI_suffix_pos++;
17570
17571 uint URI_resource_len = strlen (URI_resource_pos);
17572
17573 if (URI_resource_len < 1 || URI_resource_len > 246)
17574 {
17575 myfree (temp_input_buf);
17576
17577 return (PARSER_SALT_LENGTH);
17578 }
17579
17580 // URI_suffix:
17581
17582 char *nonce_pos = strchr (URI_suffix_pos, '*');
17583
17584 if (nonce_pos == NULL)
17585 {
17586 myfree (temp_input_buf);
17587
17588 return (PARSER_SEPARATOR_UNMATCHED);
17589 }
17590
17591 nonce_pos[0] = 0;
17592 nonce_pos++;
17593
17594 uint URI_suffix_len = strlen (URI_suffix_pos);
17595
17596 if (URI_suffix_len > 245)
17597 {
17598 myfree (temp_input_buf);
17599
17600 return (PARSER_SALT_LENGTH);
17601 }
17602
17603 // nonce:
17604
17605 char *nonce_client_pos = strchr (nonce_pos, '*');
17606
17607 if (nonce_client_pos == NULL)
17608 {
17609 myfree (temp_input_buf);
17610
17611 return (PARSER_SEPARATOR_UNMATCHED);
17612 }
17613
17614 nonce_client_pos[0] = 0;
17615 nonce_client_pos++;
17616
17617 uint nonce_len = strlen (nonce_pos);
17618
17619 if (nonce_len < 1 || nonce_len > 50)
17620 {
17621 myfree (temp_input_buf);
17622
17623 return (PARSER_SALT_LENGTH);
17624 }
17625
17626 // nonce_client:
17627
17628 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17629
17630 if (nonce_count_pos == NULL)
17631 {
17632 myfree (temp_input_buf);
17633
17634 return (PARSER_SEPARATOR_UNMATCHED);
17635 }
17636
17637 nonce_count_pos[0] = 0;
17638 nonce_count_pos++;
17639
17640 uint nonce_client_len = strlen (nonce_client_pos);
17641
17642 if (nonce_client_len > 50)
17643 {
17644 myfree (temp_input_buf);
17645
17646 return (PARSER_SALT_LENGTH);
17647 }
17648
17649 // nonce_count:
17650
17651 char *qop_pos = strchr (nonce_count_pos, '*');
17652
17653 if (qop_pos == NULL)
17654 {
17655 myfree (temp_input_buf);
17656
17657 return (PARSER_SEPARATOR_UNMATCHED);
17658 }
17659
17660 qop_pos[0] = 0;
17661 qop_pos++;
17662
17663 uint nonce_count_len = strlen (nonce_count_pos);
17664
17665 if (nonce_count_len > 50)
17666 {
17667 myfree (temp_input_buf);
17668
17669 return (PARSER_SALT_LENGTH);
17670 }
17671
17672 // qop:
17673
17674 char *directive_pos = strchr (qop_pos, '*');
17675
17676 if (directive_pos == NULL)
17677 {
17678 myfree (temp_input_buf);
17679
17680 return (PARSER_SEPARATOR_UNMATCHED);
17681 }
17682
17683 directive_pos[0] = 0;
17684 directive_pos++;
17685
17686 uint qop_len = strlen (qop_pos);
17687
17688 if (qop_len > 50)
17689 {
17690 myfree (temp_input_buf);
17691
17692 return (PARSER_SALT_LENGTH);
17693 }
17694
17695 // directive
17696
17697 char *digest_pos = strchr (directive_pos, '*');
17698
17699 if (digest_pos == NULL)
17700 {
17701 myfree (temp_input_buf);
17702
17703 return (PARSER_SEPARATOR_UNMATCHED);
17704 }
17705
17706 digest_pos[0] = 0;
17707 digest_pos++;
17708
17709 uint directive_len = strlen (directive_pos);
17710
17711 if (directive_len != 3)
17712 {
17713 myfree (temp_input_buf);
17714
17715 return (PARSER_SALT_LENGTH);
17716 }
17717
17718 if (memcmp (directive_pos, "MD5", 3))
17719 {
17720 log_info ("ERROR: only the MD5 directive is currently supported\n");
17721
17722 myfree (temp_input_buf);
17723
17724 return (PARSER_SIP_AUTH_DIRECTIVE);
17725 }
17726
17727 /*
17728 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17729 */
17730
17731 uint md5_len = 0;
17732
17733 uint md5_max_len = 4 * 64;
17734
17735 uint md5_remaining_len = md5_max_len;
17736
17737 uint tmp_md5_buf[64] = { 0 };
17738
17739 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17740
17741 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17742
17743 md5_len += method_len + 1;
17744 tmp_md5_ptr += method_len + 1;
17745
17746 if (URI_prefix_len > 0)
17747 {
17748 md5_remaining_len = md5_max_len - md5_len;
17749
17750 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17751
17752 md5_len += URI_prefix_len + 1;
17753 tmp_md5_ptr += URI_prefix_len + 1;
17754 }
17755
17756 md5_remaining_len = md5_max_len - md5_len;
17757
17758 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17759
17760 md5_len += URI_resource_len;
17761 tmp_md5_ptr += URI_resource_len;
17762
17763 if (URI_suffix_len > 0)
17764 {
17765 md5_remaining_len = md5_max_len - md5_len;
17766
17767 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17768
17769 md5_len += 1 + URI_suffix_len;
17770 }
17771
17772 uint tmp_digest[4] = { 0 };
17773
17774 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17775
17776 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17777 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17778 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17779 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17780
17781 /*
17782 * esalt
17783 */
17784
17785 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17786
17787 uint esalt_len = 0;
17788
17789 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17790
17791 // there are 2 possibilities for the esalt:
17792
17793 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17794 {
17795 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17796
17797 if (esalt_len > max_esalt_len)
17798 {
17799 myfree (temp_input_buf);
17800
17801 return (PARSER_SALT_LENGTH);
17802 }
17803
17804 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17805 nonce_pos,
17806 nonce_count_pos,
17807 nonce_client_pos,
17808 qop_pos,
17809 tmp_digest[0],
17810 tmp_digest[1],
17811 tmp_digest[2],
17812 tmp_digest[3]);
17813 }
17814 else
17815 {
17816 esalt_len = 1 + nonce_len + 1 + 32;
17817
17818 if (esalt_len > max_esalt_len)
17819 {
17820 myfree (temp_input_buf);
17821
17822 return (PARSER_SALT_LENGTH);
17823 }
17824
17825 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17826 nonce_pos,
17827 tmp_digest[0],
17828 tmp_digest[1],
17829 tmp_digest[2],
17830 tmp_digest[3]);
17831 }
17832
17833 // add 0x80 to esalt
17834
17835 esalt_buf_ptr[esalt_len] = 0x80;
17836
17837 sip->esalt_len = esalt_len;
17838
17839 /*
17840 * actual salt
17841 */
17842
17843 char *sip_salt_ptr = (char *) sip->salt_buf;
17844
17845 uint salt_len = user_len + 1 + realm_len + 1;
17846
17847 uint max_salt_len = 119;
17848
17849 if (salt_len > max_salt_len)
17850 {
17851 myfree (temp_input_buf);
17852
17853 return (PARSER_SALT_LENGTH);
17854 }
17855
17856 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17857
17858 sip->salt_len = salt_len;
17859
17860 /*
17861 * fake salt (for sorting)
17862 */
17863
17864 char *salt_buf_ptr = (char *) salt->salt_buf;
17865
17866 max_salt_len = 55;
17867
17868 uint fake_salt_len = salt_len;
17869
17870 if (fake_salt_len > max_salt_len)
17871 {
17872 fake_salt_len = max_salt_len;
17873 }
17874
17875 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17876
17877 salt->salt_len = fake_salt_len;
17878
17879 /*
17880 * digest
17881 */
17882
17883 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
17884 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
17885 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
17886 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
17887
17888 digest[0] = byte_swap_32 (digest[0]);
17889 digest[1] = byte_swap_32 (digest[1]);
17890 digest[2] = byte_swap_32 (digest[2]);
17891 digest[3] = byte_swap_32 (digest[3]);
17892
17893 myfree (temp_input_buf);
17894
17895 return (PARSER_OK);
17896 }
17897
17898 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17899 {
17900 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17901
17902 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17903
17904 u32 *digest = (u32 *) hash_buf->digest;
17905
17906 salt_t *salt = hash_buf->salt;
17907
17908 // digest
17909
17910 char *digest_pos = input_buf;
17911
17912 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
17913 digest[1] = 0;
17914 digest[2] = 0;
17915 digest[3] = 0;
17916
17917 // salt
17918
17919 char *salt_buf = input_buf + 8 + 1;
17920
17921 uint salt_len = 8;
17922
17923 char *salt_buf_ptr = (char *) salt->salt_buf;
17924
17925 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17926
17927 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17928
17929 salt->salt_len = salt_len;
17930
17931 return (PARSER_OK);
17932 }
17933
17934 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17935 {
17936 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17937
17938 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17939
17940 u32 *digest = (u32 *) hash_buf->digest;
17941
17942 salt_t *salt = hash_buf->salt;
17943
17944 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17945
17946 /**
17947 * parse line
17948 */
17949
17950 char *p_buf_pos = input_buf + 4;
17951
17952 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17953
17954 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17955
17956 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
17957
17958 NumCyclesPower_pos++;
17959
17960 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17961
17962 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17963
17964 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17965
17966 salt_len_pos++;
17967
17968 char *salt_buf_pos = strchr (salt_len_pos, '$');
17969
17970 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17971
17972 u32 salt_len_len = salt_buf_pos - salt_len_pos;
17973
17974 salt_buf_pos++;
17975
17976 char *iv_len_pos = strchr (salt_buf_pos, '$');
17977
17978 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17979
17980 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
17981
17982 iv_len_pos++;
17983
17984 char *iv_buf_pos = strchr (iv_len_pos, '$');
17985
17986 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17987
17988 u32 iv_len_len = iv_buf_pos - iv_len_pos;
17989
17990 iv_buf_pos++;
17991
17992 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17993
17994 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17995
17996 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
17997
17998 crc_buf_pos++;
17999
18000 char *data_len_pos = strchr (crc_buf_pos, '$');
18001
18002 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18003
18004 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18005
18006 data_len_pos++;
18007
18008 char *unpack_size_pos = strchr (data_len_pos, '$');
18009
18010 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18011
18012 u32 data_len_len = unpack_size_pos - data_len_pos;
18013
18014 unpack_size_pos++;
18015
18016 char *data_buf_pos = strchr (unpack_size_pos, '$');
18017
18018 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18019
18020 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18021
18022 data_buf_pos++;
18023
18024 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;
18025
18026 const uint iter = atoi (NumCyclesPower_pos);
18027 const uint crc = atoi (crc_buf_pos);
18028 const uint p_buf = atoi (p_buf_pos);
18029 const uint salt_len = atoi (salt_len_pos);
18030 const uint iv_len = atoi (iv_len_pos);
18031 const uint unpack_size = atoi (unpack_size_pos);
18032 const uint data_len = atoi (data_len_pos);
18033
18034 /**
18035 * verify some data
18036 */
18037
18038 if (p_buf != 0) return (PARSER_SALT_VALUE);
18039 if (salt_len != 0) return (PARSER_SALT_VALUE);
18040
18041 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18042
18043 if (data_len > 384) return (PARSER_SALT_VALUE);
18044
18045 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18046
18047 /**
18048 * store data
18049 */
18050
18051 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18052 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18053 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18054 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18055
18056 seven_zip->iv_len = iv_len;
18057
18058 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18059
18060 seven_zip->salt_len = 0;
18061
18062 seven_zip->crc = crc;
18063
18064 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18065 {
18066 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18067
18068 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18069 }
18070
18071 seven_zip->data_len = data_len;
18072
18073 seven_zip->unpack_size = unpack_size;
18074
18075 // real salt
18076
18077 salt->salt_buf[0] = seven_zip->data_buf[0];
18078 salt->salt_buf[1] = seven_zip->data_buf[1];
18079 salt->salt_buf[2] = seven_zip->data_buf[2];
18080 salt->salt_buf[3] = seven_zip->data_buf[3];
18081
18082 salt->salt_len = 16;
18083
18084 salt->salt_sign[0] = iter;
18085
18086 salt->salt_iter = 1 << iter;
18087
18088 /**
18089 * digest
18090 */
18091
18092 digest[0] = crc;
18093 digest[1] = 0;
18094 digest[2] = 0;
18095 digest[3] = 0;
18096
18097 return (PARSER_OK);
18098 }
18099
18100 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18101 {
18102 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18103
18104 u32 *digest = (u32 *) hash_buf->digest;
18105
18106 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18107 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18108 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18109 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18110 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18111 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18112 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18113 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18114
18115 digest[0] = byte_swap_32 (digest[0]);
18116 digest[1] = byte_swap_32 (digest[1]);
18117 digest[2] = byte_swap_32 (digest[2]);
18118 digest[3] = byte_swap_32 (digest[3]);
18119 digest[4] = byte_swap_32 (digest[4]);
18120 digest[5] = byte_swap_32 (digest[5]);
18121 digest[6] = byte_swap_32 (digest[6]);
18122 digest[7] = byte_swap_32 (digest[7]);
18123
18124 return (PARSER_OK);
18125 }
18126
18127 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18128 {
18129 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18130
18131 u32 *digest = (u32 *) hash_buf->digest;
18132
18133 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18134 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18135 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18136 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18137 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18138 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18139 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18140 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18141 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18142 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18143 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18144 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18145 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18146 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18147 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18148 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18149
18150 digest[ 0] = byte_swap_32 (digest[ 0]);
18151 digest[ 1] = byte_swap_32 (digest[ 1]);
18152 digest[ 2] = byte_swap_32 (digest[ 2]);
18153 digest[ 3] = byte_swap_32 (digest[ 3]);
18154 digest[ 4] = byte_swap_32 (digest[ 4]);
18155 digest[ 5] = byte_swap_32 (digest[ 5]);
18156 digest[ 6] = byte_swap_32 (digest[ 6]);
18157 digest[ 7] = byte_swap_32 (digest[ 7]);
18158 digest[ 8] = byte_swap_32 (digest[ 8]);
18159 digest[ 9] = byte_swap_32 (digest[ 9]);
18160 digest[10] = byte_swap_32 (digest[10]);
18161 digest[11] = byte_swap_32 (digest[11]);
18162 digest[12] = byte_swap_32 (digest[12]);
18163 digest[13] = byte_swap_32 (digest[13]);
18164 digest[14] = byte_swap_32 (digest[14]);
18165 digest[15] = byte_swap_32 (digest[15]);
18166
18167 return (PARSER_OK);
18168 }
18169
18170 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18171 {
18172 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18173
18174 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18175
18176 u32 *digest = (u32 *) hash_buf->digest;
18177
18178 salt_t *salt = hash_buf->salt;
18179
18180 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18181
18182 /**
18183 * parse line
18184 */
18185
18186 // iterations
18187
18188 char *iter_pos = input_buf + 4;
18189
18190 u32 iter = atoi (iter_pos);
18191
18192 if (iter < 1) return (PARSER_SALT_ITERATION);
18193 if (iter > 999999) return (PARSER_SALT_ITERATION);
18194
18195 // first is *raw* salt
18196
18197 char *salt_pos = strchr (iter_pos, ':');
18198
18199 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18200
18201 salt_pos++;
18202
18203 char *hash_pos = strchr (salt_pos, ':');
18204
18205 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18206
18207 u32 salt_len = hash_pos - salt_pos;
18208
18209 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18210
18211 hash_pos++;
18212
18213 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18214
18215 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18216
18217 // decode salt
18218
18219 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18220
18221 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18222
18223 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18224
18225 salt_buf_ptr[salt_len + 3] = 0x01;
18226 salt_buf_ptr[salt_len + 4] = 0x80;
18227
18228 salt->salt_len = salt_len;
18229 salt->salt_iter = iter - 1;
18230
18231 // decode hash
18232
18233 u8 tmp_buf[100] = { 0 };
18234
18235 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18236
18237 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18238
18239 memcpy (digest, tmp_buf, 16);
18240
18241 // add some stuff to normal salt to make sorted happy
18242
18243 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18244 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18245 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18246 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18247 salt->salt_buf[4] = salt->salt_iter;
18248
18249 return (PARSER_OK);
18250 }
18251
18252 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18253 {
18254 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18255
18256 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18257
18258 u32 *digest = (u32 *) hash_buf->digest;
18259
18260 salt_t *salt = hash_buf->salt;
18261
18262 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18263
18264 /**
18265 * parse line
18266 */
18267
18268 // iterations
18269
18270 char *iter_pos = input_buf + 5;
18271
18272 u32 iter = atoi (iter_pos);
18273
18274 if (iter < 1) return (PARSER_SALT_ITERATION);
18275 if (iter > 999999) return (PARSER_SALT_ITERATION);
18276
18277 // first is *raw* salt
18278
18279 char *salt_pos = strchr (iter_pos, ':');
18280
18281 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18282
18283 salt_pos++;
18284
18285 char *hash_pos = strchr (salt_pos, ':');
18286
18287 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18288
18289 u32 salt_len = hash_pos - salt_pos;
18290
18291 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18292
18293 hash_pos++;
18294
18295 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18296
18297 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18298
18299 // decode salt
18300
18301 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18302
18303 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18304
18305 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18306
18307 salt_buf_ptr[salt_len + 3] = 0x01;
18308 salt_buf_ptr[salt_len + 4] = 0x80;
18309
18310 salt->salt_len = salt_len;
18311 salt->salt_iter = iter - 1;
18312
18313 // decode hash
18314
18315 u8 tmp_buf[100] = { 0 };
18316
18317 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18318
18319 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18320
18321 memcpy (digest, tmp_buf, 16);
18322
18323 digest[0] = byte_swap_32 (digest[0]);
18324 digest[1] = byte_swap_32 (digest[1]);
18325 digest[2] = byte_swap_32 (digest[2]);
18326 digest[3] = byte_swap_32 (digest[3]);
18327
18328 // add some stuff to normal salt to make sorted happy
18329
18330 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18331 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18332 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18333 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18334 salt->salt_buf[4] = salt->salt_iter;
18335
18336 return (PARSER_OK);
18337 }
18338
18339 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18340 {
18341 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18342
18343 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18344
18345 u64 *digest = (u64 *) hash_buf->digest;
18346
18347 salt_t *salt = hash_buf->salt;
18348
18349 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18350
18351 /**
18352 * parse line
18353 */
18354
18355 // iterations
18356
18357 char *iter_pos = input_buf + 7;
18358
18359 u32 iter = atoi (iter_pos);
18360
18361 if (iter < 1) return (PARSER_SALT_ITERATION);
18362 if (iter > 999999) return (PARSER_SALT_ITERATION);
18363
18364 // first is *raw* salt
18365
18366 char *salt_pos = strchr (iter_pos, ':');
18367
18368 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18369
18370 salt_pos++;
18371
18372 char *hash_pos = strchr (salt_pos, ':');
18373
18374 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18375
18376 u32 salt_len = hash_pos - salt_pos;
18377
18378 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18379
18380 hash_pos++;
18381
18382 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18383
18384 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18385
18386 // decode salt
18387
18388 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18389
18390 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18391
18392 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18393
18394 salt_buf_ptr[salt_len + 3] = 0x01;
18395 salt_buf_ptr[salt_len + 4] = 0x80;
18396
18397 salt->salt_len = salt_len;
18398 salt->salt_iter = iter - 1;
18399
18400 // decode hash
18401
18402 u8 tmp_buf[100] = { 0 };
18403
18404 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18405
18406 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18407
18408 memcpy (digest, tmp_buf, 64);
18409
18410 digest[0] = byte_swap_64 (digest[0]);
18411 digest[1] = byte_swap_64 (digest[1]);
18412 digest[2] = byte_swap_64 (digest[2]);
18413 digest[3] = byte_swap_64 (digest[3]);
18414 digest[4] = byte_swap_64 (digest[4]);
18415 digest[5] = byte_swap_64 (digest[5]);
18416 digest[6] = byte_swap_64 (digest[6]);
18417 digest[7] = byte_swap_64 (digest[7]);
18418
18419 // add some stuff to normal salt to make sorted happy
18420
18421 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18422 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18423 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18424 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18425 salt->salt_buf[4] = salt->salt_iter;
18426
18427 return (PARSER_OK);
18428 }
18429
18430 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18431 {
18432 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18433
18434 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18435
18436 uint *digest = (uint *) hash_buf->digest;
18437
18438 salt_t *salt = hash_buf->salt;
18439
18440 /**
18441 * parse line
18442 */
18443
18444 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18445
18446 char *hash_pos = strchr (salt_pos, '$');
18447
18448 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18449
18450 u32 salt_len = hash_pos - salt_pos;
18451
18452 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18453
18454 hash_pos++;
18455
18456 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18457
18458 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18459
18460 // decode hash
18461
18462 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18463 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18464 digest[ 2] = 0;
18465 digest[ 3] = 0;
18466 digest[ 4] = 0;
18467 digest[ 5] = 0;
18468 digest[ 6] = 0;
18469 digest[ 7] = 0;
18470 digest[ 8] = 0;
18471 digest[ 9] = 0;
18472 digest[10] = 0;
18473 digest[11] = 0;
18474 digest[12] = 0;
18475 digest[13] = 0;
18476 digest[14] = 0;
18477 digest[15] = 0;
18478
18479 // decode salt
18480
18481 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18482 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18483
18484 salt->salt_iter = ROUNDS_ECRYPTFS;
18485 salt->salt_len = 8;
18486
18487 return (PARSER_OK);
18488 }
18489
18490 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18491 {
18492 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18493
18494 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18495
18496 unsigned char c19 = itoa64_to_int (input_buf[19]);
18497
18498 if (c19 & 3) return (PARSER_HASH_VALUE);
18499
18500 salt_t *salt = hash_buf->salt;
18501
18502 u32 *digest = (u32 *) hash_buf->digest;
18503
18504 // iteration count
18505
18506 salt->salt_iter = itoa64_to_int (input_buf[1])
18507 | itoa64_to_int (input_buf[2]) << 6
18508 | itoa64_to_int (input_buf[3]) << 12
18509 | itoa64_to_int (input_buf[4]) << 18;
18510
18511 // set salt
18512
18513 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18514 | itoa64_to_int (input_buf[6]) << 6
18515 | itoa64_to_int (input_buf[7]) << 12
18516 | itoa64_to_int (input_buf[8]) << 18;
18517
18518 salt->salt_len = 4;
18519
18520 u8 tmp_buf[100] = { 0 };
18521
18522 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18523
18524 memcpy (digest, tmp_buf, 8);
18525
18526 uint tt;
18527
18528 IP (digest[0], digest[1], tt);
18529
18530 digest[0] = rotr32 (digest[0], 31);
18531 digest[1] = rotr32 (digest[1], 31);
18532 digest[2] = 0;
18533 digest[3] = 0;
18534
18535 return (PARSER_OK);
18536 }
18537
18538 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18539 {
18540 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18541
18542 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18543
18544 u32 *digest = (u32 *) hash_buf->digest;
18545
18546 salt_t *salt = hash_buf->salt;
18547
18548 /**
18549 * parse line
18550 */
18551
18552 char *type_pos = input_buf + 6 + 1;
18553
18554 char *salt_pos = strchr (type_pos, '*');
18555
18556 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18557
18558 u32 type_len = salt_pos - type_pos;
18559
18560 if (type_len != 1) return (PARSER_SALT_LENGTH);
18561
18562 salt_pos++;
18563
18564 char *crypted_pos = strchr (salt_pos, '*');
18565
18566 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18567
18568 u32 salt_len = crypted_pos - salt_pos;
18569
18570 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18571
18572 crypted_pos++;
18573
18574 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18575
18576 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18577
18578 /**
18579 * copy data
18580 */
18581
18582 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18583 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18584
18585 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18586 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18587
18588 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18589 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18590 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18591 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18592
18593 salt->salt_len = 24;
18594 salt->salt_iter = ROUNDS_RAR3;
18595
18596 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18597 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18598
18599 digest[0] = 0xc43d7b00;
18600 digest[1] = 0x40070000;
18601 digest[2] = 0;
18602 digest[3] = 0;
18603
18604 return (PARSER_OK);
18605 }
18606
18607 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18608 {
18609 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18610
18611 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18612
18613 u32 *digest = (u32 *) hash_buf->digest;
18614
18615 salt_t *salt = hash_buf->salt;
18616
18617 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18618
18619 /**
18620 * parse line
18621 */
18622
18623 char *param0_pos = input_buf + 1 + 4 + 1;
18624
18625 char *param1_pos = strchr (param0_pos, '$');
18626
18627 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18628
18629 u32 param0_len = param1_pos - param0_pos;
18630
18631 param1_pos++;
18632
18633 char *param2_pos = strchr (param1_pos, '$');
18634
18635 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18636
18637 u32 param1_len = param2_pos - param1_pos;
18638
18639 param2_pos++;
18640
18641 char *param3_pos = strchr (param2_pos, '$');
18642
18643 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18644
18645 u32 param2_len = param3_pos - param2_pos;
18646
18647 param3_pos++;
18648
18649 char *param4_pos = strchr (param3_pos, '$');
18650
18651 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18652
18653 u32 param3_len = param4_pos - param3_pos;
18654
18655 param4_pos++;
18656
18657 char *param5_pos = strchr (param4_pos, '$');
18658
18659 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18660
18661 u32 param4_len = param5_pos - param4_pos;
18662
18663 param5_pos++;
18664
18665 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18666
18667 char *salt_buf = param1_pos;
18668 char *iv = param3_pos;
18669 char *pswcheck = param5_pos;
18670
18671 const uint salt_len = atoi (param0_pos);
18672 const uint iterations = atoi (param2_pos);
18673 const uint pswcheck_len = atoi (param4_pos);
18674
18675 /**
18676 * verify some data
18677 */
18678
18679 if (param1_len != 32) return (PARSER_SALT_VALUE);
18680 if (param3_len != 32) return (PARSER_SALT_VALUE);
18681 if (param5_len != 16) return (PARSER_SALT_VALUE);
18682
18683 if (salt_len != 16) return (PARSER_SALT_VALUE);
18684 if (iterations == 0) return (PARSER_SALT_VALUE);
18685 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18686
18687 /**
18688 * store data
18689 */
18690
18691 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18692 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18693 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18694 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18695
18696 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18697 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18698 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18699 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18700
18701 salt->salt_len = 16;
18702
18703 salt->salt_sign[0] = iterations;
18704
18705 salt->salt_iter = ((1 << iterations) + 32) - 1;
18706
18707 /**
18708 * digest buf
18709 */
18710
18711 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18712 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18713 digest[2] = 0;
18714 digest[3] = 0;
18715
18716 return (PARSER_OK);
18717 }
18718
18719 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18720 {
18721 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
18722
18723 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18724
18725 u32 *digest = (u32 *) hash_buf->digest;
18726
18727 salt_t *salt = hash_buf->salt;
18728
18729 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
18730
18731 /**
18732 * parse line
18733 */
18734
18735 /* Skip '$' */
18736 char *account_pos = input_buf + 11 + 1;
18737
18738 char *data_pos;
18739
18740 uint data_len;
18741
18742 if (account_pos[0] == '*')
18743 {
18744 account_pos++;
18745
18746 data_pos = strchr (account_pos, '*');
18747
18748 /* Skip '*' */
18749 data_pos++;
18750
18751 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18752
18753 uint account_len = data_pos - account_pos + 1;
18754
18755 if (account_len >= 512) return (PARSER_SALT_LENGTH);
18756
18757 /* Skip '$' */
18758 data_pos++;
18759
18760 data_len = input_len - 11 - 1 - account_len - 2;
18761
18762 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
18763 }
18764 else
18765 {
18766 /* assume $krb5tgs$23$checksum$edata2 */
18767 data_pos = account_pos;
18768
18769 memcpy (krb5tgs->account_info, "**", 3);
18770
18771 data_len = input_len - 11 - 1 - 1;
18772 }
18773
18774 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
18775
18776 char *checksum_ptr = (char *) krb5tgs->checksum;
18777
18778 for (uint i = 0; i < 16 * 2; i += 2)
18779 {
18780 const char p0 = data_pos[i + 0];
18781 const char p1 = data_pos[i + 1];
18782
18783 *checksum_ptr++ = hex_convert (p1) << 0
18784 | hex_convert (p0) << 4;
18785 }
18786
18787 char *edata_ptr = (char *) krb5tgs->edata2;
18788
18789 /* skip '$' */
18790 for (uint i = 16 * 2 + 1; i < input_len; i += 2)
18791 {
18792 const char p0 = data_pos[i + 0];
18793 const char p1 = data_pos[i + 1];
18794 *edata_ptr++ = hex_convert (p1) << 0
18795 | hex_convert (p0) << 4;
18796 }
18797
18798 krb5tgs->edata2_len = strlen (edata_ptr - input_len) / (2 * 4);
18799
18800 salt->salt_buf[0] = krb5tgs->checksum[0];
18801 salt->salt_buf[1] = krb5tgs->checksum[1];
18802 salt->salt_buf[2] = krb5tgs->checksum[2];
18803 salt->salt_buf[3] = krb5tgs->checksum[3];
18804
18805 salt->salt_len = 32;
18806
18807 digest[0] = krb5tgs->checksum[0];
18808 digest[1] = krb5tgs->checksum[1];
18809 digest[2] = krb5tgs->checksum[2];
18810 digest[3] = krb5tgs->checksum[3];
18811
18812 return (PARSER_OK);
18813 }
18814
18815 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18816 {
18817 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18818
18819 u32 *digest = (u32 *) hash_buf->digest;
18820
18821 salt_t *salt = hash_buf->salt;
18822
18823 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18824 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18825 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18826 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18827 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18828 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18829 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18830 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18831
18832 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18833
18834 uint salt_len = input_len - 64 - 1;
18835
18836 char *salt_buf = input_buf + 64 + 1;
18837
18838 char *salt_buf_ptr = (char *) salt->salt_buf;
18839
18840 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18841
18842 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18843
18844 salt->salt_len = salt_len;
18845
18846 /**
18847 * we can precompute the first sha256 transform
18848 */
18849
18850 uint w[16] = { 0 };
18851
18852 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18853 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18854 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18855 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18856 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18857 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18858 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18859 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18860 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18861 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18862 w[10] = byte_swap_32 (salt->salt_buf[10]);
18863 w[11] = byte_swap_32 (salt->salt_buf[11]);
18864 w[12] = byte_swap_32 (salt->salt_buf[12]);
18865 w[13] = byte_swap_32 (salt->salt_buf[13]);
18866 w[14] = byte_swap_32 (salt->salt_buf[14]);
18867 w[15] = byte_swap_32 (salt->salt_buf[15]);
18868
18869 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
18870
18871 sha256_64 (w, pc256);
18872
18873 salt->salt_buf_pc[0] = pc256[0];
18874 salt->salt_buf_pc[1] = pc256[1];
18875 salt->salt_buf_pc[2] = pc256[2];
18876 salt->salt_buf_pc[3] = pc256[3];
18877 salt->salt_buf_pc[4] = pc256[4];
18878 salt->salt_buf_pc[5] = pc256[5];
18879 salt->salt_buf_pc[6] = pc256[6];
18880 salt->salt_buf_pc[7] = pc256[7];
18881
18882 digest[0] -= pc256[0];
18883 digest[1] -= pc256[1];
18884 digest[2] -= pc256[2];
18885 digest[3] -= pc256[3];
18886 digest[4] -= pc256[4];
18887 digest[5] -= pc256[5];
18888 digest[6] -= pc256[6];
18889 digest[7] -= pc256[7];
18890
18891 return (PARSER_OK);
18892 }
18893
18894 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18895 {
18896 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18897
18898 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18899
18900 u32 *digest = (u32 *) hash_buf->digest;
18901
18902 salt_t *salt = hash_buf->salt;
18903
18904 /**
18905 * parse line
18906 */
18907
18908 char *data_len_pos = input_buf + 1 + 10 + 1;
18909
18910 char *data_buf_pos = strchr (data_len_pos, '$');
18911
18912 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18913
18914 u32 data_len_len = data_buf_pos - data_len_pos;
18915
18916 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18917 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18918
18919 data_buf_pos++;
18920
18921 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18922
18923 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18924
18925 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18926
18927 u32 data_len = atoi (data_len_pos);
18928
18929 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18930
18931 /**
18932 * salt
18933 */
18934
18935 char *salt_pos = data_buf_pos;
18936
18937 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18938 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18939 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
18940 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
18941
18942 // this is actually the CT, which is also the hash later (if matched)
18943
18944 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
18945 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
18946 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
18947 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
18948
18949 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18950
18951 salt->salt_iter = 10 - 1;
18952
18953 /**
18954 * digest buf
18955 */
18956
18957 digest[0] = salt->salt_buf[4];
18958 digest[1] = salt->salt_buf[5];
18959 digest[2] = salt->salt_buf[6];
18960 digest[3] = salt->salt_buf[7];
18961
18962 return (PARSER_OK);
18963 }
18964
18965 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18966 {
18967 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18968
18969 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18970
18971 u32 *digest = (u32 *) hash_buf->digest;
18972
18973 salt_t *salt = hash_buf->salt;
18974
18975 /**
18976 * parse line
18977 */
18978
18979 char *salt_pos = input_buf + 11 + 1;
18980
18981 char *iter_pos = strchr (salt_pos, ',');
18982
18983 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18984
18985 u32 salt_len = iter_pos - salt_pos;
18986
18987 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18988
18989 iter_pos++;
18990
18991 char *hash_pos = strchr (iter_pos, ',');
18992
18993 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18994
18995 u32 iter_len = hash_pos - iter_pos;
18996
18997 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18998
18999 hash_pos++;
19000
19001 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
19002
19003 if (hash_len != 64) return (PARSER_HASH_LENGTH);
19004
19005 /**
19006 * salt
19007 */
19008
19009 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
19010 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
19011 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
19012 salt->salt_buf[3] = 0x00018000;
19013
19014 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19015 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19016 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
19017 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
19018
19019 salt->salt_len = salt_len / 2;
19020
19021 salt->salt_iter = atoi (iter_pos) - 1;
19022
19023 /**
19024 * digest buf
19025 */
19026
19027 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19028 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19029 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19030 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19031 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19032 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19033 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19034 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19035
19036 return (PARSER_OK);
19037 }
19038
19039 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19040 {
19041 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
19042
19043 u32 *digest = (u32 *) hash_buf->digest;
19044
19045 salt_t *salt = hash_buf->salt;
19046
19047 /**
19048 * parse line
19049 */
19050
19051 char *hash_pos = input_buf + 64;
19052 char *salt1_pos = input_buf + 128;
19053 char *salt2_pos = input_buf;
19054
19055 /**
19056 * salt
19057 */
19058
19059 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
19060 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
19061 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
19062 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
19063
19064 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
19065 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
19066 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
19067 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
19068
19069 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
19070 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
19071 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
19072 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
19073
19074 salt->salt_len = 48;
19075
19076 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
19077
19078 /**
19079 * digest buf
19080 */
19081
19082 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19083 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19084 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19085 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19086 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19087 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19088 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19089 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19090
19091 return (PARSER_OK);
19092 }
19093
19094 /**
19095 * parallel running threads
19096 */
19097
19098 #ifdef WIN
19099
19100 BOOL WINAPI sigHandler_default (DWORD sig)
19101 {
19102 switch (sig)
19103 {
19104 case CTRL_CLOSE_EVENT:
19105
19106 /*
19107 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
19108 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
19109 * function otherwise it is too late (e.g. after returning from this function)
19110 */
19111
19112 myabort ();
19113
19114 SetConsoleCtrlHandler (NULL, TRUE);
19115
19116 hc_sleep (10);
19117
19118 return TRUE;
19119
19120 case CTRL_C_EVENT:
19121 case CTRL_LOGOFF_EVENT:
19122 case CTRL_SHUTDOWN_EVENT:
19123
19124 myabort ();
19125
19126 SetConsoleCtrlHandler (NULL, TRUE);
19127
19128 return TRUE;
19129 }
19130
19131 return FALSE;
19132 }
19133
19134 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19135 {
19136 switch (sig)
19137 {
19138 case CTRL_CLOSE_EVENT:
19139
19140 myabort ();
19141
19142 SetConsoleCtrlHandler (NULL, TRUE);
19143
19144 hc_sleep (10);
19145
19146 return TRUE;
19147
19148 case CTRL_C_EVENT:
19149 case CTRL_LOGOFF_EVENT:
19150 case CTRL_SHUTDOWN_EVENT:
19151
19152 myquit ();
19153
19154 SetConsoleCtrlHandler (NULL, TRUE);
19155
19156 return TRUE;
19157 }
19158
19159 return FALSE;
19160 }
19161
19162 void hc_signal (BOOL WINAPI (callback) (DWORD))
19163 {
19164 if (callback == NULL)
19165 {
19166 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19167 }
19168 else
19169 {
19170 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19171 }
19172 }
19173
19174 #else
19175
19176 void sigHandler_default (int sig)
19177 {
19178 myabort ();
19179
19180 signal (sig, NULL);
19181 }
19182
19183 void sigHandler_benchmark (int sig)
19184 {
19185 myquit ();
19186
19187 signal (sig, NULL);
19188 }
19189
19190 void hc_signal (void (callback) (int))
19191 {
19192 if (callback == NULL) callback = SIG_DFL;
19193
19194 signal (SIGINT, callback);
19195 signal (SIGTERM, callback);
19196 signal (SIGABRT, callback);
19197 }
19198
19199 #endif
19200
19201 void status_display ();
19202
19203 void *thread_keypress (void *p)
19204 {
19205 int benchmark = *((int *) p);
19206
19207 uint quiet = data.quiet;
19208
19209 tty_break();
19210
19211 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19212 {
19213 int ch = tty_getchar();
19214
19215 if (ch == -1) break;
19216
19217 if (ch == 0) continue;
19218
19219 #ifdef _POSIX
19220 if (ch != '\n')
19221 #endif
19222
19223 hc_thread_mutex_lock (mux_display);
19224
19225 log_info ("");
19226
19227 switch (ch)
19228 {
19229 case 's':
19230 case '\n':
19231
19232 log_info ("");
19233
19234 status_display ();
19235
19236 log_info ("");
19237
19238 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19239 if (quiet == 0) fflush (stdout);
19240
19241 break;
19242
19243 case 'b':
19244
19245 log_info ("");
19246
19247 bypass ();
19248
19249 log_info ("");
19250
19251 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19252 if (quiet == 0) fflush (stdout);
19253
19254 break;
19255
19256 case 'p':
19257
19258 log_info ("");
19259
19260 SuspendThreads ();
19261
19262 log_info ("");
19263
19264 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19265 if (quiet == 0) fflush (stdout);
19266
19267 break;
19268
19269 case 'r':
19270
19271 log_info ("");
19272
19273 ResumeThreads ();
19274
19275 log_info ("");
19276
19277 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19278 if (quiet == 0) fflush (stdout);
19279
19280 break;
19281
19282 case 'c':
19283
19284 log_info ("");
19285
19286 if (benchmark == 1) break;
19287
19288 stop_at_checkpoint ();
19289
19290 log_info ("");
19291
19292 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19293 if (quiet == 0) fflush (stdout);
19294
19295 break;
19296
19297 case 'q':
19298
19299 log_info ("");
19300
19301 if (benchmark == 1)
19302 {
19303 myquit ();
19304 }
19305 else
19306 {
19307 myabort ();
19308 }
19309
19310 break;
19311 }
19312
19313 hc_thread_mutex_unlock (mux_display);
19314 }
19315
19316 tty_fix();
19317
19318 return (p);
19319 }
19320
19321 /**
19322 * rules common
19323 */
19324
19325 bool class_num (const u8 c)
19326 {
19327 return ((c >= '0') && (c <= '9'));
19328 }
19329
19330 bool class_lower (const u8 c)
19331 {
19332 return ((c >= 'a') && (c <= 'z'));
19333 }
19334
19335 bool class_upper (const u8 c)
19336 {
19337 return ((c >= 'A') && (c <= 'Z'));
19338 }
19339
19340 bool class_alpha (const u8 c)
19341 {
19342 return (class_lower (c) || class_upper (c));
19343 }
19344
19345 int conv_ctoi (const u8 c)
19346 {
19347 if (class_num (c))
19348 {
19349 return c - '0';
19350 }
19351 else if (class_upper (c))
19352 {
19353 return c - 'A' + 10;
19354 }
19355
19356 return -1;
19357 }
19358
19359 int conv_itoc (const u8 c)
19360 {
19361 if (c < 10)
19362 {
19363 return c + '0';
19364 }
19365 else if (c < 37)
19366 {
19367 return c + 'A' - 10;
19368 }
19369
19370 return -1;
19371 }
19372
19373 /**
19374 * device rules
19375 */
19376
19377 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19378 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19379 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19380 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19381 #define MAX_KERNEL_RULES 255
19382 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19383 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19384 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19385
19386 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19387 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19388 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19389 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19390
19391 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19392 {
19393 uint rule_pos;
19394 uint rule_cnt;
19395
19396 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19397 {
19398 switch (rule_buf[rule_pos])
19399 {
19400 case ' ':
19401 rule_cnt--;
19402 break;
19403
19404 case RULE_OP_MANGLE_NOOP:
19405 SET_NAME (rule, rule_buf[rule_pos]);
19406 break;
19407
19408 case RULE_OP_MANGLE_LREST:
19409 SET_NAME (rule, rule_buf[rule_pos]);
19410 break;
19411
19412 case RULE_OP_MANGLE_UREST:
19413 SET_NAME (rule, rule_buf[rule_pos]);
19414 break;
19415
19416 case RULE_OP_MANGLE_LREST_UFIRST:
19417 SET_NAME (rule, rule_buf[rule_pos]);
19418 break;
19419
19420 case RULE_OP_MANGLE_UREST_LFIRST:
19421 SET_NAME (rule, rule_buf[rule_pos]);
19422 break;
19423
19424 case RULE_OP_MANGLE_TREST:
19425 SET_NAME (rule, rule_buf[rule_pos]);
19426 break;
19427
19428 case RULE_OP_MANGLE_TOGGLE_AT:
19429 SET_NAME (rule, rule_buf[rule_pos]);
19430 SET_P0_CONV (rule, rule_buf[rule_pos]);
19431 break;
19432
19433 case RULE_OP_MANGLE_REVERSE:
19434 SET_NAME (rule, rule_buf[rule_pos]);
19435 break;
19436
19437 case RULE_OP_MANGLE_DUPEWORD:
19438 SET_NAME (rule, rule_buf[rule_pos]);
19439 break;
19440
19441 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19442 SET_NAME (rule, rule_buf[rule_pos]);
19443 SET_P0_CONV (rule, rule_buf[rule_pos]);
19444 break;
19445
19446 case RULE_OP_MANGLE_REFLECT:
19447 SET_NAME (rule, rule_buf[rule_pos]);
19448 break;
19449
19450 case RULE_OP_MANGLE_ROTATE_LEFT:
19451 SET_NAME (rule, rule_buf[rule_pos]);
19452 break;
19453
19454 case RULE_OP_MANGLE_ROTATE_RIGHT:
19455 SET_NAME (rule, rule_buf[rule_pos]);
19456 break;
19457
19458 case RULE_OP_MANGLE_APPEND:
19459 SET_NAME (rule, rule_buf[rule_pos]);
19460 SET_P0 (rule, rule_buf[rule_pos]);
19461 break;
19462
19463 case RULE_OP_MANGLE_PREPEND:
19464 SET_NAME (rule, rule_buf[rule_pos]);
19465 SET_P0 (rule, rule_buf[rule_pos]);
19466 break;
19467
19468 case RULE_OP_MANGLE_DELETE_FIRST:
19469 SET_NAME (rule, rule_buf[rule_pos]);
19470 break;
19471
19472 case RULE_OP_MANGLE_DELETE_LAST:
19473 SET_NAME (rule, rule_buf[rule_pos]);
19474 break;
19475
19476 case RULE_OP_MANGLE_DELETE_AT:
19477 SET_NAME (rule, rule_buf[rule_pos]);
19478 SET_P0_CONV (rule, rule_buf[rule_pos]);
19479 break;
19480
19481 case RULE_OP_MANGLE_EXTRACT:
19482 SET_NAME (rule, rule_buf[rule_pos]);
19483 SET_P0_CONV (rule, rule_buf[rule_pos]);
19484 SET_P1_CONV (rule, rule_buf[rule_pos]);
19485 break;
19486
19487 case RULE_OP_MANGLE_OMIT:
19488 SET_NAME (rule, rule_buf[rule_pos]);
19489 SET_P0_CONV (rule, rule_buf[rule_pos]);
19490 SET_P1_CONV (rule, rule_buf[rule_pos]);
19491 break;
19492
19493 case RULE_OP_MANGLE_INSERT:
19494 SET_NAME (rule, rule_buf[rule_pos]);
19495 SET_P0_CONV (rule, rule_buf[rule_pos]);
19496 SET_P1 (rule, rule_buf[rule_pos]);
19497 break;
19498
19499 case RULE_OP_MANGLE_OVERSTRIKE:
19500 SET_NAME (rule, rule_buf[rule_pos]);
19501 SET_P0_CONV (rule, rule_buf[rule_pos]);
19502 SET_P1 (rule, rule_buf[rule_pos]);
19503 break;
19504
19505 case RULE_OP_MANGLE_TRUNCATE_AT:
19506 SET_NAME (rule, rule_buf[rule_pos]);
19507 SET_P0_CONV (rule, rule_buf[rule_pos]);
19508 break;
19509
19510 case RULE_OP_MANGLE_REPLACE:
19511 SET_NAME (rule, rule_buf[rule_pos]);
19512 SET_P0 (rule, rule_buf[rule_pos]);
19513 SET_P1 (rule, rule_buf[rule_pos]);
19514 break;
19515
19516 case RULE_OP_MANGLE_PURGECHAR:
19517 return (-1);
19518 break;
19519
19520 case RULE_OP_MANGLE_TOGGLECASE_REC:
19521 return (-1);
19522 break;
19523
19524 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19525 SET_NAME (rule, rule_buf[rule_pos]);
19526 SET_P0_CONV (rule, rule_buf[rule_pos]);
19527 break;
19528
19529 case RULE_OP_MANGLE_DUPECHAR_LAST:
19530 SET_NAME (rule, rule_buf[rule_pos]);
19531 SET_P0_CONV (rule, rule_buf[rule_pos]);
19532 break;
19533
19534 case RULE_OP_MANGLE_DUPECHAR_ALL:
19535 SET_NAME (rule, rule_buf[rule_pos]);
19536 break;
19537
19538 case RULE_OP_MANGLE_SWITCH_FIRST:
19539 SET_NAME (rule, rule_buf[rule_pos]);
19540 break;
19541
19542 case RULE_OP_MANGLE_SWITCH_LAST:
19543 SET_NAME (rule, rule_buf[rule_pos]);
19544 break;
19545
19546 case RULE_OP_MANGLE_SWITCH_AT:
19547 SET_NAME (rule, rule_buf[rule_pos]);
19548 SET_P0_CONV (rule, rule_buf[rule_pos]);
19549 SET_P1_CONV (rule, rule_buf[rule_pos]);
19550 break;
19551
19552 case RULE_OP_MANGLE_CHR_SHIFTL:
19553 SET_NAME (rule, rule_buf[rule_pos]);
19554 SET_P0_CONV (rule, rule_buf[rule_pos]);
19555 break;
19556
19557 case RULE_OP_MANGLE_CHR_SHIFTR:
19558 SET_NAME (rule, rule_buf[rule_pos]);
19559 SET_P0_CONV (rule, rule_buf[rule_pos]);
19560 break;
19561
19562 case RULE_OP_MANGLE_CHR_INCR:
19563 SET_NAME (rule, rule_buf[rule_pos]);
19564 SET_P0_CONV (rule, rule_buf[rule_pos]);
19565 break;
19566
19567 case RULE_OP_MANGLE_CHR_DECR:
19568 SET_NAME (rule, rule_buf[rule_pos]);
19569 SET_P0_CONV (rule, rule_buf[rule_pos]);
19570 break;
19571
19572 case RULE_OP_MANGLE_REPLACE_NP1:
19573 SET_NAME (rule, rule_buf[rule_pos]);
19574 SET_P0_CONV (rule, rule_buf[rule_pos]);
19575 break;
19576
19577 case RULE_OP_MANGLE_REPLACE_NM1:
19578 SET_NAME (rule, rule_buf[rule_pos]);
19579 SET_P0_CONV (rule, rule_buf[rule_pos]);
19580 break;
19581
19582 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19583 SET_NAME (rule, rule_buf[rule_pos]);
19584 SET_P0_CONV (rule, rule_buf[rule_pos]);
19585 break;
19586
19587 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19588 SET_NAME (rule, rule_buf[rule_pos]);
19589 SET_P0_CONV (rule, rule_buf[rule_pos]);
19590 break;
19591
19592 case RULE_OP_MANGLE_TITLE:
19593 SET_NAME (rule, rule_buf[rule_pos]);
19594 break;
19595
19596 default:
19597 return (-1);
19598 break;
19599 }
19600 }
19601
19602 if (rule_pos < rule_len) return (-1);
19603
19604 return (0);
19605 }
19606
19607 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19608 {
19609 uint rule_cnt;
19610 uint rule_pos;
19611 uint rule_len = BUFSIZ - 1; // maximum possible len
19612
19613 char rule_cmd;
19614
19615 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19616 {
19617 GET_NAME (rule);
19618
19619 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19620
19621 switch (rule_cmd)
19622 {
19623 case RULE_OP_MANGLE_NOOP:
19624 rule_buf[rule_pos] = rule_cmd;
19625 break;
19626
19627 case RULE_OP_MANGLE_LREST:
19628 rule_buf[rule_pos] = rule_cmd;
19629 break;
19630
19631 case RULE_OP_MANGLE_UREST:
19632 rule_buf[rule_pos] = rule_cmd;
19633 break;
19634
19635 case RULE_OP_MANGLE_LREST_UFIRST:
19636 rule_buf[rule_pos] = rule_cmd;
19637 break;
19638
19639 case RULE_OP_MANGLE_UREST_LFIRST:
19640 rule_buf[rule_pos] = rule_cmd;
19641 break;
19642
19643 case RULE_OP_MANGLE_TREST:
19644 rule_buf[rule_pos] = rule_cmd;
19645 break;
19646
19647 case RULE_OP_MANGLE_TOGGLE_AT:
19648 rule_buf[rule_pos] = rule_cmd;
19649 GET_P0_CONV (rule);
19650 break;
19651
19652 case RULE_OP_MANGLE_REVERSE:
19653 rule_buf[rule_pos] = rule_cmd;
19654 break;
19655
19656 case RULE_OP_MANGLE_DUPEWORD:
19657 rule_buf[rule_pos] = rule_cmd;
19658 break;
19659
19660 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19661 rule_buf[rule_pos] = rule_cmd;
19662 GET_P0_CONV (rule);
19663 break;
19664
19665 case RULE_OP_MANGLE_REFLECT:
19666 rule_buf[rule_pos] = rule_cmd;
19667 break;
19668
19669 case RULE_OP_MANGLE_ROTATE_LEFT:
19670 rule_buf[rule_pos] = rule_cmd;
19671 break;
19672
19673 case RULE_OP_MANGLE_ROTATE_RIGHT:
19674 rule_buf[rule_pos] = rule_cmd;
19675 break;
19676
19677 case RULE_OP_MANGLE_APPEND:
19678 rule_buf[rule_pos] = rule_cmd;
19679 GET_P0 (rule);
19680 break;
19681
19682 case RULE_OP_MANGLE_PREPEND:
19683 rule_buf[rule_pos] = rule_cmd;
19684 GET_P0 (rule);
19685 break;
19686
19687 case RULE_OP_MANGLE_DELETE_FIRST:
19688 rule_buf[rule_pos] = rule_cmd;
19689 break;
19690
19691 case RULE_OP_MANGLE_DELETE_LAST:
19692 rule_buf[rule_pos] = rule_cmd;
19693 break;
19694
19695 case RULE_OP_MANGLE_DELETE_AT:
19696 rule_buf[rule_pos] = rule_cmd;
19697 GET_P0_CONV (rule);
19698 break;
19699
19700 case RULE_OP_MANGLE_EXTRACT:
19701 rule_buf[rule_pos] = rule_cmd;
19702 GET_P0_CONV (rule);
19703 GET_P1_CONV (rule);
19704 break;
19705
19706 case RULE_OP_MANGLE_OMIT:
19707 rule_buf[rule_pos] = rule_cmd;
19708 GET_P0_CONV (rule);
19709 GET_P1_CONV (rule);
19710 break;
19711
19712 case RULE_OP_MANGLE_INSERT:
19713 rule_buf[rule_pos] = rule_cmd;
19714 GET_P0_CONV (rule);
19715 GET_P1 (rule);
19716 break;
19717
19718 case RULE_OP_MANGLE_OVERSTRIKE:
19719 rule_buf[rule_pos] = rule_cmd;
19720 GET_P0_CONV (rule);
19721 GET_P1 (rule);
19722 break;
19723
19724 case RULE_OP_MANGLE_TRUNCATE_AT:
19725 rule_buf[rule_pos] = rule_cmd;
19726 GET_P0_CONV (rule);
19727 break;
19728
19729 case RULE_OP_MANGLE_REPLACE:
19730 rule_buf[rule_pos] = rule_cmd;
19731 GET_P0 (rule);
19732 GET_P1 (rule);
19733 break;
19734
19735 case RULE_OP_MANGLE_PURGECHAR:
19736 return (-1);
19737 break;
19738
19739 case RULE_OP_MANGLE_TOGGLECASE_REC:
19740 return (-1);
19741 break;
19742
19743 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19744 rule_buf[rule_pos] = rule_cmd;
19745 GET_P0_CONV (rule);
19746 break;
19747
19748 case RULE_OP_MANGLE_DUPECHAR_LAST:
19749 rule_buf[rule_pos] = rule_cmd;
19750 GET_P0_CONV (rule);
19751 break;
19752
19753 case RULE_OP_MANGLE_DUPECHAR_ALL:
19754 rule_buf[rule_pos] = rule_cmd;
19755 break;
19756
19757 case RULE_OP_MANGLE_SWITCH_FIRST:
19758 rule_buf[rule_pos] = rule_cmd;
19759 break;
19760
19761 case RULE_OP_MANGLE_SWITCH_LAST:
19762 rule_buf[rule_pos] = rule_cmd;
19763 break;
19764
19765 case RULE_OP_MANGLE_SWITCH_AT:
19766 rule_buf[rule_pos] = rule_cmd;
19767 GET_P0_CONV (rule);
19768 GET_P1_CONV (rule);
19769 break;
19770
19771 case RULE_OP_MANGLE_CHR_SHIFTL:
19772 rule_buf[rule_pos] = rule_cmd;
19773 GET_P0_CONV (rule);
19774 break;
19775
19776 case RULE_OP_MANGLE_CHR_SHIFTR:
19777 rule_buf[rule_pos] = rule_cmd;
19778 GET_P0_CONV (rule);
19779 break;
19780
19781 case RULE_OP_MANGLE_CHR_INCR:
19782 rule_buf[rule_pos] = rule_cmd;
19783 GET_P0_CONV (rule);
19784 break;
19785
19786 case RULE_OP_MANGLE_CHR_DECR:
19787 rule_buf[rule_pos] = rule_cmd;
19788 GET_P0_CONV (rule);
19789 break;
19790
19791 case RULE_OP_MANGLE_REPLACE_NP1:
19792 rule_buf[rule_pos] = rule_cmd;
19793 GET_P0_CONV (rule);
19794 break;
19795
19796 case RULE_OP_MANGLE_REPLACE_NM1:
19797 rule_buf[rule_pos] = rule_cmd;
19798 GET_P0_CONV (rule);
19799 break;
19800
19801 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19802 rule_buf[rule_pos] = rule_cmd;
19803 GET_P0_CONV (rule);
19804 break;
19805
19806 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19807 rule_buf[rule_pos] = rule_cmd;
19808 GET_P0_CONV (rule);
19809 break;
19810
19811 case RULE_OP_MANGLE_TITLE:
19812 rule_buf[rule_pos] = rule_cmd;
19813 break;
19814
19815 case 0:
19816 return rule_pos - 1;
19817 break;
19818
19819 default:
19820 return (-1);
19821 break;
19822 }
19823 }
19824
19825 if (rule_cnt > 0)
19826 {
19827 return rule_pos;
19828 }
19829
19830 return (-1);
19831 }
19832
19833 /**
19834 * CPU rules : this is from hashcat sources, cpu based rules
19835 */
19836
19837 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19838 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19839
19840 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19841 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19842 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19843
19844 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19845 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19846 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19847
19848 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19849 {
19850 int pos;
19851
19852 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19853
19854 return (arr_len);
19855 }
19856
19857 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19858 {
19859 int pos;
19860
19861 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19862
19863 return (arr_len);
19864 }
19865
19866 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19867 {
19868 int pos;
19869
19870 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19871
19872 return (arr_len);
19873 }
19874
19875 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19876 {
19877 int l;
19878 int r;
19879
19880 for (l = 0; l < arr_len; l++)
19881 {
19882 r = arr_len - 1 - l;
19883
19884 if (l >= r) break;
19885
19886 MANGLE_SWITCH (arr, l, r);
19887 }
19888
19889 return (arr_len);
19890 }
19891
19892 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19893 {
19894 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19895
19896 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19897
19898 return (arr_len * 2);
19899 }
19900
19901 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19902 {
19903 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19904
19905 int orig_len = arr_len;
19906
19907 int i;
19908
19909 for (i = 0; i < times; i++)
19910 {
19911 memcpy (&arr[arr_len], arr, orig_len);
19912
19913 arr_len += orig_len;
19914 }
19915
19916 return (arr_len);
19917 }
19918
19919 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19920 {
19921 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19922
19923 mangle_double (arr, arr_len);
19924
19925 mangle_reverse (arr + arr_len, arr_len);
19926
19927 return (arr_len * 2);
19928 }
19929
19930 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19931 {
19932 int l;
19933 int r;
19934
19935 for (l = 0, r = arr_len - 1; r > 0; r--)
19936 {
19937 MANGLE_SWITCH (arr, l, r);
19938 }
19939
19940 return (arr_len);
19941 }
19942
19943 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19944 {
19945 int l;
19946 int r;
19947
19948 for (l = 0, r = arr_len - 1; l < r; l++)
19949 {
19950 MANGLE_SWITCH (arr, l, r);
19951 }
19952
19953 return (arr_len);
19954 }
19955
19956 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19957 {
19958 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19959
19960 arr[arr_len] = c;
19961
19962 return (arr_len + 1);
19963 }
19964
19965 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19966 {
19967 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19968
19969 int arr_pos;
19970
19971 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19972 {
19973 arr[arr_pos + 1] = arr[arr_pos];
19974 }
19975
19976 arr[0] = c;
19977
19978 return (arr_len + 1);
19979 }
19980
19981 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19982 {
19983 if (upos >= arr_len) return (arr_len);
19984
19985 int arr_pos;
19986
19987 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19988 {
19989 arr[arr_pos] = arr[arr_pos + 1];
19990 }
19991
19992 return (arr_len - 1);
19993 }
19994
19995 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19996 {
19997 if (upos >= arr_len) return (arr_len);
19998
19999 if ((upos + ulen) > arr_len) return (arr_len);
20000
20001 int arr_pos;
20002
20003 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
20004 {
20005 arr[arr_pos] = arr[upos + arr_pos];
20006 }
20007
20008 return (ulen);
20009 }
20010
20011 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20012 {
20013 if (upos >= arr_len) return (arr_len);
20014
20015 if ((upos + ulen) >= arr_len) return (arr_len);
20016
20017 int arr_pos;
20018
20019 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
20020 {
20021 arr[arr_pos] = arr[arr_pos + ulen];
20022 }
20023
20024 return (arr_len - ulen);
20025 }
20026
20027 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20028 {
20029 if (upos >= arr_len) return (arr_len);
20030
20031 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20032
20033 int arr_pos;
20034
20035 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
20036 {
20037 arr[arr_pos + 1] = arr[arr_pos];
20038 }
20039
20040 arr[upos] = c;
20041
20042 return (arr_len + 1);
20043 }
20044
20045 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)
20046 {
20047 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20048
20049 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
20050
20051 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
20052
20053 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
20054
20055 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
20056
20057 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
20058
20059 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
20060
20061 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
20062
20063 return (arr_len + arr2_cpy);
20064 }
20065
20066 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20067 {
20068 if (upos >= arr_len) return (arr_len);
20069
20070 arr[upos] = c;
20071
20072 return (arr_len);
20073 }
20074
20075 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
20076 {
20077 if (upos >= arr_len) return (arr_len);
20078
20079 memset (arr + upos, 0, arr_len - upos);
20080
20081 return (upos);
20082 }
20083
20084 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
20085 {
20086 int arr_pos;
20087
20088 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
20089 {
20090 if (arr[arr_pos] != oldc) continue;
20091
20092 arr[arr_pos] = newc;
20093 }
20094
20095 return (arr_len);
20096 }
20097
20098 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
20099 {
20100 int arr_pos;
20101
20102 int ret_len;
20103
20104 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
20105 {
20106 if (arr[arr_pos] == c) continue;
20107
20108 arr[ret_len] = arr[arr_pos];
20109
20110 ret_len++;
20111 }
20112
20113 return (ret_len);
20114 }
20115
20116 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
20117 {
20118 if (ulen > arr_len) return (arr_len);
20119
20120 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20121
20122 char cs[100] = { 0 };
20123
20124 memcpy (cs, arr, ulen);
20125
20126 int i;
20127
20128 for (i = 0; i < ulen; i++)
20129 {
20130 char c = cs[i];
20131
20132 arr_len = mangle_insert (arr, arr_len, i, c);
20133 }
20134
20135 return (arr_len);
20136 }
20137
20138 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20139 {
20140 if (ulen > arr_len) return (arr_len);
20141
20142 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20143
20144 int upos = arr_len - ulen;
20145
20146 int i;
20147
20148 for (i = 0; i < ulen; i++)
20149 {
20150 char c = arr[upos + i];
20151
20152 arr_len = mangle_append (arr, arr_len, c);
20153 }
20154
20155 return (arr_len);
20156 }
20157
20158 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20159 {
20160 if ( arr_len == 0) return (arr_len);
20161 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20162
20163 char c = arr[upos];
20164
20165 int i;
20166
20167 for (i = 0; i < ulen; i++)
20168 {
20169 arr_len = mangle_insert (arr, arr_len, upos, c);
20170 }
20171
20172 return (arr_len);
20173 }
20174
20175 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20176 {
20177 if ( arr_len == 0) return (arr_len);
20178 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20179
20180 int arr_pos;
20181
20182 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20183 {
20184 int new_pos = arr_pos * 2;
20185
20186 arr[new_pos] = arr[arr_pos];
20187
20188 arr[new_pos + 1] = arr[arr_pos];
20189 }
20190
20191 return (arr_len * 2);
20192 }
20193
20194 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20195 {
20196 if (upos >= arr_len) return (arr_len);
20197 if (upos2 >= arr_len) return (arr_len);
20198
20199 MANGLE_SWITCH (arr, upos, upos2);
20200
20201 return (arr_len);
20202 }
20203
20204 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20205 {
20206 MANGLE_SWITCH (arr, upos, upos2);
20207
20208 return (arr_len);
20209 }
20210
20211 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20212 {
20213 if (upos >= arr_len) return (arr_len);
20214
20215 arr[upos] <<= 1;
20216
20217 return (arr_len);
20218 }
20219
20220 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20221 {
20222 if (upos >= arr_len) return (arr_len);
20223
20224 arr[upos] >>= 1;
20225
20226 return (arr_len);
20227 }
20228
20229 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20230 {
20231 if (upos >= arr_len) return (arr_len);
20232
20233 arr[upos] += 1;
20234
20235 return (arr_len);
20236 }
20237
20238 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20239 {
20240 if (upos >= arr_len) return (arr_len);
20241
20242 arr[upos] -= 1;
20243
20244 return (arr_len);
20245 }
20246
20247 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20248 {
20249 int upper_next = 1;
20250
20251 int pos;
20252
20253 for (pos = 0; pos < arr_len; pos++)
20254 {
20255 if (arr[pos] == ' ')
20256 {
20257 upper_next = 1;
20258
20259 continue;
20260 }
20261
20262 if (upper_next)
20263 {
20264 upper_next = 0;
20265
20266 MANGLE_UPPER_AT (arr, pos);
20267 }
20268 else
20269 {
20270 MANGLE_LOWER_AT (arr, pos);
20271 }
20272 }
20273
20274 return (arr_len);
20275 }
20276
20277 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20278 {
20279 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20280
20281 u32 j;
20282
20283 u32 rule_pos = 0;
20284
20285 for (j = 0; j < rp_gen_num; j++)
20286 {
20287 u32 r = 0;
20288 u32 p1 = 0;
20289 u32 p2 = 0;
20290 u32 p3 = 0;
20291
20292 switch ((char) get_random_num (0, 9))
20293 {
20294 case 0:
20295 r = get_random_num (0, sizeof (grp_op_nop));
20296 rule_buf[rule_pos++] = grp_op_nop[r];
20297 break;
20298
20299 case 1:
20300 r = get_random_num (0, sizeof (grp_op_pos_p0));
20301 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20302 p1 = get_random_num (0, sizeof (grp_pos));
20303 rule_buf[rule_pos++] = grp_pos[p1];
20304 break;
20305
20306 case 2:
20307 r = get_random_num (0, sizeof (grp_op_pos_p1));
20308 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20309 p1 = get_random_num (1, 6);
20310 rule_buf[rule_pos++] = grp_pos[p1];
20311 break;
20312
20313 case 3:
20314 r = get_random_num (0, sizeof (grp_op_chr));
20315 rule_buf[rule_pos++] = grp_op_chr[r];
20316 p1 = get_random_num (0x20, 0x7e);
20317 rule_buf[rule_pos++] = (char) p1;
20318 break;
20319
20320 case 4:
20321 r = get_random_num (0, sizeof (grp_op_chr_chr));
20322 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20323 p1 = get_random_num (0x20, 0x7e);
20324 rule_buf[rule_pos++] = (char) p1;
20325 p2 = get_random_num (0x20, 0x7e);
20326 while (p1 == p2)
20327 p2 = get_random_num (0x20, 0x7e);
20328 rule_buf[rule_pos++] = (char) p2;
20329 break;
20330
20331 case 5:
20332 r = get_random_num (0, sizeof (grp_op_pos_chr));
20333 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20334 p1 = get_random_num (0, sizeof (grp_pos));
20335 rule_buf[rule_pos++] = grp_pos[p1];
20336 p2 = get_random_num (0x20, 0x7e);
20337 rule_buf[rule_pos++] = (char) p2;
20338 break;
20339
20340 case 6:
20341 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20342 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20343 p1 = get_random_num (0, sizeof (grp_pos));
20344 rule_buf[rule_pos++] = grp_pos[p1];
20345 p2 = get_random_num (0, sizeof (grp_pos));
20346 while (p1 == p2)
20347 p2 = get_random_num (0, sizeof (grp_pos));
20348 rule_buf[rule_pos++] = grp_pos[p2];
20349 break;
20350
20351 case 7:
20352 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20353 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20354 p1 = get_random_num (0, sizeof (grp_pos));
20355 rule_buf[rule_pos++] = grp_pos[p1];
20356 p2 = get_random_num (1, sizeof (grp_pos));
20357 while (p1 == p2)
20358 p2 = get_random_num (1, sizeof (grp_pos));
20359 rule_buf[rule_pos++] = grp_pos[p2];
20360 break;
20361
20362 case 8:
20363 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20364 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20365 p1 = get_random_num (0, sizeof (grp_pos));
20366 rule_buf[rule_pos++] = grp_pos[p1];
20367 p2 = get_random_num (1, sizeof (grp_pos));
20368 rule_buf[rule_pos++] = grp_pos[p1];
20369 p3 = get_random_num (0, sizeof (grp_pos));
20370 rule_buf[rule_pos++] = grp_pos[p3];
20371 break;
20372 }
20373 }
20374
20375 return (rule_pos);
20376 }
20377
20378 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20379 {
20380 char mem[BLOCK_SIZE] = { 0 };
20381
20382 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20383
20384 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20385
20386 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20387
20388 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20389
20390 int out_len = in_len;
20391 int mem_len = in_len;
20392
20393 memcpy (out, in, out_len);
20394
20395 int rule_pos;
20396
20397 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20398 {
20399 int upos, upos2;
20400 int ulen;
20401
20402 switch (rule[rule_pos])
20403 {
20404 case ' ':
20405 break;
20406
20407 case RULE_OP_MANGLE_NOOP:
20408 break;
20409
20410 case RULE_OP_MANGLE_LREST:
20411 out_len = mangle_lrest (out, out_len);
20412 break;
20413
20414 case RULE_OP_MANGLE_UREST:
20415 out_len = mangle_urest (out, out_len);
20416 break;
20417
20418 case RULE_OP_MANGLE_LREST_UFIRST:
20419 out_len = mangle_lrest (out, out_len);
20420 if (out_len) MANGLE_UPPER_AT (out, 0);
20421 break;
20422
20423 case RULE_OP_MANGLE_UREST_LFIRST:
20424 out_len = mangle_urest (out, out_len);
20425 if (out_len) MANGLE_LOWER_AT (out, 0);
20426 break;
20427
20428 case RULE_OP_MANGLE_TREST:
20429 out_len = mangle_trest (out, out_len);
20430 break;
20431
20432 case RULE_OP_MANGLE_TOGGLE_AT:
20433 NEXT_RULEPOS (rule_pos);
20434 NEXT_RPTOI (rule, rule_pos, upos);
20435 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20436 break;
20437
20438 case RULE_OP_MANGLE_REVERSE:
20439 out_len = mangle_reverse (out, out_len);
20440 break;
20441
20442 case RULE_OP_MANGLE_DUPEWORD:
20443 out_len = mangle_double (out, out_len);
20444 break;
20445
20446 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20447 NEXT_RULEPOS (rule_pos);
20448 NEXT_RPTOI (rule, rule_pos, ulen);
20449 out_len = mangle_double_times (out, out_len, ulen);
20450 break;
20451
20452 case RULE_OP_MANGLE_REFLECT:
20453 out_len = mangle_reflect (out, out_len);
20454 break;
20455
20456 case RULE_OP_MANGLE_ROTATE_LEFT:
20457 mangle_rotate_left (out, out_len);
20458 break;
20459
20460 case RULE_OP_MANGLE_ROTATE_RIGHT:
20461 mangle_rotate_right (out, out_len);
20462 break;
20463
20464 case RULE_OP_MANGLE_APPEND:
20465 NEXT_RULEPOS (rule_pos);
20466 out_len = mangle_append (out, out_len, rule[rule_pos]);
20467 break;
20468
20469 case RULE_OP_MANGLE_PREPEND:
20470 NEXT_RULEPOS (rule_pos);
20471 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20472 break;
20473
20474 case RULE_OP_MANGLE_DELETE_FIRST:
20475 out_len = mangle_delete_at (out, out_len, 0);
20476 break;
20477
20478 case RULE_OP_MANGLE_DELETE_LAST:
20479 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20480 break;
20481
20482 case RULE_OP_MANGLE_DELETE_AT:
20483 NEXT_RULEPOS (rule_pos);
20484 NEXT_RPTOI (rule, rule_pos, upos);
20485 out_len = mangle_delete_at (out, out_len, upos);
20486 break;
20487
20488 case RULE_OP_MANGLE_EXTRACT:
20489 NEXT_RULEPOS (rule_pos);
20490 NEXT_RPTOI (rule, rule_pos, upos);
20491 NEXT_RULEPOS (rule_pos);
20492 NEXT_RPTOI (rule, rule_pos, ulen);
20493 out_len = mangle_extract (out, out_len, upos, ulen);
20494 break;
20495
20496 case RULE_OP_MANGLE_OMIT:
20497 NEXT_RULEPOS (rule_pos);
20498 NEXT_RPTOI (rule, rule_pos, upos);
20499 NEXT_RULEPOS (rule_pos);
20500 NEXT_RPTOI (rule, rule_pos, ulen);
20501 out_len = mangle_omit (out, out_len, upos, ulen);
20502 break;
20503
20504 case RULE_OP_MANGLE_INSERT:
20505 NEXT_RULEPOS (rule_pos);
20506 NEXT_RPTOI (rule, rule_pos, upos);
20507 NEXT_RULEPOS (rule_pos);
20508 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20509 break;
20510
20511 case RULE_OP_MANGLE_OVERSTRIKE:
20512 NEXT_RULEPOS (rule_pos);
20513 NEXT_RPTOI (rule, rule_pos, upos);
20514 NEXT_RULEPOS (rule_pos);
20515 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20516 break;
20517
20518 case RULE_OP_MANGLE_TRUNCATE_AT:
20519 NEXT_RULEPOS (rule_pos);
20520 NEXT_RPTOI (rule, rule_pos, upos);
20521 out_len = mangle_truncate_at (out, out_len, upos);
20522 break;
20523
20524 case RULE_OP_MANGLE_REPLACE:
20525 NEXT_RULEPOS (rule_pos);
20526 NEXT_RULEPOS (rule_pos);
20527 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20528 break;
20529
20530 case RULE_OP_MANGLE_PURGECHAR:
20531 NEXT_RULEPOS (rule_pos);
20532 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20533 break;
20534
20535 case RULE_OP_MANGLE_TOGGLECASE_REC:
20536 /* todo */
20537 break;
20538
20539 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20540 NEXT_RULEPOS (rule_pos);
20541 NEXT_RPTOI (rule, rule_pos, ulen);
20542 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20543 break;
20544
20545 case RULE_OP_MANGLE_DUPECHAR_LAST:
20546 NEXT_RULEPOS (rule_pos);
20547 NEXT_RPTOI (rule, rule_pos, ulen);
20548 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20549 break;
20550
20551 case RULE_OP_MANGLE_DUPECHAR_ALL:
20552 out_len = mangle_dupechar (out, out_len);
20553 break;
20554
20555 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20556 NEXT_RULEPOS (rule_pos);
20557 NEXT_RPTOI (rule, rule_pos, ulen);
20558 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20559 break;
20560
20561 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20562 NEXT_RULEPOS (rule_pos);
20563 NEXT_RPTOI (rule, rule_pos, ulen);
20564 out_len = mangle_dupeblock_append (out, out_len, ulen);
20565 break;
20566
20567 case RULE_OP_MANGLE_SWITCH_FIRST:
20568 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20569 break;
20570
20571 case RULE_OP_MANGLE_SWITCH_LAST:
20572 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20573 break;
20574
20575 case RULE_OP_MANGLE_SWITCH_AT:
20576 NEXT_RULEPOS (rule_pos);
20577 NEXT_RPTOI (rule, rule_pos, upos);
20578 NEXT_RULEPOS (rule_pos);
20579 NEXT_RPTOI (rule, rule_pos, upos2);
20580 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20581 break;
20582
20583 case RULE_OP_MANGLE_CHR_SHIFTL:
20584 NEXT_RULEPOS (rule_pos);
20585 NEXT_RPTOI (rule, rule_pos, upos);
20586 mangle_chr_shiftl (out, out_len, upos);
20587 break;
20588
20589 case RULE_OP_MANGLE_CHR_SHIFTR:
20590 NEXT_RULEPOS (rule_pos);
20591 NEXT_RPTOI (rule, rule_pos, upos);
20592 mangle_chr_shiftr (out, out_len, upos);
20593 break;
20594
20595 case RULE_OP_MANGLE_CHR_INCR:
20596 NEXT_RULEPOS (rule_pos);
20597 NEXT_RPTOI (rule, rule_pos, upos);
20598 mangle_chr_incr (out, out_len, upos);
20599 break;
20600
20601 case RULE_OP_MANGLE_CHR_DECR:
20602 NEXT_RULEPOS (rule_pos);
20603 NEXT_RPTOI (rule, rule_pos, upos);
20604 mangle_chr_decr (out, out_len, upos);
20605 break;
20606
20607 case RULE_OP_MANGLE_REPLACE_NP1:
20608 NEXT_RULEPOS (rule_pos);
20609 NEXT_RPTOI (rule, rule_pos, upos);
20610 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20611 break;
20612
20613 case RULE_OP_MANGLE_REPLACE_NM1:
20614 NEXT_RULEPOS (rule_pos);
20615 NEXT_RPTOI (rule, rule_pos, upos);
20616 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20617 break;
20618
20619 case RULE_OP_MANGLE_TITLE:
20620 out_len = mangle_title (out, out_len);
20621 break;
20622
20623 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20624 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20625 NEXT_RULEPOS (rule_pos);
20626 NEXT_RPTOI (rule, rule_pos, upos);
20627 NEXT_RULEPOS (rule_pos);
20628 NEXT_RPTOI (rule, rule_pos, ulen);
20629 NEXT_RULEPOS (rule_pos);
20630 NEXT_RPTOI (rule, rule_pos, upos2);
20631 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20632 break;
20633
20634 case RULE_OP_MANGLE_APPEND_MEMORY:
20635 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20636 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20637 memcpy (out + out_len, mem, mem_len);
20638 out_len += mem_len;
20639 break;
20640
20641 case RULE_OP_MANGLE_PREPEND_MEMORY:
20642 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20643 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20644 memcpy (mem + mem_len, out, out_len);
20645 out_len += mem_len;
20646 memcpy (out, mem, out_len);
20647 break;
20648
20649 case RULE_OP_MEMORIZE_WORD:
20650 memcpy (mem, out, out_len);
20651 mem_len = out_len;
20652 break;
20653
20654 case RULE_OP_REJECT_LESS:
20655 NEXT_RULEPOS (rule_pos);
20656 NEXT_RPTOI (rule, rule_pos, upos);
20657 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20658 break;
20659
20660 case RULE_OP_REJECT_GREATER:
20661 NEXT_RULEPOS (rule_pos);
20662 NEXT_RPTOI (rule, rule_pos, upos);
20663 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20664 break;
20665
20666 case RULE_OP_REJECT_CONTAIN:
20667 NEXT_RULEPOS (rule_pos);
20668 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20669 break;
20670
20671 case RULE_OP_REJECT_NOT_CONTAIN:
20672 NEXT_RULEPOS (rule_pos);
20673 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20674 break;
20675
20676 case RULE_OP_REJECT_EQUAL_FIRST:
20677 NEXT_RULEPOS (rule_pos);
20678 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20679 break;
20680
20681 case RULE_OP_REJECT_EQUAL_LAST:
20682 NEXT_RULEPOS (rule_pos);
20683 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20684 break;
20685
20686 case RULE_OP_REJECT_EQUAL_AT:
20687 NEXT_RULEPOS (rule_pos);
20688 NEXT_RPTOI (rule, rule_pos, upos);
20689 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20690 NEXT_RULEPOS (rule_pos);
20691 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20692 break;
20693
20694 case RULE_OP_REJECT_CONTAINS:
20695 NEXT_RULEPOS (rule_pos);
20696 NEXT_RPTOI (rule, rule_pos, upos);
20697 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20698 NEXT_RULEPOS (rule_pos);
20699 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20700 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20701 break;
20702
20703 case RULE_OP_REJECT_MEMORY:
20704 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20705 break;
20706
20707 default:
20708 return (RULE_RC_SYNTAX_ERROR);
20709 break;
20710 }
20711 }
20712
20713 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20714
20715 return (out_len);
20716 }