Cleanup -m 9800 kernels to latest standard
[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, (uint *) &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, (uint *) &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 (HCBUFSIZ + 1);
4201
4202 char prev = '\n';
4203
4204 while (!feof (fd))
4205 {
4206 size_t nread = fread (buf, sizeof (char), HCBUFSIZ, 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 == HCBUFSIZ) 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 125: return ((char *) HT_00125); break;
5695 case 130: return ((char *) HT_00130); break;
5696 case 131: return ((char *) HT_00131); break;
5697 case 132: return ((char *) HT_00132); break;
5698 case 133: return ((char *) HT_00133); break;
5699 case 140: return ((char *) HT_00140); break;
5700 case 141: return ((char *) HT_00141); break;
5701 case 150: return ((char *) HT_00150); break;
5702 case 160: return ((char *) HT_00160); break;
5703 case 190: return ((char *) HT_00190); break;
5704 case 200: return ((char *) HT_00200); break;
5705 case 300: return ((char *) HT_00300); break;
5706 case 400: return ((char *) HT_00400); break;
5707 case 500: return ((char *) HT_00500); break;
5708 case 501: return ((char *) HT_00501); break;
5709 case 900: return ((char *) HT_00900); break;
5710 case 910: return ((char *) HT_00910); break;
5711 case 1000: return ((char *) HT_01000); break;
5712 case 1100: return ((char *) HT_01100); break;
5713 case 1400: return ((char *) HT_01400); break;
5714 case 1410: return ((char *) HT_01410); break;
5715 case 1420: return ((char *) HT_01420); break;
5716 case 1421: return ((char *) HT_01421); break;
5717 case 1430: return ((char *) HT_01430); break;
5718 case 1440: return ((char *) HT_01440); break;
5719 case 1441: return ((char *) HT_01441); break;
5720 case 1450: return ((char *) HT_01450); break;
5721 case 1460: return ((char *) HT_01460); break;
5722 case 1500: return ((char *) HT_01500); break;
5723 case 1600: return ((char *) HT_01600); break;
5724 case 1700: return ((char *) HT_01700); break;
5725 case 1710: return ((char *) HT_01710); break;
5726 case 1711: return ((char *) HT_01711); break;
5727 case 1720: return ((char *) HT_01720); break;
5728 case 1722: return ((char *) HT_01722); break;
5729 case 1730: return ((char *) HT_01730); break;
5730 case 1731: return ((char *) HT_01731); break;
5731 case 1740: return ((char *) HT_01740); break;
5732 case 1750: return ((char *) HT_01750); break;
5733 case 1760: return ((char *) HT_01760); break;
5734 case 1800: return ((char *) HT_01800); break;
5735 case 2100: return ((char *) HT_02100); break;
5736 case 2400: return ((char *) HT_02400); break;
5737 case 2410: return ((char *) HT_02410); break;
5738 case 2500: return ((char *) HT_02500); break;
5739 case 2600: return ((char *) HT_02600); break;
5740 case 2611: return ((char *) HT_02611); break;
5741 case 2612: return ((char *) HT_02612); break;
5742 case 2711: return ((char *) HT_02711); break;
5743 case 2811: return ((char *) HT_02811); break;
5744 case 3000: return ((char *) HT_03000); break;
5745 case 3100: return ((char *) HT_03100); break;
5746 case 3200: return ((char *) HT_03200); break;
5747 case 3710: return ((char *) HT_03710); break;
5748 case 3711: return ((char *) HT_03711); break;
5749 case 3800: return ((char *) HT_03800); break;
5750 case 4300: return ((char *) HT_04300); break;
5751 case 4400: return ((char *) HT_04400); break;
5752 case 4500: return ((char *) HT_04500); break;
5753 case 4700: return ((char *) HT_04700); break;
5754 case 4800: return ((char *) HT_04800); break;
5755 case 4900: return ((char *) HT_04900); break;
5756 case 5000: return ((char *) HT_05000); break;
5757 case 5100: return ((char *) HT_05100); break;
5758 case 5200: return ((char *) HT_05200); break;
5759 case 5300: return ((char *) HT_05300); break;
5760 case 5400: return ((char *) HT_05400); break;
5761 case 5500: return ((char *) HT_05500); break;
5762 case 5600: return ((char *) HT_05600); break;
5763 case 5700: return ((char *) HT_05700); break;
5764 case 5800: return ((char *) HT_05800); break;
5765 case 6000: return ((char *) HT_06000); break;
5766 case 6100: return ((char *) HT_06100); break;
5767 case 6211: return ((char *) HT_06211); break;
5768 case 6212: return ((char *) HT_06212); break;
5769 case 6213: return ((char *) HT_06213); break;
5770 case 6221: return ((char *) HT_06221); break;
5771 case 6222: return ((char *) HT_06222); break;
5772 case 6223: return ((char *) HT_06223); break;
5773 case 6231: return ((char *) HT_06231); break;
5774 case 6232: return ((char *) HT_06232); break;
5775 case 6233: return ((char *) HT_06233); break;
5776 case 6241: return ((char *) HT_06241); break;
5777 case 6242: return ((char *) HT_06242); break;
5778 case 6243: return ((char *) HT_06243); break;
5779 case 6300: return ((char *) HT_06300); break;
5780 case 6400: return ((char *) HT_06400); break;
5781 case 6500: return ((char *) HT_06500); break;
5782 case 6600: return ((char *) HT_06600); break;
5783 case 6700: return ((char *) HT_06700); break;
5784 case 6800: return ((char *) HT_06800); break;
5785 case 6900: return ((char *) HT_06900); break;
5786 case 7100: return ((char *) HT_07100); break;
5787 case 7200: return ((char *) HT_07200); break;
5788 case 7300: return ((char *) HT_07300); break;
5789 case 7400: return ((char *) HT_07400); break;
5790 case 7500: return ((char *) HT_07500); break;
5791 case 7600: return ((char *) HT_07600); break;
5792 case 7700: return ((char *) HT_07700); break;
5793 case 7800: return ((char *) HT_07800); break;
5794 case 7900: return ((char *) HT_07900); break;
5795 case 8000: return ((char *) HT_08000); break;
5796 case 8100: return ((char *) HT_08100); break;
5797 case 8200: return ((char *) HT_08200); break;
5798 case 8300: return ((char *) HT_08300); break;
5799 case 8400: return ((char *) HT_08400); break;
5800 case 8500: return ((char *) HT_08500); break;
5801 case 8600: return ((char *) HT_08600); break;
5802 case 8700: return ((char *) HT_08700); break;
5803 case 8800: return ((char *) HT_08800); break;
5804 case 8900: return ((char *) HT_08900); break;
5805 case 9000: return ((char *) HT_09000); break;
5806 case 9100: return ((char *) HT_09100); break;
5807 case 9200: return ((char *) HT_09200); break;
5808 case 9300: return ((char *) HT_09300); break;
5809 case 9400: return ((char *) HT_09400); break;
5810 case 9500: return ((char *) HT_09500); break;
5811 case 9600: return ((char *) HT_09600); break;
5812 case 9700: return ((char *) HT_09700); break;
5813 case 9710: return ((char *) HT_09710); break;
5814 case 9720: return ((char *) HT_09720); break;
5815 case 9800: return ((char *) HT_09800); break;
5816 case 9810: return ((char *) HT_09810); break;
5817 case 9820: return ((char *) HT_09820); break;
5818 case 9900: return ((char *) HT_09900); break;
5819 case 10000: return ((char *) HT_10000); break;
5820 case 10100: return ((char *) HT_10100); break;
5821 case 10200: return ((char *) HT_10200); break;
5822 case 10300: return ((char *) HT_10300); break;
5823 case 10400: return ((char *) HT_10400); break;
5824 case 10410: return ((char *) HT_10410); break;
5825 case 10420: return ((char *) HT_10420); break;
5826 case 10500: return ((char *) HT_10500); break;
5827 case 10600: return ((char *) HT_10600); break;
5828 case 10700: return ((char *) HT_10700); break;
5829 case 10800: return ((char *) HT_10800); break;
5830 case 10900: return ((char *) HT_10900); break;
5831 case 11000: return ((char *) HT_11000); break;
5832 case 11100: return ((char *) HT_11100); break;
5833 case 11200: return ((char *) HT_11200); break;
5834 case 11300: return ((char *) HT_11300); break;
5835 case 11400: return ((char *) HT_11400); break;
5836 case 11500: return ((char *) HT_11500); break;
5837 case 11600: return ((char *) HT_11600); break;
5838 case 11700: return ((char *) HT_11700); break;
5839 case 11800: return ((char *) HT_11800); break;
5840 case 11900: return ((char *) HT_11900); break;
5841 case 12000: return ((char *) HT_12000); break;
5842 case 12100: return ((char *) HT_12100); break;
5843 case 12200: return ((char *) HT_12200); break;
5844 case 12300: return ((char *) HT_12300); break;
5845 case 12400: return ((char *) HT_12400); break;
5846 case 12500: return ((char *) HT_12500); break;
5847 case 12600: return ((char *) HT_12600); break;
5848 case 12700: return ((char *) HT_12700); break;
5849 case 12800: return ((char *) HT_12800); break;
5850 case 12900: return ((char *) HT_12900); break;
5851 case 13000: return ((char *) HT_13000); break;
5852 case 13100: return ((char *) HT_13100); break;
5853 case 13200: return ((char *) HT_13200); break;
5854 case 13300: return ((char *) HT_13300); break;
5855 case 13400: return ((char *) HT_13400); break;
5856 }
5857
5858 return ((char *) "Unknown");
5859 }
5860
5861 char *strstatus (const uint devices_status)
5862 {
5863 switch (devices_status)
5864 {
5865 case STATUS_INIT: return ((char *) ST_0000); break;
5866 case STATUS_STARTING: return ((char *) ST_0001); break;
5867 case STATUS_RUNNING: return ((char *) ST_0002); break;
5868 case STATUS_PAUSED: return ((char *) ST_0003); break;
5869 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5870 case STATUS_CRACKED: return ((char *) ST_0005); break;
5871 case STATUS_ABORTED: return ((char *) ST_0006); break;
5872 case STATUS_QUIT: return ((char *) ST_0007); break;
5873 case STATUS_BYPASS: return ((char *) ST_0008); break;
5874 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5875 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
5876 }
5877
5878 return ((char *) "Unknown");
5879 }
5880
5881 void ascii_digest (char *out_buf, uint salt_pos, uint digest_pos)
5882 {
5883 uint hash_type = data.hash_type;
5884 uint hash_mode = data.hash_mode;
5885 uint salt_type = data.salt_type;
5886 uint opts_type = data.opts_type;
5887 uint opti_type = data.opti_type;
5888 uint dgst_size = data.dgst_size;
5889
5890 char *hashfile = data.hashfile;
5891
5892 uint len = 4096;
5893
5894 uint digest_buf[64] = { 0 };
5895
5896 u64 *digest_buf64 = (u64 *) digest_buf;
5897
5898 char *digests_buf_ptr = (char *) data.digests_buf;
5899
5900 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5901
5902 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5903 {
5904 uint tt;
5905
5906 switch (hash_type)
5907 {
5908 case HASH_TYPE_DESCRYPT:
5909 FP (digest_buf[1], digest_buf[0], tt);
5910 break;
5911
5912 case HASH_TYPE_DESRACF:
5913 digest_buf[0] = rotl32 (digest_buf[0], 29);
5914 digest_buf[1] = rotl32 (digest_buf[1], 29);
5915
5916 FP (digest_buf[1], digest_buf[0], tt);
5917 break;
5918
5919 case HASH_TYPE_LM:
5920 FP (digest_buf[1], digest_buf[0], tt);
5921 break;
5922
5923 case HASH_TYPE_NETNTLM:
5924 digest_buf[0] = rotl32 (digest_buf[0], 29);
5925 digest_buf[1] = rotl32 (digest_buf[1], 29);
5926 digest_buf[2] = rotl32 (digest_buf[2], 29);
5927 digest_buf[3] = rotl32 (digest_buf[3], 29);
5928
5929 FP (digest_buf[1], digest_buf[0], tt);
5930 FP (digest_buf[3], digest_buf[2], tt);
5931 break;
5932
5933 case HASH_TYPE_BSDICRYPT:
5934 digest_buf[0] = rotl32 (digest_buf[0], 31);
5935 digest_buf[1] = rotl32 (digest_buf[1], 31);
5936
5937 FP (digest_buf[1], digest_buf[0], tt);
5938 break;
5939 }
5940 }
5941
5942 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5943 {
5944 switch (hash_type)
5945 {
5946 case HASH_TYPE_MD4:
5947 digest_buf[0] += MD4M_A;
5948 digest_buf[1] += MD4M_B;
5949 digest_buf[2] += MD4M_C;
5950 digest_buf[3] += MD4M_D;
5951 break;
5952
5953 case HASH_TYPE_MD5:
5954 digest_buf[0] += MD5M_A;
5955 digest_buf[1] += MD5M_B;
5956 digest_buf[2] += MD5M_C;
5957 digest_buf[3] += MD5M_D;
5958 break;
5959
5960 case HASH_TYPE_SHA1:
5961 digest_buf[0] += SHA1M_A;
5962 digest_buf[1] += SHA1M_B;
5963 digest_buf[2] += SHA1M_C;
5964 digest_buf[3] += SHA1M_D;
5965 digest_buf[4] += SHA1M_E;
5966 break;
5967
5968 case HASH_TYPE_SHA256:
5969 digest_buf[0] += SHA256M_A;
5970 digest_buf[1] += SHA256M_B;
5971 digest_buf[2] += SHA256M_C;
5972 digest_buf[3] += SHA256M_D;
5973 digest_buf[4] += SHA256M_E;
5974 digest_buf[5] += SHA256M_F;
5975 digest_buf[6] += SHA256M_G;
5976 digest_buf[7] += SHA256M_H;
5977 break;
5978
5979 case HASH_TYPE_SHA384:
5980 digest_buf64[0] += SHA384M_A;
5981 digest_buf64[1] += SHA384M_B;
5982 digest_buf64[2] += SHA384M_C;
5983 digest_buf64[3] += SHA384M_D;
5984 digest_buf64[4] += SHA384M_E;
5985 digest_buf64[5] += SHA384M_F;
5986 digest_buf64[6] += 0;
5987 digest_buf64[7] += 0;
5988 break;
5989
5990 case HASH_TYPE_SHA512:
5991 digest_buf64[0] += SHA512M_A;
5992 digest_buf64[1] += SHA512M_B;
5993 digest_buf64[2] += SHA512M_C;
5994 digest_buf64[3] += SHA512M_D;
5995 digest_buf64[4] += SHA512M_E;
5996 digest_buf64[5] += SHA512M_F;
5997 digest_buf64[6] += SHA512M_G;
5998 digest_buf64[7] += SHA512M_H;
5999 break;
6000 }
6001 }
6002
6003 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
6004 {
6005 if (dgst_size == DGST_SIZE_4_2)
6006 {
6007 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6008 }
6009 else if (dgst_size == DGST_SIZE_4_4)
6010 {
6011 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6012 }
6013 else if (dgst_size == DGST_SIZE_4_5)
6014 {
6015 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6016 }
6017 else if (dgst_size == DGST_SIZE_4_6)
6018 {
6019 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6020 }
6021 else if (dgst_size == DGST_SIZE_4_8)
6022 {
6023 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6024 }
6025 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6026 {
6027 if (hash_type == HASH_TYPE_WHIRLPOOL)
6028 {
6029 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6030 }
6031 else if (hash_type == HASH_TYPE_SHA384)
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_SHA512)
6036 {
6037 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6038 }
6039 else if (hash_type == HASH_TYPE_GOST)
6040 {
6041 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6042 }
6043 }
6044 else if (dgst_size == DGST_SIZE_4_64)
6045 {
6046 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6047 }
6048 else if (dgst_size == DGST_SIZE_8_25)
6049 {
6050 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6051 }
6052 }
6053
6054 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6055 | (data.salt_type == SALT_TYPE_EXTERN)
6056 | (data.salt_type == SALT_TYPE_EMBEDDED));
6057
6058 salt_t salt;
6059
6060 if (isSalted)
6061 {
6062 memset (&salt, 0, sizeof (salt_t));
6063
6064 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6065
6066 char *ptr = (char *) salt.salt_buf;
6067
6068 uint len = salt.salt_len;
6069
6070 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6071 {
6072 uint tt;
6073
6074 switch (hash_type)
6075 {
6076 case HASH_TYPE_NETNTLM:
6077
6078 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6079 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6080
6081 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6082
6083 break;
6084 }
6085 }
6086
6087 if (opts_type & OPTS_TYPE_ST_UNICODE)
6088 {
6089 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6090 {
6091 ptr[i] = ptr[j];
6092 }
6093
6094 len = len / 2;
6095 }
6096
6097 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6098 {
6099 uint max = salt.salt_len / 4;
6100
6101 if (len % 4) max++;
6102
6103 for (uint i = 0; i < max; i++)
6104 {
6105 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6106 }
6107 }
6108
6109 if (opts_type & OPTS_TYPE_ST_HEX)
6110 {
6111 char tmp[64] = { 0 };
6112
6113 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6114 {
6115 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6116 }
6117
6118 len = len * 2;
6119
6120 memcpy (ptr, tmp, len);
6121 }
6122
6123 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6124
6125 memset (ptr + len, 0, memset_size);
6126
6127 salt.salt_len = len;
6128 }
6129
6130 //
6131 // some modes require special encoding
6132 //
6133
6134 uint out_buf_plain[256] = { 0 };
6135 uint out_buf_salt[256] = { 0 };
6136
6137 char tmp_buf[1024] = { 0 };
6138
6139 char *ptr_plain = (char *) out_buf_plain;
6140 char *ptr_salt = (char *) out_buf_salt;
6141
6142 if (hash_mode == 22)
6143 {
6144 char username[30] = { 0 };
6145
6146 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6147
6148 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6149
6150 u16 *ptr = (u16 *) digest_buf;
6151
6152 tmp_buf[ 0] = sig[0];
6153 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6154 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6155 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6156 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6157 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6158 tmp_buf[ 6] = sig[1];
6159 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6160 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6161 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6162 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6163 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6164 tmp_buf[12] = sig[2];
6165 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6166 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6167 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6168 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6169 tmp_buf[17] = sig[3];
6170 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6171 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6172 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6173 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6174 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6175 tmp_buf[23] = sig[4];
6176 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6177 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6178 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6179 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6180 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6181 tmp_buf[29] = sig[5];
6182
6183 snprintf (out_buf, len-1, "%s:%s",
6184 tmp_buf,
6185 username);
6186 }
6187 else if (hash_mode == 23)
6188 {
6189 // do not show the skyper part in output
6190
6191 char *salt_buf_ptr = (char *) salt.salt_buf;
6192
6193 salt_buf_ptr[salt.salt_len - 8] = 0;
6194
6195 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6196 digest_buf[0],
6197 digest_buf[1],
6198 digest_buf[2],
6199 digest_buf[3],
6200 salt_buf_ptr);
6201 }
6202 else if (hash_mode == 101)
6203 {
6204 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6205
6206 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6207 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6208 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6209 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6210 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6211
6212 memcpy (tmp_buf, digest_buf, 20);
6213
6214 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6215
6216 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6217 }
6218 else if (hash_mode == 111)
6219 {
6220 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6221
6222 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6223 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6224 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6225 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6226 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6227
6228 memcpy (tmp_buf, digest_buf, 20);
6229 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6230
6231 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6232
6233 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6234 }
6235 else if ((hash_mode == 122) || (hash_mode == 125))
6236 {
6237 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6238 (char *) salt.salt_buf,
6239 digest_buf[0],
6240 digest_buf[1],
6241 digest_buf[2],
6242 digest_buf[3],
6243 digest_buf[4]);
6244 }
6245 else if (hash_mode == 124)
6246 {
6247 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6248 (char *) salt.salt_buf,
6249 digest_buf[0],
6250 digest_buf[1],
6251 digest_buf[2],
6252 digest_buf[3],
6253 digest_buf[4]);
6254 }
6255 else if (hash_mode == 131)
6256 {
6257 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6258 (char *) salt.salt_buf,
6259 0, 0, 0, 0, 0,
6260 digest_buf[0],
6261 digest_buf[1],
6262 digest_buf[2],
6263 digest_buf[3],
6264 digest_buf[4]);
6265 }
6266 else if (hash_mode == 132)
6267 {
6268 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6269 (char *) salt.salt_buf,
6270 digest_buf[0],
6271 digest_buf[1],
6272 digest_buf[2],
6273 digest_buf[3],
6274 digest_buf[4]);
6275 }
6276 else if (hash_mode == 133)
6277 {
6278 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6279
6280 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6281 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6282 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6283 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6284 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6285
6286 memcpy (tmp_buf, digest_buf, 20);
6287
6288 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6289
6290 snprintf (out_buf, len-1, "%s", ptr_plain);
6291 }
6292 else if (hash_mode == 141)
6293 {
6294 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6295
6296 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6297
6298 memset (tmp_buf, 0, sizeof (tmp_buf));
6299
6300 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6301
6302 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6303 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6304 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6305 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6306 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6307
6308 memcpy (tmp_buf, digest_buf, 20);
6309
6310 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6311
6312 ptr_plain[27] = 0;
6313
6314 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6315 }
6316 else if (hash_mode == 400)
6317 {
6318 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6319
6320 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6321 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6322 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6323 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6324
6325 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6326
6327 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6328 }
6329 else if (hash_mode == 500)
6330 {
6331 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6332
6333 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6334 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6335 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6336 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6337
6338 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6339
6340 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6341 {
6342 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6343 }
6344 else
6345 {
6346 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6347 }
6348 }
6349 else if (hash_mode == 501)
6350 {
6351 uint digest_idx = salt.digests_offset + digest_pos;
6352
6353 hashinfo_t **hashinfo_ptr = data.hash_info;
6354 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6355
6356 snprintf (out_buf, len-1, "%s", hash_buf);
6357 }
6358 else if (hash_mode == 1421)
6359 {
6360 u8 *salt_ptr = (u8 *) salt.salt_buf;
6361
6362 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6363 salt_ptr[0],
6364 salt_ptr[1],
6365 salt_ptr[2],
6366 salt_ptr[3],
6367 salt_ptr[4],
6368 salt_ptr[5],
6369 digest_buf[0],
6370 digest_buf[1],
6371 digest_buf[2],
6372 digest_buf[3],
6373 digest_buf[4],
6374 digest_buf[5],
6375 digest_buf[6],
6376 digest_buf[7]);
6377 }
6378 else if (hash_mode == 1441)
6379 {
6380 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6381
6382 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6383
6384 memset (tmp_buf, 0, sizeof (tmp_buf));
6385
6386 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6387
6388 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6389 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6390 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6391 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6392 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6393 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6394 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6395 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6396
6397 memcpy (tmp_buf, digest_buf, 32);
6398
6399 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6400
6401 ptr_plain[43] = 0;
6402
6403 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6404 }
6405 else if (hash_mode == 1500)
6406 {
6407 out_buf[0] = salt.salt_sign[0] & 0xff;
6408 out_buf[1] = salt.salt_sign[1] & 0xff;
6409 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6410 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6411 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6412
6413 memset (tmp_buf, 0, sizeof (tmp_buf));
6414
6415 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6416
6417 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6418 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6419
6420 memcpy (tmp_buf, digest_buf, 8);
6421
6422 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6423
6424 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6425
6426 out_buf[13] = 0;
6427 }
6428 else if (hash_mode == 1600)
6429 {
6430 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6431
6432 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6433 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6434 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6435 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6436
6437 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6438
6439 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6440 {
6441 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6442 }
6443 else
6444 {
6445 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6446 }
6447 }
6448 else if (hash_mode == 1711)
6449 {
6450 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6451
6452 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6453 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6454 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6455 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6456 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6457 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6458 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6459 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6460
6461 memcpy (tmp_buf, digest_buf, 64);
6462 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6463
6464 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6465
6466 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6467 }
6468 else if (hash_mode == 1722)
6469 {
6470 uint *ptr = digest_buf;
6471
6472 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6473 (unsigned char *) salt.salt_buf,
6474 ptr[ 1], ptr[ 0],
6475 ptr[ 3], ptr[ 2],
6476 ptr[ 5], ptr[ 4],
6477 ptr[ 7], ptr[ 6],
6478 ptr[ 9], ptr[ 8],
6479 ptr[11], ptr[10],
6480 ptr[13], ptr[12],
6481 ptr[15], ptr[14]);
6482 }
6483 else if (hash_mode == 1731)
6484 {
6485 uint *ptr = digest_buf;
6486
6487 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6488 (unsigned char *) salt.salt_buf,
6489 ptr[ 1], ptr[ 0],
6490 ptr[ 3], ptr[ 2],
6491 ptr[ 5], ptr[ 4],
6492 ptr[ 7], ptr[ 6],
6493 ptr[ 9], ptr[ 8],
6494 ptr[11], ptr[10],
6495 ptr[13], ptr[12],
6496 ptr[15], ptr[14]);
6497 }
6498 else if (hash_mode == 1800)
6499 {
6500 // temp workaround
6501
6502 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6503 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6504 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6505 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6506 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6507 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6508 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6509 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6510
6511 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6512
6513 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6514 {
6515 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6516 }
6517 else
6518 {
6519 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6520 }
6521 }
6522 else if (hash_mode == 2100)
6523 {
6524 uint pos = 0;
6525
6526 snprintf (out_buf + pos, len-1, "%s%i#",
6527 SIGNATURE_DCC2,
6528 salt.salt_iter + 1);
6529
6530 uint signature_len = strlen (out_buf);
6531
6532 pos += signature_len;
6533 len -= signature_len;
6534
6535 char *salt_ptr = (char *) salt.salt_buf;
6536
6537 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6538
6539 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6540 byte_swap_32 (digest_buf[0]),
6541 byte_swap_32 (digest_buf[1]),
6542 byte_swap_32 (digest_buf[2]),
6543 byte_swap_32 (digest_buf[3]));
6544 }
6545 else if ((hash_mode == 2400) || (hash_mode == 2410))
6546 {
6547 memcpy (tmp_buf, digest_buf, 16);
6548
6549 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6550
6551 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6552 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6553 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6554 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6555
6556 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6557 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6558 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6559 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6560
6561 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6562 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6563 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6564 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6565
6566 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6567 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6568 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6569 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6570
6571 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6572 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6573 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6574 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6575
6576 out_buf[16] = 0;
6577 }
6578 else if (hash_mode == 2500)
6579 {
6580 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6581
6582 wpa_t *wpa = &wpas[salt_pos];
6583
6584 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6585 (char *) salt.salt_buf,
6586 wpa->orig_mac1[0],
6587 wpa->orig_mac1[1],
6588 wpa->orig_mac1[2],
6589 wpa->orig_mac1[3],
6590 wpa->orig_mac1[4],
6591 wpa->orig_mac1[5],
6592 wpa->orig_mac2[0],
6593 wpa->orig_mac2[1],
6594 wpa->orig_mac2[2],
6595 wpa->orig_mac2[3],
6596 wpa->orig_mac2[4],
6597 wpa->orig_mac2[5]);
6598 }
6599 else if (hash_mode == 4400)
6600 {
6601 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6602 byte_swap_32 (digest_buf[0]),
6603 byte_swap_32 (digest_buf[1]),
6604 byte_swap_32 (digest_buf[2]),
6605 byte_swap_32 (digest_buf[3]));
6606 }
6607 else if (hash_mode == 4700)
6608 {
6609 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6610 byte_swap_32 (digest_buf[0]),
6611 byte_swap_32 (digest_buf[1]),
6612 byte_swap_32 (digest_buf[2]),
6613 byte_swap_32 (digest_buf[3]),
6614 byte_swap_32 (digest_buf[4]));
6615 }
6616 else if (hash_mode == 4800)
6617 {
6618 u8 chap_id_byte = (u8) salt.salt_buf[4];
6619
6620 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6621 digest_buf[0],
6622 digest_buf[1],
6623 digest_buf[2],
6624 digest_buf[3],
6625 byte_swap_32 (salt.salt_buf[0]),
6626 byte_swap_32 (salt.salt_buf[1]),
6627 byte_swap_32 (salt.salt_buf[2]),
6628 byte_swap_32 (salt.salt_buf[3]),
6629 chap_id_byte);
6630 }
6631 else if (hash_mode == 4900)
6632 {
6633 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6634 byte_swap_32 (digest_buf[0]),
6635 byte_swap_32 (digest_buf[1]),
6636 byte_swap_32 (digest_buf[2]),
6637 byte_swap_32 (digest_buf[3]),
6638 byte_swap_32 (digest_buf[4]));
6639 }
6640 else if (hash_mode == 5100)
6641 {
6642 snprintf (out_buf, len-1, "%08x%08x",
6643 digest_buf[0],
6644 digest_buf[1]);
6645 }
6646 else if (hash_mode == 5200)
6647 {
6648 snprintf (out_buf, len-1, "%s", hashfile);
6649 }
6650 else if (hash_mode == 5300)
6651 {
6652 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6653
6654 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6655
6656 int buf_len = len -1;
6657
6658 // msg_buf
6659
6660 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6661
6662 for (uint i = 0; i < ikepsk_msg_len; i++)
6663 {
6664 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6665 {
6666 snprintf (out_buf, buf_len, ":");
6667
6668 buf_len--;
6669 out_buf++;
6670 }
6671
6672 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6673
6674 buf_len -= 8;
6675 out_buf += 8;
6676 }
6677
6678 // nr_buf
6679
6680 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6681
6682 for (uint i = 0; i < ikepsk_nr_len; i++)
6683 {
6684 if ((i == 0) || (i == 5))
6685 {
6686 snprintf (out_buf, buf_len, ":");
6687
6688 buf_len--;
6689 out_buf++;
6690 }
6691
6692 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6693
6694 buf_len -= 8;
6695 out_buf += 8;
6696 }
6697
6698 // digest_buf
6699
6700 for (uint i = 0; i < 4; i++)
6701 {
6702 if (i == 0)
6703 {
6704 snprintf (out_buf, buf_len, ":");
6705
6706 buf_len--;
6707 out_buf++;
6708 }
6709
6710 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6711
6712 buf_len -= 8;
6713 out_buf += 8;
6714 }
6715 }
6716 else if (hash_mode == 5400)
6717 {
6718 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6719
6720 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6721
6722 int buf_len = len -1;
6723
6724 // msg_buf
6725
6726 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6727
6728 for (uint i = 0; i < ikepsk_msg_len; i++)
6729 {
6730 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6731 {
6732 snprintf (out_buf, buf_len, ":");
6733
6734 buf_len--;
6735 out_buf++;
6736 }
6737
6738 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6739
6740 buf_len -= 8;
6741 out_buf += 8;
6742 }
6743
6744 // nr_buf
6745
6746 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6747
6748 for (uint i = 0; i < ikepsk_nr_len; i++)
6749 {
6750 if ((i == 0) || (i == 5))
6751 {
6752 snprintf (out_buf, buf_len, ":");
6753
6754 buf_len--;
6755 out_buf++;
6756 }
6757
6758 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6759
6760 buf_len -= 8;
6761 out_buf += 8;
6762 }
6763
6764 // digest_buf
6765
6766 for (uint i = 0; i < 5; i++)
6767 {
6768 if (i == 0)
6769 {
6770 snprintf (out_buf, buf_len, ":");
6771
6772 buf_len--;
6773 out_buf++;
6774 }
6775
6776 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6777
6778 buf_len -= 8;
6779 out_buf += 8;
6780 }
6781 }
6782 else if (hash_mode == 5500)
6783 {
6784 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6785
6786 netntlm_t *netntlm = &netntlms[salt_pos];
6787
6788 char user_buf[64] = { 0 };
6789 char domain_buf[64] = { 0 };
6790 char srvchall_buf[1024] = { 0 };
6791 char clichall_buf[1024] = { 0 };
6792
6793 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6794 {
6795 char *ptr = (char *) netntlm->userdomain_buf;
6796
6797 user_buf[i] = ptr[j];
6798 }
6799
6800 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6801 {
6802 char *ptr = (char *) netntlm->userdomain_buf;
6803
6804 domain_buf[i] = ptr[netntlm->user_len + j];
6805 }
6806
6807 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6808 {
6809 u8 *ptr = (u8 *) netntlm->chall_buf;
6810
6811 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6812 }
6813
6814 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6815 {
6816 u8 *ptr = (u8 *) netntlm->chall_buf;
6817
6818 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6819 }
6820
6821 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6822 user_buf,
6823 domain_buf,
6824 srvchall_buf,
6825 digest_buf[0],
6826 digest_buf[1],
6827 digest_buf[2],
6828 digest_buf[3],
6829 byte_swap_32 (salt.salt_buf_pc[0]),
6830 byte_swap_32 (salt.salt_buf_pc[1]),
6831 clichall_buf);
6832 }
6833 else if (hash_mode == 5600)
6834 {
6835 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6836
6837 netntlm_t *netntlm = &netntlms[salt_pos];
6838
6839 char user_buf[64] = { 0 };
6840 char domain_buf[64] = { 0 };
6841 char srvchall_buf[1024] = { 0 };
6842 char clichall_buf[1024] = { 0 };
6843
6844 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6845 {
6846 char *ptr = (char *) netntlm->userdomain_buf;
6847
6848 user_buf[i] = ptr[j];
6849 }
6850
6851 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6852 {
6853 char *ptr = (char *) netntlm->userdomain_buf;
6854
6855 domain_buf[i] = ptr[netntlm->user_len + j];
6856 }
6857
6858 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6859 {
6860 u8 *ptr = (u8 *) netntlm->chall_buf;
6861
6862 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6863 }
6864
6865 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6866 {
6867 u8 *ptr = (u8 *) netntlm->chall_buf;
6868
6869 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6870 }
6871
6872 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6873 user_buf,
6874 domain_buf,
6875 srvchall_buf,
6876 digest_buf[0],
6877 digest_buf[1],
6878 digest_buf[2],
6879 digest_buf[3],
6880 clichall_buf);
6881 }
6882 else if (hash_mode == 5700)
6883 {
6884 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6885
6886 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6887 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6888 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6889 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6890 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6891 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6892 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6893 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6894
6895 memcpy (tmp_buf, digest_buf, 32);
6896
6897 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6898
6899 ptr_plain[43] = 0;
6900
6901 snprintf (out_buf, len-1, "%s", ptr_plain);
6902 }
6903 else if (hash_mode == 5800)
6904 {
6905 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6906 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6907 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6908 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6909 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6910
6911 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6912 digest_buf[0],
6913 digest_buf[1],
6914 digest_buf[2],
6915 digest_buf[3],
6916 digest_buf[4]);
6917 }
6918 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6919 {
6920 snprintf (out_buf, len-1, "%s", hashfile);
6921 }
6922 else if (hash_mode == 6300)
6923 {
6924 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6925
6926 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6927 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6928 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6929 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6930
6931 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6932
6933 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6934 }
6935 else if (hash_mode == 6400)
6936 {
6937 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6938
6939 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6940 }
6941 else if (hash_mode == 6500)
6942 {
6943 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6944
6945 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6946 }
6947 else if (hash_mode == 6600)
6948 {
6949 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6950
6951 agilekey_t *agilekey = &agilekeys[salt_pos];
6952
6953 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6954 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6955
6956 uint buf_len = len - 1;
6957
6958 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6959 buf_len -= 22;
6960
6961 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6962 {
6963 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6964
6965 buf_len -= 2;
6966 }
6967 }
6968 else if (hash_mode == 6700)
6969 {
6970 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6971
6972 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6973 }
6974 else if (hash_mode == 6800)
6975 {
6976 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6977 }
6978 else if (hash_mode == 7100)
6979 {
6980 uint *ptr = digest_buf;
6981
6982 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6983
6984 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6985
6986 uint esalt[8] = { 0 };
6987
6988 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6989 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6990 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6991 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6992 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6993 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6994 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6995 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6996
6997 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",
6998 SIGNATURE_SHA512OSX,
6999 salt.salt_iter + 1,
7000 esalt[ 0], esalt[ 1],
7001 esalt[ 2], esalt[ 3],
7002 esalt[ 4], esalt[ 5],
7003 esalt[ 6], esalt[ 7],
7004 ptr [ 1], ptr [ 0],
7005 ptr [ 3], ptr [ 2],
7006 ptr [ 5], ptr [ 4],
7007 ptr [ 7], ptr [ 6],
7008 ptr [ 9], ptr [ 8],
7009 ptr [11], ptr [10],
7010 ptr [13], ptr [12],
7011 ptr [15], ptr [14]);
7012 }
7013 else if (hash_mode == 7200)
7014 {
7015 uint *ptr = digest_buf;
7016
7017 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7018
7019 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7020
7021 uint len_used = 0;
7022
7023 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7024
7025 len_used = strlen (out_buf);
7026
7027 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7028
7029 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7030 {
7031 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7032 }
7033
7034 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",
7035 ptr [ 1], ptr [ 0],
7036 ptr [ 3], ptr [ 2],
7037 ptr [ 5], ptr [ 4],
7038 ptr [ 7], ptr [ 6],
7039 ptr [ 9], ptr [ 8],
7040 ptr [11], ptr [10],
7041 ptr [13], ptr [12],
7042 ptr [15], ptr [14]);
7043 }
7044 else if (hash_mode == 7300)
7045 {
7046 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7047
7048 rakp_t *rakp = &rakps[salt_pos];
7049
7050 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7051 {
7052 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7053 }
7054
7055 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7056 digest_buf[0],
7057 digest_buf[1],
7058 digest_buf[2],
7059 digest_buf[3],
7060 digest_buf[4]);
7061 }
7062 else if (hash_mode == 7400)
7063 {
7064 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7065
7066 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7067 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7068 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7069 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7070 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7071 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7072 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7073 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7074
7075 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7076
7077 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7078 {
7079 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7080 }
7081 else
7082 {
7083 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7084 }
7085 }
7086 else if (hash_mode == 7500)
7087 {
7088 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7089
7090 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7091
7092 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7093 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7094
7095 char data[128] = { 0 };
7096
7097 char *ptr_data = data;
7098
7099 for (uint i = 0; i < 36; i++, ptr_data += 2)
7100 {
7101 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7102 }
7103
7104 for (uint i = 0; i < 16; i++, ptr_data += 2)
7105 {
7106 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7107 }
7108
7109 *ptr_data = 0;
7110
7111 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7112 SIGNATURE_KRB5PA,
7113 (char *) krb5pa->user,
7114 (char *) krb5pa->realm,
7115 (char *) krb5pa->salt,
7116 data);
7117 }
7118 else if (hash_mode == 7700)
7119 {
7120 snprintf (out_buf, len-1, "%s$%08X%08X",
7121 (char *) salt.salt_buf,
7122 digest_buf[0],
7123 digest_buf[1]);
7124 }
7125 else if (hash_mode == 7800)
7126 {
7127 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7128 (char *) salt.salt_buf,
7129 digest_buf[0],
7130 digest_buf[1],
7131 digest_buf[2],
7132 digest_buf[3],
7133 digest_buf[4]);
7134 }
7135 else if (hash_mode == 7900)
7136 {
7137 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7138
7139 // ugly hack start
7140
7141 char *tmp = (char *) salt.salt_buf_pc;
7142
7143 ptr_plain[42] = tmp[0];
7144
7145 // ugly hack end
7146
7147 ptr_plain[43] = 0;
7148
7149 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7150 }
7151 else if (hash_mode == 8000)
7152 {
7153 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7154 (unsigned char *) salt.salt_buf,
7155 digest_buf[0],
7156 digest_buf[1],
7157 digest_buf[2],
7158 digest_buf[3],
7159 digest_buf[4],
7160 digest_buf[5],
7161 digest_buf[6],
7162 digest_buf[7]);
7163 }
7164 else if (hash_mode == 8100)
7165 {
7166 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7167 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7168
7169 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7170 (unsigned char *) salt.salt_buf,
7171 digest_buf[0],
7172 digest_buf[1],
7173 digest_buf[2],
7174 digest_buf[3],
7175 digest_buf[4]);
7176 }
7177 else if (hash_mode == 8200)
7178 {
7179 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7180
7181 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7182
7183 char data_buf[4096] = { 0 };
7184
7185 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7186 {
7187 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7188 }
7189
7190 data_buf[cloudkey->data_len * 2] = 0;
7191
7192 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7193 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7194 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7195 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7196 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7197 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7198 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7199 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7200
7201 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7202 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7203 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7204 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7205
7206 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7207 digest_buf[0],
7208 digest_buf[1],
7209 digest_buf[2],
7210 digest_buf[3],
7211 digest_buf[4],
7212 digest_buf[5],
7213 digest_buf[6],
7214 digest_buf[7],
7215 salt.salt_buf[0],
7216 salt.salt_buf[1],
7217 salt.salt_buf[2],
7218 salt.salt_buf[3],
7219 salt.salt_iter + 1,
7220 data_buf);
7221 }
7222 else if (hash_mode == 8300)
7223 {
7224 char digest_buf_c[34] = { 0 };
7225
7226 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7227 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7228 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7229 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7230 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7231
7232 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7233
7234 digest_buf_c[32] = 0;
7235
7236 // domain
7237
7238 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7239
7240 char domain_buf_c[33] = { 0 };
7241
7242 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7243
7244 for (uint i = 0; i < salt_pc_len; i++)
7245 {
7246 const char next = domain_buf_c[i];
7247
7248 domain_buf_c[i] = '.';
7249
7250 i += next;
7251 }
7252
7253 domain_buf_c[salt_pc_len] = 0;
7254
7255 // final
7256
7257 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7258 }
7259 else if (hash_mode == 8500)
7260 {
7261 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7262 }
7263 else if (hash_mode == 2612)
7264 {
7265 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7266 SIGNATURE_PHPS,
7267 (char *) salt.salt_buf,
7268 digest_buf[0],
7269 digest_buf[1],
7270 digest_buf[2],
7271 digest_buf[3]);
7272 }
7273 else if (hash_mode == 3711)
7274 {
7275 char *salt_ptr = (char *) salt.salt_buf;
7276
7277 salt_ptr[salt.salt_len - 1] = 0;
7278
7279 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7280 SIGNATURE_MEDIAWIKI_B,
7281 salt_ptr,
7282 digest_buf[0],
7283 digest_buf[1],
7284 digest_buf[2],
7285 digest_buf[3]);
7286 }
7287 else if (hash_mode == 8800)
7288 {
7289 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7290
7291 androidfde_t *androidfde = &androidfdes[salt_pos];
7292
7293 char tmp[3073] = { 0 };
7294
7295 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7296 {
7297 sprintf (tmp + j, "%08x", androidfde->data[i]);
7298 }
7299
7300 tmp[3072] = 0;
7301
7302 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7303 SIGNATURE_ANDROIDFDE,
7304 byte_swap_32 (salt.salt_buf[0]),
7305 byte_swap_32 (salt.salt_buf[1]),
7306 byte_swap_32 (salt.salt_buf[2]),
7307 byte_swap_32 (salt.salt_buf[3]),
7308 byte_swap_32 (digest_buf[0]),
7309 byte_swap_32 (digest_buf[1]),
7310 byte_swap_32 (digest_buf[2]),
7311 byte_swap_32 (digest_buf[3]),
7312 tmp);
7313 }
7314 else if (hash_mode == 8900)
7315 {
7316 uint N = salt.scrypt_N;
7317 uint r = salt.scrypt_r;
7318 uint p = salt.scrypt_p;
7319
7320 char base64_salt[32] = { 0 };
7321
7322 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7323
7324 memset (tmp_buf, 0, 46);
7325
7326 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7327 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7328 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7329 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7330 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7331 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7332 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7333 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7334 digest_buf[8] = 0; // needed for base64_encode ()
7335
7336 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7337
7338 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7339 SIGNATURE_SCRYPT,
7340 N,
7341 r,
7342 p,
7343 base64_salt,
7344 tmp_buf);
7345 }
7346 else if (hash_mode == 9000)
7347 {
7348 snprintf (out_buf, len-1, "%s", hashfile);
7349 }
7350 else if (hash_mode == 9200)
7351 {
7352 // salt
7353
7354 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7355
7356 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7357
7358 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7359
7360 // hash
7361
7362 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7363 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7364 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7365 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7366 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7367 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7368 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7369 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7370 digest_buf[8] = 0; // needed for base64_encode ()
7371
7372 char tmp_buf[64] = { 0 };
7373
7374 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7375 tmp_buf[43] = 0; // cut it here
7376
7377 // output
7378
7379 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7380 }
7381 else if (hash_mode == 9300)
7382 {
7383 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7384 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7385 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7386 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7387 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7388 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7389 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7390 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7391 digest_buf[8] = 0; // needed for base64_encode ()
7392
7393 char tmp_buf[64] = { 0 };
7394
7395 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7396 tmp_buf[43] = 0; // cut it here
7397
7398 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7399
7400 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7401 }
7402 else if (hash_mode == 9400)
7403 {
7404 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7405
7406 office2007_t *office2007 = &office2007s[salt_pos];
7407
7408 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7409 SIGNATURE_OFFICE2007,
7410 2007,
7411 20,
7412 office2007->keySize,
7413 16,
7414 salt.salt_buf[0],
7415 salt.salt_buf[1],
7416 salt.salt_buf[2],
7417 salt.salt_buf[3],
7418 office2007->encryptedVerifier[0],
7419 office2007->encryptedVerifier[1],
7420 office2007->encryptedVerifier[2],
7421 office2007->encryptedVerifier[3],
7422 office2007->encryptedVerifierHash[0],
7423 office2007->encryptedVerifierHash[1],
7424 office2007->encryptedVerifierHash[2],
7425 office2007->encryptedVerifierHash[3],
7426 office2007->encryptedVerifierHash[4]);
7427 }
7428 else if (hash_mode == 9500)
7429 {
7430 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7431
7432 office2010_t *office2010 = &office2010s[salt_pos];
7433
7434 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,
7435
7436 salt.salt_buf[0],
7437 salt.salt_buf[1],
7438 salt.salt_buf[2],
7439 salt.salt_buf[3],
7440 office2010->encryptedVerifier[0],
7441 office2010->encryptedVerifier[1],
7442 office2010->encryptedVerifier[2],
7443 office2010->encryptedVerifier[3],
7444 office2010->encryptedVerifierHash[0],
7445 office2010->encryptedVerifierHash[1],
7446 office2010->encryptedVerifierHash[2],
7447 office2010->encryptedVerifierHash[3],
7448 office2010->encryptedVerifierHash[4],
7449 office2010->encryptedVerifierHash[5],
7450 office2010->encryptedVerifierHash[6],
7451 office2010->encryptedVerifierHash[7]);
7452 }
7453 else if (hash_mode == 9600)
7454 {
7455 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7456
7457 office2013_t *office2013 = &office2013s[salt_pos];
7458
7459 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,
7460
7461 salt.salt_buf[0],
7462 salt.salt_buf[1],
7463 salt.salt_buf[2],
7464 salt.salt_buf[3],
7465 office2013->encryptedVerifier[0],
7466 office2013->encryptedVerifier[1],
7467 office2013->encryptedVerifier[2],
7468 office2013->encryptedVerifier[3],
7469 office2013->encryptedVerifierHash[0],
7470 office2013->encryptedVerifierHash[1],
7471 office2013->encryptedVerifierHash[2],
7472 office2013->encryptedVerifierHash[3],
7473 office2013->encryptedVerifierHash[4],
7474 office2013->encryptedVerifierHash[5],
7475 office2013->encryptedVerifierHash[6],
7476 office2013->encryptedVerifierHash[7]);
7477 }
7478 else if (hash_mode == 9700)
7479 {
7480 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7481
7482 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7483
7484 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7485 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7486 byte_swap_32 (salt.salt_buf[0]),
7487 byte_swap_32 (salt.salt_buf[1]),
7488 byte_swap_32 (salt.salt_buf[2]),
7489 byte_swap_32 (salt.salt_buf[3]),
7490 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7491 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7492 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7493 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7494 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7495 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7496 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7497 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7498 }
7499 else if (hash_mode == 9710)
7500 {
7501 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7502
7503 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7504
7505 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7506 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7507 byte_swap_32 (salt.salt_buf[0]),
7508 byte_swap_32 (salt.salt_buf[1]),
7509 byte_swap_32 (salt.salt_buf[2]),
7510 byte_swap_32 (salt.salt_buf[3]),
7511 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7512 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7513 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7514 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7515 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7516 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7517 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7518 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7519 }
7520 else if (hash_mode == 9720)
7521 {
7522 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7523
7524 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7525
7526 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7527
7528 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7529 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7530 byte_swap_32 (salt.salt_buf[0]),
7531 byte_swap_32 (salt.salt_buf[1]),
7532 byte_swap_32 (salt.salt_buf[2]),
7533 byte_swap_32 (salt.salt_buf[3]),
7534 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7535 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7536 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7537 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7538 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7539 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7540 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7541 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7542 rc4key[0],
7543 rc4key[1],
7544 rc4key[2],
7545 rc4key[3],
7546 rc4key[4]);
7547 }
7548 else if (hash_mode == 9800)
7549 {
7550 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7551
7552 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7553
7554 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7555 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7556 salt.salt_buf[0],
7557 salt.salt_buf[1],
7558 salt.salt_buf[2],
7559 salt.salt_buf[3],
7560 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7561 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7562 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7563 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7564 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7565 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7566 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7567 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7568 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7569 }
7570 else if (hash_mode == 9810)
7571 {
7572 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7573
7574 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7575
7576 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7577 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7578 salt.salt_buf[0],
7579 salt.salt_buf[1],
7580 salt.salt_buf[2],
7581 salt.salt_buf[3],
7582 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7583 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7584 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7585 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7586 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7587 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7588 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7589 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7590 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7591 }
7592 else if (hash_mode == 9820)
7593 {
7594 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7595
7596 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7597
7598 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7599
7600 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7601 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7602 salt.salt_buf[0],
7603 salt.salt_buf[1],
7604 salt.salt_buf[2],
7605 salt.salt_buf[3],
7606 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7607 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7608 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7609 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7610 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7611 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7612 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7613 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7614 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7615 rc4key[0],
7616 rc4key[1],
7617 rc4key[2],
7618 rc4key[3],
7619 rc4key[4]);
7620 }
7621 else if (hash_mode == 10000)
7622 {
7623 // salt
7624
7625 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7626
7627 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7628
7629 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7630
7631 // hash
7632
7633 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7634 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7635 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7636 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7637 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7638 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7639 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7640 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7641 digest_buf[8] = 0; // needed for base64_encode ()
7642
7643 char tmp_buf[64] = { 0 };
7644
7645 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7646
7647 // output
7648
7649 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7650 }
7651 else if (hash_mode == 10100)
7652 {
7653 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7654 digest_buf[0],
7655 digest_buf[1],
7656 2,
7657 4,
7658 byte_swap_32 (salt.salt_buf[0]),
7659 byte_swap_32 (salt.salt_buf[1]),
7660 byte_swap_32 (salt.salt_buf[2]),
7661 byte_swap_32 (salt.salt_buf[3]));
7662 }
7663 else if (hash_mode == 10200)
7664 {
7665 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7666
7667 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7668
7669 // challenge
7670
7671 char challenge[100] = { 0 };
7672
7673 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7674
7675 // response
7676
7677 char tmp_buf[100] = { 0 };
7678
7679 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7680 (char *) cram_md5->user,
7681 digest_buf[0],
7682 digest_buf[1],
7683 digest_buf[2],
7684 digest_buf[3]);
7685
7686 char response[100] = { 0 };
7687
7688 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7689
7690 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7691 }
7692 else if (hash_mode == 10300)
7693 {
7694 char tmp_buf[100] = { 0 };
7695
7696 memcpy (tmp_buf + 0, digest_buf, 20);
7697 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7698
7699 uint tmp_len = 20 + salt.salt_len;
7700
7701 // base64 encode it
7702
7703 char base64_encoded[100] = { 0 };
7704
7705 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7706
7707 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7708 }
7709 else if (hash_mode == 10400)
7710 {
7711 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7712
7713 pdf_t *pdf = &pdfs[salt_pos];
7714
7715 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",
7716
7717 pdf->V,
7718 pdf->R,
7719 40,
7720 pdf->P,
7721 pdf->enc_md,
7722 pdf->id_len,
7723 byte_swap_32 (pdf->id_buf[0]),
7724 byte_swap_32 (pdf->id_buf[1]),
7725 byte_swap_32 (pdf->id_buf[2]),
7726 byte_swap_32 (pdf->id_buf[3]),
7727 pdf->u_len,
7728 byte_swap_32 (pdf->u_buf[0]),
7729 byte_swap_32 (pdf->u_buf[1]),
7730 byte_swap_32 (pdf->u_buf[2]),
7731 byte_swap_32 (pdf->u_buf[3]),
7732 byte_swap_32 (pdf->u_buf[4]),
7733 byte_swap_32 (pdf->u_buf[5]),
7734 byte_swap_32 (pdf->u_buf[6]),
7735 byte_swap_32 (pdf->u_buf[7]),
7736 pdf->o_len,
7737 byte_swap_32 (pdf->o_buf[0]),
7738 byte_swap_32 (pdf->o_buf[1]),
7739 byte_swap_32 (pdf->o_buf[2]),
7740 byte_swap_32 (pdf->o_buf[3]),
7741 byte_swap_32 (pdf->o_buf[4]),
7742 byte_swap_32 (pdf->o_buf[5]),
7743 byte_swap_32 (pdf->o_buf[6]),
7744 byte_swap_32 (pdf->o_buf[7])
7745 );
7746 }
7747 else if (hash_mode == 10410)
7748 {
7749 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7750
7751 pdf_t *pdf = &pdfs[salt_pos];
7752
7753 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",
7754
7755 pdf->V,
7756 pdf->R,
7757 40,
7758 pdf->P,
7759 pdf->enc_md,
7760 pdf->id_len,
7761 byte_swap_32 (pdf->id_buf[0]),
7762 byte_swap_32 (pdf->id_buf[1]),
7763 byte_swap_32 (pdf->id_buf[2]),
7764 byte_swap_32 (pdf->id_buf[3]),
7765 pdf->u_len,
7766 byte_swap_32 (pdf->u_buf[0]),
7767 byte_swap_32 (pdf->u_buf[1]),
7768 byte_swap_32 (pdf->u_buf[2]),
7769 byte_swap_32 (pdf->u_buf[3]),
7770 byte_swap_32 (pdf->u_buf[4]),
7771 byte_swap_32 (pdf->u_buf[5]),
7772 byte_swap_32 (pdf->u_buf[6]),
7773 byte_swap_32 (pdf->u_buf[7]),
7774 pdf->o_len,
7775 byte_swap_32 (pdf->o_buf[0]),
7776 byte_swap_32 (pdf->o_buf[1]),
7777 byte_swap_32 (pdf->o_buf[2]),
7778 byte_swap_32 (pdf->o_buf[3]),
7779 byte_swap_32 (pdf->o_buf[4]),
7780 byte_swap_32 (pdf->o_buf[5]),
7781 byte_swap_32 (pdf->o_buf[6]),
7782 byte_swap_32 (pdf->o_buf[7])
7783 );
7784 }
7785 else if (hash_mode == 10420)
7786 {
7787 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7788
7789 pdf_t *pdf = &pdfs[salt_pos];
7790
7791 u8 *rc4key = (u8 *) pdf->rc4key;
7792
7793 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",
7794
7795 pdf->V,
7796 pdf->R,
7797 40,
7798 pdf->P,
7799 pdf->enc_md,
7800 pdf->id_len,
7801 byte_swap_32 (pdf->id_buf[0]),
7802 byte_swap_32 (pdf->id_buf[1]),
7803 byte_swap_32 (pdf->id_buf[2]),
7804 byte_swap_32 (pdf->id_buf[3]),
7805 pdf->u_len,
7806 byte_swap_32 (pdf->u_buf[0]),
7807 byte_swap_32 (pdf->u_buf[1]),
7808 byte_swap_32 (pdf->u_buf[2]),
7809 byte_swap_32 (pdf->u_buf[3]),
7810 byte_swap_32 (pdf->u_buf[4]),
7811 byte_swap_32 (pdf->u_buf[5]),
7812 byte_swap_32 (pdf->u_buf[6]),
7813 byte_swap_32 (pdf->u_buf[7]),
7814 pdf->o_len,
7815 byte_swap_32 (pdf->o_buf[0]),
7816 byte_swap_32 (pdf->o_buf[1]),
7817 byte_swap_32 (pdf->o_buf[2]),
7818 byte_swap_32 (pdf->o_buf[3]),
7819 byte_swap_32 (pdf->o_buf[4]),
7820 byte_swap_32 (pdf->o_buf[5]),
7821 byte_swap_32 (pdf->o_buf[6]),
7822 byte_swap_32 (pdf->o_buf[7]),
7823 rc4key[0],
7824 rc4key[1],
7825 rc4key[2],
7826 rc4key[3],
7827 rc4key[4]
7828 );
7829 }
7830 else if (hash_mode == 10500)
7831 {
7832 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7833
7834 pdf_t *pdf = &pdfs[salt_pos];
7835
7836 if (pdf->id_len == 32)
7837 {
7838 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",
7839
7840 pdf->V,
7841 pdf->R,
7842 128,
7843 pdf->P,
7844 pdf->enc_md,
7845 pdf->id_len,
7846 byte_swap_32 (pdf->id_buf[0]),
7847 byte_swap_32 (pdf->id_buf[1]),
7848 byte_swap_32 (pdf->id_buf[2]),
7849 byte_swap_32 (pdf->id_buf[3]),
7850 byte_swap_32 (pdf->id_buf[4]),
7851 byte_swap_32 (pdf->id_buf[5]),
7852 byte_swap_32 (pdf->id_buf[6]),
7853 byte_swap_32 (pdf->id_buf[7]),
7854 pdf->u_len,
7855 byte_swap_32 (pdf->u_buf[0]),
7856 byte_swap_32 (pdf->u_buf[1]),
7857 byte_swap_32 (pdf->u_buf[2]),
7858 byte_swap_32 (pdf->u_buf[3]),
7859 byte_swap_32 (pdf->u_buf[4]),
7860 byte_swap_32 (pdf->u_buf[5]),
7861 byte_swap_32 (pdf->u_buf[6]),
7862 byte_swap_32 (pdf->u_buf[7]),
7863 pdf->o_len,
7864 byte_swap_32 (pdf->o_buf[0]),
7865 byte_swap_32 (pdf->o_buf[1]),
7866 byte_swap_32 (pdf->o_buf[2]),
7867 byte_swap_32 (pdf->o_buf[3]),
7868 byte_swap_32 (pdf->o_buf[4]),
7869 byte_swap_32 (pdf->o_buf[5]),
7870 byte_swap_32 (pdf->o_buf[6]),
7871 byte_swap_32 (pdf->o_buf[7])
7872 );
7873 }
7874 else
7875 {
7876 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",
7877
7878 pdf->V,
7879 pdf->R,
7880 128,
7881 pdf->P,
7882 pdf->enc_md,
7883 pdf->id_len,
7884 byte_swap_32 (pdf->id_buf[0]),
7885 byte_swap_32 (pdf->id_buf[1]),
7886 byte_swap_32 (pdf->id_buf[2]),
7887 byte_swap_32 (pdf->id_buf[3]),
7888 pdf->u_len,
7889 byte_swap_32 (pdf->u_buf[0]),
7890 byte_swap_32 (pdf->u_buf[1]),
7891 byte_swap_32 (pdf->u_buf[2]),
7892 byte_swap_32 (pdf->u_buf[3]),
7893 byte_swap_32 (pdf->u_buf[4]),
7894 byte_swap_32 (pdf->u_buf[5]),
7895 byte_swap_32 (pdf->u_buf[6]),
7896 byte_swap_32 (pdf->u_buf[7]),
7897 pdf->o_len,
7898 byte_swap_32 (pdf->o_buf[0]),
7899 byte_swap_32 (pdf->o_buf[1]),
7900 byte_swap_32 (pdf->o_buf[2]),
7901 byte_swap_32 (pdf->o_buf[3]),
7902 byte_swap_32 (pdf->o_buf[4]),
7903 byte_swap_32 (pdf->o_buf[5]),
7904 byte_swap_32 (pdf->o_buf[6]),
7905 byte_swap_32 (pdf->o_buf[7])
7906 );
7907 }
7908 }
7909 else if (hash_mode == 10600)
7910 {
7911 uint digest_idx = salt.digests_offset + digest_pos;
7912
7913 hashinfo_t **hashinfo_ptr = data.hash_info;
7914 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7915
7916 snprintf (out_buf, len-1, "%s", hash_buf);
7917 }
7918 else if (hash_mode == 10700)
7919 {
7920 uint digest_idx = salt.digests_offset + digest_pos;
7921
7922 hashinfo_t **hashinfo_ptr = data.hash_info;
7923 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7924
7925 snprintf (out_buf, len-1, "%s", hash_buf);
7926 }
7927 else if (hash_mode == 10900)
7928 {
7929 uint digest_idx = salt.digests_offset + digest_pos;
7930
7931 hashinfo_t **hashinfo_ptr = data.hash_info;
7932 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7933
7934 snprintf (out_buf, len-1, "%s", hash_buf);
7935 }
7936 else if (hash_mode == 11100)
7937 {
7938 u32 salt_challenge = salt.salt_buf[0];
7939
7940 salt_challenge = byte_swap_32 (salt_challenge);
7941
7942 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7943
7944 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7945 SIGNATURE_POSTGRESQL_AUTH,
7946 user_name,
7947 salt_challenge,
7948 digest_buf[0],
7949 digest_buf[1],
7950 digest_buf[2],
7951 digest_buf[3]);
7952 }
7953 else if (hash_mode == 11200)
7954 {
7955 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7956 SIGNATURE_MYSQL_AUTH,
7957 (unsigned char *) salt.salt_buf,
7958 digest_buf[0],
7959 digest_buf[1],
7960 digest_buf[2],
7961 digest_buf[3],
7962 digest_buf[4]);
7963 }
7964 else if (hash_mode == 11300)
7965 {
7966 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7967
7968 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7969
7970 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7971 const uint ckey_len = bitcoin_wallet->ckey_len;
7972 const uint public_key_len = bitcoin_wallet->public_key_len;
7973
7974 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7975 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7976 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7977
7978 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7979 {
7980 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7981
7982 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7983 }
7984
7985 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7986 {
7987 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7988
7989 sprintf (ckey_buf + j, "%02x", ptr[i]);
7990 }
7991
7992 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7993 {
7994 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
7995
7996 sprintf (public_key_buf + j, "%02x", ptr[i]);
7997 }
7998
7999 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
8000 SIGNATURE_BITCOIN_WALLET,
8001 cry_master_len * 2,
8002 cry_master_buf,
8003 salt.salt_len,
8004 (unsigned char *) salt.salt_buf,
8005 salt.salt_iter + 1,
8006 ckey_len * 2,
8007 ckey_buf,
8008 public_key_len * 2,
8009 public_key_buf
8010 );
8011
8012 free (cry_master_buf);
8013 free (ckey_buf);
8014 free (public_key_buf);
8015 }
8016 else if (hash_mode == 11400)
8017 {
8018 uint digest_idx = salt.digests_offset + digest_pos;
8019
8020 hashinfo_t **hashinfo_ptr = data.hash_info;
8021 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8022
8023 snprintf (out_buf, len-1, "%s", hash_buf);
8024 }
8025 else if (hash_mode == 11600)
8026 {
8027 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8028
8029 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8030
8031 const uint data_len = seven_zip->data_len;
8032
8033 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8034
8035 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8036 {
8037 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8038
8039 sprintf (data_buf + j, "%02x", ptr[i]);
8040 }
8041
8042 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8043 SIGNATURE_SEVEN_ZIP,
8044 0,
8045 salt.salt_sign[0],
8046 0,
8047 (char *) seven_zip->salt_buf,
8048 seven_zip->iv_len,
8049 seven_zip->iv_buf[0],
8050 seven_zip->iv_buf[1],
8051 seven_zip->iv_buf[2],
8052 seven_zip->iv_buf[3],
8053 seven_zip->crc,
8054 seven_zip->data_len,
8055 seven_zip->unpack_size,
8056 data_buf);
8057
8058 free (data_buf);
8059 }
8060 else if (hash_mode == 11700)
8061 {
8062 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8063 digest_buf[0],
8064 digest_buf[1],
8065 digest_buf[2],
8066 digest_buf[3],
8067 digest_buf[4],
8068 digest_buf[5],
8069 digest_buf[6],
8070 digest_buf[7]);
8071 }
8072 else if (hash_mode == 11800)
8073 {
8074 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8075 digest_buf[ 0],
8076 digest_buf[ 1],
8077 digest_buf[ 2],
8078 digest_buf[ 3],
8079 digest_buf[ 4],
8080 digest_buf[ 5],
8081 digest_buf[ 6],
8082 digest_buf[ 7],
8083 digest_buf[ 8],
8084 digest_buf[ 9],
8085 digest_buf[10],
8086 digest_buf[11],
8087 digest_buf[12],
8088 digest_buf[13],
8089 digest_buf[14],
8090 digest_buf[15]);
8091 }
8092 else if (hash_mode == 11900)
8093 {
8094 uint digest_idx = salt.digests_offset + digest_pos;
8095
8096 hashinfo_t **hashinfo_ptr = data.hash_info;
8097 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8098
8099 snprintf (out_buf, len-1, "%s", hash_buf);
8100 }
8101 else if (hash_mode == 12000)
8102 {
8103 uint digest_idx = salt.digests_offset + digest_pos;
8104
8105 hashinfo_t **hashinfo_ptr = data.hash_info;
8106 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8107
8108 snprintf (out_buf, len-1, "%s", hash_buf);
8109 }
8110 else if (hash_mode == 12100)
8111 {
8112 uint digest_idx = salt.digests_offset + digest_pos;
8113
8114 hashinfo_t **hashinfo_ptr = data.hash_info;
8115 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8116
8117 snprintf (out_buf, len-1, "%s", hash_buf);
8118 }
8119 else if (hash_mode == 12200)
8120 {
8121 uint *ptr_digest = digest_buf;
8122 uint *ptr_salt = salt.salt_buf;
8123
8124 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8125 SIGNATURE_ECRYPTFS,
8126 ptr_salt[0],
8127 ptr_salt[1],
8128 ptr_digest[0],
8129 ptr_digest[1]);
8130 }
8131 else if (hash_mode == 12300)
8132 {
8133 uint *ptr_digest = digest_buf;
8134 uint *ptr_salt = salt.salt_buf;
8135
8136 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",
8137 ptr_digest[ 0], ptr_digest[ 1],
8138 ptr_digest[ 2], ptr_digest[ 3],
8139 ptr_digest[ 4], ptr_digest[ 5],
8140 ptr_digest[ 6], ptr_digest[ 7],
8141 ptr_digest[ 8], ptr_digest[ 9],
8142 ptr_digest[10], ptr_digest[11],
8143 ptr_digest[12], ptr_digest[13],
8144 ptr_digest[14], ptr_digest[15],
8145 ptr_salt[0],
8146 ptr_salt[1],
8147 ptr_salt[2],
8148 ptr_salt[3]);
8149 }
8150 else if (hash_mode == 12400)
8151 {
8152 // encode iteration count
8153
8154 char salt_iter[5] = { 0 };
8155
8156 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8157 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8158 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8159 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8160 salt_iter[4] = 0;
8161
8162 // encode salt
8163
8164 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8165 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8166 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8167 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8168 ptr_salt[4] = 0;
8169
8170 // encode digest
8171
8172 memset (tmp_buf, 0, sizeof (tmp_buf));
8173
8174 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8175 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8176
8177 memcpy (tmp_buf, digest_buf, 8);
8178
8179 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8180
8181 ptr_plain[11] = 0;
8182
8183 // fill the resulting buffer
8184
8185 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8186 }
8187 else if (hash_mode == 12500)
8188 {
8189 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8190 SIGNATURE_RAR3,
8191 byte_swap_32 (salt.salt_buf[0]),
8192 byte_swap_32 (salt.salt_buf[1]),
8193 salt.salt_buf[2],
8194 salt.salt_buf[3],
8195 salt.salt_buf[4],
8196 salt.salt_buf[5]);
8197 }
8198 else if (hash_mode == 12600)
8199 {
8200 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8201 digest_buf[0] + salt.salt_buf_pc[0],
8202 digest_buf[1] + salt.salt_buf_pc[1],
8203 digest_buf[2] + salt.salt_buf_pc[2],
8204 digest_buf[3] + salt.salt_buf_pc[3],
8205 digest_buf[4] + salt.salt_buf_pc[4],
8206 digest_buf[5] + salt.salt_buf_pc[5],
8207 digest_buf[6] + salt.salt_buf_pc[6],
8208 digest_buf[7] + salt.salt_buf_pc[7]);
8209 }
8210 else if (hash_mode == 12700)
8211 {
8212 uint digest_idx = salt.digests_offset + digest_pos;
8213
8214 hashinfo_t **hashinfo_ptr = data.hash_info;
8215 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8216
8217 snprintf (out_buf, len-1, "%s", hash_buf);
8218 }
8219 else if (hash_mode == 12800)
8220 {
8221 const u8 *ptr = (const u8 *) salt.salt_buf;
8222
8223 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",
8224 SIGNATURE_MS_DRSR,
8225 ptr[0],
8226 ptr[1],
8227 ptr[2],
8228 ptr[3],
8229 ptr[4],
8230 ptr[5],
8231 ptr[6],
8232 ptr[7],
8233 ptr[8],
8234 ptr[9],
8235 salt.salt_iter + 1,
8236 byte_swap_32 (digest_buf[0]),
8237 byte_swap_32 (digest_buf[1]),
8238 byte_swap_32 (digest_buf[2]),
8239 byte_swap_32 (digest_buf[3]),
8240 byte_swap_32 (digest_buf[4]),
8241 byte_swap_32 (digest_buf[5]),
8242 byte_swap_32 (digest_buf[6]),
8243 byte_swap_32 (digest_buf[7])
8244 );
8245 }
8246 else if (hash_mode == 12900)
8247 {
8248 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",
8249 salt.salt_buf[ 4],
8250 salt.salt_buf[ 5],
8251 salt.salt_buf[ 6],
8252 salt.salt_buf[ 7],
8253 salt.salt_buf[ 8],
8254 salt.salt_buf[ 9],
8255 salt.salt_buf[10],
8256 salt.salt_buf[11],
8257 byte_swap_32 (digest_buf[0]),
8258 byte_swap_32 (digest_buf[1]),
8259 byte_swap_32 (digest_buf[2]),
8260 byte_swap_32 (digest_buf[3]),
8261 byte_swap_32 (digest_buf[4]),
8262 byte_swap_32 (digest_buf[5]),
8263 byte_swap_32 (digest_buf[6]),
8264 byte_swap_32 (digest_buf[7]),
8265 salt.salt_buf[ 0],
8266 salt.salt_buf[ 1],
8267 salt.salt_buf[ 2],
8268 salt.salt_buf[ 3]
8269 );
8270 }
8271 else if (hash_mode == 13000)
8272 {
8273 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8274
8275 rar5_t *rar5 = &rar5s[salt_pos];
8276
8277 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8278 salt.salt_buf[0],
8279 salt.salt_buf[1],
8280 salt.salt_buf[2],
8281 salt.salt_buf[3],
8282 salt.salt_sign[0],
8283 rar5->iv[0],
8284 rar5->iv[1],
8285 rar5->iv[2],
8286 rar5->iv[3],
8287 byte_swap_32 (digest_buf[0]),
8288 byte_swap_32 (digest_buf[1])
8289 );
8290 }
8291 else if (hash_mode == 13100)
8292 {
8293 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8294
8295 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8296
8297 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8298 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8299
8300 char data[2560 * 4 * 2] = { 0 };
8301
8302 char *ptr_data = data;
8303
8304 for (uint i = 0; i < 16; i++, ptr_data += 2)
8305 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8306
8307 /* skip '$' */
8308 ptr_data++;
8309
8310 for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
8311 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8312
8313 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8314 SIGNATURE_KRB5TGS,
8315 (char *) krb5tgs->account_info,
8316 data,
8317 data + 33);
8318 }
8319 else if (hash_mode == 13200)
8320 {
8321 snprintf (out_buf, len-1, "%s*%d*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x",
8322 SIGNATURE_AXCRYPT,
8323 salt.salt_iter,
8324 salt.salt_buf[0],
8325 salt.salt_buf[1],
8326 salt.salt_buf[2],
8327 salt.salt_buf[3],
8328 salt.salt_buf[4],
8329 salt.salt_buf[5],
8330 salt.salt_buf[6],
8331 salt.salt_buf[7],
8332 salt.salt_buf[8],
8333 salt.salt_buf[9]);
8334 }
8335 else if (hash_mode == 13300)
8336 {
8337 snprintf (out_buf, len-1, "%s$%08x%08x%08x%08x",
8338 SIGNATURE_AXCRYPT_SHA1,
8339 digest_buf[0],
8340 digest_buf[1],
8341 digest_buf[2],
8342 digest_buf[3]);
8343 }
8344 else if (hash_mode == 13400)
8345 {
8346 keepass_t *keepasss = (keepass_t *) data.esalts_buf;
8347
8348 keepass_t *keepass = &keepasss[salt_pos];
8349
8350 u32 version = (u32) keepass->version;
8351 u32 rounds = salt.salt_iter;
8352 u32 algorithm = (u32) keepass->algorithm;
8353 u32 keyfile_len = (u32) keepass->keyfile_len;
8354
8355 u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed ;
8356 u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed ;
8357 u32 *ptr_enc_iv = (u32 *) keepass->enc_iv ;
8358 u32 *ptr_contents_hash = (u32 *) keepass->contents_hash ;
8359 u32 *ptr_keyfile = (u32 *) keepass->keyfile ;
8360
8361 /* specific to version 1 */
8362 u32 contents_len;
8363 u32 *ptr_contents;
8364
8365 /* specific to version 2 */
8366 u32 expected_bytes_len;
8367 u32 *ptr_expected_bytes;
8368
8369 u32 final_random_seed_len;
8370 u32 transf_random_seed_len;
8371 u32 enc_iv_len;
8372 u32 contents_hash_len;
8373
8374 transf_random_seed_len = 8;
8375 enc_iv_len = 4;
8376 contents_hash_len = 8;
8377 final_random_seed_len = 8;
8378
8379 if (version == 1)
8380 final_random_seed_len = 4;
8381
8382 snprintf (out_buf, len-1, "%s*%d*%d*%d",
8383 SIGNATURE_KEEPASS,
8384 version,
8385 rounds,
8386 algorithm);
8387
8388 char *ptr_data = out_buf;
8389
8390 ptr_data += strlen(out_buf);
8391
8392 *ptr_data = '*';
8393 ptr_data++;
8394
8395 for (uint i = 0; i < final_random_seed_len; i++, ptr_data += 8)
8396 sprintf (ptr_data, "%08x", ptr_final_random_seed[i]);
8397
8398 *ptr_data = '*';
8399 ptr_data++;
8400
8401 for (uint i = 0; i < transf_random_seed_len; i++, ptr_data += 8)
8402 sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]);
8403
8404 *ptr_data = '*';
8405 ptr_data++;
8406
8407 for (uint i = 0; i < enc_iv_len; i++, ptr_data += 8)
8408 sprintf (ptr_data, "%08x", ptr_enc_iv[i]);
8409
8410 *ptr_data = '*';
8411 ptr_data++;
8412
8413 if (version == 1)
8414 {
8415 contents_len = (u32) keepass->contents_len;
8416 ptr_contents = (u32 *) keepass->contents;
8417
8418 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8419 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8420
8421 *ptr_data = '*';
8422 ptr_data++;
8423
8424 /* inline flag */
8425 *ptr_data = '1';
8426 ptr_data++;
8427
8428 *ptr_data = '*';
8429 ptr_data++;
8430
8431 char ptr_contents_len[10] = { 0 };
8432
8433 sprintf ((char*) ptr_contents_len, "%d", contents_len);
8434
8435 sprintf (ptr_data, "%d", contents_len);
8436
8437 ptr_data += strlen(ptr_contents_len);
8438
8439 *ptr_data = '*';
8440 ptr_data++;
8441
8442 for (uint i = 0; i < contents_len / 4; i++, ptr_data += 8)
8443 sprintf (ptr_data, "%08x", ptr_contents[i]);
8444 }
8445 else if (version == 2)
8446 {
8447 expected_bytes_len = 8;
8448 ptr_expected_bytes = (u32 *) keepass->expected_bytes ;
8449
8450 for (uint i = 0; i < expected_bytes_len; i++, ptr_data += 8)
8451 sprintf (ptr_data, "%08x", ptr_expected_bytes[i]);
8452
8453 *ptr_data = '*';
8454 ptr_data++;
8455
8456 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8457 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8458 }
8459 if (keyfile_len)
8460 {
8461 *ptr_data = '*';
8462 ptr_data++;
8463
8464 /* inline flag */
8465 *ptr_data = '1';
8466 ptr_data++;
8467
8468 *ptr_data = '*';
8469 ptr_data++;
8470
8471 sprintf (ptr_data, "%d", keyfile_len);
8472
8473 ptr_data += 2;
8474
8475 *ptr_data = '*';
8476 ptr_data++;
8477
8478 for (uint i = 0; i < 8; i++, ptr_data += 8)
8479 sprintf (ptr_data, "%08x", ptr_keyfile[i]);
8480 }
8481 }
8482 else
8483 {
8484 if (hash_type == HASH_TYPE_MD4)
8485 {
8486 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8487 digest_buf[0],
8488 digest_buf[1],
8489 digest_buf[2],
8490 digest_buf[3]);
8491 }
8492 else if (hash_type == HASH_TYPE_MD5)
8493 {
8494 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8495 digest_buf[0],
8496 digest_buf[1],
8497 digest_buf[2],
8498 digest_buf[3]);
8499 }
8500 else if (hash_type == HASH_TYPE_SHA1)
8501 {
8502 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8503 digest_buf[0],
8504 digest_buf[1],
8505 digest_buf[2],
8506 digest_buf[3],
8507 digest_buf[4]);
8508 }
8509 else if (hash_type == HASH_TYPE_SHA256)
8510 {
8511 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8512 digest_buf[0],
8513 digest_buf[1],
8514 digest_buf[2],
8515 digest_buf[3],
8516 digest_buf[4],
8517 digest_buf[5],
8518 digest_buf[6],
8519 digest_buf[7]);
8520 }
8521 else if (hash_type == HASH_TYPE_SHA384)
8522 {
8523 uint *ptr = digest_buf;
8524
8525 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8526 ptr[ 1], ptr[ 0],
8527 ptr[ 3], ptr[ 2],
8528 ptr[ 5], ptr[ 4],
8529 ptr[ 7], ptr[ 6],
8530 ptr[ 9], ptr[ 8],
8531 ptr[11], ptr[10]);
8532 }
8533 else if (hash_type == HASH_TYPE_SHA512)
8534 {
8535 uint *ptr = digest_buf;
8536
8537 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8538 ptr[ 1], ptr[ 0],
8539 ptr[ 3], ptr[ 2],
8540 ptr[ 5], ptr[ 4],
8541 ptr[ 7], ptr[ 6],
8542 ptr[ 9], ptr[ 8],
8543 ptr[11], ptr[10],
8544 ptr[13], ptr[12],
8545 ptr[15], ptr[14]);
8546 }
8547 else if (hash_type == HASH_TYPE_LM)
8548 {
8549 snprintf (out_buf, len-1, "%08x%08x",
8550 digest_buf[0],
8551 digest_buf[1]);
8552 }
8553 else if (hash_type == HASH_TYPE_ORACLEH)
8554 {
8555 snprintf (out_buf, len-1, "%08X%08X",
8556 digest_buf[0],
8557 digest_buf[1]);
8558 }
8559 else if (hash_type == HASH_TYPE_BCRYPT)
8560 {
8561 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8562 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8563
8564 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8565
8566 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8567 }
8568 else if (hash_type == HASH_TYPE_KECCAK)
8569 {
8570 uint *ptr = digest_buf;
8571
8572 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",
8573 ptr[ 1], ptr[ 0],
8574 ptr[ 3], ptr[ 2],
8575 ptr[ 5], ptr[ 4],
8576 ptr[ 7], ptr[ 6],
8577 ptr[ 9], ptr[ 8],
8578 ptr[11], ptr[10],
8579 ptr[13], ptr[12],
8580 ptr[15], ptr[14],
8581 ptr[17], ptr[16],
8582 ptr[19], ptr[18],
8583 ptr[21], ptr[20],
8584 ptr[23], ptr[22],
8585 ptr[25], ptr[24],
8586 ptr[27], ptr[26],
8587 ptr[29], ptr[28],
8588 ptr[31], ptr[30],
8589 ptr[33], ptr[32],
8590 ptr[35], ptr[34],
8591 ptr[37], ptr[36],
8592 ptr[39], ptr[38],
8593 ptr[41], ptr[30],
8594 ptr[43], ptr[42],
8595 ptr[45], ptr[44],
8596 ptr[47], ptr[46],
8597 ptr[49], ptr[48]
8598 );
8599
8600 out_buf[salt.keccak_mdlen * 2] = 0;
8601 }
8602 else if (hash_type == HASH_TYPE_RIPEMD160)
8603 {
8604 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8605 digest_buf[0],
8606 digest_buf[1],
8607 digest_buf[2],
8608 digest_buf[3],
8609 digest_buf[4]);
8610 }
8611 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8612 {
8613 digest_buf[ 0] = digest_buf[ 0];
8614 digest_buf[ 1] = digest_buf[ 1];
8615 digest_buf[ 2] = digest_buf[ 2];
8616 digest_buf[ 3] = digest_buf[ 3];
8617 digest_buf[ 4] = digest_buf[ 4];
8618 digest_buf[ 5] = digest_buf[ 5];
8619 digest_buf[ 6] = digest_buf[ 6];
8620 digest_buf[ 7] = digest_buf[ 7];
8621 digest_buf[ 8] = digest_buf[ 8];
8622 digest_buf[ 9] = digest_buf[ 9];
8623 digest_buf[10] = digest_buf[10];
8624 digest_buf[11] = digest_buf[11];
8625 digest_buf[12] = digest_buf[12];
8626 digest_buf[13] = digest_buf[13];
8627 digest_buf[14] = digest_buf[14];
8628 digest_buf[15] = digest_buf[15];
8629
8630 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8631 digest_buf[ 0],
8632 digest_buf[ 1],
8633 digest_buf[ 2],
8634 digest_buf[ 3],
8635 digest_buf[ 4],
8636 digest_buf[ 5],
8637 digest_buf[ 6],
8638 digest_buf[ 7],
8639 digest_buf[ 8],
8640 digest_buf[ 9],
8641 digest_buf[10],
8642 digest_buf[11],
8643 digest_buf[12],
8644 digest_buf[13],
8645 digest_buf[14],
8646 digest_buf[15]);
8647 }
8648 else if (hash_type == HASH_TYPE_GOST)
8649 {
8650 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8651 digest_buf[0],
8652 digest_buf[1],
8653 digest_buf[2],
8654 digest_buf[3],
8655 digest_buf[4],
8656 digest_buf[5],
8657 digest_buf[6],
8658 digest_buf[7]);
8659 }
8660 else if (hash_type == HASH_TYPE_MYSQL)
8661 {
8662 snprintf (out_buf, len-1, "%08x%08x",
8663 digest_buf[0],
8664 digest_buf[1]);
8665 }
8666 else if (hash_type == HASH_TYPE_LOTUS5)
8667 {
8668 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8669 digest_buf[0],
8670 digest_buf[1],
8671 digest_buf[2],
8672 digest_buf[3]);
8673 }
8674 else if (hash_type == HASH_TYPE_LOTUS6)
8675 {
8676 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8677 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8678 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8679 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8680
8681 char buf[16] = { 0 };
8682
8683 memcpy (buf + 0, salt.salt_buf, 5);
8684 memcpy (buf + 5, digest_buf, 9);
8685
8686 buf[3] -= -4;
8687
8688 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8689
8690 tmp_buf[18] = salt.salt_buf_pc[7];
8691 tmp_buf[19] = 0;
8692
8693 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8694 }
8695 else if (hash_type == HASH_TYPE_LOTUS8)
8696 {
8697 char buf[52] = { 0 };
8698
8699 // salt
8700
8701 memcpy (buf + 0, salt.salt_buf, 16);
8702
8703 buf[3] -= -4;
8704
8705 // iteration
8706
8707 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8708
8709 // chars
8710
8711 buf[26] = salt.salt_buf_pc[0];
8712 buf[27] = salt.salt_buf_pc[1];
8713
8714 // digest
8715
8716 memcpy (buf + 28, digest_buf, 8);
8717
8718 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8719
8720 tmp_buf[49] = 0;
8721
8722 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8723 }
8724 else if (hash_type == HASH_TYPE_CRC32)
8725 {
8726 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8727 }
8728 }
8729
8730 if (salt_type == SALT_TYPE_INTERN)
8731 {
8732 size_t pos = strlen (out_buf);
8733
8734 out_buf[pos] = data.separator;
8735
8736 char *ptr = (char *) salt.salt_buf;
8737
8738 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8739
8740 out_buf[pos + 1 + salt.salt_len] = 0;
8741 }
8742 }
8743
8744 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8745 {
8746 memset (hccap, 0, sizeof (hccap_t));
8747
8748 salt_t *salt = &data.salts_buf[salt_pos];
8749
8750 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8751
8752 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8753 wpa_t *wpa = &wpas[salt_pos];
8754
8755 hccap->keyver = wpa->keyver;
8756
8757 hccap->eapol_size = wpa->eapol_size;
8758
8759 if (wpa->keyver != 1)
8760 {
8761 uint eapol_tmp[64] = { 0 };
8762
8763 for (uint i = 0; i < 64; i++)
8764 {
8765 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8766 }
8767
8768 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8769 }
8770 else
8771 {
8772 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8773 }
8774
8775 memcpy (hccap->mac1, wpa->orig_mac1, 6);
8776 memcpy (hccap->mac2, wpa->orig_mac2, 6);
8777 memcpy (hccap->nonce1, wpa->orig_nonce1, 32);
8778 memcpy (hccap->nonce2, wpa->orig_nonce2, 32);
8779
8780 char *digests_buf_ptr = (char *) data.digests_buf;
8781
8782 uint dgst_size = data.dgst_size;
8783
8784 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8785
8786 if (wpa->keyver != 1)
8787 {
8788 uint digest_tmp[4] = { 0 };
8789
8790 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8791 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8792 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8793 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8794
8795 memcpy (hccap->keymic, digest_tmp, 16);
8796 }
8797 else
8798 {
8799 memcpy (hccap->keymic, digest_ptr, 16);
8800 }
8801 }
8802
8803 void SuspendThreads ()
8804 {
8805 if (data.devices_status == STATUS_RUNNING)
8806 {
8807 hc_timer_set (&data.timer_paused);
8808
8809 data.devices_status = STATUS_PAUSED;
8810
8811 log_info ("Paused");
8812 }
8813 }
8814
8815 void ResumeThreads ()
8816 {
8817 if (data.devices_status == STATUS_PAUSED)
8818 {
8819 float ms_paused;
8820
8821 hc_timer_get (data.timer_paused, ms_paused);
8822
8823 data.ms_paused += ms_paused;
8824
8825 data.devices_status = STATUS_RUNNING;
8826
8827 log_info ("Resumed");
8828 }
8829 }
8830
8831 void bypass ()
8832 {
8833 if (data.devices_status != STATUS_RUNNING) return;
8834
8835 data.devices_status = STATUS_BYPASS;
8836
8837 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8838 }
8839
8840 void stop_at_checkpoint ()
8841 {
8842 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8843 {
8844 if (data.devices_status != STATUS_RUNNING) return;
8845 }
8846
8847 // this feature only makes sense if --restore-disable was not specified
8848
8849 if (data.restore_disable == 1)
8850 {
8851 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8852
8853 return;
8854 }
8855
8856 // check if monitoring of Restore Point updates should be enabled or disabled
8857
8858 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8859 {
8860 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8861
8862 // save the current restore point value
8863
8864 data.checkpoint_cur_words = get_lowest_words_done ();
8865
8866 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8867 }
8868 else
8869 {
8870 data.devices_status = STATUS_RUNNING;
8871
8872 // reset the global value for checkpoint checks
8873
8874 data.checkpoint_cur_words = 0;
8875
8876 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8877 }
8878 }
8879
8880 void myabort ()
8881 {
8882 if (data.devices_status == STATUS_INIT) return;
8883 if (data.devices_status == STATUS_STARTING) return;
8884
8885 data.devices_status = STATUS_ABORTED;
8886 }
8887
8888 void myquit ()
8889 {
8890 if (data.devices_status == STATUS_INIT) return;
8891 if (data.devices_status == STATUS_STARTING) return;
8892
8893 data.devices_status = STATUS_QUIT;
8894 }
8895
8896 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8897 {
8898 FILE *fp = fopen (kernel_file, "rb");
8899
8900 if (fp != NULL)
8901 {
8902 struct stat st;
8903
8904 memset (&st, 0, sizeof (st));
8905
8906 stat (kernel_file, &st);
8907
8908 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8909
8910 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8911
8912 if (num_read != (size_t) st.st_size)
8913 {
8914 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8915
8916 exit (-1);
8917 }
8918
8919 fclose (fp);
8920
8921 buf[st.st_size] = 0;
8922
8923 for (int i = 0; i < num_devices; i++)
8924 {
8925 kernel_lengths[i] = (size_t) st.st_size;
8926
8927 kernel_sources[i] = buf;
8928 }
8929 }
8930 else
8931 {
8932 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8933
8934 exit (-1);
8935 }
8936
8937 return;
8938 }
8939
8940 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8941 {
8942 if (binary_size > 0)
8943 {
8944 FILE *fp = fopen (dst, "wb");
8945
8946 lock_file (fp);
8947 fwrite (binary, sizeof (u8), binary_size, fp);
8948
8949 fflush (fp);
8950 fclose (fp);
8951 }
8952 }
8953
8954 /**
8955 * restore
8956 */
8957
8958 restore_data_t *init_restore (int argc, char **argv)
8959 {
8960 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8961
8962 if (data.restore_disable == 0)
8963 {
8964 FILE *fp = fopen (data.eff_restore_file, "rb");
8965
8966 if (fp)
8967 {
8968 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8969
8970 if (nread != 1)
8971 {
8972 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8973
8974 exit (-1);
8975 }
8976
8977 fclose (fp);
8978
8979 if (rd->pid)
8980 {
8981 char *pidbin = (char *) mymalloc (HCBUFSIZ);
8982
8983 int pidbin_len = -1;
8984
8985 #ifdef _POSIX
8986 snprintf (pidbin, HCBUFSIZ - 1, "/proc/%d/cmdline", rd->pid);
8987
8988 FILE *fd = fopen (pidbin, "rb");
8989
8990 if (fd)
8991 {
8992 pidbin_len = fread (pidbin, 1, HCBUFSIZ, fd);
8993
8994 pidbin[pidbin_len] = 0;
8995
8996 fclose (fd);
8997
8998 char *argv0_r = strrchr (argv[0], '/');
8999
9000 char *pidbin_r = strrchr (pidbin, '/');
9001
9002 if (argv0_r == NULL) argv0_r = argv[0];
9003
9004 if (pidbin_r == NULL) pidbin_r = pidbin;
9005
9006 if (strcmp (argv0_r, pidbin_r) == 0)
9007 {
9008 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
9009
9010 exit (-1);
9011 }
9012 }
9013
9014 #elif _WIN
9015 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
9016
9017 char *pidbin2 = (char *) mymalloc (HCBUFSIZ);
9018
9019 int pidbin2_len = -1;
9020
9021 pidbin_len = GetModuleFileName (NULL, pidbin, HCBUFSIZ);
9022 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, HCBUFSIZ);
9023
9024 pidbin[pidbin_len] = 0;
9025 pidbin2[pidbin2_len] = 0;
9026
9027 if (pidbin2_len)
9028 {
9029 if (strcmp (pidbin, pidbin2) == 0)
9030 {
9031 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
9032
9033 exit (-1);
9034 }
9035 }
9036
9037 myfree (pidbin2);
9038
9039 #endif
9040
9041 myfree (pidbin);
9042 }
9043
9044 if (rd->version_bin < RESTORE_MIN)
9045 {
9046 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
9047
9048 exit (-1);
9049 }
9050 }
9051 }
9052
9053 memset (rd, 0, sizeof (restore_data_t));
9054
9055 rd->version_bin = VERSION_BIN;
9056
9057 #ifdef _POSIX
9058 rd->pid = getpid ();
9059 #elif _WIN
9060 rd->pid = GetCurrentProcessId ();
9061 #endif
9062
9063 if (getcwd (rd->cwd, 255) == NULL)
9064 {
9065 myfree (rd);
9066
9067 return (NULL);
9068 }
9069
9070 rd->argc = argc;
9071 rd->argv = argv;
9072
9073 return (rd);
9074 }
9075
9076 void read_restore (const char *eff_restore_file, restore_data_t *rd)
9077 {
9078 FILE *fp = fopen (eff_restore_file, "rb");
9079
9080 if (fp == NULL)
9081 {
9082 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
9083
9084 exit (-1);
9085 }
9086
9087 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
9088 {
9089 log_error ("ERROR: cannot read %s", eff_restore_file);
9090
9091 exit (-1);
9092 }
9093
9094 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
9095
9096 char *buf = (char *) mymalloc (HCBUFSIZ);
9097
9098 for (uint i = 0; i < rd->argc; i++)
9099 {
9100 if (fgets (buf, HCBUFSIZ - 1, fp) == NULL)
9101 {
9102 log_error ("ERROR: cannot read %s", eff_restore_file);
9103
9104 exit (-1);
9105 }
9106
9107 size_t len = strlen (buf);
9108
9109 if (len) buf[len - 1] = 0;
9110
9111 rd->argv[i] = mystrdup (buf);
9112 }
9113
9114 myfree (buf);
9115
9116 fclose (fp);
9117
9118 if (chdir (rd->cwd))
9119 {
9120 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
9121
9122 exit (-1);
9123 }
9124 }
9125
9126 u64 get_lowest_words_done ()
9127 {
9128 u64 words_cur = -1;
9129
9130 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
9131 {
9132 hc_device_param_t *device_param = &data.devices_param[device_id];
9133
9134 if (device_param->skipped) continue;
9135
9136 const u64 words_done = device_param->words_done;
9137
9138 if (words_done < words_cur) words_cur = words_done;
9139 }
9140
9141 // It's possible that a device's workload isn't finished right after a restore-case.
9142 // In that case, this function would return 0 and overwrite the real restore point
9143 // There's also data.words_cur which is set to rd->words_cur but it changes while
9144 // the attack is running therefore we should stick to rd->words_cur.
9145 // Note that -s influences rd->words_cur we should keep a close look on that.
9146
9147 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9148
9149 return words_cur;
9150 }
9151
9152 void write_restore (const char *new_restore_file, restore_data_t *rd)
9153 {
9154 u64 words_cur = get_lowest_words_done ();
9155
9156 rd->words_cur = words_cur;
9157
9158 FILE *fp = fopen (new_restore_file, "wb");
9159
9160 if (fp == NULL)
9161 {
9162 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9163
9164 exit (-1);
9165 }
9166
9167 if (setvbuf (fp, NULL, _IONBF, 0))
9168 {
9169 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9170
9171 exit (-1);
9172 }
9173
9174 fwrite (rd, sizeof (restore_data_t), 1, fp);
9175
9176 for (uint i = 0; i < rd->argc; i++)
9177 {
9178 fprintf (fp, "%s", rd->argv[i]);
9179 fputc ('\n', fp);
9180 }
9181
9182 fflush (fp);
9183
9184 fsync (fileno (fp));
9185
9186 fclose (fp);
9187 }
9188
9189 void cycle_restore ()
9190 {
9191 const char *eff_restore_file = data.eff_restore_file;
9192 const char *new_restore_file = data.new_restore_file;
9193
9194 restore_data_t *rd = data.rd;
9195
9196 write_restore (new_restore_file, rd);
9197
9198 struct stat st;
9199
9200 memset (&st, 0, sizeof(st));
9201
9202 if (stat (eff_restore_file, &st) == 0)
9203 {
9204 if (unlink (eff_restore_file))
9205 {
9206 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
9207 }
9208 }
9209
9210 if (rename (new_restore_file, eff_restore_file))
9211 {
9212 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9213 }
9214 }
9215
9216 void check_checkpoint ()
9217 {
9218 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9219
9220 u64 words_cur = get_lowest_words_done ();
9221
9222 if (words_cur != data.checkpoint_cur_words)
9223 {
9224 myabort ();
9225 }
9226 }
9227
9228 /**
9229 * tuning db
9230 */
9231
9232 void tuning_db_destroy (tuning_db_t *tuning_db)
9233 {
9234 int i;
9235
9236 for (i = 0; i < tuning_db->alias_cnt; i++)
9237 {
9238 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9239
9240 myfree (alias->device_name);
9241 myfree (alias->alias_name);
9242 }
9243
9244 for (i = 0; i < tuning_db->entry_cnt; i++)
9245 {
9246 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9247
9248 myfree (entry->device_name);
9249 }
9250
9251 myfree (tuning_db->alias_buf);
9252 myfree (tuning_db->entry_buf);
9253
9254 myfree (tuning_db);
9255 }
9256
9257 tuning_db_t *tuning_db_alloc (FILE *fp)
9258 {
9259 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9260
9261 int num_lines = count_lines (fp);
9262
9263 // a bit over-allocated
9264
9265 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9266 tuning_db->alias_cnt = 0;
9267
9268 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9269 tuning_db->entry_cnt = 0;
9270
9271 return tuning_db;
9272 }
9273
9274 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9275 {
9276 FILE *fp = fopen (tuning_db_file, "rb");
9277
9278 if (fp == NULL)
9279 {
9280 log_error ("%s: %s", tuning_db_file, strerror (errno));
9281
9282 exit (-1);
9283 }
9284
9285 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9286
9287 rewind (fp);
9288
9289 int line_num = 0;
9290
9291 char *buf = (char *) mymalloc (HCBUFSIZ);
9292
9293 while (!feof (fp))
9294 {
9295 char *line_buf = fgets (buf, HCBUFSIZ - 1, fp);
9296
9297 if (line_buf == NULL) break;
9298
9299 line_num++;
9300
9301 const int line_len = in_superchop (line_buf);
9302
9303 if (line_len == 0) continue;
9304
9305 if (line_buf[0] == '#') continue;
9306
9307 // start processing
9308
9309 char *token_ptr[7] = { NULL };
9310
9311 int token_cnt = 0;
9312
9313 char *next = strtok (line_buf, "\t ");
9314
9315 token_ptr[token_cnt] = next;
9316
9317 token_cnt++;
9318
9319 while ((next = strtok (NULL, "\t ")) != NULL)
9320 {
9321 token_ptr[token_cnt] = next;
9322
9323 token_cnt++;
9324 }
9325
9326 if (token_cnt == 2)
9327 {
9328 char *device_name = token_ptr[0];
9329 char *alias_name = token_ptr[1];
9330
9331 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9332
9333 alias->device_name = mystrdup (device_name);
9334 alias->alias_name = mystrdup (alias_name);
9335
9336 tuning_db->alias_cnt++;
9337 }
9338 else if (token_cnt == 6)
9339 {
9340 if ((token_ptr[1][0] != '0') &&
9341 (token_ptr[1][0] != '1') &&
9342 (token_ptr[1][0] != '3') &&
9343 (token_ptr[1][0] != '*'))
9344 {
9345 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9346
9347 continue;
9348 }
9349
9350 if ((token_ptr[3][0] != '1') &&
9351 (token_ptr[3][0] != '2') &&
9352 (token_ptr[3][0] != '4') &&
9353 (token_ptr[3][0] != '8') &&
9354 (token_ptr[3][0] != 'N'))
9355 {
9356 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9357
9358 continue;
9359 }
9360
9361 char *device_name = token_ptr[0];
9362
9363 int attack_mode = -1;
9364 int hash_type = -1;
9365 int vector_width = -1;
9366 int kernel_accel = -1;
9367 int kernel_loops = -1;
9368
9369 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9370 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9371 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9372
9373 if (token_ptr[4][0] != 'A')
9374 {
9375 kernel_accel = atoi (token_ptr[4]);
9376
9377 if ((kernel_accel < 1) || (kernel_accel > 1024))
9378 {
9379 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9380
9381 continue;
9382 }
9383 }
9384 else
9385 {
9386 kernel_accel = 0;
9387 }
9388
9389 if (token_ptr[5][0] != 'A')
9390 {
9391 kernel_loops = atoi (token_ptr[5]);
9392
9393 if ((kernel_loops < 1) || (kernel_loops > 1024))
9394 {
9395 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9396
9397 continue;
9398 }
9399 }
9400 else
9401 {
9402 kernel_loops = 0;
9403 }
9404
9405 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9406
9407 entry->device_name = mystrdup (device_name);
9408 entry->attack_mode = attack_mode;
9409 entry->hash_type = hash_type;
9410 entry->vector_width = vector_width;
9411 entry->kernel_accel = kernel_accel;
9412 entry->kernel_loops = kernel_loops;
9413
9414 tuning_db->entry_cnt++;
9415 }
9416 else
9417 {
9418 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9419
9420 continue;
9421 }
9422 }
9423
9424 myfree (buf);
9425
9426 fclose (fp);
9427
9428 // todo: print loaded 'cnt' message
9429
9430 // sort the database
9431
9432 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9433 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9434
9435 return tuning_db;
9436 }
9437
9438 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, hc_device_param_t *device_param, int attack_mode, int hash_type)
9439 {
9440 static tuning_db_entry_t s;
9441
9442 // first we need to convert all spaces in the device_name to underscore
9443
9444 char *device_name_nospace = strdup (device_param->device_name);
9445
9446 int device_name_length = strlen (device_name_nospace);
9447
9448 int i;
9449
9450 for (i = 0; i < device_name_length; i++)
9451 {
9452 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9453 }
9454
9455 // find out if there's an alias configured
9456
9457 tuning_db_alias_t a;
9458
9459 a.device_name = device_name_nospace;
9460
9461 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);
9462
9463 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9464
9465 // attack-mode 6 and 7 are attack-mode 1 basically
9466
9467 if (attack_mode == 6) attack_mode = 1;
9468 if (attack_mode == 7) attack_mode = 1;
9469
9470 // bsearch is not ideal but fast enough
9471
9472 s.device_name = device_name_nospace;
9473 s.attack_mode = attack_mode;
9474 s.hash_type = hash_type;
9475
9476 tuning_db_entry_t *entry = NULL;
9477
9478 // this will produce all 2^3 combinations required
9479
9480 for (i = 0; i < 8; i++)
9481 {
9482 s.device_name = (i & 1) ? "*" : device_name_nospace;
9483 s.attack_mode = (i & 2) ? -1 : attack_mode;
9484 s.hash_type = (i & 4) ? -1 : hash_type;
9485
9486 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9487
9488 if (entry != NULL) break;
9489
9490 // in non-wildcard mode do some additional checks:
9491
9492 if ((i & 1) == 0)
9493 {
9494 // in case we have an alias-name
9495
9496 if (alias_name != NULL)
9497 {
9498 s.device_name = alias_name;
9499
9500 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9501
9502 if (entry != NULL) break;
9503 }
9504
9505 // or by device type
9506
9507 if (device_param->device_type & CL_DEVICE_TYPE_CPU)
9508 {
9509 s.device_name = "DEVICE_TYPE_CPU";
9510 }
9511 else if (device_param->device_type & CL_DEVICE_TYPE_GPU)
9512 {
9513 s.device_name = "DEVICE_TYPE_GPU";
9514 }
9515 else if (device_param->device_type & CL_DEVICE_TYPE_ACCELERATOR)
9516 {
9517 s.device_name = "DEVICE_TYPE_ACCELERATOR";
9518 }
9519
9520 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9521
9522 if (entry != NULL) break;
9523 }
9524 }
9525
9526 // free converted device_name
9527
9528 myfree (device_name_nospace);
9529
9530 return entry;
9531 }
9532
9533 /**
9534 * parser
9535 */
9536
9537 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9538 {
9539 u8 tmp[256] = { 0 };
9540
9541 if (salt_len > sizeof (tmp))
9542 {
9543 return UINT_MAX;
9544 }
9545
9546 memcpy (tmp, in, salt_len);
9547
9548 if (data.opts_type & OPTS_TYPE_ST_HEX)
9549 {
9550 if ((salt_len % 2) == 0)
9551 {
9552 u32 new_salt_len = salt_len / 2;
9553
9554 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9555 {
9556 u8 p0 = tmp[j + 0];
9557 u8 p1 = tmp[j + 1];
9558
9559 tmp[i] = hex_convert (p1) << 0;
9560 tmp[i] |= hex_convert (p0) << 4;
9561 }
9562
9563 salt_len = new_salt_len;
9564 }
9565 else
9566 {
9567 return UINT_MAX;
9568 }
9569 }
9570 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9571 {
9572 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9573 }
9574
9575 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9576
9577 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9578 {
9579 if (salt_len < 20)
9580 {
9581 u32 *tmp_uint = (u32 *) tmp;
9582
9583 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9584 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9585 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9586 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9587 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9588 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9589 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9590 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9591 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9592 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9593
9594 salt_len = salt_len * 2;
9595 }
9596 else
9597 {
9598 return UINT_MAX;
9599 }
9600 }
9601
9602 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9603 {
9604 lowercase (tmp, salt_len);
9605 }
9606
9607 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9608 {
9609 uppercase (tmp, salt_len);
9610 }
9611
9612 u32 len = salt_len;
9613
9614 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9615 {
9616 tmp[len++] = 0x80;
9617 }
9618
9619 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9620 {
9621 tmp[len++] = 0x01;
9622 }
9623
9624 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9625 {
9626 u32 *tmp_uint = (uint *) tmp;
9627
9628 u32 max = len / 4;
9629
9630 if (len % 4) max++;
9631
9632 for (u32 i = 0; i < max; i++)
9633 {
9634 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9635 }
9636
9637 // Important: we may need to increase the length of memcpy since
9638 // we don't want to "loose" some swapped bytes (could happen if
9639 // they do not perfectly fit in the 4-byte blocks)
9640 // Memcpy does always copy the bytes in the BE order, but since
9641 // we swapped them, some important bytes could be in positions
9642 // we normally skip with the original len
9643
9644 if (len % 4) len += 4 - (len % 4);
9645 }
9646
9647 memcpy (out, tmp, len);
9648
9649 return (salt_len);
9650 }
9651
9652 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9653 {
9654 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9655
9656 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9657
9658 u32 *digest = (u32 *) hash_buf->digest;
9659
9660 salt_t *salt = hash_buf->salt;
9661
9662 memcpy ((char *) salt->salt_sign, input_buf, 6);
9663
9664 char *iter_pos = input_buf + 4;
9665
9666 salt->salt_iter = 1 << atoi (iter_pos);
9667
9668 char *salt_pos = strchr (iter_pos, '$');
9669
9670 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9671
9672 salt_pos++;
9673
9674 uint salt_len = 16;
9675
9676 salt->salt_len = salt_len;
9677
9678 u8 tmp_buf[100] = { 0 };
9679
9680 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9681
9682 char *salt_buf_ptr = (char *) salt->salt_buf;
9683
9684 memcpy (salt_buf_ptr, tmp_buf, 16);
9685
9686 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9687 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9688 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9689 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9690
9691 char *hash_pos = salt_pos + 22;
9692
9693 memset (tmp_buf, 0, sizeof (tmp_buf));
9694
9695 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9696
9697 memcpy (digest, tmp_buf, 24);
9698
9699 digest[0] = byte_swap_32 (digest[0]);
9700 digest[1] = byte_swap_32 (digest[1]);
9701 digest[2] = byte_swap_32 (digest[2]);
9702 digest[3] = byte_swap_32 (digest[3]);
9703 digest[4] = byte_swap_32 (digest[4]);
9704 digest[5] = byte_swap_32 (digest[5]);
9705
9706 digest[5] &= ~0xff; // its just 23 not 24 !
9707
9708 return (PARSER_OK);
9709 }
9710
9711 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9712 {
9713 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9714
9715 u32 *digest = (u32 *) hash_buf->digest;
9716
9717 u8 tmp_buf[100] = { 0 };
9718
9719 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9720
9721 memcpy (digest, tmp_buf, 32);
9722
9723 digest[0] = byte_swap_32 (digest[0]);
9724 digest[1] = byte_swap_32 (digest[1]);
9725 digest[2] = byte_swap_32 (digest[2]);
9726 digest[3] = byte_swap_32 (digest[3]);
9727 digest[4] = byte_swap_32 (digest[4]);
9728 digest[5] = byte_swap_32 (digest[5]);
9729 digest[6] = byte_swap_32 (digest[6]);
9730 digest[7] = byte_swap_32 (digest[7]);
9731
9732 digest[0] -= SHA256M_A;
9733 digest[1] -= SHA256M_B;
9734 digest[2] -= SHA256M_C;
9735 digest[3] -= SHA256M_D;
9736 digest[4] -= SHA256M_E;
9737 digest[5] -= SHA256M_F;
9738 digest[6] -= SHA256M_G;
9739 digest[7] -= SHA256M_H;
9740
9741 return (PARSER_OK);
9742 }
9743
9744 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9745 {
9746 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9747
9748 u32 *digest = (u32 *) hash_buf->digest;
9749
9750 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9751 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9752
9753 digest[0] = byte_swap_32 (digest[0]);
9754 digest[1] = byte_swap_32 (digest[1]);
9755
9756 uint tt;
9757
9758 IP (digest[0], digest[1], tt);
9759
9760 digest[0] = digest[0];
9761 digest[1] = digest[1];
9762 digest[2] = 0;
9763 digest[3] = 0;
9764
9765 return (PARSER_OK);
9766 }
9767
9768 int arubaos_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9769 {
9770 if ((input_len < DISPLAY_LEN_MIN_125) || (input_len > DISPLAY_LEN_MAX_125)) return (PARSER_GLOBAL_LENGTH);
9771
9772 if ((input_buf[8] != '0') || (input_buf[9] != '1')) return (PARSER_SIGNATURE_UNMATCHED);
9773
9774 u32 *digest = (u32 *) hash_buf->digest;
9775
9776 salt_t *salt = hash_buf->salt;
9777
9778 char *hash_pos = input_buf + 10;
9779
9780 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9781 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9782 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9783 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9784 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9785
9786 digest[0] -= SHA1M_A;
9787 digest[1] -= SHA1M_B;
9788 digest[2] -= SHA1M_C;
9789 digest[3] -= SHA1M_D;
9790 digest[4] -= SHA1M_E;
9791
9792 uint salt_len = 10;
9793
9794 char *salt_buf_ptr = (char *) salt->salt_buf;
9795
9796 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9797
9798 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9799
9800 salt->salt_len = salt_len;
9801
9802 return (PARSER_OK);
9803 }
9804
9805 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9806 {
9807 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9808
9809 u32 *digest = (u32 *) hash_buf->digest;
9810
9811 salt_t *salt = hash_buf->salt;
9812
9813 char *hash_pos = input_buf + 8;
9814
9815 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9816 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9817 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9818 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9819 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9820
9821 digest[0] -= SHA1M_A;
9822 digest[1] -= SHA1M_B;
9823 digest[2] -= SHA1M_C;
9824 digest[3] -= SHA1M_D;
9825 digest[4] -= SHA1M_E;
9826
9827 uint salt_len = 8;
9828
9829 char *salt_buf_ptr = (char *) salt->salt_buf;
9830
9831 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9832
9833 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9834
9835 salt->salt_len = salt_len;
9836
9837 return (PARSER_OK);
9838 }
9839
9840 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9841 {
9842 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9843
9844 u64 *digest = (u64 *) hash_buf->digest;
9845
9846 salt_t *salt = hash_buf->salt;
9847
9848 char *hash_pos = input_buf + 8;
9849
9850 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9851 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9852 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9853 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9854 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9855 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9856 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9857 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9858
9859 digest[0] -= SHA512M_A;
9860 digest[1] -= SHA512M_B;
9861 digest[2] -= SHA512M_C;
9862 digest[3] -= SHA512M_D;
9863 digest[4] -= SHA512M_E;
9864 digest[5] -= SHA512M_F;
9865 digest[6] -= SHA512M_G;
9866 digest[7] -= SHA512M_H;
9867
9868 uint salt_len = 8;
9869
9870 char *salt_buf_ptr = (char *) salt->salt_buf;
9871
9872 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9873
9874 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9875
9876 salt->salt_len = salt_len;
9877
9878 return (PARSER_OK);
9879 }
9880
9881 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9882 {
9883 if (data.opts_type & OPTS_TYPE_ST_HEX)
9884 {
9885 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9886 }
9887 else
9888 {
9889 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9890 }
9891
9892 u32 *digest = (u32 *) hash_buf->digest;
9893
9894 salt_t *salt = hash_buf->salt;
9895
9896 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9897 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9898 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9899 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9900
9901 digest[0] = byte_swap_32 (digest[0]);
9902 digest[1] = byte_swap_32 (digest[1]);
9903 digest[2] = byte_swap_32 (digest[2]);
9904 digest[3] = byte_swap_32 (digest[3]);
9905
9906 digest[0] -= MD5M_A;
9907 digest[1] -= MD5M_B;
9908 digest[2] -= MD5M_C;
9909 digest[3] -= MD5M_D;
9910
9911 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9912
9913 uint salt_len = input_len - 32 - 1;
9914
9915 char *salt_buf = input_buf + 32 + 1;
9916
9917 char *salt_buf_ptr = (char *) salt->salt_buf;
9918
9919 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9920
9921 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9922
9923 salt->salt_len = salt_len;
9924
9925 return (PARSER_OK);
9926 }
9927
9928 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9929 {
9930 if (data.opts_type & OPTS_TYPE_ST_HEX)
9931 {
9932 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9933 }
9934 else
9935 {
9936 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9937 }
9938
9939 // unscramble
9940
9941 char clean_input_buf[32] = { 0 };
9942
9943 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9944 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9945
9946 for (int i = 0, j = 0, k = 0; i < 30; i++)
9947 {
9948 if (i == pos[j])
9949 {
9950 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9951
9952 j++;
9953 }
9954 else
9955 {
9956 clean_input_buf[k] = input_buf[i];
9957
9958 k++;
9959 }
9960 }
9961
9962 // base64 decode
9963
9964 u32 *digest = (u32 *) hash_buf->digest;
9965
9966 salt_t *salt = hash_buf->salt;
9967
9968 u32 a, b, c, d, e, f;
9969
9970 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9971 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9972 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9973 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9974 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9975 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9976
9977 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9978 | (((d << 12) | (e << 6) | (f)) << 0);
9979
9980 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9981 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9982 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9983 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9984 e = base64_to_int (clean_input_buf[10] & 0x7f);
9985 f = base64_to_int (clean_input_buf[11] & 0x7f);
9986
9987 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9988 | (((d << 12) | (e << 6) | (f)) << 0);
9989
9990 a = base64_to_int (clean_input_buf[12] & 0x7f);
9991 b = base64_to_int (clean_input_buf[13] & 0x7f);
9992 c = base64_to_int (clean_input_buf[14] & 0x7f);
9993 d = base64_to_int (clean_input_buf[15] & 0x7f);
9994 e = base64_to_int (clean_input_buf[16] & 0x7f);
9995 f = base64_to_int (clean_input_buf[17] & 0x7f);
9996
9997 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9998 | (((d << 12) | (e << 6) | (f)) << 0);
9999
10000 a = base64_to_int (clean_input_buf[18] & 0x7f);
10001 b = base64_to_int (clean_input_buf[19] & 0x7f);
10002 c = base64_to_int (clean_input_buf[20] & 0x7f);
10003 d = base64_to_int (clean_input_buf[21] & 0x7f);
10004 e = base64_to_int (clean_input_buf[22] & 0x7f);
10005 f = base64_to_int (clean_input_buf[23] & 0x7f);
10006
10007 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10008 | (((d << 12) | (e << 6) | (f)) << 0);
10009
10010 digest[0] = byte_swap_32 (digest[0]);
10011 digest[1] = byte_swap_32 (digest[1]);
10012 digest[2] = byte_swap_32 (digest[2]);
10013 digest[3] = byte_swap_32 (digest[3]);
10014
10015 digest[0] -= MD5M_A;
10016 digest[1] -= MD5M_B;
10017 digest[2] -= MD5M_C;
10018 digest[3] -= MD5M_D;
10019
10020 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10021
10022 uint salt_len = input_len - 30 - 1;
10023
10024 char *salt_buf = input_buf + 30 + 1;
10025
10026 char *salt_buf_ptr = (char *) salt->salt_buf;
10027
10028 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10029
10030 // max. salt length: 55 (max for MD5) - 22 (":Administration Tools:") - 1 (0x80) = 32
10031 // 32 - 4 bytes (to fit w0lr for all attack modes) = 28
10032
10033 if (salt_len > 28) return (PARSER_SALT_LENGTH);
10034
10035 salt->salt_len = salt_len;
10036
10037 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10038
10039 salt->salt_len += 22;
10040
10041 return (PARSER_OK);
10042 }
10043
10044 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10045 {
10046 if (data.opts_type & OPTS_TYPE_ST_HEX)
10047 {
10048 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10049 }
10050 else
10051 {
10052 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10053 }
10054
10055 u32 *digest = (u32 *) hash_buf->digest;
10056
10057 salt_t *salt = hash_buf->salt;
10058
10059 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10060 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10061 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10062 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10063 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10064
10065 digest[0] -= SHA1M_A;
10066 digest[1] -= SHA1M_B;
10067 digest[2] -= SHA1M_C;
10068 digest[3] -= SHA1M_D;
10069 digest[4] -= SHA1M_E;
10070
10071 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10072
10073 uint salt_len = input_len - 40 - 1;
10074
10075 char *salt_buf = input_buf + 40 + 1;
10076
10077 char *salt_buf_ptr = (char *) salt->salt_buf;
10078
10079 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10080
10081 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10082
10083 salt->salt_len = salt_len;
10084
10085 return (PARSER_OK);
10086 }
10087
10088 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10089 {
10090 if (data.opts_type & OPTS_TYPE_ST_HEX)
10091 {
10092 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10093 }
10094 else
10095 {
10096 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10097 }
10098
10099 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10100
10101 char *iter_pos = input_buf + 6;
10102
10103 salt_t *salt = hash_buf->salt;
10104
10105 uint iter = atoi (iter_pos);
10106
10107 if (iter < 1)
10108 {
10109 iter = ROUNDS_DCC2;
10110 }
10111
10112 salt->salt_iter = iter - 1;
10113
10114 char *salt_pos = strchr (iter_pos, '#');
10115
10116 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10117
10118 salt_pos++;
10119
10120 char *digest_pos = strchr (salt_pos, '#');
10121
10122 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10123
10124 digest_pos++;
10125
10126 uint salt_len = digest_pos - salt_pos - 1;
10127
10128 u32 *digest = (u32 *) hash_buf->digest;
10129
10130 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10131 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10132 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10133 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10134
10135 char *salt_buf_ptr = (char *) salt->salt_buf;
10136
10137 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10138
10139 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10140
10141 salt->salt_len = salt_len;
10142
10143 return (PARSER_OK);
10144 }
10145
10146 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10147 {
10148 u32 *digest = (u32 *) hash_buf->digest;
10149
10150 salt_t *salt = hash_buf->salt;
10151
10152 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10153
10154 hccap_t in;
10155
10156 memcpy (&in, input_buf, input_len);
10157
10158 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10159
10160 memcpy (digest, in.keymic, 16);
10161
10162 /*
10163 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10164 The phrase "Pairwise key expansion"
10165 Access Point Address (referred to as Authenticator Address AA)
10166 Supplicant Address (referred to as Supplicant Address SA)
10167 Access Point Nonce (referred to as Authenticator Anonce)
10168 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10169 */
10170
10171 uint salt_len = strlen (in.essid);
10172
10173 if (salt_len > 36)
10174 {
10175 log_info ("WARNING: the length of the ESSID is too long. The hccap file may be invalid or corrupted");
10176
10177 return (PARSER_SALT_LENGTH);
10178 }
10179
10180 memcpy (salt->salt_buf, in.essid, salt_len);
10181
10182 salt->salt_len = salt_len;
10183
10184 salt->salt_iter = ROUNDS_WPA2 - 1;
10185
10186 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10187
10188 memcpy (pke_ptr, "Pairwise key expansion", 23);
10189
10190 if (memcmp (in.mac1, in.mac2, 6) < 0)
10191 {
10192 memcpy (pke_ptr + 23, in.mac1, 6);
10193 memcpy (pke_ptr + 29, in.mac2, 6);
10194 }
10195 else
10196 {
10197 memcpy (pke_ptr + 23, in.mac2, 6);
10198 memcpy (pke_ptr + 29, in.mac1, 6);
10199 }
10200
10201 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10202 {
10203 memcpy (pke_ptr + 35, in.nonce1, 32);
10204 memcpy (pke_ptr + 67, in.nonce2, 32);
10205 }
10206 else
10207 {
10208 memcpy (pke_ptr + 35, in.nonce2, 32);
10209 memcpy (pke_ptr + 67, in.nonce1, 32);
10210 }
10211
10212 for (int i = 0; i < 25; i++)
10213 {
10214 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10215 }
10216
10217 memcpy (wpa->orig_mac1, in.mac1, 6);
10218 memcpy (wpa->orig_mac2, in.mac2, 6);
10219 memcpy (wpa->orig_nonce1, in.nonce1, 32);
10220 memcpy (wpa->orig_nonce2, in.nonce2, 32);
10221
10222 wpa->keyver = in.keyver;
10223
10224 if (wpa->keyver > 255)
10225 {
10226 log_info ("ATTENTION!");
10227 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10228 log_info (" This could be due to a recent aircrack-ng bug.");
10229 log_info (" The key version was automatically reset to a reasonable value.");
10230 log_info ("");
10231
10232 wpa->keyver &= 0xff;
10233 }
10234
10235 wpa->eapol_size = in.eapol_size;
10236
10237 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10238
10239 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10240
10241 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10242
10243 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10244
10245 if (wpa->keyver == 1)
10246 {
10247 // nothing to do
10248 }
10249 else
10250 {
10251 digest[0] = byte_swap_32 (digest[0]);
10252 digest[1] = byte_swap_32 (digest[1]);
10253 digest[2] = byte_swap_32 (digest[2]);
10254 digest[3] = byte_swap_32 (digest[3]);
10255
10256 for (int i = 0; i < 64; i++)
10257 {
10258 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10259 }
10260 }
10261
10262 uint32_t *p0 = (uint32_t *) in.essid;
10263 uint32_t c0 = 0;
10264 uint32_t c1 = 0;
10265
10266 for (uint i = 0; i < sizeof (in.essid) / sizeof (uint32_t); i++) c0 ^= *p0++;
10267 for (uint i = 0; i < sizeof (wpa->pke) / sizeof (wpa->pke[0]); i++) c1 ^= wpa->pke[i];
10268
10269 salt->salt_buf[10] = c0;
10270 salt->salt_buf[11] = c1;
10271
10272 return (PARSER_OK);
10273 }
10274
10275 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10276 {
10277 u32 *digest = (u32 *) hash_buf->digest;
10278
10279 salt_t *salt = hash_buf->salt;
10280
10281 if (input_len == 0)
10282 {
10283 log_error ("Password Safe v2 container not specified");
10284
10285 exit (-1);
10286 }
10287
10288 FILE *fp = fopen (input_buf, "rb");
10289
10290 if (fp == NULL)
10291 {
10292 log_error ("%s: %s", input_buf, strerror (errno));
10293
10294 exit (-1);
10295 }
10296
10297 psafe2_hdr buf;
10298
10299 memset (&buf, 0, sizeof (psafe2_hdr));
10300
10301 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10302
10303 fclose (fp);
10304
10305 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10306
10307 salt->salt_buf[0] = buf.random[0];
10308 salt->salt_buf[1] = buf.random[1];
10309
10310 salt->salt_len = 8;
10311 salt->salt_iter = 1000;
10312
10313 digest[0] = byte_swap_32 (buf.hash[0]);
10314 digest[1] = byte_swap_32 (buf.hash[1]);
10315 digest[2] = byte_swap_32 (buf.hash[2]);
10316 digest[3] = byte_swap_32 (buf.hash[3]);
10317 digest[4] = byte_swap_32 (buf.hash[4]);
10318
10319 return (PARSER_OK);
10320 }
10321
10322 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10323 {
10324 u32 *digest = (u32 *) hash_buf->digest;
10325
10326 salt_t *salt = hash_buf->salt;
10327
10328 if (input_len == 0)
10329 {
10330 log_error (".psafe3 not specified");
10331
10332 exit (-1);
10333 }
10334
10335 FILE *fp = fopen (input_buf, "rb");
10336
10337 if (fp == NULL)
10338 {
10339 log_error ("%s: %s", input_buf, strerror (errno));
10340
10341 exit (-1);
10342 }
10343
10344 psafe3_t in;
10345
10346 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10347
10348 fclose (fp);
10349
10350 data.hashfile = input_buf; // we will need this in case it gets cracked
10351
10352 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10353
10354 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10355
10356 salt->salt_iter = in.iterations + 1;
10357
10358 salt->salt_buf[0] = in.salt_buf[0];
10359 salt->salt_buf[1] = in.salt_buf[1];
10360 salt->salt_buf[2] = in.salt_buf[2];
10361 salt->salt_buf[3] = in.salt_buf[3];
10362 salt->salt_buf[4] = in.salt_buf[4];
10363 salt->salt_buf[5] = in.salt_buf[5];
10364 salt->salt_buf[6] = in.salt_buf[6];
10365 salt->salt_buf[7] = in.salt_buf[7];
10366
10367 salt->salt_len = 32;
10368
10369 digest[0] = in.hash_buf[0];
10370 digest[1] = in.hash_buf[1];
10371 digest[2] = in.hash_buf[2];
10372 digest[3] = in.hash_buf[3];
10373 digest[4] = in.hash_buf[4];
10374 digest[5] = in.hash_buf[5];
10375 digest[6] = in.hash_buf[6];
10376 digest[7] = in.hash_buf[7];
10377
10378 digest[0] = byte_swap_32 (digest[0]);
10379 digest[1] = byte_swap_32 (digest[1]);
10380 digest[2] = byte_swap_32 (digest[2]);
10381 digest[3] = byte_swap_32 (digest[3]);
10382 digest[4] = byte_swap_32 (digest[4]);
10383 digest[5] = byte_swap_32 (digest[5]);
10384 digest[6] = byte_swap_32 (digest[6]);
10385 digest[7] = byte_swap_32 (digest[7]);
10386
10387 return (PARSER_OK);
10388 }
10389
10390 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10391 {
10392 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10393
10394 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10395
10396 u32 *digest = (u32 *) hash_buf->digest;
10397
10398 salt_t *salt = hash_buf->salt;
10399
10400 char *iter_pos = input_buf + 3;
10401
10402 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10403
10404 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10405
10406 memcpy ((char *) salt->salt_sign, input_buf, 4);
10407
10408 salt->salt_iter = salt_iter;
10409
10410 char *salt_pos = iter_pos + 1;
10411
10412 uint salt_len = 8;
10413
10414 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10415
10416 salt->salt_len = salt_len;
10417
10418 char *hash_pos = salt_pos + salt_len;
10419
10420 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10421
10422 return (PARSER_OK);
10423 }
10424
10425 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10426 {
10427 if (input_len < DISPLAY_LEN_MIN_500) return (PARSER_GLOBAL_LENGTH);
10428
10429 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10430
10431 u32 *digest = (u32 *) hash_buf->digest;
10432
10433 salt_t *salt = hash_buf->salt;
10434
10435 char *salt_pos = input_buf + 3;
10436
10437 uint iterations_len = 0;
10438
10439 if (memcmp (salt_pos, "rounds=", 7) == 0)
10440 {
10441 salt_pos += 7;
10442
10443 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10444
10445 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10446 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10447
10448 salt_pos[0] = 0x0;
10449
10450 salt->salt_iter = atoi (salt_pos - iterations_len);
10451
10452 salt_pos += 1;
10453
10454 iterations_len += 8;
10455 }
10456 else
10457 {
10458 salt->salt_iter = ROUNDS_MD5CRYPT;
10459 }
10460
10461 if (input_len > (DISPLAY_LEN_MAX_500 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10462
10463 char *hash_pos = strchr (salt_pos, '$');
10464
10465 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10466
10467 uint salt_len = hash_pos - salt_pos;
10468
10469 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10470
10471 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10472
10473 salt->salt_len = salt_len;
10474
10475 hash_pos++;
10476
10477 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10478
10479 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10480
10481 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10482
10483 return (PARSER_OK);
10484 }
10485
10486 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10487 {
10488 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10489
10490 u32 *digest = (u32 *) hash_buf->digest;
10491
10492 salt_t *salt = hash_buf->salt;
10493
10494 char *salt_pos = input_buf + 6;
10495
10496 uint iterations_len = 0;
10497
10498 if (memcmp (salt_pos, "rounds=", 7) == 0)
10499 {
10500 salt_pos += 7;
10501
10502 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10503
10504 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10505 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10506
10507 salt_pos[0] = 0x0;
10508
10509 salt->salt_iter = atoi (salt_pos - iterations_len);
10510
10511 salt_pos += 1;
10512
10513 iterations_len += 8;
10514 }
10515 else
10516 {
10517 salt->salt_iter = ROUNDS_MD5CRYPT;
10518 }
10519
10520 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10521
10522 char *hash_pos = strchr (salt_pos, '$');
10523
10524 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10525
10526 uint salt_len = hash_pos - salt_pos;
10527
10528 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10529
10530 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10531
10532 salt->salt_len = salt_len;
10533
10534 hash_pos++;
10535
10536 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10537
10538 return (PARSER_OK);
10539 }
10540
10541 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10542 {
10543 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10544
10545 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10546
10547 u32 *digest = (u32 *) hash_buf->digest;
10548
10549 salt_t *salt = hash_buf->salt;
10550
10551 char *salt_pos = input_buf + 14;
10552
10553 char *hash_pos = strchr (salt_pos, '*');
10554
10555 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10556
10557 hash_pos++;
10558
10559 uint salt_len = hash_pos - salt_pos - 1;
10560
10561 char *salt_buf_ptr = (char *) salt->salt_buf;
10562
10563 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10564
10565 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10566
10567 salt->salt_len = salt_len;
10568
10569 u8 tmp_buf[100] = { 0 };
10570
10571 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10572
10573 memcpy (digest, tmp_buf, 20);
10574
10575 digest[0] = byte_swap_32 (digest[0]);
10576 digest[1] = byte_swap_32 (digest[1]);
10577 digest[2] = byte_swap_32 (digest[2]);
10578 digest[3] = byte_swap_32 (digest[3]);
10579 digest[4] = byte_swap_32 (digest[4]);
10580
10581 digest[0] -= SHA1M_A;
10582 digest[1] -= SHA1M_B;
10583 digest[2] -= SHA1M_C;
10584 digest[3] -= SHA1M_D;
10585 digest[4] -= SHA1M_E;
10586
10587 return (PARSER_OK);
10588 }
10589
10590 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10591 {
10592 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10593
10594 unsigned char c12 = itoa64_to_int (input_buf[12]);
10595
10596 if (c12 & 3) return (PARSER_HASH_VALUE);
10597
10598 u32 *digest = (u32 *) hash_buf->digest;
10599
10600 salt_t *salt = hash_buf->salt;
10601
10602 // for ascii_digest
10603 salt->salt_sign[0] = input_buf[0];
10604 salt->salt_sign[1] = input_buf[1];
10605
10606 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10607 | itoa64_to_int (input_buf[1]) << 6;
10608
10609 salt->salt_len = 2;
10610
10611 u8 tmp_buf[100] = { 0 };
10612
10613 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10614
10615 memcpy (digest, tmp_buf, 8);
10616
10617 uint tt;
10618
10619 IP (digest[0], digest[1], tt);
10620
10621 digest[2] = 0;
10622 digest[3] = 0;
10623
10624 return (PARSER_OK);
10625 }
10626
10627 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10628 {
10629 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10630
10631 u32 *digest = (u32 *) hash_buf->digest;
10632
10633 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10634 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10635 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10636 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10637
10638 digest[0] = byte_swap_32 (digest[0]);
10639 digest[1] = byte_swap_32 (digest[1]);
10640 digest[2] = byte_swap_32 (digest[2]);
10641 digest[3] = byte_swap_32 (digest[3]);
10642
10643 digest[0] -= MD4M_A;
10644 digest[1] -= MD4M_B;
10645 digest[2] -= MD4M_C;
10646 digest[3] -= MD4M_D;
10647
10648 return (PARSER_OK);
10649 }
10650
10651 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10652 {
10653 if (data.opts_type & OPTS_TYPE_ST_HEX)
10654 {
10655 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10656 }
10657 else
10658 {
10659 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10660 }
10661
10662 u32 *digest = (u32 *) hash_buf->digest;
10663
10664 salt_t *salt = hash_buf->salt;
10665
10666 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10667 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10668 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10669 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10670
10671 digest[0] = byte_swap_32 (digest[0]);
10672 digest[1] = byte_swap_32 (digest[1]);
10673 digest[2] = byte_swap_32 (digest[2]);
10674 digest[3] = byte_swap_32 (digest[3]);
10675
10676 digest[0] -= MD4M_A;
10677 digest[1] -= MD4M_B;
10678 digest[2] -= MD4M_C;
10679 digest[3] -= MD4M_D;
10680
10681 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10682
10683 uint salt_len = input_len - 32 - 1;
10684
10685 char *salt_buf = input_buf + 32 + 1;
10686
10687 char *salt_buf_ptr = (char *) salt->salt_buf;
10688
10689 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10690
10691 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10692
10693 salt->salt_len = salt_len;
10694
10695 return (PARSER_OK);
10696 }
10697
10698 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10699 {
10700 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10701
10702 u32 *digest = (u32 *) hash_buf->digest;
10703
10704 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10705 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10706 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10707 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10708
10709 digest[0] = byte_swap_32 (digest[0]);
10710 digest[1] = byte_swap_32 (digest[1]);
10711 digest[2] = byte_swap_32 (digest[2]);
10712 digest[3] = byte_swap_32 (digest[3]);
10713
10714 digest[0] -= MD5M_A;
10715 digest[1] -= MD5M_B;
10716 digest[2] -= MD5M_C;
10717 digest[3] -= MD5M_D;
10718
10719 return (PARSER_OK);
10720 }
10721
10722 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10723 {
10724 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10725
10726 u32 *digest = (u32 *) hash_buf->digest;
10727
10728 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10729 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10730 digest[2] = 0;
10731 digest[3] = 0;
10732
10733 digest[0] = byte_swap_32 (digest[0]);
10734 digest[1] = byte_swap_32 (digest[1]);
10735
10736 return (PARSER_OK);
10737 }
10738
10739 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10740 {
10741 if (data.opts_type & OPTS_TYPE_ST_HEX)
10742 {
10743 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10744 }
10745 else
10746 {
10747 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10748 }
10749
10750 u32 *digest = (u32 *) hash_buf->digest;
10751
10752 salt_t *salt = hash_buf->salt;
10753
10754 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10755 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10756 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10757 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10758
10759 digest[0] = byte_swap_32 (digest[0]);
10760 digest[1] = byte_swap_32 (digest[1]);
10761 digest[2] = byte_swap_32 (digest[2]);
10762 digest[3] = byte_swap_32 (digest[3]);
10763
10764 digest[0] -= MD5M_A;
10765 digest[1] -= MD5M_B;
10766 digest[2] -= MD5M_C;
10767 digest[3] -= MD5M_D;
10768
10769 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10770
10771 uint salt_len = input_len - 32 - 1;
10772
10773 char *salt_buf = input_buf + 32 + 1;
10774
10775 char *salt_buf_ptr = (char *) salt->salt_buf;
10776
10777 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10778
10779 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10780
10781 salt->salt_len = salt_len;
10782
10783 return (PARSER_OK);
10784 }
10785
10786 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10787 {
10788 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10789
10790 u32 *digest = (u32 *) hash_buf->digest;
10791
10792 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10793 | itoa64_to_int (input_buf[ 1]) << 6
10794 | itoa64_to_int (input_buf[ 2]) << 12
10795 | itoa64_to_int (input_buf[ 3]) << 18;
10796 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10797 | itoa64_to_int (input_buf[ 5]) << 6
10798 | itoa64_to_int (input_buf[ 6]) << 12
10799 | itoa64_to_int (input_buf[ 7]) << 18;
10800 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10801 | itoa64_to_int (input_buf[ 9]) << 6
10802 | itoa64_to_int (input_buf[10]) << 12
10803 | itoa64_to_int (input_buf[11]) << 18;
10804 digest[3] = itoa64_to_int (input_buf[12]) << 0
10805 | itoa64_to_int (input_buf[13]) << 6
10806 | itoa64_to_int (input_buf[14]) << 12
10807 | itoa64_to_int (input_buf[15]) << 18;
10808
10809 digest[0] -= MD5M_A;
10810 digest[1] -= MD5M_B;
10811 digest[2] -= MD5M_C;
10812 digest[3] -= MD5M_D;
10813
10814 digest[0] &= 0x00ffffff;
10815 digest[1] &= 0x00ffffff;
10816 digest[2] &= 0x00ffffff;
10817 digest[3] &= 0x00ffffff;
10818
10819 return (PARSER_OK);
10820 }
10821
10822 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10823 {
10824 if (data.opts_type & OPTS_TYPE_ST_HEX)
10825 {
10826 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10827 }
10828 else
10829 {
10830 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10831 }
10832
10833 u32 *digest = (u32 *) hash_buf->digest;
10834
10835 salt_t *salt = hash_buf->salt;
10836
10837 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10838 | itoa64_to_int (input_buf[ 1]) << 6
10839 | itoa64_to_int (input_buf[ 2]) << 12
10840 | itoa64_to_int (input_buf[ 3]) << 18;
10841 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10842 | itoa64_to_int (input_buf[ 5]) << 6
10843 | itoa64_to_int (input_buf[ 6]) << 12
10844 | itoa64_to_int (input_buf[ 7]) << 18;
10845 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10846 | itoa64_to_int (input_buf[ 9]) << 6
10847 | itoa64_to_int (input_buf[10]) << 12
10848 | itoa64_to_int (input_buf[11]) << 18;
10849 digest[3] = itoa64_to_int (input_buf[12]) << 0
10850 | itoa64_to_int (input_buf[13]) << 6
10851 | itoa64_to_int (input_buf[14]) << 12
10852 | itoa64_to_int (input_buf[15]) << 18;
10853
10854 digest[0] -= MD5M_A;
10855 digest[1] -= MD5M_B;
10856 digest[2] -= MD5M_C;
10857 digest[3] -= MD5M_D;
10858
10859 digest[0] &= 0x00ffffff;
10860 digest[1] &= 0x00ffffff;
10861 digest[2] &= 0x00ffffff;
10862 digest[3] &= 0x00ffffff;
10863
10864 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10865
10866 uint salt_len = input_len - 16 - 1;
10867
10868 char *salt_buf = input_buf + 16 + 1;
10869
10870 char *salt_buf_ptr = (char *) salt->salt_buf;
10871
10872 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10873
10874 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10875
10876 salt->salt_len = salt_len;
10877
10878 return (PARSER_OK);
10879 }
10880
10881 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10882 {
10883 key[0] = (nthash[0] >> 0);
10884 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10885 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10886 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10887 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10888 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10889 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10890 key[7] = (nthash[6] << 1);
10891
10892 key[0] |= 0x01;
10893 key[1] |= 0x01;
10894 key[2] |= 0x01;
10895 key[3] |= 0x01;
10896 key[4] |= 0x01;
10897 key[5] |= 0x01;
10898 key[6] |= 0x01;
10899 key[7] |= 0x01;
10900 }
10901
10902 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10903 {
10904 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10905
10906 u32 *digest = (u32 *) hash_buf->digest;
10907
10908 salt_t *salt = hash_buf->salt;
10909
10910 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10911
10912 /**
10913 * parse line
10914 */
10915
10916 char *user_pos = input_buf;
10917
10918 char *unused_pos = strchr (user_pos, ':');
10919
10920 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10921
10922 uint user_len = unused_pos - user_pos;
10923
10924 if (user_len > 60) return (PARSER_SALT_LENGTH);
10925
10926 unused_pos++;
10927
10928 char *domain_pos = strchr (unused_pos, ':');
10929
10930 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10931
10932 uint unused_len = domain_pos - unused_pos;
10933
10934 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10935
10936 domain_pos++;
10937
10938 char *srvchall_pos = strchr (domain_pos, ':');
10939
10940 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10941
10942 uint domain_len = srvchall_pos - domain_pos;
10943
10944 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10945
10946 srvchall_pos++;
10947
10948 char *hash_pos = strchr (srvchall_pos, ':');
10949
10950 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10951
10952 uint srvchall_len = hash_pos - srvchall_pos;
10953
10954 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10955
10956 hash_pos++;
10957
10958 char *clichall_pos = strchr (hash_pos, ':');
10959
10960 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10961
10962 uint hash_len = clichall_pos - hash_pos;
10963
10964 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10965
10966 clichall_pos++;
10967
10968 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10969
10970 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10971
10972 /**
10973 * store some data for later use
10974 */
10975
10976 netntlm->user_len = user_len * 2;
10977 netntlm->domain_len = domain_len * 2;
10978 netntlm->srvchall_len = srvchall_len / 2;
10979 netntlm->clichall_len = clichall_len / 2;
10980
10981 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10982 char *chall_ptr = (char *) netntlm->chall_buf;
10983
10984 /**
10985 * handle username and domainname
10986 */
10987
10988 for (uint i = 0; i < user_len; i++)
10989 {
10990 *userdomain_ptr++ = user_pos[i];
10991 *userdomain_ptr++ = 0;
10992 }
10993
10994 for (uint i = 0; i < domain_len; i++)
10995 {
10996 *userdomain_ptr++ = domain_pos[i];
10997 *userdomain_ptr++ = 0;
10998 }
10999
11000 /**
11001 * handle server challenge encoding
11002 */
11003
11004 for (uint i = 0; i < srvchall_len; i += 2)
11005 {
11006 const char p0 = srvchall_pos[i + 0];
11007 const char p1 = srvchall_pos[i + 1];
11008
11009 *chall_ptr++ = hex_convert (p1) << 0
11010 | hex_convert (p0) << 4;
11011 }
11012
11013 /**
11014 * handle client challenge encoding
11015 */
11016
11017 for (uint i = 0; i < clichall_len; i += 2)
11018 {
11019 const char p0 = clichall_pos[i + 0];
11020 const char p1 = clichall_pos[i + 1];
11021
11022 *chall_ptr++ = hex_convert (p1) << 0
11023 | hex_convert (p0) << 4;
11024 }
11025
11026 /**
11027 * store data
11028 */
11029
11030 char *salt_buf_ptr = (char *) salt->salt_buf;
11031
11032 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11033
11034 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11035
11036 salt->salt_len = salt_len;
11037
11038 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11039 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11040 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11041 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11042
11043 digest[0] = byte_swap_32 (digest[0]);
11044 digest[1] = byte_swap_32 (digest[1]);
11045 digest[2] = byte_swap_32 (digest[2]);
11046 digest[3] = byte_swap_32 (digest[3]);
11047
11048 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11049
11050 uint digest_tmp[2] = { 0 };
11051
11052 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11053 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11054
11055 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11056 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11057
11058 /* special case 2: ESS */
11059
11060 if (srvchall_len == 48)
11061 {
11062 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11063 {
11064 uint w[16] = { 0 };
11065
11066 w[ 0] = netntlm->chall_buf[6];
11067 w[ 1] = netntlm->chall_buf[7];
11068 w[ 2] = netntlm->chall_buf[0];
11069 w[ 3] = netntlm->chall_buf[1];
11070 w[ 4] = 0x80;
11071 w[14] = 16 * 8;
11072
11073 uint dgst[4] = { 0 };
11074
11075 dgst[0] = MAGIC_A;
11076 dgst[1] = MAGIC_B;
11077 dgst[2] = MAGIC_C;
11078 dgst[3] = MAGIC_D;
11079
11080 md5_64 (w, dgst);
11081
11082 salt->salt_buf[0] = dgst[0];
11083 salt->salt_buf[1] = dgst[1];
11084 }
11085 }
11086
11087 /* precompute netntlmv1 exploit start */
11088
11089 for (uint i = 0; i < 0x10000; i++)
11090 {
11091 uint key_md4[2] = { i, 0 };
11092 uint key_des[2] = { 0, 0 };
11093
11094 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11095
11096 uint Kc[16] = { 0 };
11097 uint Kd[16] = { 0 };
11098
11099 _des_keysetup (key_des, Kc, Kd, c_skb);
11100
11101 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11102
11103 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11104
11105 if (data3[0] != digest_tmp[0]) continue;
11106 if (data3[1] != digest_tmp[1]) continue;
11107
11108 salt->salt_buf[2] = i;
11109
11110 salt->salt_len = 24;
11111
11112 break;
11113 }
11114
11115 salt->salt_buf_pc[0] = digest_tmp[0];
11116 salt->salt_buf_pc[1] = digest_tmp[1];
11117
11118 /* precompute netntlmv1 exploit stop */
11119
11120 u32 tt;
11121
11122 IP (digest[0], digest[1], tt);
11123 IP (digest[2], digest[3], tt);
11124
11125 digest[0] = rotr32 (digest[0], 29);
11126 digest[1] = rotr32 (digest[1], 29);
11127 digest[2] = rotr32 (digest[2], 29);
11128 digest[3] = rotr32 (digest[3], 29);
11129
11130 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11131
11132 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11133 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11134
11135 return (PARSER_OK);
11136 }
11137
11138 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11139 {
11140 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11141
11142 u32 *digest = (u32 *) hash_buf->digest;
11143
11144 salt_t *salt = hash_buf->salt;
11145
11146 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11147
11148 /**
11149 * parse line
11150 */
11151
11152 char *user_pos = input_buf;
11153
11154 char *unused_pos = strchr (user_pos, ':');
11155
11156 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11157
11158 uint user_len = unused_pos - user_pos;
11159
11160 if (user_len > 60) return (PARSER_SALT_LENGTH);
11161
11162 unused_pos++;
11163
11164 char *domain_pos = strchr (unused_pos, ':');
11165
11166 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11167
11168 uint unused_len = domain_pos - unused_pos;
11169
11170 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11171
11172 domain_pos++;
11173
11174 char *srvchall_pos = strchr (domain_pos, ':');
11175
11176 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11177
11178 uint domain_len = srvchall_pos - domain_pos;
11179
11180 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11181
11182 srvchall_pos++;
11183
11184 char *hash_pos = strchr (srvchall_pos, ':');
11185
11186 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11187
11188 uint srvchall_len = hash_pos - srvchall_pos;
11189
11190 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11191
11192 hash_pos++;
11193
11194 char *clichall_pos = strchr (hash_pos, ':');
11195
11196 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11197
11198 uint hash_len = clichall_pos - hash_pos;
11199
11200 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11201
11202 clichall_pos++;
11203
11204 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11205
11206 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11207
11208 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11209
11210 /**
11211 * store some data for later use
11212 */
11213
11214 netntlm->user_len = user_len * 2;
11215 netntlm->domain_len = domain_len * 2;
11216 netntlm->srvchall_len = srvchall_len / 2;
11217 netntlm->clichall_len = clichall_len / 2;
11218
11219 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11220 char *chall_ptr = (char *) netntlm->chall_buf;
11221
11222 /**
11223 * handle username and domainname
11224 */
11225
11226 for (uint i = 0; i < user_len; i++)
11227 {
11228 *userdomain_ptr++ = toupper (user_pos[i]);
11229 *userdomain_ptr++ = 0;
11230 }
11231
11232 for (uint i = 0; i < domain_len; i++)
11233 {
11234 *userdomain_ptr++ = domain_pos[i];
11235 *userdomain_ptr++ = 0;
11236 }
11237
11238 *userdomain_ptr++ = 0x80;
11239
11240 /**
11241 * handle server challenge encoding
11242 */
11243
11244 for (uint i = 0; i < srvchall_len; i += 2)
11245 {
11246 const char p0 = srvchall_pos[i + 0];
11247 const char p1 = srvchall_pos[i + 1];
11248
11249 *chall_ptr++ = hex_convert (p1) << 0
11250 | hex_convert (p0) << 4;
11251 }
11252
11253 /**
11254 * handle client challenge encoding
11255 */
11256
11257 for (uint i = 0; i < clichall_len; i += 2)
11258 {
11259 const char p0 = clichall_pos[i + 0];
11260 const char p1 = clichall_pos[i + 1];
11261
11262 *chall_ptr++ = hex_convert (p1) << 0
11263 | hex_convert (p0) << 4;
11264 }
11265
11266 *chall_ptr++ = 0x80;
11267
11268 /**
11269 * handle hash itself
11270 */
11271
11272 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11273 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11274 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11275 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11276
11277 digest[0] = byte_swap_32 (digest[0]);
11278 digest[1] = byte_swap_32 (digest[1]);
11279 digest[2] = byte_swap_32 (digest[2]);
11280 digest[3] = byte_swap_32 (digest[3]);
11281
11282 /**
11283 * reuse challange data as salt_buf, its the buffer that is most likely unique
11284 */
11285
11286 salt->salt_buf[0] = 0;
11287 salt->salt_buf[1] = 0;
11288 salt->salt_buf[2] = 0;
11289 salt->salt_buf[3] = 0;
11290 salt->salt_buf[4] = 0;
11291 salt->salt_buf[5] = 0;
11292 salt->salt_buf[6] = 0;
11293 salt->salt_buf[7] = 0;
11294
11295 uint *uptr;
11296
11297 uptr = (uint *) netntlm->userdomain_buf;
11298
11299 for (uint i = 0; i < 16; i += 16)
11300 {
11301 md5_64 (uptr, salt->salt_buf);
11302 }
11303
11304 uptr = (uint *) netntlm->chall_buf;
11305
11306 for (uint i = 0; i < 256; i += 16)
11307 {
11308 md5_64 (uptr, salt->salt_buf);
11309 }
11310
11311 salt->salt_len = 16;
11312
11313 return (PARSER_OK);
11314 }
11315
11316 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11317 {
11318 if (data.opts_type & OPTS_TYPE_ST_HEX)
11319 {
11320 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11321 }
11322 else
11323 {
11324 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11325 }
11326
11327 u32 *digest = (u32 *) hash_buf->digest;
11328
11329 salt_t *salt = hash_buf->salt;
11330
11331 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11332 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11333 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11334 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11335
11336 digest[0] = byte_swap_32 (digest[0]);
11337 digest[1] = byte_swap_32 (digest[1]);
11338 digest[2] = byte_swap_32 (digest[2]);
11339 digest[3] = byte_swap_32 (digest[3]);
11340
11341 digest[0] -= MD5M_A;
11342 digest[1] -= MD5M_B;
11343 digest[2] -= MD5M_C;
11344 digest[3] -= MD5M_D;
11345
11346 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11347
11348 uint salt_len = input_len - 32 - 1;
11349
11350 char *salt_buf = input_buf + 32 + 1;
11351
11352 char *salt_buf_ptr = (char *) salt->salt_buf;
11353
11354 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11355
11356 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11357
11358 salt->salt_len = salt_len;
11359
11360 return (PARSER_OK);
11361 }
11362
11363 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11364 {
11365 if (data.opts_type & OPTS_TYPE_ST_HEX)
11366 {
11367 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11368 }
11369 else
11370 {
11371 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11372 }
11373
11374 u32 *digest = (u32 *) hash_buf->digest;
11375
11376 salt_t *salt = hash_buf->salt;
11377
11378 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11379 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11380 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11381 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11382
11383 digest[0] = byte_swap_32 (digest[0]);
11384 digest[1] = byte_swap_32 (digest[1]);
11385 digest[2] = byte_swap_32 (digest[2]);
11386 digest[3] = byte_swap_32 (digest[3]);
11387
11388 digest[0] -= MD5M_A;
11389 digest[1] -= MD5M_B;
11390 digest[2] -= MD5M_C;
11391 digest[3] -= MD5M_D;
11392
11393 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11394
11395 uint salt_len = input_len - 32 - 1;
11396
11397 char *salt_buf = input_buf + 32 + 1;
11398
11399 char *salt_buf_ptr = (char *) salt->salt_buf;
11400
11401 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11402
11403 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11404
11405 salt->salt_len = salt_len;
11406
11407 return (PARSER_OK);
11408 }
11409
11410 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11411 {
11412 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11413
11414 u32 *digest = (u32 *) hash_buf->digest;
11415
11416 salt_t *salt = hash_buf->salt;
11417
11418 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11419 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11420 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11421 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11422
11423 digest[0] = byte_swap_32 (digest[0]);
11424 digest[1] = byte_swap_32 (digest[1]);
11425 digest[2] = byte_swap_32 (digest[2]);
11426 digest[3] = byte_swap_32 (digest[3]);
11427
11428 digest[0] -= MD5M_A;
11429 digest[1] -= MD5M_B;
11430 digest[2] -= MD5M_C;
11431 digest[3] -= MD5M_D;
11432
11433 /**
11434 * This is a virtual salt. While the algorithm is basically not salted
11435 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11436 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11437 */
11438
11439 char *salt_buf_ptr = (char *) salt->salt_buf;
11440
11441 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11442
11443 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11444
11445 salt->salt_len = salt_len;
11446
11447 return (PARSER_OK);
11448 }
11449
11450 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11451 {
11452 if (data.opts_type & OPTS_TYPE_ST_HEX)
11453 {
11454 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11455 }
11456 else
11457 {
11458 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11459 }
11460
11461 u32 *digest = (u32 *) hash_buf->digest;
11462
11463 salt_t *salt = hash_buf->salt;
11464
11465 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11466 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11467 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11468 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11469
11470 digest[0] = byte_swap_32 (digest[0]);
11471 digest[1] = byte_swap_32 (digest[1]);
11472 digest[2] = byte_swap_32 (digest[2]);
11473 digest[3] = byte_swap_32 (digest[3]);
11474
11475 digest[0] -= MD5M_A;
11476 digest[1] -= MD5M_B;
11477 digest[2] -= MD5M_C;
11478 digest[3] -= MD5M_D;
11479
11480 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11481
11482 uint salt_len = input_len - 32 - 1;
11483
11484 char *salt_buf = input_buf + 32 + 1;
11485
11486 char *salt_buf_ptr = (char *) salt->salt_buf;
11487
11488 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11489
11490 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11491
11492 salt->salt_len = salt_len;
11493
11494 return (PARSER_OK);
11495 }
11496
11497 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11498 {
11499 if (data.opts_type & OPTS_TYPE_ST_HEX)
11500 {
11501 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11502 }
11503 else
11504 {
11505 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11506 }
11507
11508 u32 *digest = (u32 *) hash_buf->digest;
11509
11510 salt_t *salt = hash_buf->salt;
11511
11512 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11513 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11514 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11515 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11516
11517 digest[0] = byte_swap_32 (digest[0]);
11518 digest[1] = byte_swap_32 (digest[1]);
11519 digest[2] = byte_swap_32 (digest[2]);
11520 digest[3] = byte_swap_32 (digest[3]);
11521
11522 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11523
11524 uint salt_len = input_len - 32 - 1;
11525
11526 char *salt_buf = input_buf + 32 + 1;
11527
11528 char *salt_buf_ptr = (char *) salt->salt_buf;
11529
11530 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11531
11532 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11533
11534 salt->salt_len = salt_len;
11535
11536 return (PARSER_OK);
11537 }
11538
11539 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11540 {
11541 if (data.opts_type & OPTS_TYPE_ST_HEX)
11542 {
11543 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11544 }
11545 else
11546 {
11547 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11548 }
11549
11550 u32 *digest = (u32 *) hash_buf->digest;
11551
11552 salt_t *salt = hash_buf->salt;
11553
11554 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11555 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11556 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11557 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11558
11559 digest[0] = byte_swap_32 (digest[0]);
11560 digest[1] = byte_swap_32 (digest[1]);
11561 digest[2] = byte_swap_32 (digest[2]);
11562 digest[3] = byte_swap_32 (digest[3]);
11563
11564 digest[0] -= MD4M_A;
11565 digest[1] -= MD4M_B;
11566 digest[2] -= MD4M_C;
11567 digest[3] -= MD4M_D;
11568
11569 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11570
11571 uint salt_len = input_len - 32 - 1;
11572
11573 char *salt_buf = input_buf + 32 + 1;
11574
11575 char *salt_buf_ptr = (char *) salt->salt_buf;
11576
11577 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11578
11579 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11580
11581 salt->salt_len = salt_len;
11582
11583 return (PARSER_OK);
11584 }
11585
11586 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11587 {
11588 if (data.opts_type & OPTS_TYPE_ST_HEX)
11589 {
11590 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11591 }
11592 else
11593 {
11594 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11595 }
11596
11597 u32 *digest = (u32 *) hash_buf->digest;
11598
11599 salt_t *salt = hash_buf->salt;
11600
11601 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11602 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11603 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11604 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11605
11606 digest[0] = byte_swap_32 (digest[0]);
11607 digest[1] = byte_swap_32 (digest[1]);
11608 digest[2] = byte_swap_32 (digest[2]);
11609 digest[3] = byte_swap_32 (digest[3]);
11610
11611 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11612
11613 uint salt_len = input_len - 32 - 1;
11614
11615 char *salt_buf = input_buf + 32 + 1;
11616
11617 uint salt_pc_block[16] = { 0 };
11618
11619 char *salt_pc_block_ptr = (char *) salt_pc_block;
11620
11621 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11622
11623 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11624
11625 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11626
11627 salt_pc_block[14] = salt_len * 8;
11628
11629 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11630
11631 md5_64 (salt_pc_block, salt_pc_digest);
11632
11633 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11634 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11635 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11636 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11637
11638 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11639
11640 memcpy (salt_buf_ptr, salt_buf, salt_len);
11641
11642 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11643
11644 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11645 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11646 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11647 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11648
11649 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11650
11651 return (PARSER_OK);
11652 }
11653
11654 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11655 {
11656 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11657
11658 u32 *digest = (u32 *) hash_buf->digest;
11659
11660 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11661 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11662 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11663 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11664 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11665
11666 digest[0] -= SHA1M_A;
11667 digest[1] -= SHA1M_B;
11668 digest[2] -= SHA1M_C;
11669 digest[3] -= SHA1M_D;
11670 digest[4] -= SHA1M_E;
11671
11672 return (PARSER_OK);
11673 }
11674
11675 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11676 {
11677 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11678
11679 u32 *digest = (u32 *) hash_buf->digest;
11680
11681 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11682 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11683 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11684 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11685 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11686
11687 return (PARSER_OK);
11688 }
11689
11690 int sha1axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11691 {
11692 if ((input_len < DISPLAY_LEN_MIN_13300) || (input_len > DISPLAY_LEN_MAX_13300)) return (PARSER_GLOBAL_LENGTH);
11693
11694 if (memcmp (SIGNATURE_AXCRYPT_SHA1, input_buf, 13)) return (PARSER_SIGNATURE_UNMATCHED);
11695
11696 u32 *digest = (u32 *) hash_buf->digest;
11697
11698 input_buf +=14;
11699
11700 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11701 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11702 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11703 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11704 digest[4] = 0x00000000;
11705
11706 return (PARSER_OK);
11707 }
11708
11709 int sha1s_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_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11714 }
11715 else
11716 {
11717 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) 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] = hex_to_u32 ((const u8 *) &input_buf[16]);
11727 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11728 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11729
11730 digest[0] -= SHA1M_A;
11731 digest[1] -= SHA1M_B;
11732 digest[2] -= SHA1M_C;
11733 digest[3] -= SHA1M_D;
11734 digest[4] -= SHA1M_E;
11735
11736 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11737
11738 uint salt_len = input_len - 40 - 1;
11739
11740 char *salt_buf = input_buf + 40 + 1;
11741
11742 char *salt_buf_ptr = (char *) salt->salt_buf;
11743
11744 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11745
11746 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11747
11748 salt->salt_len = salt_len;
11749
11750 return (PARSER_OK);
11751 }
11752
11753 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11754 {
11755 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11756
11757 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11758
11759 u32 *digest = (u32 *) hash_buf->digest;
11760
11761 u8 tmp_buf[100] = { 0 };
11762
11763 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11764
11765 memcpy (digest, tmp_buf, 20);
11766
11767 digest[0] = byte_swap_32 (digest[0]);
11768 digest[1] = byte_swap_32 (digest[1]);
11769 digest[2] = byte_swap_32 (digest[2]);
11770 digest[3] = byte_swap_32 (digest[3]);
11771 digest[4] = byte_swap_32 (digest[4]);
11772
11773 digest[0] -= SHA1M_A;
11774 digest[1] -= SHA1M_B;
11775 digest[2] -= SHA1M_C;
11776 digest[3] -= SHA1M_D;
11777 digest[4] -= SHA1M_E;
11778
11779 return (PARSER_OK);
11780 }
11781
11782 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11783 {
11784 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11785
11786 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11787
11788 u32 *digest = (u32 *) hash_buf->digest;
11789
11790 salt_t *salt = hash_buf->salt;
11791
11792 u8 tmp_buf[100] = { 0 };
11793
11794 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11795
11796 if (tmp_len < 20) return (PARSER_HASH_LENGTH);
11797
11798 memcpy (digest, tmp_buf, 20);
11799
11800 int salt_len = tmp_len - 20;
11801
11802 if (salt_len < 0) return (PARSER_SALT_LENGTH);
11803
11804 salt->salt_len = salt_len;
11805
11806 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11807
11808 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11809 {
11810 char *ptr = (char *) salt->salt_buf;
11811
11812 ptr[salt->salt_len] = 0x80;
11813 }
11814
11815 digest[0] = byte_swap_32 (digest[0]);
11816 digest[1] = byte_swap_32 (digest[1]);
11817 digest[2] = byte_swap_32 (digest[2]);
11818 digest[3] = byte_swap_32 (digest[3]);
11819 digest[4] = byte_swap_32 (digest[4]);
11820
11821 digest[0] -= SHA1M_A;
11822 digest[1] -= SHA1M_B;
11823 digest[2] -= SHA1M_C;
11824 digest[3] -= SHA1M_D;
11825 digest[4] -= SHA1M_E;
11826
11827 return (PARSER_OK);
11828 }
11829
11830 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11831 {
11832 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11833
11834 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11835
11836 u32 *digest = (u32 *) hash_buf->digest;
11837
11838 salt_t *salt = hash_buf->salt;
11839
11840 char *salt_buf = input_buf + 6;
11841
11842 uint salt_len = 8;
11843
11844 char *salt_buf_ptr = (char *) salt->salt_buf;
11845
11846 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11847
11848 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11849
11850 salt->salt_len = salt_len;
11851
11852 char *hash_pos = input_buf + 6 + 8 + 40;
11853
11854 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11855 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11856 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11857 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11858 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11859
11860 digest[0] -= SHA1M_A;
11861 digest[1] -= SHA1M_B;
11862 digest[2] -= SHA1M_C;
11863 digest[3] -= SHA1M_D;
11864 digest[4] -= SHA1M_E;
11865
11866 return (PARSER_OK);
11867 }
11868
11869 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11870 {
11871 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11872
11873 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11874
11875 u32 *digest = (u32 *) hash_buf->digest;
11876
11877 salt_t *salt = hash_buf->salt;
11878
11879 char *salt_buf = input_buf + 6;
11880
11881 uint salt_len = 8;
11882
11883 char *salt_buf_ptr = (char *) salt->salt_buf;
11884
11885 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11886
11887 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11888
11889 salt->salt_len = salt_len;
11890
11891 char *hash_pos = input_buf + 6 + 8;
11892
11893 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11894 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11895 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11896 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11897 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11898
11899 digest[0] -= SHA1M_A;
11900 digest[1] -= SHA1M_B;
11901 digest[2] -= SHA1M_C;
11902 digest[3] -= SHA1M_D;
11903 digest[4] -= SHA1M_E;
11904
11905 return (PARSER_OK);
11906 }
11907
11908 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11909 {
11910 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11911
11912 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11913
11914 u64 *digest = (u64 *) hash_buf->digest;
11915
11916 salt_t *salt = hash_buf->salt;
11917
11918 char *salt_buf = input_buf + 6;
11919
11920 uint salt_len = 8;
11921
11922 char *salt_buf_ptr = (char *) salt->salt_buf;
11923
11924 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11925
11926 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11927
11928 salt->salt_len = salt_len;
11929
11930 char *hash_pos = input_buf + 6 + 8;
11931
11932 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11933 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11934 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11935 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11936 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11937 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11938 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11939 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11940
11941 digest[0] -= SHA512M_A;
11942 digest[1] -= SHA512M_B;
11943 digest[2] -= SHA512M_C;
11944 digest[3] -= SHA512M_D;
11945 digest[4] -= SHA512M_E;
11946 digest[5] -= SHA512M_F;
11947 digest[6] -= SHA512M_G;
11948 digest[7] -= SHA512M_H;
11949
11950 return (PARSER_OK);
11951 }
11952
11953 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11954 {
11955 if (data.opts_type & OPTS_TYPE_ST_HEX)
11956 {
11957 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11958 }
11959 else
11960 {
11961 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11962 }
11963
11964 u32 *digest = (u32 *) hash_buf->digest;
11965
11966 salt_t *salt = hash_buf->salt;
11967
11968 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11969 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11970 digest[2] = 0;
11971 digest[3] = 0;
11972
11973 digest[0] = byte_swap_32 (digest[0]);
11974 digest[1] = byte_swap_32 (digest[1]);
11975
11976 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11977
11978 uint salt_len = input_len - 16 - 1;
11979
11980 char *salt_buf = input_buf + 16 + 1;
11981
11982 char *salt_buf_ptr = (char *) salt->salt_buf;
11983
11984 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11985
11986 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11987
11988 salt->salt_len = salt_len;
11989
11990 return (PARSER_OK);
11991 }
11992
11993 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11994 {
11995 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11996
11997 u32 *digest = (u32 *) hash_buf->digest;
11998
11999 salt_t *salt = hash_buf->salt;
12000
12001 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12002 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12003 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12004 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12005 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12006
12007 digest[0] -= SHA1M_A;
12008 digest[1] -= SHA1M_B;
12009 digest[2] -= SHA1M_C;
12010 digest[3] -= SHA1M_D;
12011 digest[4] -= SHA1M_E;
12012
12013 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12014
12015 uint salt_len = input_len - 40 - 1;
12016
12017 char *salt_buf = input_buf + 40 + 1;
12018
12019 char *salt_buf_ptr = (char *) salt->salt_buf;
12020
12021 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12022
12023 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12024
12025 salt->salt_len = salt_len;
12026
12027 return (PARSER_OK);
12028 }
12029
12030 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12031 {
12032 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
12033
12034 u32 *digest = (u32 *) hash_buf->digest;
12035
12036 salt_t *salt = hash_buf->salt;
12037
12038 char *hash_pos = input_buf;
12039
12040 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12041 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12042 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
12043 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
12044 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
12045 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
12046 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
12047 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
12048 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12049 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12050 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12051 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12052 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12053 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12054 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12055 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12056
12057 char *salt_pos = input_buf + 128;
12058
12059 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12060 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12061 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12062 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12063
12064 salt->salt_iter = ROUNDS_ORACLET - 1;
12065 salt->salt_len = 16;
12066
12067 return (PARSER_OK);
12068 }
12069
12070 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12071 {
12072 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12073
12074 u32 *digest = (u32 *) hash_buf->digest;
12075
12076 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12077 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12078 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12079 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12080 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12081 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12082 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12083 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12084
12085 digest[0] -= SHA256M_A;
12086 digest[1] -= SHA256M_B;
12087 digest[2] -= SHA256M_C;
12088 digest[3] -= SHA256M_D;
12089 digest[4] -= SHA256M_E;
12090 digest[5] -= SHA256M_F;
12091 digest[6] -= SHA256M_G;
12092 digest[7] -= SHA256M_H;
12093
12094 return (PARSER_OK);
12095 }
12096
12097 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12098 {
12099 if (data.opts_type & OPTS_TYPE_ST_HEX)
12100 {
12101 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12102 }
12103 else
12104 {
12105 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
12106 }
12107
12108 u32 *digest = (u32 *) hash_buf->digest;
12109
12110 salt_t *salt = hash_buf->salt;
12111
12112 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12113 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12114 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12115 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12116 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12117 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12118 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12119 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12120
12121 digest[0] -= SHA256M_A;
12122 digest[1] -= SHA256M_B;
12123 digest[2] -= SHA256M_C;
12124 digest[3] -= SHA256M_D;
12125 digest[4] -= SHA256M_E;
12126 digest[5] -= SHA256M_F;
12127 digest[6] -= SHA256M_G;
12128 digest[7] -= SHA256M_H;
12129
12130 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12131
12132 uint salt_len = input_len - 64 - 1;
12133
12134 char *salt_buf = input_buf + 64 + 1;
12135
12136 char *salt_buf_ptr = (char *) salt->salt_buf;
12137
12138 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12139
12140 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12141
12142 salt->salt_len = salt_len;
12143
12144 return (PARSER_OK);
12145 }
12146
12147 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12148 {
12149 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12150
12151 u64 *digest = (u64 *) hash_buf->digest;
12152
12153 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12154 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12155 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12156 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12157 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12158 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12159 digest[6] = 0;
12160 digest[7] = 0;
12161
12162 digest[0] -= SHA384M_A;
12163 digest[1] -= SHA384M_B;
12164 digest[2] -= SHA384M_C;
12165 digest[3] -= SHA384M_D;
12166 digest[4] -= SHA384M_E;
12167 digest[5] -= SHA384M_F;
12168 digest[6] -= 0;
12169 digest[7] -= 0;
12170
12171 return (PARSER_OK);
12172 }
12173
12174 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12175 {
12176 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12177
12178 u64 *digest = (u64 *) hash_buf->digest;
12179
12180 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12181 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12182 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12183 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12184 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12185 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12186 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12187 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12188
12189 digest[0] -= SHA512M_A;
12190 digest[1] -= SHA512M_B;
12191 digest[2] -= SHA512M_C;
12192 digest[3] -= SHA512M_D;
12193 digest[4] -= SHA512M_E;
12194 digest[5] -= SHA512M_F;
12195 digest[6] -= SHA512M_G;
12196 digest[7] -= SHA512M_H;
12197
12198 return (PARSER_OK);
12199 }
12200
12201 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12202 {
12203 if (data.opts_type & OPTS_TYPE_ST_HEX)
12204 {
12205 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12206 }
12207 else
12208 {
12209 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12210 }
12211
12212 u64 *digest = (u64 *) hash_buf->digest;
12213
12214 salt_t *salt = hash_buf->salt;
12215
12216 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12217 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12218 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12219 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12220 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12221 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12222 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12223 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12224
12225 digest[0] -= SHA512M_A;
12226 digest[1] -= SHA512M_B;
12227 digest[2] -= SHA512M_C;
12228 digest[3] -= SHA512M_D;
12229 digest[4] -= SHA512M_E;
12230 digest[5] -= SHA512M_F;
12231 digest[6] -= SHA512M_G;
12232 digest[7] -= SHA512M_H;
12233
12234 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12235
12236 uint salt_len = input_len - 128 - 1;
12237
12238 char *salt_buf = input_buf + 128 + 1;
12239
12240 char *salt_buf_ptr = (char *) salt->salt_buf;
12241
12242 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12243
12244 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12245
12246 salt->salt_len = salt_len;
12247
12248 return (PARSER_OK);
12249 }
12250
12251 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12252 {
12253 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12254
12255 u64 *digest = (u64 *) hash_buf->digest;
12256
12257 salt_t *salt = hash_buf->salt;
12258
12259 char *salt_pos = input_buf + 3;
12260
12261 uint iterations_len = 0;
12262
12263 if (memcmp (salt_pos, "rounds=", 7) == 0)
12264 {
12265 salt_pos += 7;
12266
12267 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12268
12269 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12270 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12271
12272 salt_pos[0] = 0x0;
12273
12274 salt->salt_iter = atoi (salt_pos - iterations_len);
12275
12276 salt_pos += 1;
12277
12278 iterations_len += 8;
12279 }
12280 else
12281 {
12282 salt->salt_iter = ROUNDS_SHA512CRYPT;
12283 }
12284
12285 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12286
12287 char *hash_pos = strchr (salt_pos, '$');
12288
12289 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12290
12291 uint salt_len = hash_pos - salt_pos;
12292
12293 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12294
12295 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12296
12297 salt->salt_len = salt_len;
12298
12299 hash_pos++;
12300
12301 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12302
12303 return (PARSER_OK);
12304 }
12305
12306 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12307 {
12308 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12309
12310 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12311
12312 u64 *digest = (u64 *) hash_buf->digest;
12313
12314 salt_t *salt = hash_buf->salt;
12315
12316 uint keccak_mdlen = input_len / 2;
12317
12318 for (uint i = 0; i < keccak_mdlen / 8; i++)
12319 {
12320 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12321
12322 digest[i] = byte_swap_64 (digest[i]);
12323 }
12324
12325 salt->keccak_mdlen = keccak_mdlen;
12326
12327 return (PARSER_OK);
12328 }
12329
12330 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12331 {
12332 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12333
12334 u32 *digest = (u32 *) hash_buf->digest;
12335
12336 salt_t *salt = hash_buf->salt;
12337
12338 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12339
12340 /**
12341 * Parse that strange long line
12342 */
12343
12344 char *in_off[9];
12345
12346 size_t in_len[9] = { 0 };
12347
12348 in_off[0] = strtok (input_buf, ":");
12349
12350 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12351
12352 in_len[0] = strlen (in_off[0]);
12353
12354 size_t i;
12355
12356 for (i = 1; i < 9; i++)
12357 {
12358 in_off[i] = strtok (NULL, ":");
12359
12360 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12361
12362 in_len[i] = strlen (in_off[i]);
12363 }
12364
12365 char *ptr = (char *) ikepsk->msg_buf;
12366
12367 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12368 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12369 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12370 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12371 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12372 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12373
12374 *ptr = 0x80;
12375
12376 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12377
12378 ptr = (char *) ikepsk->nr_buf;
12379
12380 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12381 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12382
12383 *ptr = 0x80;
12384
12385 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12386
12387 /**
12388 * Store to database
12389 */
12390
12391 ptr = in_off[8];
12392
12393 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12394 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12395 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12396 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12397
12398 digest[0] = byte_swap_32 (digest[0]);
12399 digest[1] = byte_swap_32 (digest[1]);
12400 digest[2] = byte_swap_32 (digest[2]);
12401 digest[3] = byte_swap_32 (digest[3]);
12402
12403 salt->salt_len = 32;
12404
12405 salt->salt_buf[0] = ikepsk->nr_buf[0];
12406 salt->salt_buf[1] = ikepsk->nr_buf[1];
12407 salt->salt_buf[2] = ikepsk->nr_buf[2];
12408 salt->salt_buf[3] = ikepsk->nr_buf[3];
12409 salt->salt_buf[4] = ikepsk->nr_buf[4];
12410 salt->salt_buf[5] = ikepsk->nr_buf[5];
12411 salt->salt_buf[6] = ikepsk->nr_buf[6];
12412 salt->salt_buf[7] = ikepsk->nr_buf[7];
12413
12414 return (PARSER_OK);
12415 }
12416
12417 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12418 {
12419 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12420
12421 u32 *digest = (u32 *) hash_buf->digest;
12422
12423 salt_t *salt = hash_buf->salt;
12424
12425 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12426
12427 /**
12428 * Parse that strange long line
12429 */
12430
12431 char *in_off[9];
12432
12433 size_t in_len[9] = { 0 };
12434
12435 in_off[0] = strtok (input_buf, ":");
12436
12437 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12438
12439 in_len[0] = strlen (in_off[0]);
12440
12441 size_t i;
12442
12443 for (i = 1; i < 9; i++)
12444 {
12445 in_off[i] = strtok (NULL, ":");
12446
12447 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12448
12449 in_len[i] = strlen (in_off[i]);
12450 }
12451
12452 char *ptr = (char *) ikepsk->msg_buf;
12453
12454 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12455 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12456 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12457 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12458 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12459 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12460
12461 *ptr = 0x80;
12462
12463 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12464
12465 ptr = (char *) ikepsk->nr_buf;
12466
12467 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12468 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12469
12470 *ptr = 0x80;
12471
12472 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12473
12474 /**
12475 * Store to database
12476 */
12477
12478 ptr = in_off[8];
12479
12480 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12481 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12482 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12483 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12484 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12485
12486 salt->salt_len = 32;
12487
12488 salt->salt_buf[0] = ikepsk->nr_buf[0];
12489 salt->salt_buf[1] = ikepsk->nr_buf[1];
12490 salt->salt_buf[2] = ikepsk->nr_buf[2];
12491 salt->salt_buf[3] = ikepsk->nr_buf[3];
12492 salt->salt_buf[4] = ikepsk->nr_buf[4];
12493 salt->salt_buf[5] = ikepsk->nr_buf[5];
12494 salt->salt_buf[6] = ikepsk->nr_buf[6];
12495 salt->salt_buf[7] = ikepsk->nr_buf[7];
12496
12497 return (PARSER_OK);
12498 }
12499
12500 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12501 {
12502 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12503
12504 u32 *digest = (u32 *) hash_buf->digest;
12505
12506 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12507 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12508 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12509 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12510 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12511
12512 digest[0] = byte_swap_32 (digest[0]);
12513 digest[1] = byte_swap_32 (digest[1]);
12514 digest[2] = byte_swap_32 (digest[2]);
12515 digest[3] = byte_swap_32 (digest[3]);
12516 digest[4] = byte_swap_32 (digest[4]);
12517
12518 return (PARSER_OK);
12519 }
12520
12521 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12522 {
12523 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12524
12525 u32 *digest = (u32 *) hash_buf->digest;
12526
12527 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12528 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12529 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12530 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12531 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12532 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12533 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12534 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12535 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12536 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12537 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12538 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12539 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12540 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12541 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12542 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12543
12544 return (PARSER_OK);
12545 }
12546
12547 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12548 {
12549 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12550
12551 u32 *digest = (u32 *) hash_buf->digest;
12552
12553 salt_t *salt = hash_buf->salt;
12554
12555 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12556 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12557 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12558 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12559 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12560
12561 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12562
12563 uint salt_len = input_len - 40 - 1;
12564
12565 char *salt_buf = input_buf + 40 + 1;
12566
12567 char *salt_buf_ptr = (char *) salt->salt_buf;
12568
12569 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12570
12571 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12572
12573 salt->salt_len = salt_len;
12574
12575 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12576
12577 return (PARSER_OK);
12578 }
12579
12580 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12581 {
12582 u32 *digest = (u32 *) hash_buf->digest;
12583
12584 salt_t *salt = hash_buf->salt;
12585
12586 tc_t *tc = (tc_t *) hash_buf->esalt;
12587
12588 if (input_len == 0)
12589 {
12590 log_error ("TrueCrypt container not specified");
12591
12592 exit (-1);
12593 }
12594
12595 FILE *fp = fopen (input_buf, "rb");
12596
12597 if (fp == NULL)
12598 {
12599 log_error ("%s: %s", input_buf, strerror (errno));
12600
12601 exit (-1);
12602 }
12603
12604 char buf[512] = { 0 };
12605
12606 int n = fread (buf, 1, sizeof (buf), fp);
12607
12608 fclose (fp);
12609
12610 if (n != 512) return (PARSER_TC_FILE_SIZE);
12611
12612 memcpy (tc->salt_buf, buf, 64);
12613
12614 memcpy (tc->data_buf, buf + 64, 512 - 64);
12615
12616 salt->salt_buf[0] = tc->salt_buf[0];
12617
12618 salt->salt_len = 4;
12619
12620 salt->salt_iter = 1000 - 1;
12621
12622 digest[0] = tc->data_buf[0];
12623
12624 return (PARSER_OK);
12625 }
12626
12627 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12628 {
12629 u32 *digest = (u32 *) hash_buf->digest;
12630
12631 salt_t *salt = hash_buf->salt;
12632
12633 tc_t *tc = (tc_t *) hash_buf->esalt;
12634
12635 if (input_len == 0)
12636 {
12637 log_error ("TrueCrypt container not specified");
12638
12639 exit (-1);
12640 }
12641
12642 FILE *fp = fopen (input_buf, "rb");
12643
12644 if (fp == NULL)
12645 {
12646 log_error ("%s: %s", input_buf, strerror (errno));
12647
12648 exit (-1);
12649 }
12650
12651 char buf[512] = { 0 };
12652
12653 int n = fread (buf, 1, sizeof (buf), fp);
12654
12655 fclose (fp);
12656
12657 if (n != 512) return (PARSER_TC_FILE_SIZE);
12658
12659 memcpy (tc->salt_buf, buf, 64);
12660
12661 memcpy (tc->data_buf, buf + 64, 512 - 64);
12662
12663 salt->salt_buf[0] = tc->salt_buf[0];
12664
12665 salt->salt_len = 4;
12666
12667 salt->salt_iter = 2000 - 1;
12668
12669 digest[0] = tc->data_buf[0];
12670
12671 return (PARSER_OK);
12672 }
12673
12674 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12675 {
12676 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12677
12678 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12679
12680 u32 *digest = (u32 *) hash_buf->digest;
12681
12682 salt_t *salt = hash_buf->salt;
12683
12684 char *salt_pos = input_buf + 6;
12685
12686 char *hash_pos = strchr (salt_pos, '$');
12687
12688 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12689
12690 uint salt_len = hash_pos - salt_pos;
12691
12692 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12693
12694 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12695
12696 salt->salt_len = salt_len;
12697
12698 salt->salt_iter = 1000;
12699
12700 hash_pos++;
12701
12702 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12703
12704 return (PARSER_OK);
12705 }
12706
12707 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12708 {
12709 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12710
12711 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12712
12713 u32 *digest = (u32 *) hash_buf->digest;
12714
12715 salt_t *salt = hash_buf->salt;
12716
12717 char *iter_pos = input_buf + 7;
12718
12719 char *salt_pos = strchr (iter_pos, '$');
12720
12721 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12722
12723 salt_pos++;
12724
12725 char *hash_pos = strchr (salt_pos, '$');
12726
12727 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12728
12729 uint salt_len = hash_pos - salt_pos;
12730
12731 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12732
12733 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12734
12735 salt->salt_len = salt_len;
12736
12737 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12738
12739 salt->salt_sign[0] = atoi (salt_iter);
12740
12741 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12742
12743 hash_pos++;
12744
12745 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12746
12747 digest[0] = byte_swap_32 (digest[0]);
12748 digest[1] = byte_swap_32 (digest[1]);
12749 digest[2] = byte_swap_32 (digest[2]);
12750 digest[3] = byte_swap_32 (digest[3]);
12751 digest[4] = byte_swap_32 (digest[4]);
12752
12753 return (PARSER_OK);
12754 }
12755
12756 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12757 {
12758 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12759
12760 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12761
12762 u32 *digest = (u32 *) hash_buf->digest;
12763
12764 salt_t *salt = hash_buf->salt;
12765
12766 char *iter_pos = input_buf + 9;
12767
12768 char *salt_pos = strchr (iter_pos, '$');
12769
12770 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12771
12772 salt_pos++;
12773
12774 char *hash_pos = strchr (salt_pos, '$');
12775
12776 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12777
12778 uint salt_len = hash_pos - salt_pos;
12779
12780 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12781
12782 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12783
12784 salt->salt_len = salt_len;
12785
12786 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12787
12788 salt->salt_sign[0] = atoi (salt_iter);
12789
12790 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12791
12792 hash_pos++;
12793
12794 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12795
12796 digest[0] = byte_swap_32 (digest[0]);
12797 digest[1] = byte_swap_32 (digest[1]);
12798 digest[2] = byte_swap_32 (digest[2]);
12799 digest[3] = byte_swap_32 (digest[3]);
12800 digest[4] = byte_swap_32 (digest[4]);
12801 digest[5] = byte_swap_32 (digest[5]);
12802 digest[6] = byte_swap_32 (digest[6]);
12803 digest[7] = byte_swap_32 (digest[7]);
12804
12805 return (PARSER_OK);
12806 }
12807
12808 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12809 {
12810 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12811
12812 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12813
12814 u64 *digest = (u64 *) hash_buf->digest;
12815
12816 salt_t *salt = hash_buf->salt;
12817
12818 char *iter_pos = input_buf + 9;
12819
12820 char *salt_pos = strchr (iter_pos, '$');
12821
12822 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12823
12824 salt_pos++;
12825
12826 char *hash_pos = strchr (salt_pos, '$');
12827
12828 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12829
12830 uint salt_len = hash_pos - salt_pos;
12831
12832 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12833
12834 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12835
12836 salt->salt_len = salt_len;
12837
12838 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12839
12840 salt->salt_sign[0] = atoi (salt_iter);
12841
12842 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12843
12844 hash_pos++;
12845
12846 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12847
12848 digest[0] = byte_swap_64 (digest[0]);
12849 digest[1] = byte_swap_64 (digest[1]);
12850 digest[2] = byte_swap_64 (digest[2]);
12851 digest[3] = byte_swap_64 (digest[3]);
12852 digest[4] = byte_swap_64 (digest[4]);
12853 digest[5] = byte_swap_64 (digest[5]);
12854 digest[6] = byte_swap_64 (digest[6]);
12855 digest[7] = byte_swap_64 (digest[7]);
12856
12857 return (PARSER_OK);
12858 }
12859
12860 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12861 {
12862 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12863
12864 u32 *digest = (u32 *) hash_buf->digest;
12865
12866 salt_t *salt = hash_buf->salt;
12867
12868 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12869
12870 /**
12871 * parse line
12872 */
12873
12874 char *iterations_pos = input_buf;
12875
12876 char *saltbuf_pos = strchr (iterations_pos, ':');
12877
12878 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12879
12880 uint iterations_len = saltbuf_pos - iterations_pos;
12881
12882 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12883
12884 saltbuf_pos++;
12885
12886 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12887
12888 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12889
12890 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12891
12892 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12893
12894 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12895
12896 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12897
12898 cipherbuf_pos++;
12899
12900 /**
12901 * pbkdf2 iterations
12902 */
12903
12904 salt->salt_iter = atoi (iterations_pos) - 1;
12905
12906 /**
12907 * handle salt encoding
12908 */
12909
12910 char *saltbuf_ptr = (char *) salt->salt_buf;
12911
12912 for (uint i = 0; i < saltbuf_len; i += 2)
12913 {
12914 const char p0 = saltbuf_pos[i + 0];
12915 const char p1 = saltbuf_pos[i + 1];
12916
12917 *saltbuf_ptr++ = hex_convert (p1) << 0
12918 | hex_convert (p0) << 4;
12919 }
12920
12921 salt->salt_len = saltbuf_len / 2;
12922
12923 /**
12924 * handle cipher encoding
12925 */
12926
12927 uint *tmp = (uint *) mymalloc (32);
12928
12929 char *cipherbuf_ptr = (char *) tmp;
12930
12931 for (uint i = 2016; i < cipherbuf_len; i += 2)
12932 {
12933 const char p0 = cipherbuf_pos[i + 0];
12934 const char p1 = cipherbuf_pos[i + 1];
12935
12936 *cipherbuf_ptr++ = hex_convert (p1) << 0
12937 | hex_convert (p0) << 4;
12938 }
12939
12940 // iv is stored at salt_buf 4 (length 16)
12941 // data is stored at salt_buf 8 (length 16)
12942
12943 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12944 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12945 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12946 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12947
12948 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12949 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12950 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12951 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12952
12953 free (tmp);
12954
12955 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12956 {
12957 const char p0 = cipherbuf_pos[j + 0];
12958 const char p1 = cipherbuf_pos[j + 1];
12959
12960 agilekey->cipher[i] = hex_convert (p1) << 0
12961 | hex_convert (p0) << 4;
12962 }
12963
12964 /**
12965 * digest buf
12966 */
12967
12968 digest[0] = 0x10101010;
12969 digest[1] = 0x10101010;
12970 digest[2] = 0x10101010;
12971 digest[3] = 0x10101010;
12972
12973 return (PARSER_OK);
12974 }
12975
12976 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12977 {
12978 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12979
12980 u32 *digest = (u32 *) hash_buf->digest;
12981
12982 salt_t *salt = hash_buf->salt;
12983
12984 char *hashbuf_pos = input_buf;
12985
12986 char *iterations_pos = strchr (hashbuf_pos, ':');
12987
12988 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12989
12990 uint hash_len = iterations_pos - hashbuf_pos;
12991
12992 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12993
12994 iterations_pos++;
12995
12996 char *saltbuf_pos = strchr (iterations_pos, ':');
12997
12998 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12999
13000 uint iterations_len = saltbuf_pos - iterations_pos;
13001
13002 saltbuf_pos++;
13003
13004 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
13005
13006 if (salt_len > 32) return (PARSER_SALT_LENGTH);
13007
13008 char *salt_buf_ptr = (char *) salt->salt_buf;
13009
13010 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
13011
13012 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13013
13014 salt->salt_len = salt_len;
13015
13016 salt->salt_iter = atoi (iterations_pos) - 1;
13017
13018 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13019 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13020 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13021 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13022
13023 return (PARSER_OK);
13024 }
13025
13026 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13027 {
13028 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
13029
13030 u32 *digest = (u32 *) hash_buf->digest;
13031
13032 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13033 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13034 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13035 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13036 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13037 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13038 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13039 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13040
13041 digest[0] = byte_swap_32 (digest[0]);
13042 digest[1] = byte_swap_32 (digest[1]);
13043 digest[2] = byte_swap_32 (digest[2]);
13044 digest[3] = byte_swap_32 (digest[3]);
13045 digest[4] = byte_swap_32 (digest[4]);
13046 digest[5] = byte_swap_32 (digest[5]);
13047 digest[6] = byte_swap_32 (digest[6]);
13048 digest[7] = byte_swap_32 (digest[7]);
13049
13050 return (PARSER_OK);
13051 }
13052
13053 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13054 {
13055 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13056
13057 u32 *digest = (u32 *) hash_buf->digest;
13058
13059 salt_t *salt = hash_buf->salt;
13060
13061 char *salt_pos = input_buf + 3;
13062
13063 uint iterations_len = 0;
13064
13065 if (memcmp (salt_pos, "rounds=", 7) == 0)
13066 {
13067 salt_pos += 7;
13068
13069 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13070
13071 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13072 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13073
13074 salt_pos[0] = 0x0;
13075
13076 salt->salt_iter = atoi (salt_pos - iterations_len);
13077
13078 salt_pos += 1;
13079
13080 iterations_len += 8;
13081 }
13082 else
13083 {
13084 salt->salt_iter = ROUNDS_SHA256CRYPT;
13085 }
13086
13087 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13088
13089 char *hash_pos = strchr (salt_pos, '$');
13090
13091 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13092
13093 uint salt_len = hash_pos - salt_pos;
13094
13095 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13096
13097 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13098
13099 salt->salt_len = salt_len;
13100
13101 hash_pos++;
13102
13103 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13104
13105 return (PARSER_OK);
13106 }
13107
13108 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13109 {
13110 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13111
13112 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13113
13114 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13115
13116 u64 *digest = (u64 *) hash_buf->digest;
13117
13118 salt_t *salt = hash_buf->salt;
13119
13120 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13121
13122 char *iter_pos = input_buf + 4;
13123
13124 char *salt_pos = strchr (iter_pos, '$');
13125
13126 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13127
13128 salt_pos++;
13129
13130 char *hash_pos = strchr (salt_pos, '$');
13131
13132 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13133
13134 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13135
13136 hash_pos++;
13137
13138 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13139 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13140 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13141 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13142 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13143 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13144 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13145 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13146
13147 uint salt_len = hash_pos - salt_pos - 1;
13148
13149 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13150
13151 salt->salt_len = salt_len / 2;
13152
13153 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13154 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13155 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13156 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13157 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13158 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13159 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13160 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13161
13162 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13163 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13164 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13165 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13166 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13167 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13168 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13169 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13170 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13171 pbkdf2_sha512->salt_buf[9] = 0x80;
13172
13173 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13174
13175 salt->salt_iter = atoi (iter_pos) - 1;
13176
13177 return (PARSER_OK);
13178 }
13179
13180 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13181 {
13182 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13183
13184 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13185
13186 u32 *digest = (u32 *) hash_buf->digest;
13187
13188 salt_t *salt = hash_buf->salt;
13189
13190 char *salt_pos = input_buf + 14;
13191
13192 char *hash_pos = strchr (salt_pos, '*');
13193
13194 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13195
13196 hash_pos++;
13197
13198 uint salt_len = hash_pos - salt_pos - 1;
13199
13200 char *salt_buf_ptr = (char *) salt->salt_buf;
13201
13202 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13203
13204 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13205
13206 salt->salt_len = salt_len;
13207
13208 u8 tmp_buf[100] = { 0 };
13209
13210 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13211
13212 memcpy (digest, tmp_buf, 32);
13213
13214 digest[0] = byte_swap_32 (digest[0]);
13215 digest[1] = byte_swap_32 (digest[1]);
13216 digest[2] = byte_swap_32 (digest[2]);
13217 digest[3] = byte_swap_32 (digest[3]);
13218 digest[4] = byte_swap_32 (digest[4]);
13219 digest[5] = byte_swap_32 (digest[5]);
13220 digest[6] = byte_swap_32 (digest[6]);
13221 digest[7] = byte_swap_32 (digest[7]);
13222
13223 digest[0] -= SHA256M_A;
13224 digest[1] -= SHA256M_B;
13225 digest[2] -= SHA256M_C;
13226 digest[3] -= SHA256M_D;
13227 digest[4] -= SHA256M_E;
13228 digest[5] -= SHA256M_F;
13229 digest[6] -= SHA256M_G;
13230 digest[7] -= SHA256M_H;
13231
13232 return (PARSER_OK);
13233 }
13234
13235 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13236 {
13237 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13238
13239 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13240
13241 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13242
13243 u64 *digest = (u64 *) hash_buf->digest;
13244
13245 salt_t *salt = hash_buf->salt;
13246
13247 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13248
13249 char *iter_pos = input_buf + 19;
13250
13251 char *salt_pos = strchr (iter_pos, '.');
13252
13253 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13254
13255 salt_pos++;
13256
13257 char *hash_pos = strchr (salt_pos, '.');
13258
13259 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13260
13261 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13262
13263 hash_pos++;
13264
13265 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13266 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13267 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13268 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13269 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13270 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13271 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13272 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13273
13274 uint salt_len = hash_pos - salt_pos - 1;
13275
13276 salt_len /= 2;
13277
13278 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13279
13280 uint i;
13281
13282 for (i = 0; i < salt_len; i++)
13283 {
13284 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13285 }
13286
13287 salt_buf_ptr[salt_len + 3] = 0x01;
13288 salt_buf_ptr[salt_len + 4] = 0x80;
13289
13290 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13291
13292 salt->salt_len = salt_len;
13293
13294 salt->salt_iter = atoi (iter_pos) - 1;
13295
13296 return (PARSER_OK);
13297 }
13298
13299 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13300 {
13301 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13302
13303 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13304
13305 u64 *digest = (u64 *) hash_buf->digest;
13306
13307 salt_t *salt = hash_buf->salt;
13308
13309 u8 tmp_buf[120] = { 0 };
13310
13311 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13312
13313 if (tmp_len < 64) return (PARSER_HASH_LENGTH);
13314
13315 memcpy (digest, tmp_buf, 64);
13316
13317 digest[0] = byte_swap_64 (digest[0]);
13318 digest[1] = byte_swap_64 (digest[1]);
13319 digest[2] = byte_swap_64 (digest[2]);
13320 digest[3] = byte_swap_64 (digest[3]);
13321 digest[4] = byte_swap_64 (digest[4]);
13322 digest[5] = byte_swap_64 (digest[5]);
13323 digest[6] = byte_swap_64 (digest[6]);
13324 digest[7] = byte_swap_64 (digest[7]);
13325
13326 digest[0] -= SHA512M_A;
13327 digest[1] -= SHA512M_B;
13328 digest[2] -= SHA512M_C;
13329 digest[3] -= SHA512M_D;
13330 digest[4] -= SHA512M_E;
13331 digest[5] -= SHA512M_F;
13332 digest[6] -= SHA512M_G;
13333 digest[7] -= SHA512M_H;
13334
13335 int salt_len = tmp_len - 64;
13336
13337 if (salt_len < 0) return (PARSER_SALT_LENGTH);
13338
13339 salt->salt_len = salt_len;
13340
13341 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13342
13343 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13344 {
13345 char *ptr = (char *) salt->salt_buf;
13346
13347 ptr[salt->salt_len] = 0x80;
13348 }
13349
13350 return (PARSER_OK);
13351 }
13352
13353 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13354 {
13355 if (data.opts_type & OPTS_TYPE_ST_HEX)
13356 {
13357 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13358 }
13359 else
13360 {
13361 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13362 }
13363
13364 u32 *digest = (u32 *) hash_buf->digest;
13365
13366 salt_t *salt = hash_buf->salt;
13367
13368 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13369 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13370 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13371 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13372
13373 digest[0] = byte_swap_32 (digest[0]);
13374 digest[1] = byte_swap_32 (digest[1]);
13375 digest[2] = byte_swap_32 (digest[2]);
13376 digest[3] = byte_swap_32 (digest[3]);
13377
13378 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13379
13380 uint salt_len = input_len - 32 - 1;
13381
13382 char *salt_buf = input_buf + 32 + 1;
13383
13384 char *salt_buf_ptr = (char *) salt->salt_buf;
13385
13386 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13387
13388 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13389
13390 salt->salt_len = salt_len;
13391
13392 return (PARSER_OK);
13393 }
13394
13395 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13396 {
13397 if (data.opts_type & OPTS_TYPE_ST_HEX)
13398 {
13399 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13400 }
13401 else
13402 {
13403 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13404 }
13405
13406 u32 *digest = (u32 *) hash_buf->digest;
13407
13408 salt_t *salt = hash_buf->salt;
13409
13410 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13411 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13412 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13413 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13414 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13415
13416 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13417
13418 uint salt_len = input_len - 40 - 1;
13419
13420 char *salt_buf = input_buf + 40 + 1;
13421
13422 char *salt_buf_ptr = (char *) salt->salt_buf;
13423
13424 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13425
13426 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13427
13428 salt->salt_len = salt_len;
13429
13430 return (PARSER_OK);
13431 }
13432
13433 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13434 {
13435 if (data.opts_type & OPTS_TYPE_ST_HEX)
13436 {
13437 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13438 }
13439 else
13440 {
13441 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13442 }
13443
13444 u32 *digest = (u32 *) hash_buf->digest;
13445
13446 salt_t *salt = hash_buf->salt;
13447
13448 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13449 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13450 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13451 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13452 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13453 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13454 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13455 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13456
13457 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13458
13459 uint salt_len = input_len - 64 - 1;
13460
13461 char *salt_buf = input_buf + 64 + 1;
13462
13463 char *salt_buf_ptr = (char *) salt->salt_buf;
13464
13465 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13466
13467 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13468
13469 salt->salt_len = salt_len;
13470
13471 return (PARSER_OK);
13472 }
13473
13474 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13475 {
13476 if (data.opts_type & OPTS_TYPE_ST_HEX)
13477 {
13478 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13479 }
13480 else
13481 {
13482 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13483 }
13484
13485 u64 *digest = (u64 *) hash_buf->digest;
13486
13487 salt_t *salt = hash_buf->salt;
13488
13489 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13490 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13491 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13492 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13493 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13494 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13495 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13496 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13497
13498 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13499
13500 uint salt_len = input_len - 128 - 1;
13501
13502 char *salt_buf = input_buf + 128 + 1;
13503
13504 char *salt_buf_ptr = (char *) salt->salt_buf;
13505
13506 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13507
13508 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13509
13510 salt->salt_len = salt_len;
13511
13512 return (PARSER_OK);
13513 }
13514
13515 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13516 {
13517 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13518
13519 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13520
13521 u32 *digest = (u32 *) hash_buf->digest;
13522
13523 salt_t *salt = hash_buf->salt;
13524
13525 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13526
13527 /**
13528 * parse line
13529 */
13530
13531 char *user_pos = input_buf + 10 + 1;
13532
13533 char *realm_pos = strchr (user_pos, '$');
13534
13535 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13536
13537 uint user_len = realm_pos - user_pos;
13538
13539 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13540
13541 realm_pos++;
13542
13543 char *salt_pos = strchr (realm_pos, '$');
13544
13545 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13546
13547 uint realm_len = salt_pos - realm_pos;
13548
13549 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13550
13551 salt_pos++;
13552
13553 char *data_pos = strchr (salt_pos, '$');
13554
13555 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13556
13557 uint salt_len = data_pos - salt_pos;
13558
13559 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13560
13561 data_pos++;
13562
13563 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13564
13565 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13566
13567 /**
13568 * copy data
13569 */
13570
13571 memcpy (krb5pa->user, user_pos, user_len);
13572 memcpy (krb5pa->realm, realm_pos, realm_len);
13573 memcpy (krb5pa->salt, salt_pos, salt_len);
13574
13575 char *timestamp_ptr = (char *) krb5pa->timestamp;
13576
13577 for (uint i = 0; i < (36 * 2); i += 2)
13578 {
13579 const char p0 = data_pos[i + 0];
13580 const char p1 = data_pos[i + 1];
13581
13582 *timestamp_ptr++ = hex_convert (p1) << 0
13583 | hex_convert (p0) << 4;
13584 }
13585
13586 char *checksum_ptr = (char *) krb5pa->checksum;
13587
13588 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13589 {
13590 const char p0 = data_pos[i + 0];
13591 const char p1 = data_pos[i + 1];
13592
13593 *checksum_ptr++ = hex_convert (p1) << 0
13594 | hex_convert (p0) << 4;
13595 }
13596
13597 /**
13598 * copy some data to generic buffers to make sorting happy
13599 */
13600
13601 salt->salt_buf[0] = krb5pa->timestamp[0];
13602 salt->salt_buf[1] = krb5pa->timestamp[1];
13603 salt->salt_buf[2] = krb5pa->timestamp[2];
13604 salt->salt_buf[3] = krb5pa->timestamp[3];
13605 salt->salt_buf[4] = krb5pa->timestamp[4];
13606 salt->salt_buf[5] = krb5pa->timestamp[5];
13607 salt->salt_buf[6] = krb5pa->timestamp[6];
13608 salt->salt_buf[7] = krb5pa->timestamp[7];
13609 salt->salt_buf[8] = krb5pa->timestamp[8];
13610
13611 salt->salt_len = 36;
13612
13613 digest[0] = krb5pa->checksum[0];
13614 digest[1] = krb5pa->checksum[1];
13615 digest[2] = krb5pa->checksum[2];
13616 digest[3] = krb5pa->checksum[3];
13617
13618 return (PARSER_OK);
13619 }
13620
13621 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13622 {
13623 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13624
13625 u32 *digest = (u32 *) hash_buf->digest;
13626
13627 salt_t *salt = hash_buf->salt;
13628
13629 /**
13630 * parse line
13631 */
13632
13633 char *salt_pos = input_buf;
13634
13635 char *hash_pos = strchr (salt_pos, '$');
13636
13637 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13638
13639 uint salt_len = hash_pos - salt_pos;
13640
13641 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13642
13643 hash_pos++;
13644
13645 uint hash_len = input_len - 1 - salt_len;
13646
13647 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13648
13649 /**
13650 * valid some data
13651 */
13652
13653 uint user_len = 0;
13654
13655 for (uint i = 0; i < salt_len; i++)
13656 {
13657 if (salt_pos[i] == ' ') continue;
13658
13659 user_len++;
13660 }
13661
13662 // SAP user names cannot be longer than 12 characters
13663 if (user_len > 12) return (PARSER_SALT_LENGTH);
13664
13665 // SAP user name cannot start with ! or ?
13666 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13667
13668 /**
13669 * copy data
13670 */
13671
13672 char *salt_buf_ptr = (char *) salt->salt_buf;
13673
13674 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13675
13676 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13677
13678 salt->salt_len = salt_len;
13679
13680 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13681 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13682 digest[2] = 0;
13683 digest[3] = 0;
13684
13685 digest[0] = byte_swap_32 (digest[0]);
13686 digest[1] = byte_swap_32 (digest[1]);
13687
13688 return (PARSER_OK);
13689 }
13690
13691 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13692 {
13693 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13694
13695 u32 *digest = (u32 *) hash_buf->digest;
13696
13697 salt_t *salt = hash_buf->salt;
13698
13699 /**
13700 * parse line
13701 */
13702
13703 char *salt_pos = input_buf;
13704
13705 char *hash_pos = strchr (salt_pos, '$');
13706
13707 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13708
13709 uint salt_len = hash_pos - salt_pos;
13710
13711 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13712
13713 hash_pos++;
13714
13715 uint hash_len = input_len - 1 - salt_len;
13716
13717 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13718
13719 /**
13720 * valid some data
13721 */
13722
13723 uint user_len = 0;
13724
13725 for (uint i = 0; i < salt_len; i++)
13726 {
13727 if (salt_pos[i] == ' ') continue;
13728
13729 user_len++;
13730 }
13731
13732 // SAP user names cannot be longer than 12 characters
13733 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13734 // so far nobody complained so we stay with this because it helps in optimization
13735 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13736
13737 if (user_len > 12) return (PARSER_SALT_LENGTH);
13738
13739 // SAP user name cannot start with ! or ?
13740 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13741
13742 /**
13743 * copy data
13744 */
13745
13746 char *salt_buf_ptr = (char *) salt->salt_buf;
13747
13748 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13749
13750 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13751
13752 salt->salt_len = salt_len;
13753
13754 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13755 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13756 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13757 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13758 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13759
13760 return (PARSER_OK);
13761 }
13762
13763 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13764 {
13765 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13766
13767 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13768
13769 u64 *digest = (u64 *) hash_buf->digest;
13770
13771 salt_t *salt = hash_buf->salt;
13772
13773 char *iter_pos = input_buf + 3;
13774
13775 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13776
13777 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13778
13779 memcpy ((char *) salt->salt_sign, input_buf, 4);
13780
13781 salt->salt_iter = salt_iter;
13782
13783 char *salt_pos = iter_pos + 1;
13784
13785 uint salt_len = 8;
13786
13787 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13788
13789 salt->salt_len = salt_len;
13790
13791 char *hash_pos = salt_pos + salt_len;
13792
13793 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13794
13795 // ugly hack start
13796
13797 char *tmp = (char *) salt->salt_buf_pc;
13798
13799 tmp[0] = hash_pos[42];
13800
13801 // ugly hack end
13802
13803 digest[ 0] = byte_swap_64 (digest[ 0]);
13804 digest[ 1] = byte_swap_64 (digest[ 1]);
13805 digest[ 2] = byte_swap_64 (digest[ 2]);
13806 digest[ 3] = byte_swap_64 (digest[ 3]);
13807 digest[ 4] = 0;
13808 digest[ 5] = 0;
13809 digest[ 6] = 0;
13810 digest[ 7] = 0;
13811
13812 return (PARSER_OK);
13813 }
13814
13815 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13816 {
13817 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13818
13819 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13820
13821 u32 *digest = (u32 *) hash_buf->digest;
13822
13823 salt_t *salt = hash_buf->salt;
13824
13825 char *salt_buf = input_buf + 6;
13826
13827 uint salt_len = 16;
13828
13829 char *salt_buf_ptr = (char *) salt->salt_buf;
13830
13831 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13832
13833 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13834
13835 salt->salt_len = salt_len;
13836
13837 char *hash_pos = input_buf + 6 + 16;
13838
13839 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13840 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13841 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13842 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13843 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13844 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13845 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13846 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13847
13848 return (PARSER_OK);
13849 }
13850
13851 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13852 {
13853 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13854
13855 u32 *digest = (u32 *) hash_buf->digest;
13856
13857 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13858 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13859 digest[2] = 0;
13860 digest[3] = 0;
13861
13862 return (PARSER_OK);
13863 }
13864
13865 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13866 {
13867 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13868
13869 u32 *digest = (u32 *) hash_buf->digest;
13870
13871 salt_t *salt = hash_buf->salt;
13872
13873 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13874
13875 char *saltbuf_pos = input_buf;
13876
13877 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13878
13879 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13880
13881 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13882
13883 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13884 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13885
13886 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13887
13888 hashbuf_pos++;
13889
13890 uint hashbuf_len = input_len - saltbuf_len - 1;
13891
13892 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13893
13894 char *salt_ptr = (char *) saltbuf_pos;
13895 char *rakp_ptr = (char *) rakp->salt_buf;
13896
13897 uint i;
13898 uint j;
13899
13900 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13901 {
13902 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13903 }
13904
13905 rakp_ptr[j] = 0x80;
13906
13907 rakp->salt_len = j;
13908
13909 for (i = 0; i < 64; i++)
13910 {
13911 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13912 }
13913
13914 salt->salt_buf[0] = rakp->salt_buf[0];
13915 salt->salt_buf[1] = rakp->salt_buf[1];
13916 salt->salt_buf[2] = rakp->salt_buf[2];
13917 salt->salt_buf[3] = rakp->salt_buf[3];
13918 salt->salt_buf[4] = rakp->salt_buf[4];
13919 salt->salt_buf[5] = rakp->salt_buf[5];
13920 salt->salt_buf[6] = rakp->salt_buf[6];
13921 salt->salt_buf[7] = rakp->salt_buf[7];
13922
13923 salt->salt_len = 32; // muss min. 32 haben
13924
13925 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13926 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13927 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13928 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13929 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13930
13931 return (PARSER_OK);
13932 }
13933
13934 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13935 {
13936 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13937
13938 u32 *digest = (u32 *) hash_buf->digest;
13939
13940 salt_t *salt = hash_buf->salt;
13941
13942 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13943
13944 char *salt_pos = input_buf + 1;
13945
13946 memcpy (salt->salt_buf, salt_pos, 8);
13947
13948 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13949 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13950
13951 salt->salt_len = 8;
13952
13953 char *hash_pos = salt_pos + 8;
13954
13955 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13956 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13957 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13958 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13959 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13960
13961 digest[0] -= SHA1M_A;
13962 digest[1] -= SHA1M_B;
13963 digest[2] -= SHA1M_C;
13964 digest[3] -= SHA1M_D;
13965 digest[4] -= SHA1M_E;
13966
13967 return (PARSER_OK);
13968 }
13969
13970 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13971 {
13972 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13973
13974 u32 *digest = (u32 *) hash_buf->digest;
13975
13976 salt_t *salt = hash_buf->salt;
13977
13978 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13979 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13980 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13981 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13982
13983 digest[0] = byte_swap_32 (digest[0]);
13984 digest[1] = byte_swap_32 (digest[1]);
13985 digest[2] = byte_swap_32 (digest[2]);
13986 digest[3] = byte_swap_32 (digest[3]);
13987
13988 digest[0] -= MD5M_A;
13989 digest[1] -= MD5M_B;
13990 digest[2] -= MD5M_C;
13991 digest[3] -= MD5M_D;
13992
13993 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13994
13995 char *salt_buf_ptr = input_buf + 32 + 1;
13996
13997 u32 *salt_buf = salt->salt_buf;
13998
13999 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
14000 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
14001 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
14002 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
14003
14004 salt_buf[0] = byte_swap_32 (salt_buf[0]);
14005 salt_buf[1] = byte_swap_32 (salt_buf[1]);
14006 salt_buf[2] = byte_swap_32 (salt_buf[2]);
14007 salt_buf[3] = byte_swap_32 (salt_buf[3]);
14008
14009 salt->salt_len = 16 + 1;
14010
14011 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14012
14013 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
14014
14015 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
14016
14017 return (PARSER_OK);
14018 }
14019
14020 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14021 {
14022 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
14023
14024 u32 *digest = (u32 *) hash_buf->digest;
14025
14026 salt_t *salt = hash_buf->salt;
14027
14028 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
14029
14030 /**
14031 * parse line
14032 */
14033
14034 char *hashbuf_pos = input_buf;
14035
14036 char *saltbuf_pos = strchr (hashbuf_pos, ':');
14037
14038 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14039
14040 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
14041
14042 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
14043
14044 saltbuf_pos++;
14045
14046 char *iteration_pos = strchr (saltbuf_pos, ':');
14047
14048 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14049
14050 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14051
14052 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14053
14054 iteration_pos++;
14055
14056 char *databuf_pos = strchr (iteration_pos, ':');
14057
14058 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14059
14060 const uint iteration_len = databuf_pos - iteration_pos;
14061
14062 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14063 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14064
14065 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14066
14067 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14068 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14069
14070 databuf_pos++;
14071
14072 // digest
14073
14074 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14075 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14076 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14077 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14078 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14079 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14080 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14081 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14082
14083 // salt
14084
14085 char *saltbuf_ptr = (char *) salt->salt_buf;
14086
14087 for (uint i = 0; i < saltbuf_len; i += 2)
14088 {
14089 const char p0 = saltbuf_pos[i + 0];
14090 const char p1 = saltbuf_pos[i + 1];
14091
14092 *saltbuf_ptr++ = hex_convert (p1) << 0
14093 | hex_convert (p0) << 4;
14094 }
14095
14096 salt->salt_buf[4] = 0x01000000;
14097 salt->salt_buf[5] = 0x80;
14098
14099 salt->salt_len = saltbuf_len / 2;
14100
14101 // iteration
14102
14103 salt->salt_iter = atoi (iteration_pos) - 1;
14104
14105 // data
14106
14107 char *databuf_ptr = (char *) cloudkey->data_buf;
14108
14109 for (uint i = 0; i < databuf_len; i += 2)
14110 {
14111 const char p0 = databuf_pos[i + 0];
14112 const char p1 = databuf_pos[i + 1];
14113
14114 *databuf_ptr++ = hex_convert (p1) << 0
14115 | hex_convert (p0) << 4;
14116 }
14117
14118 *databuf_ptr++ = 0x80;
14119
14120 for (uint i = 0; i < 512; i++)
14121 {
14122 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14123 }
14124
14125 cloudkey->data_len = databuf_len / 2;
14126
14127 return (PARSER_OK);
14128 }
14129
14130 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14131 {
14132 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14133
14134 u32 *digest = (u32 *) hash_buf->digest;
14135
14136 salt_t *salt = hash_buf->salt;
14137
14138 /**
14139 * parse line
14140 */
14141
14142 char *hashbuf_pos = input_buf;
14143
14144 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14145
14146 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14147
14148 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14149
14150 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14151
14152 domainbuf_pos++;
14153
14154 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14155
14156 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14157
14158 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14159
14160 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14161
14162 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14163
14164 saltbuf_pos++;
14165
14166 char *iteration_pos = strchr (saltbuf_pos, ':');
14167
14168 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14169
14170 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14171
14172 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14173
14174 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14175
14176 iteration_pos++;
14177
14178 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14179
14180 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14181 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14182
14183 // ok, the plan for this algorithm is the following:
14184 // we have 2 salts here, the domain-name and a random salt
14185 // while both are used in the initial transformation,
14186 // only the random salt is used in the following iterations
14187 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14188 // and one that includes only the real salt (stored into salt_buf[]).
14189 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14190
14191 u8 tmp_buf[100] = { 0 };
14192
14193 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14194
14195 memcpy (digest, tmp_buf, 20);
14196
14197 digest[0] = byte_swap_32 (digest[0]);
14198 digest[1] = byte_swap_32 (digest[1]);
14199 digest[2] = byte_swap_32 (digest[2]);
14200 digest[3] = byte_swap_32 (digest[3]);
14201 digest[4] = byte_swap_32 (digest[4]);
14202
14203 // domain
14204
14205 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14206
14207 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14208
14209 char *len_ptr = NULL;
14210
14211 for (uint i = 0; i < domainbuf_len; i++)
14212 {
14213 if (salt_buf_pc_ptr[i] == '.')
14214 {
14215 len_ptr = &salt_buf_pc_ptr[i];
14216
14217 *len_ptr = 0;
14218 }
14219 else
14220 {
14221 *len_ptr += 1;
14222 }
14223 }
14224
14225 salt->salt_buf_pc[7] = domainbuf_len;
14226
14227 // "real" salt
14228
14229 char *salt_buf_ptr = (char *) salt->salt_buf;
14230
14231 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14232
14233 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14234
14235 salt->salt_len = salt_len;
14236
14237 // iteration
14238
14239 salt->salt_iter = atoi (iteration_pos);
14240
14241 return (PARSER_OK);
14242 }
14243
14244 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14245 {
14246 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14247
14248 u32 *digest = (u32 *) hash_buf->digest;
14249
14250 salt_t *salt = hash_buf->salt;
14251
14252 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14253 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14254 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14255 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14256 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14257
14258 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14259
14260 uint salt_len = input_len - 40 - 1;
14261
14262 char *salt_buf = input_buf + 40 + 1;
14263
14264 char *salt_buf_ptr = (char *) salt->salt_buf;
14265
14266 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14267
14268 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14269
14270 salt->salt_len = salt_len;
14271
14272 return (PARSER_OK);
14273 }
14274
14275 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14276 {
14277 const u8 ascii_to_ebcdic[] =
14278 {
14279 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14280 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14281 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14282 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14283 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14284 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14285 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14286 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14287 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14288 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14289 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14290 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14291 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14292 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14293 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14294 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14295 };
14296
14297 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14298
14299 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14300
14301 u32 *digest = (u32 *) hash_buf->digest;
14302
14303 salt_t *salt = hash_buf->salt;
14304
14305 char *salt_pos = input_buf + 6 + 1;
14306
14307 char *digest_pos = strchr (salt_pos, '*');
14308
14309 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14310
14311 uint salt_len = digest_pos - salt_pos;
14312
14313 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14314
14315 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14316
14317 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14318
14319 digest_pos++;
14320
14321 char *salt_buf_ptr = (char *) salt->salt_buf;
14322 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14323
14324 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14325
14326 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14327
14328 salt->salt_len = salt_len;
14329
14330 for (uint i = 0; i < salt_len; i++)
14331 {
14332 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14333 }
14334 for (uint i = salt_len; i < 8; i++)
14335 {
14336 salt_buf_pc_ptr[i] = 0x40;
14337 }
14338
14339 uint tt;
14340
14341 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14342
14343 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14344 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14345
14346 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14347 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14348
14349 digest[0] = byte_swap_32 (digest[0]);
14350 digest[1] = byte_swap_32 (digest[1]);
14351
14352 IP (digest[0], digest[1], tt);
14353
14354 digest[0] = rotr32 (digest[0], 29);
14355 digest[1] = rotr32 (digest[1], 29);
14356 digest[2] = 0;
14357 digest[3] = 0;
14358
14359 return (PARSER_OK);
14360 }
14361
14362 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14363 {
14364 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14365
14366 u32 *digest = (u32 *) hash_buf->digest;
14367
14368 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14369 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14370 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14371 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14372
14373 digest[0] = byte_swap_32 (digest[0]);
14374 digest[1] = byte_swap_32 (digest[1]);
14375 digest[2] = byte_swap_32 (digest[2]);
14376 digest[3] = byte_swap_32 (digest[3]);
14377
14378 return (PARSER_OK);
14379 }
14380
14381 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14382 {
14383 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14384
14385 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14386
14387 u32 *digest = (u32 *) hash_buf->digest;
14388
14389 salt_t *salt = hash_buf->salt;
14390
14391 u8 tmp_buf[120] = { 0 };
14392
14393 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14394
14395 tmp_buf[3] += -4; // dont ask!
14396
14397 memcpy (salt->salt_buf, tmp_buf, 5);
14398
14399 salt->salt_len = 5;
14400
14401 memcpy (digest, tmp_buf + 5, 9);
14402
14403 // yes, only 9 byte are needed to crack, but 10 to display
14404
14405 salt->salt_buf_pc[7] = input_buf[20];
14406
14407 return (PARSER_OK);
14408 }
14409
14410 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14411 {
14412 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14413
14414 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14415
14416 u32 *digest = (u32 *) hash_buf->digest;
14417
14418 salt_t *salt = hash_buf->salt;
14419
14420 u8 tmp_buf[120] = { 0 };
14421
14422 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14423
14424 tmp_buf[3] += -4; // dont ask!
14425
14426 // salt
14427
14428 memcpy (salt->salt_buf, tmp_buf, 16);
14429
14430 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)
14431
14432 // iteration
14433
14434 char tmp_iter_buf[11] = { 0 };
14435
14436 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14437
14438 tmp_iter_buf[10] = 0;
14439
14440 salt->salt_iter = atoi (tmp_iter_buf);
14441
14442 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14443 {
14444 return (PARSER_SALT_ITERATION);
14445 }
14446
14447 salt->salt_iter--; // first round in init
14448
14449 // 2 additional bytes for display only
14450
14451 salt->salt_buf_pc[0] = tmp_buf[26];
14452 salt->salt_buf_pc[1] = tmp_buf[27];
14453
14454 // digest
14455
14456 memcpy (digest, tmp_buf + 28, 8);
14457
14458 digest[0] = byte_swap_32 (digest[0]);
14459 digest[1] = byte_swap_32 (digest[1]);
14460 digest[2] = 0;
14461 digest[3] = 0;
14462
14463 return (PARSER_OK);
14464 }
14465
14466 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14467 {
14468 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14469
14470 u32 *digest = (u32 *) hash_buf->digest;
14471
14472 salt_t *salt = hash_buf->salt;
14473
14474 char *salt_buf_pos = input_buf;
14475
14476 char *hash_buf_pos = salt_buf_pos + 6;
14477
14478 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14479 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14480 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14481 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14482 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14483 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14484 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14485 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14486
14487 digest[0] -= SHA256M_A;
14488 digest[1] -= SHA256M_B;
14489 digest[2] -= SHA256M_C;
14490 digest[3] -= SHA256M_D;
14491 digest[4] -= SHA256M_E;
14492 digest[5] -= SHA256M_F;
14493 digest[6] -= SHA256M_G;
14494 digest[7] -= SHA256M_H;
14495
14496 char *salt_buf_ptr = (char *) salt->salt_buf;
14497
14498 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14499
14500 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14501
14502 salt->salt_len = salt_len;
14503
14504 return (PARSER_OK);
14505 }
14506
14507 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14508 {
14509 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14510
14511 u32 *digest = (u32 *) hash_buf->digest;
14512
14513 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14514
14515 salt_t *salt = hash_buf->salt;
14516
14517 char *salt_buf = input_buf + 6;
14518
14519 char *digest_buf = strchr (salt_buf, '$');
14520
14521 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14522
14523 uint salt_len = digest_buf - salt_buf;
14524
14525 digest_buf++; // skip the '$' symbol
14526
14527 char *salt_buf_ptr = (char *) salt->salt_buf;
14528
14529 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14530
14531 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14532
14533 salt->salt_len = salt_len;
14534
14535 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14536 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14537 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14538 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14539
14540 digest[0] = byte_swap_32 (digest[0]);
14541 digest[1] = byte_swap_32 (digest[1]);
14542 digest[2] = byte_swap_32 (digest[2]);
14543 digest[3] = byte_swap_32 (digest[3]);
14544
14545 digest[0] -= MD5M_A;
14546 digest[1] -= MD5M_B;
14547 digest[2] -= MD5M_C;
14548 digest[3] -= MD5M_D;
14549
14550 return (PARSER_OK);
14551 }
14552
14553 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14554 {
14555 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14556
14557 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14558
14559 u32 *digest = (u32 *) hash_buf->digest;
14560
14561 salt_t *salt = hash_buf->salt;
14562
14563 char *salt_buf = input_buf + 3;
14564
14565 char *digest_buf = strchr (salt_buf, '$');
14566
14567 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14568
14569 uint salt_len = digest_buf - salt_buf;
14570
14571 digest_buf++; // skip the '$' symbol
14572
14573 char *salt_buf_ptr = (char *) salt->salt_buf;
14574
14575 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14576
14577 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14578
14579 salt_buf_ptr[salt_len] = 0x2d;
14580
14581 salt->salt_len = salt_len + 1;
14582
14583 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14584 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14585 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14586 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14587
14588 digest[0] = byte_swap_32 (digest[0]);
14589 digest[1] = byte_swap_32 (digest[1]);
14590 digest[2] = byte_swap_32 (digest[2]);
14591 digest[3] = byte_swap_32 (digest[3]);
14592
14593 digest[0] -= MD5M_A;
14594 digest[1] -= MD5M_B;
14595 digest[2] -= MD5M_C;
14596 digest[3] -= MD5M_D;
14597
14598 return (PARSER_OK);
14599 }
14600
14601 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14602 {
14603 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14604
14605 u32 *digest = (u32 *) hash_buf->digest;
14606
14607 salt_t *salt = hash_buf->salt;
14608
14609 u8 tmp_buf[100] = { 0 };
14610
14611 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14612
14613 memcpy (digest, tmp_buf, 20);
14614
14615 digest[0] = byte_swap_32 (digest[0]);
14616 digest[1] = byte_swap_32 (digest[1]);
14617 digest[2] = byte_swap_32 (digest[2]);
14618 digest[3] = byte_swap_32 (digest[3]);
14619 digest[4] = byte_swap_32 (digest[4]);
14620
14621 digest[0] -= SHA1M_A;
14622 digest[1] -= SHA1M_B;
14623 digest[2] -= SHA1M_C;
14624 digest[3] -= SHA1M_D;
14625 digest[4] -= SHA1M_E;
14626
14627 salt->salt_buf[0] = 0x80;
14628
14629 salt->salt_len = 0;
14630
14631 return (PARSER_OK);
14632 }
14633
14634 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14635 {
14636 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14637
14638 u32 *digest = (u32 *) hash_buf->digest;
14639
14640 salt_t *salt = hash_buf->salt;
14641
14642 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14643 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14644 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14645 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14646
14647 digest[0] = byte_swap_32 (digest[0]);
14648 digest[1] = byte_swap_32 (digest[1]);
14649 digest[2] = byte_swap_32 (digest[2]);
14650 digest[3] = byte_swap_32 (digest[3]);
14651
14652 digest[0] -= MD5M_A;
14653 digest[1] -= MD5M_B;
14654 digest[2] -= MD5M_C;
14655 digest[3] -= MD5M_D;
14656
14657 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14658
14659 uint salt_len = input_len - 32 - 1;
14660
14661 char *salt_buf = input_buf + 32 + 1;
14662
14663 char *salt_buf_ptr = (char *) salt->salt_buf;
14664
14665 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14666
14667 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14668
14669 /*
14670 * add static "salt" part
14671 */
14672
14673 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14674
14675 salt_len += 8;
14676
14677 salt->salt_len = salt_len;
14678
14679 return (PARSER_OK);
14680 }
14681
14682 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14683 {
14684 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14685
14686 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14687
14688 u32 *digest = (u32 *) hash_buf->digest;
14689
14690 salt_t *salt = hash_buf->salt;
14691
14692 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14693
14694 /**
14695 * parse line
14696 */
14697
14698 char *saltlen_pos = input_buf + 1 + 3 + 1;
14699
14700 char *saltbuf_pos = strchr (saltlen_pos, '$');
14701
14702 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14703
14704 uint saltlen_len = saltbuf_pos - saltlen_pos;
14705
14706 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14707
14708 saltbuf_pos++;
14709
14710 char *keylen_pos = strchr (saltbuf_pos, '$');
14711
14712 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14713
14714 uint saltbuf_len = keylen_pos - saltbuf_pos;
14715
14716 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14717
14718 keylen_pos++;
14719
14720 char *keybuf_pos = strchr (keylen_pos, '$');
14721
14722 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14723
14724 uint keylen_len = keybuf_pos - keylen_pos;
14725
14726 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14727
14728 keybuf_pos++;
14729
14730 char *databuf_pos = strchr (keybuf_pos, '$');
14731
14732 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14733
14734 uint keybuf_len = databuf_pos - keybuf_pos;
14735
14736 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14737
14738 databuf_pos++;
14739
14740 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14741
14742 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14743
14744 /**
14745 * copy data
14746 */
14747
14748 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14749 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14750 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14751 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14752
14753 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14754 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14755 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14756 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14757
14758 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14759 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14760 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14761 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14762
14763 salt->salt_len = 16;
14764 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14765
14766 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14767 {
14768 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14769 }
14770
14771 return (PARSER_OK);
14772 }
14773
14774 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14775 {
14776 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14777
14778 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14779
14780 u32 *digest = (u32 *) hash_buf->digest;
14781
14782 salt_t *salt = hash_buf->salt;
14783
14784 /**
14785 * parse line
14786 */
14787
14788 // first is the N salt parameter
14789
14790 char *N_pos = input_buf + 6;
14791
14792 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14793
14794 N_pos++;
14795
14796 salt->scrypt_N = atoi (N_pos);
14797
14798 // r
14799
14800 char *r_pos = strchr (N_pos, ':');
14801
14802 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14803
14804 r_pos++;
14805
14806 salt->scrypt_r = atoi (r_pos);
14807
14808 // p
14809
14810 char *p_pos = strchr (r_pos, ':');
14811
14812 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14813
14814 p_pos++;
14815
14816 salt->scrypt_p = atoi (p_pos);
14817
14818 // salt
14819
14820 char *saltbuf_pos = strchr (p_pos, ':');
14821
14822 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14823
14824 saltbuf_pos++;
14825
14826 char *hash_pos = strchr (saltbuf_pos, ':');
14827
14828 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14829
14830 hash_pos++;
14831
14832 // base64 decode
14833
14834 int salt_len_base64 = hash_pos - saltbuf_pos;
14835
14836 if (salt_len_base64 > 45) return (PARSER_SALT_LENGTH);
14837
14838 u8 tmp_buf[33] = { 0 };
14839
14840 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, salt_len_base64, tmp_buf);
14841
14842 char *salt_buf_ptr = (char *) salt->salt_buf;
14843
14844 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14845
14846 salt->salt_len = tmp_len;
14847 salt->salt_iter = 1;
14848
14849 // digest - base64 decode
14850
14851 memset (tmp_buf, 0, sizeof (tmp_buf));
14852
14853 tmp_len = input_len - (hash_pos - input_buf);
14854
14855 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14856
14857 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14858
14859 memcpy (digest, tmp_buf, 32);
14860
14861 return (PARSER_OK);
14862 }
14863
14864 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14865 {
14866 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14867
14868 u32 *digest = (u32 *) hash_buf->digest;
14869
14870 salt_t *salt = hash_buf->salt;
14871
14872 /**
14873 * parse line
14874 */
14875
14876 char decrypted[76] = { 0 }; // iv + hash
14877
14878 juniper_decrypt_hash (input_buf, decrypted);
14879
14880 char *md5crypt_hash = decrypted + 12;
14881
14882 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14883
14884 salt->salt_iter = ROUNDS_MD5CRYPT;
14885
14886 char *salt_pos = md5crypt_hash + 3;
14887
14888 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14889
14890 salt->salt_len = hash_pos - salt_pos; // should be 8
14891
14892 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14893
14894 hash_pos++;
14895
14896 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14897
14898 return (PARSER_OK);
14899 }
14900
14901 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14902 {
14903 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14904
14905 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14906
14907 u32 *digest = (u32 *) hash_buf->digest;
14908
14909 salt_t *salt = hash_buf->salt;
14910
14911 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14912
14913 /**
14914 * parse line
14915 */
14916
14917 // first is *raw* salt
14918
14919 char *salt_pos = input_buf + 3;
14920
14921 char *hash_pos = strchr (salt_pos, '$');
14922
14923 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14924
14925 uint salt_len = hash_pos - salt_pos;
14926
14927 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14928
14929 hash_pos++;
14930
14931 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14932
14933 memcpy (salt_buf_ptr, salt_pos, 14);
14934
14935 salt_buf_ptr[17] = 0x01;
14936 salt_buf_ptr[18] = 0x80;
14937
14938 // add some stuff to normal salt to make sorted happy
14939
14940 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14941 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14942 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14943 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14944
14945 salt->salt_len = salt_len;
14946 salt->salt_iter = ROUNDS_CISCO8 - 1;
14947
14948 // base64 decode hash
14949
14950 u8 tmp_buf[100] = { 0 };
14951
14952 uint hash_len = input_len - 3 - salt_len - 1;
14953
14954 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14955
14956 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14957
14958 memcpy (digest, tmp_buf, 32);
14959
14960 digest[0] = byte_swap_32 (digest[0]);
14961 digest[1] = byte_swap_32 (digest[1]);
14962 digest[2] = byte_swap_32 (digest[2]);
14963 digest[3] = byte_swap_32 (digest[3]);
14964 digest[4] = byte_swap_32 (digest[4]);
14965 digest[5] = byte_swap_32 (digest[5]);
14966 digest[6] = byte_swap_32 (digest[6]);
14967 digest[7] = byte_swap_32 (digest[7]);
14968
14969 return (PARSER_OK);
14970 }
14971
14972 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14973 {
14974 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14975
14976 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14977
14978 u32 *digest = (u32 *) hash_buf->digest;
14979
14980 salt_t *salt = hash_buf->salt;
14981
14982 /**
14983 * parse line
14984 */
14985
14986 // first is *raw* salt
14987
14988 char *salt_pos = input_buf + 3;
14989
14990 char *hash_pos = strchr (salt_pos, '$');
14991
14992 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14993
14994 uint salt_len = hash_pos - salt_pos;
14995
14996 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14997
14998 salt->salt_len = salt_len;
14999 hash_pos++;
15000
15001 char *salt_buf_ptr = (char *) salt->salt_buf;
15002
15003 memcpy (salt_buf_ptr, salt_pos, salt_len);
15004 salt_buf_ptr[salt_len] = 0;
15005
15006 // base64 decode hash
15007
15008 u8 tmp_buf[100] = { 0 };
15009
15010 uint hash_len = input_len - 3 - salt_len - 1;
15011
15012 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15013
15014 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15015
15016 memcpy (digest, tmp_buf, 32);
15017
15018 // fixed:
15019 salt->scrypt_N = 16384;
15020 salt->scrypt_r = 1;
15021 salt->scrypt_p = 1;
15022 salt->salt_iter = 1;
15023
15024 return (PARSER_OK);
15025 }
15026
15027 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15028 {
15029 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
15030
15031 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15032
15033 u32 *digest = (u32 *) hash_buf->digest;
15034
15035 salt_t *salt = hash_buf->salt;
15036
15037 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
15038
15039 /**
15040 * parse line
15041 */
15042
15043 char *version_pos = input_buf + 8 + 1;
15044
15045 char *verifierHashSize_pos = strchr (version_pos, '*');
15046
15047 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15048
15049 u32 version_len = verifierHashSize_pos - version_pos;
15050
15051 if (version_len != 4) return (PARSER_SALT_LENGTH);
15052
15053 verifierHashSize_pos++;
15054
15055 char *keySize_pos = strchr (verifierHashSize_pos, '*');
15056
15057 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15058
15059 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
15060
15061 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
15062
15063 keySize_pos++;
15064
15065 char *saltSize_pos = strchr (keySize_pos, '*');
15066
15067 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15068
15069 u32 keySize_len = saltSize_pos - keySize_pos;
15070
15071 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15072
15073 saltSize_pos++;
15074
15075 char *osalt_pos = strchr (saltSize_pos, '*');
15076
15077 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15078
15079 u32 saltSize_len = osalt_pos - saltSize_pos;
15080
15081 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15082
15083 osalt_pos++;
15084
15085 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15086
15087 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15088
15089 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15090
15091 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15092
15093 encryptedVerifier_pos++;
15094
15095 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15096
15097 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15098
15099 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15100
15101 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15102
15103 encryptedVerifierHash_pos++;
15104
15105 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;
15106
15107 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15108
15109 const uint version = atoi (version_pos);
15110
15111 if (version != 2007) return (PARSER_SALT_VALUE);
15112
15113 const uint verifierHashSize = atoi (verifierHashSize_pos);
15114
15115 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15116
15117 const uint keySize = atoi (keySize_pos);
15118
15119 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15120
15121 office2007->keySize = keySize;
15122
15123 const uint saltSize = atoi (saltSize_pos);
15124
15125 if (saltSize != 16) return (PARSER_SALT_VALUE);
15126
15127 /**
15128 * salt
15129 */
15130
15131 salt->salt_len = 16;
15132 salt->salt_iter = ROUNDS_OFFICE2007;
15133
15134 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15135 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15136 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15137 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15138
15139 /**
15140 * esalt
15141 */
15142
15143 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15144 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15145 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15146 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15147
15148 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15149 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15150 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15151 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15152 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15153
15154 /**
15155 * digest
15156 */
15157
15158 digest[0] = office2007->encryptedVerifierHash[0];
15159 digest[1] = office2007->encryptedVerifierHash[1];
15160 digest[2] = office2007->encryptedVerifierHash[2];
15161 digest[3] = office2007->encryptedVerifierHash[3];
15162
15163 return (PARSER_OK);
15164 }
15165
15166 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15167 {
15168 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15169
15170 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15171
15172 u32 *digest = (u32 *) hash_buf->digest;
15173
15174 salt_t *salt = hash_buf->salt;
15175
15176 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15177
15178 /**
15179 * parse line
15180 */
15181
15182 char *version_pos = input_buf + 8 + 1;
15183
15184 char *spinCount_pos = strchr (version_pos, '*');
15185
15186 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15187
15188 u32 version_len = spinCount_pos - version_pos;
15189
15190 if (version_len != 4) return (PARSER_SALT_LENGTH);
15191
15192 spinCount_pos++;
15193
15194 char *keySize_pos = strchr (spinCount_pos, '*');
15195
15196 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15197
15198 u32 spinCount_len = keySize_pos - spinCount_pos;
15199
15200 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15201
15202 keySize_pos++;
15203
15204 char *saltSize_pos = strchr (keySize_pos, '*');
15205
15206 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15207
15208 u32 keySize_len = saltSize_pos - keySize_pos;
15209
15210 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15211
15212 saltSize_pos++;
15213
15214 char *osalt_pos = strchr (saltSize_pos, '*');
15215
15216 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15217
15218 u32 saltSize_len = osalt_pos - saltSize_pos;
15219
15220 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15221
15222 osalt_pos++;
15223
15224 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15225
15226 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15227
15228 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15229
15230 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15231
15232 encryptedVerifier_pos++;
15233
15234 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15235
15236 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15237
15238 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15239
15240 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15241
15242 encryptedVerifierHash_pos++;
15243
15244 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;
15245
15246 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15247
15248 const uint version = atoi (version_pos);
15249
15250 if (version != 2010) return (PARSER_SALT_VALUE);
15251
15252 const uint spinCount = atoi (spinCount_pos);
15253
15254 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15255
15256 const uint keySize = atoi (keySize_pos);
15257
15258 if (keySize != 128) return (PARSER_SALT_VALUE);
15259
15260 const uint saltSize = atoi (saltSize_pos);
15261
15262 if (saltSize != 16) return (PARSER_SALT_VALUE);
15263
15264 /**
15265 * salt
15266 */
15267
15268 salt->salt_len = 16;
15269 salt->salt_iter = spinCount;
15270
15271 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15272 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15273 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15274 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15275
15276 /**
15277 * esalt
15278 */
15279
15280 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15281 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15282 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15283 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15284
15285 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15286 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15287 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15288 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15289 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15290 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15291 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15292 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15293
15294 /**
15295 * digest
15296 */
15297
15298 digest[0] = office2010->encryptedVerifierHash[0];
15299 digest[1] = office2010->encryptedVerifierHash[1];
15300 digest[2] = office2010->encryptedVerifierHash[2];
15301 digest[3] = office2010->encryptedVerifierHash[3];
15302
15303 return (PARSER_OK);
15304 }
15305
15306 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15307 {
15308 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15309
15310 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15311
15312 u32 *digest = (u32 *) hash_buf->digest;
15313
15314 salt_t *salt = hash_buf->salt;
15315
15316 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15317
15318 /**
15319 * parse line
15320 */
15321
15322 char *version_pos = input_buf + 8 + 1;
15323
15324 char *spinCount_pos = strchr (version_pos, '*');
15325
15326 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15327
15328 u32 version_len = spinCount_pos - version_pos;
15329
15330 if (version_len != 4) return (PARSER_SALT_LENGTH);
15331
15332 spinCount_pos++;
15333
15334 char *keySize_pos = strchr (spinCount_pos, '*');
15335
15336 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15337
15338 u32 spinCount_len = keySize_pos - spinCount_pos;
15339
15340 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15341
15342 keySize_pos++;
15343
15344 char *saltSize_pos = strchr (keySize_pos, '*');
15345
15346 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15347
15348 u32 keySize_len = saltSize_pos - keySize_pos;
15349
15350 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15351
15352 saltSize_pos++;
15353
15354 char *osalt_pos = strchr (saltSize_pos, '*');
15355
15356 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15357
15358 u32 saltSize_len = osalt_pos - saltSize_pos;
15359
15360 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15361
15362 osalt_pos++;
15363
15364 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15365
15366 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15367
15368 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15369
15370 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15371
15372 encryptedVerifier_pos++;
15373
15374 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15375
15376 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15377
15378 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15379
15380 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15381
15382 encryptedVerifierHash_pos++;
15383
15384 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;
15385
15386 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15387
15388 const uint version = atoi (version_pos);
15389
15390 if (version != 2013) return (PARSER_SALT_VALUE);
15391
15392 const uint spinCount = atoi (spinCount_pos);
15393
15394 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15395
15396 const uint keySize = atoi (keySize_pos);
15397
15398 if (keySize != 256) return (PARSER_SALT_VALUE);
15399
15400 const uint saltSize = atoi (saltSize_pos);
15401
15402 if (saltSize != 16) return (PARSER_SALT_VALUE);
15403
15404 /**
15405 * salt
15406 */
15407
15408 salt->salt_len = 16;
15409 salt->salt_iter = spinCount;
15410
15411 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15412 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15413 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15414 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15415
15416 /**
15417 * esalt
15418 */
15419
15420 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15421 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15422 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15423 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15424
15425 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15426 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15427 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15428 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15429 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15430 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15431 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15432 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15433
15434 /**
15435 * digest
15436 */
15437
15438 digest[0] = office2013->encryptedVerifierHash[0];
15439 digest[1] = office2013->encryptedVerifierHash[1];
15440 digest[2] = office2013->encryptedVerifierHash[2];
15441 digest[3] = office2013->encryptedVerifierHash[3];
15442
15443 return (PARSER_OK);
15444 }
15445
15446 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15447 {
15448 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15449
15450 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15451
15452 u32 *digest = (u32 *) hash_buf->digest;
15453
15454 salt_t *salt = hash_buf->salt;
15455
15456 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15457
15458 /**
15459 * parse line
15460 */
15461
15462 char *version_pos = input_buf + 11;
15463
15464 char *osalt_pos = strchr (version_pos, '*');
15465
15466 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15467
15468 u32 version_len = osalt_pos - version_pos;
15469
15470 if (version_len != 1) return (PARSER_SALT_LENGTH);
15471
15472 osalt_pos++;
15473
15474 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15475
15476 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15477
15478 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15479
15480 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15481
15482 encryptedVerifier_pos++;
15483
15484 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15485
15486 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15487
15488 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15489
15490 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15491
15492 encryptedVerifierHash_pos++;
15493
15494 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15495
15496 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15497
15498 const uint version = *version_pos - 0x30;
15499
15500 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15501
15502 /**
15503 * esalt
15504 */
15505
15506 oldoffice01->version = version;
15507
15508 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15509 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15510 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15511 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15512
15513 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15514 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15515 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15516 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15517
15518 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15519 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15520 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15521 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15522
15523 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15524 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15525 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15526 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15527
15528 /**
15529 * salt
15530 */
15531
15532 salt->salt_len = 16;
15533
15534 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15535 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15536 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15537 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15538
15539 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15540 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15541 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15542 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15543
15544 // this is a workaround as office produces multiple documents with the same salt
15545
15546 salt->salt_len += 32;
15547
15548 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15549 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15550 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15551 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15552 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15553 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15554 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15555 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15556
15557 /**
15558 * digest
15559 */
15560
15561 digest[0] = oldoffice01->encryptedVerifierHash[0];
15562 digest[1] = oldoffice01->encryptedVerifierHash[1];
15563 digest[2] = oldoffice01->encryptedVerifierHash[2];
15564 digest[3] = oldoffice01->encryptedVerifierHash[3];
15565
15566 return (PARSER_OK);
15567 }
15568
15569 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15570 {
15571 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15572 }
15573
15574 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15575 {
15576 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15577
15578 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15579
15580 u32 *digest = (u32 *) hash_buf->digest;
15581
15582 salt_t *salt = hash_buf->salt;
15583
15584 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15585
15586 /**
15587 * parse line
15588 */
15589
15590 char *version_pos = input_buf + 11;
15591
15592 char *osalt_pos = strchr (version_pos, '*');
15593
15594 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15595
15596 u32 version_len = osalt_pos - version_pos;
15597
15598 if (version_len != 1) return (PARSER_SALT_LENGTH);
15599
15600 osalt_pos++;
15601
15602 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15603
15604 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15605
15606 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15607
15608 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15609
15610 encryptedVerifier_pos++;
15611
15612 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15613
15614 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15615
15616 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15617
15618 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15619
15620 encryptedVerifierHash_pos++;
15621
15622 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15623
15624 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15625
15626 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15627
15628 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15629
15630 rc4key_pos++;
15631
15632 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15633
15634 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15635
15636 const uint version = *version_pos - 0x30;
15637
15638 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15639
15640 /**
15641 * esalt
15642 */
15643
15644 oldoffice01->version = version;
15645
15646 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15647 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15648 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15649 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15650
15651 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15652 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15653 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15654 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15655
15656 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15657 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15658 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15659 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15660
15661 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15662 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15663 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15664 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15665
15666 oldoffice01->rc4key[1] = 0;
15667 oldoffice01->rc4key[0] = 0;
15668
15669 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15670 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15671 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15672 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15673 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15674 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15675 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15676 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15677 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15678 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15679
15680 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15681 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15682
15683 /**
15684 * salt
15685 */
15686
15687 salt->salt_len = 16;
15688
15689 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15690 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15691 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15692 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15693
15694 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15695 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15696 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15697 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15698
15699 // this is a workaround as office produces multiple documents with the same salt
15700
15701 salt->salt_len += 32;
15702
15703 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15704 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15705 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15706 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15707 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15708 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15709 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15710 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15711
15712 /**
15713 * digest
15714 */
15715
15716 digest[0] = oldoffice01->rc4key[0];
15717 digest[1] = oldoffice01->rc4key[1];
15718 digest[2] = 0;
15719 digest[3] = 0;
15720
15721 return (PARSER_OK);
15722 }
15723
15724 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15725 {
15726 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15727
15728 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15729
15730 u32 *digest = (u32 *) hash_buf->digest;
15731
15732 salt_t *salt = hash_buf->salt;
15733
15734 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15735
15736 /**
15737 * parse line
15738 */
15739
15740 char *version_pos = input_buf + 11;
15741
15742 char *osalt_pos = strchr (version_pos, '*');
15743
15744 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15745
15746 u32 version_len = osalt_pos - version_pos;
15747
15748 if (version_len != 1) return (PARSER_SALT_LENGTH);
15749
15750 osalt_pos++;
15751
15752 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15753
15754 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15755
15756 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15757
15758 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15759
15760 encryptedVerifier_pos++;
15761
15762 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15763
15764 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15765
15766 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15767
15768 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15769
15770 encryptedVerifierHash_pos++;
15771
15772 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15773
15774 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15775
15776 const uint version = *version_pos - 0x30;
15777
15778 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15779
15780 /**
15781 * esalt
15782 */
15783
15784 oldoffice34->version = version;
15785
15786 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15787 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15788 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15789 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15790
15791 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15792 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15793 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15794 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15795
15796 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15797 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15798 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15799 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15800 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15801
15802 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15803 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15804 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15805 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15806 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15807
15808 /**
15809 * salt
15810 */
15811
15812 salt->salt_len = 16;
15813
15814 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15815 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15816 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15817 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15818
15819 // this is a workaround as office produces multiple documents with the same salt
15820
15821 salt->salt_len += 32;
15822
15823 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15824 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15825 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15826 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15827 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15828 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15829 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15830 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15831
15832 /**
15833 * digest
15834 */
15835
15836 digest[0] = oldoffice34->encryptedVerifierHash[0];
15837 digest[1] = oldoffice34->encryptedVerifierHash[1];
15838 digest[2] = oldoffice34->encryptedVerifierHash[2];
15839 digest[3] = oldoffice34->encryptedVerifierHash[3];
15840
15841 return (PARSER_OK);
15842 }
15843
15844 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15845 {
15846 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15847
15848 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15849 }
15850
15851 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15852 {
15853 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15854
15855 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15856
15857 u32 *digest = (u32 *) hash_buf->digest;
15858
15859 salt_t *salt = hash_buf->salt;
15860
15861 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15862
15863 /**
15864 * parse line
15865 */
15866
15867 char *version_pos = input_buf + 11;
15868
15869 char *osalt_pos = strchr (version_pos, '*');
15870
15871 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15872
15873 u32 version_len = osalt_pos - version_pos;
15874
15875 if (version_len != 1) return (PARSER_SALT_LENGTH);
15876
15877 osalt_pos++;
15878
15879 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15880
15881 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15882
15883 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15884
15885 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15886
15887 encryptedVerifier_pos++;
15888
15889 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15890
15891 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15892
15893 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15894
15895 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15896
15897 encryptedVerifierHash_pos++;
15898
15899 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15900
15901 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15902
15903 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15904
15905 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15906
15907 rc4key_pos++;
15908
15909 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15910
15911 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15912
15913 const uint version = *version_pos - 0x30;
15914
15915 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15916
15917 /**
15918 * esalt
15919 */
15920
15921 oldoffice34->version = version;
15922
15923 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15924 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15925 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15926 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15927
15928 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15929 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15930 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15931 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15932
15933 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15934 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15935 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15936 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15937 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15938
15939 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15940 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15941 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15942 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15943 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15944
15945 oldoffice34->rc4key[1] = 0;
15946 oldoffice34->rc4key[0] = 0;
15947
15948 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15949 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15950 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15951 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15952 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15953 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15954 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15955 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15956 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15957 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15958
15959 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15960 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15961
15962 /**
15963 * salt
15964 */
15965
15966 salt->salt_len = 16;
15967
15968 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15969 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15970 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15971 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15972
15973 // this is a workaround as office produces multiple documents with the same salt
15974
15975 salt->salt_len += 32;
15976
15977 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15978 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15979 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15980 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15981 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15982 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15983 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15984 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15985
15986 /**
15987 * digest
15988 */
15989
15990 digest[0] = oldoffice34->rc4key[0];
15991 digest[1] = oldoffice34->rc4key[1];
15992 digest[2] = 0;
15993 digest[3] = 0;
15994
15995 return (PARSER_OK);
15996 }
15997
15998 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15999 {
16000 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
16001
16002 u32 *digest = (u32 *) hash_buf->digest;
16003
16004 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16005 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16006 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16007 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16008
16009 digest[0] = byte_swap_32 (digest[0]);
16010 digest[1] = byte_swap_32 (digest[1]);
16011 digest[2] = byte_swap_32 (digest[2]);
16012 digest[3] = byte_swap_32 (digest[3]);
16013
16014 return (PARSER_OK);
16015 }
16016
16017 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16018 {
16019 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
16020
16021 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16022
16023 u32 *digest = (u32 *) hash_buf->digest;
16024
16025 salt_t *salt = hash_buf->salt;
16026
16027 char *signature_pos = input_buf;
16028
16029 char *salt_pos = strchr (signature_pos, '$');
16030
16031 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16032
16033 u32 signature_len = salt_pos - signature_pos;
16034
16035 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
16036
16037 salt_pos++;
16038
16039 char *hash_pos = strchr (salt_pos, '$');
16040
16041 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16042
16043 u32 salt_len = hash_pos - salt_pos;
16044
16045 if (salt_len > 32) return (PARSER_SALT_LENGTH);
16046
16047 hash_pos++;
16048
16049 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
16050
16051 if (hash_len != 40) return (PARSER_SALT_LENGTH);
16052
16053 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
16054 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
16055 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
16056 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
16057 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
16058
16059 digest[0] -= SHA1M_A;
16060 digest[1] -= SHA1M_B;
16061 digest[2] -= SHA1M_C;
16062 digest[3] -= SHA1M_D;
16063 digest[4] -= SHA1M_E;
16064
16065 char *salt_buf_ptr = (char *) salt->salt_buf;
16066
16067 memcpy (salt_buf_ptr, salt_pos, salt_len);
16068
16069 salt->salt_len = salt_len;
16070
16071 return (PARSER_OK);
16072 }
16073
16074 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16075 {
16076 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16077
16078 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16079
16080 u32 *digest = (u32 *) hash_buf->digest;
16081
16082 salt_t *salt = hash_buf->salt;
16083
16084 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16085
16086 /**
16087 * parse line
16088 */
16089
16090 char *iter_pos = input_buf + 14;
16091
16092 const int iter = atoi (iter_pos);
16093
16094 if (iter < 1) return (PARSER_SALT_ITERATION);
16095
16096 salt->salt_iter = iter - 1;
16097
16098 char *salt_pos = strchr (iter_pos, '$');
16099
16100 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16101
16102 salt_pos++;
16103
16104 char *hash_pos = strchr (salt_pos, '$');
16105
16106 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16107
16108 const uint salt_len = hash_pos - salt_pos;
16109
16110 hash_pos++;
16111
16112 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16113
16114 memcpy (salt_buf_ptr, salt_pos, salt_len);
16115
16116 salt->salt_len = salt_len;
16117
16118 salt_buf_ptr[salt_len + 3] = 0x01;
16119 salt_buf_ptr[salt_len + 4] = 0x80;
16120
16121 // add some stuff to normal salt to make sorted happy
16122
16123 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16124 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16125 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16126 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16127 salt->salt_buf[4] = salt->salt_iter;
16128
16129 // base64 decode hash
16130
16131 u8 tmp_buf[100] = { 0 };
16132
16133 uint hash_len = input_len - (hash_pos - input_buf);
16134
16135 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16136
16137 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16138
16139 memcpy (digest, tmp_buf, 32);
16140
16141 digest[0] = byte_swap_32 (digest[0]);
16142 digest[1] = byte_swap_32 (digest[1]);
16143 digest[2] = byte_swap_32 (digest[2]);
16144 digest[3] = byte_swap_32 (digest[3]);
16145 digest[4] = byte_swap_32 (digest[4]);
16146 digest[5] = byte_swap_32 (digest[5]);
16147 digest[6] = byte_swap_32 (digest[6]);
16148 digest[7] = byte_swap_32 (digest[7]);
16149
16150 return (PARSER_OK);
16151 }
16152
16153 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16154 {
16155 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16156
16157 u32 *digest = (u32 *) hash_buf->digest;
16158
16159 salt_t *salt = hash_buf->salt;
16160
16161 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16162 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16163 digest[2] = 0;
16164 digest[3] = 0;
16165
16166 digest[0] = byte_swap_32 (digest[0]);
16167 digest[1] = byte_swap_32 (digest[1]);
16168
16169 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16170 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16171 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16172
16173 char iter_c = input_buf[17];
16174 char iter_d = input_buf[19];
16175
16176 // atm only defaults, let's see if there's more request
16177 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16178 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16179
16180 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16181
16182 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16183 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16184 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16185 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16186
16187 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16188 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16189 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16190 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16191
16192 salt->salt_len = 16;
16193
16194 return (PARSER_OK);
16195 }
16196
16197 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16198 {
16199 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16200
16201 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16202
16203 u32 *digest = (u32 *) hash_buf->digest;
16204
16205 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16206
16207 salt_t *salt = hash_buf->salt;
16208
16209 char *salt_pos = input_buf + 10;
16210
16211 char *hash_pos = strchr (salt_pos, '$');
16212
16213 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16214
16215 uint salt_len = hash_pos - salt_pos;
16216
16217 hash_pos++;
16218
16219 uint hash_len = input_len - 10 - salt_len - 1;
16220
16221 // base64 decode salt
16222
16223 if (salt_len > 133) return (PARSER_SALT_LENGTH);
16224
16225 u8 tmp_buf[100] = { 0 };
16226
16227 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16228
16229 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16230
16231 tmp_buf[salt_len] = 0x80;
16232
16233 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16234
16235 salt->salt_len = salt_len;
16236
16237 // base64 decode hash
16238
16239 if (hash_len > 133) return (PARSER_HASH_LENGTH);
16240
16241 memset (tmp_buf, 0, sizeof (tmp_buf));
16242
16243 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16244
16245 if (hash_len < 32 + 1) return (PARSER_SALT_LENGTH);
16246
16247 uint user_len = hash_len - 32;
16248
16249 const u8 *tmp_hash = tmp_buf + user_len;
16250
16251 user_len--; // skip the trailing space
16252
16253 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16254 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16255 digest[2] = hex_to_u32 (&tmp_hash[16]);
16256 digest[3] = hex_to_u32 (&tmp_hash[24]);
16257
16258 digest[0] = byte_swap_32 (digest[0]);
16259 digest[1] = byte_swap_32 (digest[1]);
16260 digest[2] = byte_swap_32 (digest[2]);
16261 digest[3] = byte_swap_32 (digest[3]);
16262
16263 // store username for host only (output hash if cracked)
16264
16265 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16266 memcpy (cram_md5->user, tmp_buf, user_len);
16267
16268 return (PARSER_OK);
16269 }
16270
16271 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16272 {
16273 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16274
16275 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16276
16277 u32 *digest = (u32 *) hash_buf->digest;
16278
16279 salt_t *salt = hash_buf->salt;
16280
16281 char *iter_pos = input_buf + 10;
16282
16283 u32 iter = atoi (iter_pos);
16284
16285 if (iter < 1)
16286 {
16287 return (PARSER_SALT_ITERATION);
16288 }
16289
16290 iter--; // first iteration is special
16291
16292 salt->salt_iter = iter;
16293
16294 char *base64_pos = strchr (iter_pos, '}');
16295
16296 if (base64_pos == NULL)
16297 {
16298 return (PARSER_SIGNATURE_UNMATCHED);
16299 }
16300
16301 base64_pos++;
16302
16303 // base64 decode salt
16304
16305 u32 base64_len = input_len - (base64_pos - input_buf);
16306
16307 u8 tmp_buf[100] = { 0 };
16308
16309 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16310
16311 if (decoded_len < 24)
16312 {
16313 return (PARSER_SALT_LENGTH);
16314 }
16315
16316 // copy the salt
16317
16318 uint salt_len = decoded_len - 20;
16319
16320 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16321 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16322
16323 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16324
16325 salt->salt_len = salt_len;
16326
16327 // set digest
16328
16329 u32 *digest_ptr = (u32*) tmp_buf;
16330
16331 digest[0] = byte_swap_32 (digest_ptr[0]);
16332 digest[1] = byte_swap_32 (digest_ptr[1]);
16333 digest[2] = byte_swap_32 (digest_ptr[2]);
16334 digest[3] = byte_swap_32 (digest_ptr[3]);
16335 digest[4] = byte_swap_32 (digest_ptr[4]);
16336
16337 return (PARSER_OK);
16338 }
16339
16340 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16341 {
16342 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16343
16344 u32 *digest = (u32 *) hash_buf->digest;
16345
16346 salt_t *salt = hash_buf->salt;
16347
16348 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16349 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16350 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16351 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16352 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16353
16354 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16355
16356 uint salt_len = input_len - 40 - 1;
16357
16358 char *salt_buf = input_buf + 40 + 1;
16359
16360 char *salt_buf_ptr = (char *) salt->salt_buf;
16361
16362 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16363
16364 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16365
16366 salt->salt_len = salt_len;
16367
16368 return (PARSER_OK);
16369 }
16370
16371 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16372 {
16373 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16374
16375 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16376
16377 u32 *digest = (u32 *) hash_buf->digest;
16378
16379 salt_t *salt = hash_buf->salt;
16380
16381 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16382
16383 /**
16384 * parse line
16385 */
16386
16387 char *V_pos = input_buf + 5;
16388
16389 char *R_pos = strchr (V_pos, '*');
16390
16391 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16392
16393 u32 V_len = R_pos - V_pos;
16394
16395 R_pos++;
16396
16397 char *bits_pos = strchr (R_pos, '*');
16398
16399 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16400
16401 u32 R_len = bits_pos - R_pos;
16402
16403 bits_pos++;
16404
16405 char *P_pos = strchr (bits_pos, '*');
16406
16407 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16408
16409 u32 bits_len = P_pos - bits_pos;
16410
16411 P_pos++;
16412
16413 char *enc_md_pos = strchr (P_pos, '*');
16414
16415 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16416
16417 u32 P_len = enc_md_pos - P_pos;
16418
16419 enc_md_pos++;
16420
16421 char *id_len_pos = strchr (enc_md_pos, '*');
16422
16423 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16424
16425 u32 enc_md_len = id_len_pos - enc_md_pos;
16426
16427 id_len_pos++;
16428
16429 char *id_buf_pos = strchr (id_len_pos, '*');
16430
16431 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16432
16433 u32 id_len_len = id_buf_pos - id_len_pos;
16434
16435 id_buf_pos++;
16436
16437 char *u_len_pos = strchr (id_buf_pos, '*');
16438
16439 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16440
16441 u32 id_buf_len = u_len_pos - id_buf_pos;
16442
16443 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16444
16445 u_len_pos++;
16446
16447 char *u_buf_pos = strchr (u_len_pos, '*');
16448
16449 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16450
16451 u32 u_len_len = u_buf_pos - u_len_pos;
16452
16453 u_buf_pos++;
16454
16455 char *o_len_pos = strchr (u_buf_pos, '*');
16456
16457 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16458
16459 u32 u_buf_len = o_len_pos - u_buf_pos;
16460
16461 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16462
16463 o_len_pos++;
16464
16465 char *o_buf_pos = strchr (o_len_pos, '*');
16466
16467 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16468
16469 u32 o_len_len = o_buf_pos - o_len_pos;
16470
16471 o_buf_pos++;
16472
16473 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;
16474
16475 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16476
16477 // validate data
16478
16479 const int V = atoi (V_pos);
16480 const int R = atoi (R_pos);
16481 const int P = atoi (P_pos);
16482
16483 if (V != 1) return (PARSER_SALT_VALUE);
16484 if (R != 2) return (PARSER_SALT_VALUE);
16485
16486 const int enc_md = atoi (enc_md_pos);
16487
16488 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16489
16490 const int id_len = atoi (id_len_pos);
16491 const int u_len = atoi (u_len_pos);
16492 const int o_len = atoi (o_len_pos);
16493
16494 if (id_len != 16) return (PARSER_SALT_VALUE);
16495 if (u_len != 32) return (PARSER_SALT_VALUE);
16496 if (o_len != 32) return (PARSER_SALT_VALUE);
16497
16498 const int bits = atoi (bits_pos);
16499
16500 if (bits != 40) return (PARSER_SALT_VALUE);
16501
16502 // copy data to esalt
16503
16504 pdf->V = V;
16505 pdf->R = R;
16506 pdf->P = P;
16507
16508 pdf->enc_md = enc_md;
16509
16510 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16511 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16512 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16513 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16514 pdf->id_len = id_len;
16515
16516 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16517 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16518 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16519 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16520 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16521 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16522 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16523 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16524 pdf->u_len = u_len;
16525
16526 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16527 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16528 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16529 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16530 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16531 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16532 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16533 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16534 pdf->o_len = o_len;
16535
16536 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16537 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16538 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16539 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16540
16541 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16542 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16543 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16544 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16545 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16546 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16547 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16548 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16549
16550 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16551 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16552 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16553 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16554 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16555 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16556 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16557 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16558
16559 // we use ID for salt, maybe needs to change, we will see...
16560
16561 salt->salt_buf[0] = pdf->id_buf[0];
16562 salt->salt_buf[1] = pdf->id_buf[1];
16563 salt->salt_buf[2] = pdf->id_buf[2];
16564 salt->salt_buf[3] = pdf->id_buf[3];
16565 salt->salt_len = pdf->id_len;
16566
16567 digest[0] = pdf->u_buf[0];
16568 digest[1] = pdf->u_buf[1];
16569 digest[2] = pdf->u_buf[2];
16570 digest[3] = pdf->u_buf[3];
16571
16572 return (PARSER_OK);
16573 }
16574
16575 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16576 {
16577 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16578 }
16579
16580 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16581 {
16582 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16583
16584 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16585
16586 u32 *digest = (u32 *) hash_buf->digest;
16587
16588 salt_t *salt = hash_buf->salt;
16589
16590 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16591
16592 /**
16593 * parse line
16594 */
16595
16596 char *V_pos = input_buf + 5;
16597
16598 char *R_pos = strchr (V_pos, '*');
16599
16600 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16601
16602 u32 V_len = R_pos - V_pos;
16603
16604 R_pos++;
16605
16606 char *bits_pos = strchr (R_pos, '*');
16607
16608 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16609
16610 u32 R_len = bits_pos - R_pos;
16611
16612 bits_pos++;
16613
16614 char *P_pos = strchr (bits_pos, '*');
16615
16616 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16617
16618 u32 bits_len = P_pos - bits_pos;
16619
16620 P_pos++;
16621
16622 char *enc_md_pos = strchr (P_pos, '*');
16623
16624 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16625
16626 u32 P_len = enc_md_pos - P_pos;
16627
16628 enc_md_pos++;
16629
16630 char *id_len_pos = strchr (enc_md_pos, '*');
16631
16632 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16633
16634 u32 enc_md_len = id_len_pos - enc_md_pos;
16635
16636 id_len_pos++;
16637
16638 char *id_buf_pos = strchr (id_len_pos, '*');
16639
16640 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16641
16642 u32 id_len_len = id_buf_pos - id_len_pos;
16643
16644 id_buf_pos++;
16645
16646 char *u_len_pos = strchr (id_buf_pos, '*');
16647
16648 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16649
16650 u32 id_buf_len = u_len_pos - id_buf_pos;
16651
16652 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16653
16654 u_len_pos++;
16655
16656 char *u_buf_pos = strchr (u_len_pos, '*');
16657
16658 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16659
16660 u32 u_len_len = u_buf_pos - u_len_pos;
16661
16662 u_buf_pos++;
16663
16664 char *o_len_pos = strchr (u_buf_pos, '*');
16665
16666 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16667
16668 u32 u_buf_len = o_len_pos - u_buf_pos;
16669
16670 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16671
16672 o_len_pos++;
16673
16674 char *o_buf_pos = strchr (o_len_pos, '*');
16675
16676 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16677
16678 u32 o_len_len = o_buf_pos - o_len_pos;
16679
16680 o_buf_pos++;
16681
16682 char *rc4key_pos = strchr (o_buf_pos, ':');
16683
16684 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16685
16686 u32 o_buf_len = rc4key_pos - o_buf_pos;
16687
16688 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16689
16690 rc4key_pos++;
16691
16692 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;
16693
16694 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16695
16696 // validate data
16697
16698 const int V = atoi (V_pos);
16699 const int R = atoi (R_pos);
16700 const int P = atoi (P_pos);
16701
16702 if (V != 1) return (PARSER_SALT_VALUE);
16703 if (R != 2) return (PARSER_SALT_VALUE);
16704
16705 const int enc_md = atoi (enc_md_pos);
16706
16707 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16708
16709 const int id_len = atoi (id_len_pos);
16710 const int u_len = atoi (u_len_pos);
16711 const int o_len = atoi (o_len_pos);
16712
16713 if (id_len != 16) return (PARSER_SALT_VALUE);
16714 if (u_len != 32) return (PARSER_SALT_VALUE);
16715 if (o_len != 32) return (PARSER_SALT_VALUE);
16716
16717 const int bits = atoi (bits_pos);
16718
16719 if (bits != 40) return (PARSER_SALT_VALUE);
16720
16721 // copy data to esalt
16722
16723 pdf->V = V;
16724 pdf->R = R;
16725 pdf->P = P;
16726
16727 pdf->enc_md = enc_md;
16728
16729 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16730 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16731 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16732 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16733 pdf->id_len = id_len;
16734
16735 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16736 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16737 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16738 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16739 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16740 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16741 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16742 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16743 pdf->u_len = u_len;
16744
16745 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16746 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16747 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16748 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16749 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16750 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16751 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16752 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16753 pdf->o_len = o_len;
16754
16755 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16756 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16757 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16758 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16759
16760 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16761 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16762 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16763 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16764 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16765 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16766 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16767 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16768
16769 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16770 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16771 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16772 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16773 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16774 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16775 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16776 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16777
16778 pdf->rc4key[1] = 0;
16779 pdf->rc4key[0] = 0;
16780
16781 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16782 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16783 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16784 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16785 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16786 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16787 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16788 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16789 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16790 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16791
16792 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16793 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16794
16795 // we use ID for salt, maybe needs to change, we will see...
16796
16797 salt->salt_buf[0] = pdf->id_buf[0];
16798 salt->salt_buf[1] = pdf->id_buf[1];
16799 salt->salt_buf[2] = pdf->id_buf[2];
16800 salt->salt_buf[3] = pdf->id_buf[3];
16801 salt->salt_buf[4] = pdf->u_buf[0];
16802 salt->salt_buf[5] = pdf->u_buf[1];
16803 salt->salt_buf[6] = pdf->o_buf[0];
16804 salt->salt_buf[7] = pdf->o_buf[1];
16805 salt->salt_len = pdf->id_len + 16;
16806
16807 digest[0] = pdf->rc4key[0];
16808 digest[1] = pdf->rc4key[1];
16809 digest[2] = 0;
16810 digest[3] = 0;
16811
16812 return (PARSER_OK);
16813 }
16814
16815 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16816 {
16817 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16818
16819 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16820
16821 u32 *digest = (u32 *) hash_buf->digest;
16822
16823 salt_t *salt = hash_buf->salt;
16824
16825 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16826
16827 /**
16828 * parse line
16829 */
16830
16831 char *V_pos = input_buf + 5;
16832
16833 char *R_pos = strchr (V_pos, '*');
16834
16835 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16836
16837 u32 V_len = R_pos - V_pos;
16838
16839 R_pos++;
16840
16841 char *bits_pos = strchr (R_pos, '*');
16842
16843 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16844
16845 u32 R_len = bits_pos - R_pos;
16846
16847 bits_pos++;
16848
16849 char *P_pos = strchr (bits_pos, '*');
16850
16851 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16852
16853 u32 bits_len = P_pos - bits_pos;
16854
16855 P_pos++;
16856
16857 char *enc_md_pos = strchr (P_pos, '*');
16858
16859 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16860
16861 u32 P_len = enc_md_pos - P_pos;
16862
16863 enc_md_pos++;
16864
16865 char *id_len_pos = strchr (enc_md_pos, '*');
16866
16867 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16868
16869 u32 enc_md_len = id_len_pos - enc_md_pos;
16870
16871 id_len_pos++;
16872
16873 char *id_buf_pos = strchr (id_len_pos, '*');
16874
16875 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16876
16877 u32 id_len_len = id_buf_pos - id_len_pos;
16878
16879 id_buf_pos++;
16880
16881 char *u_len_pos = strchr (id_buf_pos, '*');
16882
16883 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16884
16885 u32 id_buf_len = u_len_pos - id_buf_pos;
16886
16887 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16888
16889 u_len_pos++;
16890
16891 char *u_buf_pos = strchr (u_len_pos, '*');
16892
16893 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16894
16895 u32 u_len_len = u_buf_pos - u_len_pos;
16896
16897 u_buf_pos++;
16898
16899 char *o_len_pos = strchr (u_buf_pos, '*');
16900
16901 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16902
16903 u32 u_buf_len = o_len_pos - u_buf_pos;
16904
16905 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16906
16907 o_len_pos++;
16908
16909 char *o_buf_pos = strchr (o_len_pos, '*');
16910
16911 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16912
16913 u32 o_len_len = o_buf_pos - o_len_pos;
16914
16915 o_buf_pos++;
16916
16917 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;
16918
16919 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16920
16921 // validate data
16922
16923 const int V = atoi (V_pos);
16924 const int R = atoi (R_pos);
16925 const int P = atoi (P_pos);
16926
16927 int vr_ok = 0;
16928
16929 if ((V == 2) && (R == 3)) vr_ok = 1;
16930 if ((V == 4) && (R == 4)) vr_ok = 1;
16931
16932 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16933
16934 const int id_len = atoi (id_len_pos);
16935 const int u_len = atoi (u_len_pos);
16936 const int o_len = atoi (o_len_pos);
16937
16938 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16939
16940 if (u_len != 32) return (PARSER_SALT_VALUE);
16941 if (o_len != 32) return (PARSER_SALT_VALUE);
16942
16943 const int bits = atoi (bits_pos);
16944
16945 if (bits != 128) return (PARSER_SALT_VALUE);
16946
16947 int enc_md = 1;
16948
16949 if (R >= 4)
16950 {
16951 enc_md = atoi (enc_md_pos);
16952 }
16953
16954 // copy data to esalt
16955
16956 pdf->V = V;
16957 pdf->R = R;
16958 pdf->P = P;
16959
16960 pdf->enc_md = enc_md;
16961
16962 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16963 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16964 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16965 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16966
16967 if (id_len == 32)
16968 {
16969 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16970 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16971 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16972 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16973 }
16974
16975 pdf->id_len = id_len;
16976
16977 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16978 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16979 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16980 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16981 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16982 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16983 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16984 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16985 pdf->u_len = u_len;
16986
16987 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16988 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16989 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16990 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16991 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16992 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16993 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16994 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16995 pdf->o_len = o_len;
16996
16997 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16998 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16999 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17000 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17001
17002 if (id_len == 32)
17003 {
17004 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
17005 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
17006 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
17007 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
17008 }
17009
17010 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17011 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17012 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17013 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17014 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17015 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17016 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17017 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17018
17019 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17020 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17021 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17022 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17023 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17024 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17025 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17026 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17027
17028 // precompute rc4 data for later use
17029
17030 uint padding[8] =
17031 {
17032 0x5e4ebf28,
17033 0x418a754e,
17034 0x564e0064,
17035 0x0801faff,
17036 0xb6002e2e,
17037 0x803e68d0,
17038 0xfea90c2f,
17039 0x7a695364
17040 };
17041
17042 // md5
17043
17044 uint salt_pc_block[32] = { 0 };
17045
17046 char *salt_pc_ptr = (char *) salt_pc_block;
17047
17048 memcpy (salt_pc_ptr, padding, 32);
17049 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
17050
17051 uint salt_pc_digest[4] = { 0 };
17052
17053 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
17054
17055 pdf->rc4data[0] = salt_pc_digest[0];
17056 pdf->rc4data[1] = salt_pc_digest[1];
17057
17058 // we use ID for salt, maybe needs to change, we will see...
17059
17060 salt->salt_buf[0] = pdf->id_buf[0];
17061 salt->salt_buf[1] = pdf->id_buf[1];
17062 salt->salt_buf[2] = pdf->id_buf[2];
17063 salt->salt_buf[3] = pdf->id_buf[3];
17064 salt->salt_buf[4] = pdf->u_buf[0];
17065 salt->salt_buf[5] = pdf->u_buf[1];
17066 salt->salt_buf[6] = pdf->o_buf[0];
17067 salt->salt_buf[7] = pdf->o_buf[1];
17068 salt->salt_len = pdf->id_len + 16;
17069
17070 salt->salt_iter = ROUNDS_PDF14;
17071
17072 digest[0] = pdf->u_buf[0];
17073 digest[1] = pdf->u_buf[1];
17074 digest[2] = 0;
17075 digest[3] = 0;
17076
17077 return (PARSER_OK);
17078 }
17079
17080 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17081 {
17082 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17083
17084 if (ret != PARSER_OK)
17085 {
17086 return ret;
17087 }
17088
17089 u32 *digest = (u32 *) hash_buf->digest;
17090
17091 salt_t *salt = hash_buf->salt;
17092
17093 digest[0] -= SHA256M_A;
17094 digest[1] -= SHA256M_B;
17095 digest[2] -= SHA256M_C;
17096 digest[3] -= SHA256M_D;
17097 digest[4] -= SHA256M_E;
17098 digest[5] -= SHA256M_F;
17099 digest[6] -= SHA256M_G;
17100 digest[7] -= SHA256M_H;
17101
17102 salt->salt_buf[2] = 0x80;
17103
17104 return (PARSER_OK);
17105 }
17106
17107 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17108 {
17109 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17110
17111 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17112
17113 u32 *digest = (u32 *) hash_buf->digest;
17114
17115 salt_t *salt = hash_buf->salt;
17116
17117 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17118
17119 /**
17120 * parse line
17121 */
17122
17123 char *V_pos = input_buf + 5;
17124
17125 char *R_pos = strchr (V_pos, '*');
17126
17127 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17128
17129 u32 V_len = R_pos - V_pos;
17130
17131 R_pos++;
17132
17133 char *bits_pos = strchr (R_pos, '*');
17134
17135 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17136
17137 u32 R_len = bits_pos - R_pos;
17138
17139 bits_pos++;
17140
17141 char *P_pos = strchr (bits_pos, '*');
17142
17143 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17144
17145 u32 bits_len = P_pos - bits_pos;
17146
17147 P_pos++;
17148
17149 char *enc_md_pos = strchr (P_pos, '*');
17150
17151 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17152
17153 u32 P_len = enc_md_pos - P_pos;
17154
17155 enc_md_pos++;
17156
17157 char *id_len_pos = strchr (enc_md_pos, '*');
17158
17159 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17160
17161 u32 enc_md_len = id_len_pos - enc_md_pos;
17162
17163 id_len_pos++;
17164
17165 char *id_buf_pos = strchr (id_len_pos, '*');
17166
17167 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17168
17169 u32 id_len_len = id_buf_pos - id_len_pos;
17170
17171 id_buf_pos++;
17172
17173 char *u_len_pos = strchr (id_buf_pos, '*');
17174
17175 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17176
17177 u32 id_buf_len = u_len_pos - id_buf_pos;
17178
17179 u_len_pos++;
17180
17181 char *u_buf_pos = strchr (u_len_pos, '*');
17182
17183 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17184
17185 u32 u_len_len = u_buf_pos - u_len_pos;
17186
17187 u_buf_pos++;
17188
17189 char *o_len_pos = strchr (u_buf_pos, '*');
17190
17191 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17192
17193 u32 u_buf_len = o_len_pos - u_buf_pos;
17194
17195 o_len_pos++;
17196
17197 char *o_buf_pos = strchr (o_len_pos, '*');
17198
17199 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17200
17201 u32 o_len_len = o_buf_pos - o_len_pos;
17202
17203 o_buf_pos++;
17204
17205 char *last = strchr (o_buf_pos, '*');
17206
17207 if (last == NULL) last = input_buf + input_len;
17208
17209 u32 o_buf_len = last - o_buf_pos;
17210
17211 // validate data
17212
17213 const int V = atoi (V_pos);
17214 const int R = atoi (R_pos);
17215
17216 int vr_ok = 0;
17217
17218 if ((V == 5) && (R == 5)) vr_ok = 1;
17219 if ((V == 5) && (R == 6)) vr_ok = 1;
17220
17221 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17222
17223 const int bits = atoi (bits_pos);
17224
17225 if (bits != 256) return (PARSER_SALT_VALUE);
17226
17227 int enc_md = atoi (enc_md_pos);
17228
17229 if (enc_md != 1) return (PARSER_SALT_VALUE);
17230
17231 const uint id_len = atoi (id_len_pos);
17232 const uint u_len = atoi (u_len_pos);
17233 const uint o_len = atoi (o_len_pos);
17234
17235 if (V_len > 6) return (PARSER_SALT_LENGTH);
17236 if (R_len > 6) return (PARSER_SALT_LENGTH);
17237 if (P_len > 6) return (PARSER_SALT_LENGTH);
17238 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17239 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17240 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17241 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17242 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17243
17244 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17245 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17246 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17247
17248 // copy data to esalt
17249
17250 if (u_len < 40) return (PARSER_SALT_VALUE);
17251
17252 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17253 {
17254 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17255 }
17256
17257 salt->salt_buf[0] = pdf->u_buf[8];
17258 salt->salt_buf[1] = pdf->u_buf[9];
17259
17260 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17261 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17262
17263 salt->salt_len = 8;
17264 salt->salt_iter = ROUNDS_PDF17L8;
17265
17266 digest[0] = pdf->u_buf[0];
17267 digest[1] = pdf->u_buf[1];
17268 digest[2] = pdf->u_buf[2];
17269 digest[3] = pdf->u_buf[3];
17270 digest[4] = pdf->u_buf[4];
17271 digest[5] = pdf->u_buf[5];
17272 digest[6] = pdf->u_buf[6];
17273 digest[7] = pdf->u_buf[7];
17274
17275 return (PARSER_OK);
17276 }
17277
17278 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17279 {
17280 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17281
17282 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17283
17284 u32 *digest = (u32 *) hash_buf->digest;
17285
17286 salt_t *salt = hash_buf->salt;
17287
17288 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17289
17290 /**
17291 * parse line
17292 */
17293
17294 // iterations
17295
17296 char *iter_pos = input_buf + 7;
17297
17298 u32 iter = atoi (iter_pos);
17299
17300 if (iter < 1) return (PARSER_SALT_ITERATION);
17301 if (iter > 999999) return (PARSER_SALT_ITERATION);
17302
17303 // first is *raw* salt
17304
17305 char *salt_pos = strchr (iter_pos, ':');
17306
17307 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17308
17309 salt_pos++;
17310
17311 char *hash_pos = strchr (salt_pos, ':');
17312
17313 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17314
17315 u32 salt_len = hash_pos - salt_pos;
17316
17317 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17318
17319 hash_pos++;
17320
17321 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17322
17323 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17324
17325 // decode salt
17326
17327 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17328
17329 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17330
17331 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17332
17333 salt_buf_ptr[salt_len + 3] = 0x01;
17334 salt_buf_ptr[salt_len + 4] = 0x80;
17335
17336 salt->salt_len = salt_len;
17337 salt->salt_iter = iter - 1;
17338
17339 // decode hash
17340
17341 u8 tmp_buf[100] = { 0 };
17342
17343 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17344
17345 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17346
17347 memcpy (digest, tmp_buf, 16);
17348
17349 digest[0] = byte_swap_32 (digest[0]);
17350 digest[1] = byte_swap_32 (digest[1]);
17351 digest[2] = byte_swap_32 (digest[2]);
17352 digest[3] = byte_swap_32 (digest[3]);
17353
17354 // add some stuff to normal salt to make sorted happy
17355
17356 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17357 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17358 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17359 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17360 salt->salt_buf[4] = salt->salt_iter;
17361
17362 return (PARSER_OK);
17363 }
17364
17365 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17366 {
17367 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17368
17369 u32 *digest = (u32 *) hash_buf->digest;
17370
17371 salt_t *salt = hash_buf->salt;
17372
17373 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17374 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17375 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17376 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17377
17378 digest[0] = byte_swap_32 (digest[0]);
17379 digest[1] = byte_swap_32 (digest[1]);
17380 digest[2] = byte_swap_32 (digest[2]);
17381 digest[3] = byte_swap_32 (digest[3]);
17382
17383 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17384
17385 uint salt_len = input_len - 32 - 1;
17386
17387 char *salt_buf = input_buf + 32 + 1;
17388
17389 char *salt_buf_ptr = (char *) salt->salt_buf;
17390
17391 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17392
17393 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17394
17395 salt->salt_len = salt_len;
17396
17397 return (PARSER_OK);
17398 }
17399
17400 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17401 {
17402 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17403
17404 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17405
17406 u32 *digest = (u32 *) hash_buf->digest;
17407
17408 salt_t *salt = hash_buf->salt;
17409
17410 char *user_pos = input_buf + 10;
17411
17412 char *salt_pos = strchr (user_pos, '*');
17413
17414 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17415
17416 salt_pos++;
17417
17418 char *hash_pos = strchr (salt_pos, '*');
17419
17420 hash_pos++;
17421
17422 uint hash_len = input_len - (hash_pos - input_buf);
17423
17424 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17425
17426 uint user_len = salt_pos - user_pos - 1;
17427
17428 uint salt_len = hash_pos - salt_pos - 1;
17429
17430 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17431
17432 /*
17433 * store digest
17434 */
17435
17436 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17437 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17438 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17439 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17440
17441 digest[0] = byte_swap_32 (digest[0]);
17442 digest[1] = byte_swap_32 (digest[1]);
17443 digest[2] = byte_swap_32 (digest[2]);
17444 digest[3] = byte_swap_32 (digest[3]);
17445
17446 digest[0] -= MD5M_A;
17447 digest[1] -= MD5M_B;
17448 digest[2] -= MD5M_C;
17449 digest[3] -= MD5M_D;
17450
17451 /*
17452 * store salt
17453 */
17454
17455 char *salt_buf_ptr = (char *) salt->salt_buf;
17456
17457 // first 4 bytes are the "challenge"
17458
17459 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17460 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17461 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17462 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17463
17464 // append the user name
17465
17466 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17467
17468 salt->salt_len = 4 + user_len;
17469
17470 return (PARSER_OK);
17471 }
17472
17473 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17474 {
17475 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17476
17477 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17478
17479 u32 *digest = (u32 *) hash_buf->digest;
17480
17481 salt_t *salt = hash_buf->salt;
17482
17483 char *salt_pos = input_buf + 9;
17484
17485 char *hash_pos = strchr (salt_pos, '*');
17486
17487 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17488
17489 hash_pos++;
17490
17491 uint hash_len = input_len - (hash_pos - input_buf);
17492
17493 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17494
17495 uint salt_len = hash_pos - salt_pos - 1;
17496
17497 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17498
17499 /*
17500 * store digest
17501 */
17502
17503 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17504 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17505 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17506 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17507 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17508
17509 /*
17510 * store salt
17511 */
17512
17513 char *salt_buf_ptr = (char *) salt->salt_buf;
17514
17515 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17516
17517 salt->salt_len = salt_len;
17518
17519 return (PARSER_OK);
17520 }
17521
17522 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17523 {
17524 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17525
17526 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17527
17528 u32 *digest = (u32 *) hash_buf->digest;
17529
17530 salt_t *salt = hash_buf->salt;
17531
17532 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17533
17534 /**
17535 * parse line
17536 */
17537
17538 char *cry_master_len_pos = input_buf + 9;
17539
17540 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17541
17542 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17543
17544 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17545
17546 cry_master_buf_pos++;
17547
17548 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17549
17550 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17551
17552 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17553
17554 cry_salt_len_pos++;
17555
17556 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17557
17558 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17559
17560 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17561
17562 cry_salt_buf_pos++;
17563
17564 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17565
17566 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17567
17568 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17569
17570 cry_rounds_pos++;
17571
17572 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17573
17574 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17575
17576 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17577
17578 ckey_len_pos++;
17579
17580 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17581
17582 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17583
17584 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17585
17586 ckey_buf_pos++;
17587
17588 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17589
17590 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17591
17592 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17593
17594 public_key_len_pos++;
17595
17596 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17597
17598 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17599
17600 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17601
17602 public_key_buf_pos++;
17603
17604 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;
17605
17606 const uint cry_master_len = atoi (cry_master_len_pos);
17607 const uint cry_salt_len = atoi (cry_salt_len_pos);
17608 const uint ckey_len = atoi (ckey_len_pos);
17609 const uint public_key_len = atoi (public_key_len_pos);
17610
17611 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17612 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17613 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17614 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17615
17616 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17617 {
17618 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17619
17620 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17621 }
17622
17623 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17624 {
17625 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17626
17627 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17628 }
17629
17630 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17631 {
17632 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17633
17634 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17635 }
17636
17637 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17638 bitcoin_wallet->ckey_len = ckey_len / 2;
17639 bitcoin_wallet->public_key_len = public_key_len / 2;
17640
17641 /*
17642 * store digest (should be unique enought, hopefully)
17643 */
17644
17645 digest[0] = bitcoin_wallet->cry_master_buf[0];
17646 digest[1] = bitcoin_wallet->cry_master_buf[1];
17647 digest[2] = bitcoin_wallet->cry_master_buf[2];
17648 digest[3] = bitcoin_wallet->cry_master_buf[3];
17649
17650 /*
17651 * store salt
17652 */
17653
17654 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17655
17656 const uint cry_rounds = atoi (cry_rounds_pos);
17657
17658 salt->salt_iter = cry_rounds - 1;
17659
17660 char *salt_buf_ptr = (char *) salt->salt_buf;
17661
17662 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17663
17664 salt->salt_len = salt_len;
17665
17666 return (PARSER_OK);
17667 }
17668
17669 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17670 {
17671 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17672
17673 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17674
17675 u32 *digest = (u32 *) hash_buf->digest;
17676
17677 salt_t *salt = hash_buf->salt;
17678
17679 sip_t *sip = (sip_t *) hash_buf->esalt;
17680
17681 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17682
17683 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17684
17685 memcpy (temp_input_buf, input_buf, input_len);
17686
17687 // URI_server:
17688
17689 char *URI_server_pos = temp_input_buf + 6;
17690
17691 char *URI_client_pos = strchr (URI_server_pos, '*');
17692
17693 if (URI_client_pos == NULL)
17694 {
17695 myfree (temp_input_buf);
17696
17697 return (PARSER_SEPARATOR_UNMATCHED);
17698 }
17699
17700 URI_client_pos[0] = 0;
17701 URI_client_pos++;
17702
17703 uint URI_server_len = strlen (URI_server_pos);
17704
17705 if (URI_server_len > 512)
17706 {
17707 myfree (temp_input_buf);
17708
17709 return (PARSER_SALT_LENGTH);
17710 }
17711
17712 // URI_client:
17713
17714 char *user_pos = strchr (URI_client_pos, '*');
17715
17716 if (user_pos == NULL)
17717 {
17718 myfree (temp_input_buf);
17719
17720 return (PARSER_SEPARATOR_UNMATCHED);
17721 }
17722
17723 user_pos[0] = 0;
17724 user_pos++;
17725
17726 uint URI_client_len = strlen (URI_client_pos);
17727
17728 if (URI_client_len > 512)
17729 {
17730 myfree (temp_input_buf);
17731
17732 return (PARSER_SALT_LENGTH);
17733 }
17734
17735 // user:
17736
17737 char *realm_pos = strchr (user_pos, '*');
17738
17739 if (realm_pos == NULL)
17740 {
17741 myfree (temp_input_buf);
17742
17743 return (PARSER_SEPARATOR_UNMATCHED);
17744 }
17745
17746 realm_pos[0] = 0;
17747 realm_pos++;
17748
17749 uint user_len = strlen (user_pos);
17750
17751 if (user_len > 116)
17752 {
17753 myfree (temp_input_buf);
17754
17755 return (PARSER_SALT_LENGTH);
17756 }
17757
17758 // realm:
17759
17760 char *method_pos = strchr (realm_pos, '*');
17761
17762 if (method_pos == NULL)
17763 {
17764 myfree (temp_input_buf);
17765
17766 return (PARSER_SEPARATOR_UNMATCHED);
17767 }
17768
17769 method_pos[0] = 0;
17770 method_pos++;
17771
17772 uint realm_len = strlen (realm_pos);
17773
17774 if (realm_len > 116)
17775 {
17776 myfree (temp_input_buf);
17777
17778 return (PARSER_SALT_LENGTH);
17779 }
17780
17781 // method:
17782
17783 char *URI_prefix_pos = strchr (method_pos, '*');
17784
17785 if (URI_prefix_pos == NULL)
17786 {
17787 myfree (temp_input_buf);
17788
17789 return (PARSER_SEPARATOR_UNMATCHED);
17790 }
17791
17792 URI_prefix_pos[0] = 0;
17793 URI_prefix_pos++;
17794
17795 uint method_len = strlen (method_pos);
17796
17797 if (method_len > 246)
17798 {
17799 myfree (temp_input_buf);
17800
17801 return (PARSER_SALT_LENGTH);
17802 }
17803
17804 // URI_prefix:
17805
17806 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17807
17808 if (URI_resource_pos == NULL)
17809 {
17810 myfree (temp_input_buf);
17811
17812 return (PARSER_SEPARATOR_UNMATCHED);
17813 }
17814
17815 URI_resource_pos[0] = 0;
17816 URI_resource_pos++;
17817
17818 uint URI_prefix_len = strlen (URI_prefix_pos);
17819
17820 if (URI_prefix_len > 245)
17821 {
17822 myfree (temp_input_buf);
17823
17824 return (PARSER_SALT_LENGTH);
17825 }
17826
17827 // URI_resource:
17828
17829 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17830
17831 if (URI_suffix_pos == NULL)
17832 {
17833 myfree (temp_input_buf);
17834
17835 return (PARSER_SEPARATOR_UNMATCHED);
17836 }
17837
17838 URI_suffix_pos[0] = 0;
17839 URI_suffix_pos++;
17840
17841 uint URI_resource_len = strlen (URI_resource_pos);
17842
17843 if (URI_resource_len < 1 || URI_resource_len > 246)
17844 {
17845 myfree (temp_input_buf);
17846
17847 return (PARSER_SALT_LENGTH);
17848 }
17849
17850 // URI_suffix:
17851
17852 char *nonce_pos = strchr (URI_suffix_pos, '*');
17853
17854 if (nonce_pos == NULL)
17855 {
17856 myfree (temp_input_buf);
17857
17858 return (PARSER_SEPARATOR_UNMATCHED);
17859 }
17860
17861 nonce_pos[0] = 0;
17862 nonce_pos++;
17863
17864 uint URI_suffix_len = strlen (URI_suffix_pos);
17865
17866 if (URI_suffix_len > 245)
17867 {
17868 myfree (temp_input_buf);
17869
17870 return (PARSER_SALT_LENGTH);
17871 }
17872
17873 // nonce:
17874
17875 char *nonce_client_pos = strchr (nonce_pos, '*');
17876
17877 if (nonce_client_pos == NULL)
17878 {
17879 myfree (temp_input_buf);
17880
17881 return (PARSER_SEPARATOR_UNMATCHED);
17882 }
17883
17884 nonce_client_pos[0] = 0;
17885 nonce_client_pos++;
17886
17887 uint nonce_len = strlen (nonce_pos);
17888
17889 if (nonce_len < 1 || nonce_len > 50)
17890 {
17891 myfree (temp_input_buf);
17892
17893 return (PARSER_SALT_LENGTH);
17894 }
17895
17896 // nonce_client:
17897
17898 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17899
17900 if (nonce_count_pos == NULL)
17901 {
17902 myfree (temp_input_buf);
17903
17904 return (PARSER_SEPARATOR_UNMATCHED);
17905 }
17906
17907 nonce_count_pos[0] = 0;
17908 nonce_count_pos++;
17909
17910 uint nonce_client_len = strlen (nonce_client_pos);
17911
17912 if (nonce_client_len > 50)
17913 {
17914 myfree (temp_input_buf);
17915
17916 return (PARSER_SALT_LENGTH);
17917 }
17918
17919 // nonce_count:
17920
17921 char *qop_pos = strchr (nonce_count_pos, '*');
17922
17923 if (qop_pos == NULL)
17924 {
17925 myfree (temp_input_buf);
17926
17927 return (PARSER_SEPARATOR_UNMATCHED);
17928 }
17929
17930 qop_pos[0] = 0;
17931 qop_pos++;
17932
17933 uint nonce_count_len = strlen (nonce_count_pos);
17934
17935 if (nonce_count_len > 50)
17936 {
17937 myfree (temp_input_buf);
17938
17939 return (PARSER_SALT_LENGTH);
17940 }
17941
17942 // qop:
17943
17944 char *directive_pos = strchr (qop_pos, '*');
17945
17946 if (directive_pos == NULL)
17947 {
17948 myfree (temp_input_buf);
17949
17950 return (PARSER_SEPARATOR_UNMATCHED);
17951 }
17952
17953 directive_pos[0] = 0;
17954 directive_pos++;
17955
17956 uint qop_len = strlen (qop_pos);
17957
17958 if (qop_len > 50)
17959 {
17960 myfree (temp_input_buf);
17961
17962 return (PARSER_SALT_LENGTH);
17963 }
17964
17965 // directive
17966
17967 char *digest_pos = strchr (directive_pos, '*');
17968
17969 if (digest_pos == NULL)
17970 {
17971 myfree (temp_input_buf);
17972
17973 return (PARSER_SEPARATOR_UNMATCHED);
17974 }
17975
17976 digest_pos[0] = 0;
17977 digest_pos++;
17978
17979 uint directive_len = strlen (directive_pos);
17980
17981 if (directive_len != 3)
17982 {
17983 myfree (temp_input_buf);
17984
17985 return (PARSER_SALT_LENGTH);
17986 }
17987
17988 if (memcmp (directive_pos, "MD5", 3))
17989 {
17990 log_info ("ERROR: only the MD5 directive is currently supported\n");
17991
17992 myfree (temp_input_buf);
17993
17994 return (PARSER_SIP_AUTH_DIRECTIVE);
17995 }
17996
17997 /*
17998 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17999 */
18000
18001 uint md5_len = 0;
18002
18003 uint md5_max_len = 4 * 64;
18004
18005 uint md5_remaining_len = md5_max_len;
18006
18007 uint tmp_md5_buf[64] = { 0 };
18008
18009 char *tmp_md5_ptr = (char *) tmp_md5_buf;
18010
18011 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
18012
18013 md5_len += method_len + 1;
18014 tmp_md5_ptr += method_len + 1;
18015
18016 if (URI_prefix_len > 0)
18017 {
18018 md5_remaining_len = md5_max_len - md5_len;
18019
18020 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
18021
18022 md5_len += URI_prefix_len + 1;
18023 tmp_md5_ptr += URI_prefix_len + 1;
18024 }
18025
18026 md5_remaining_len = md5_max_len - md5_len;
18027
18028 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
18029
18030 md5_len += URI_resource_len;
18031 tmp_md5_ptr += URI_resource_len;
18032
18033 if (URI_suffix_len > 0)
18034 {
18035 md5_remaining_len = md5_max_len - md5_len;
18036
18037 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
18038
18039 md5_len += 1 + URI_suffix_len;
18040 }
18041
18042 uint tmp_digest[4] = { 0 };
18043
18044 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
18045
18046 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
18047 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
18048 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
18049 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
18050
18051 /*
18052 * esalt
18053 */
18054
18055 char *esalt_buf_ptr = (char *) sip->esalt_buf;
18056
18057 uint esalt_len = 0;
18058
18059 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
18060
18061 // there are 2 possibilities for the esalt:
18062
18063 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
18064 {
18065 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
18066
18067 if (esalt_len > max_esalt_len)
18068 {
18069 myfree (temp_input_buf);
18070
18071 return (PARSER_SALT_LENGTH);
18072 }
18073
18074 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18075 nonce_pos,
18076 nonce_count_pos,
18077 nonce_client_pos,
18078 qop_pos,
18079 tmp_digest[0],
18080 tmp_digest[1],
18081 tmp_digest[2],
18082 tmp_digest[3]);
18083 }
18084 else
18085 {
18086 esalt_len = 1 + nonce_len + 1 + 32;
18087
18088 if (esalt_len > max_esalt_len)
18089 {
18090 myfree (temp_input_buf);
18091
18092 return (PARSER_SALT_LENGTH);
18093 }
18094
18095 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18096 nonce_pos,
18097 tmp_digest[0],
18098 tmp_digest[1],
18099 tmp_digest[2],
18100 tmp_digest[3]);
18101 }
18102
18103 // add 0x80 to esalt
18104
18105 esalt_buf_ptr[esalt_len] = 0x80;
18106
18107 sip->esalt_len = esalt_len;
18108
18109 /*
18110 * actual salt
18111 */
18112
18113 char *sip_salt_ptr = (char *) sip->salt_buf;
18114
18115 uint salt_len = user_len + 1 + realm_len + 1;
18116
18117 uint max_salt_len = 119;
18118
18119 if (salt_len > max_salt_len)
18120 {
18121 myfree (temp_input_buf);
18122
18123 return (PARSER_SALT_LENGTH);
18124 }
18125
18126 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18127
18128 sip->salt_len = salt_len;
18129
18130 /*
18131 * fake salt (for sorting)
18132 */
18133
18134 char *salt_buf_ptr = (char *) salt->salt_buf;
18135
18136 max_salt_len = 55;
18137
18138 uint fake_salt_len = salt_len;
18139
18140 if (fake_salt_len > max_salt_len)
18141 {
18142 fake_salt_len = max_salt_len;
18143 }
18144
18145 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18146
18147 salt->salt_len = fake_salt_len;
18148
18149 /*
18150 * digest
18151 */
18152
18153 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18154 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18155 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18156 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18157
18158 digest[0] = byte_swap_32 (digest[0]);
18159 digest[1] = byte_swap_32 (digest[1]);
18160 digest[2] = byte_swap_32 (digest[2]);
18161 digest[3] = byte_swap_32 (digest[3]);
18162
18163 myfree (temp_input_buf);
18164
18165 return (PARSER_OK);
18166 }
18167
18168 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18169 {
18170 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18171
18172 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18173
18174 u32 *digest = (u32 *) hash_buf->digest;
18175
18176 salt_t *salt = hash_buf->salt;
18177
18178 // digest
18179
18180 char *digest_pos = input_buf;
18181
18182 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18183 digest[1] = 0;
18184 digest[2] = 0;
18185 digest[3] = 0;
18186
18187 // salt
18188
18189 char *salt_buf = input_buf + 8 + 1;
18190
18191 uint salt_len = 8;
18192
18193 char *salt_buf_ptr = (char *) salt->salt_buf;
18194
18195 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18196
18197 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18198
18199 salt->salt_len = salt_len;
18200
18201 return (PARSER_OK);
18202 }
18203
18204 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18205 {
18206 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18207
18208 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18209
18210 u32 *digest = (u32 *) hash_buf->digest;
18211
18212 salt_t *salt = hash_buf->salt;
18213
18214 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18215
18216 /**
18217 * parse line
18218 */
18219
18220 char *p_buf_pos = input_buf + 4;
18221
18222 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18223
18224 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18225
18226 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18227
18228 NumCyclesPower_pos++;
18229
18230 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18231
18232 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18233
18234 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18235
18236 salt_len_pos++;
18237
18238 char *salt_buf_pos = strchr (salt_len_pos, '$');
18239
18240 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18241
18242 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18243
18244 salt_buf_pos++;
18245
18246 char *iv_len_pos = strchr (salt_buf_pos, '$');
18247
18248 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18249
18250 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18251
18252 iv_len_pos++;
18253
18254 char *iv_buf_pos = strchr (iv_len_pos, '$');
18255
18256 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18257
18258 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18259
18260 iv_buf_pos++;
18261
18262 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18263
18264 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18265
18266 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18267
18268 crc_buf_pos++;
18269
18270 char *data_len_pos = strchr (crc_buf_pos, '$');
18271
18272 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18273
18274 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18275
18276 data_len_pos++;
18277
18278 char *unpack_size_pos = strchr (data_len_pos, '$');
18279
18280 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18281
18282 u32 data_len_len = unpack_size_pos - data_len_pos;
18283
18284 unpack_size_pos++;
18285
18286 char *data_buf_pos = strchr (unpack_size_pos, '$');
18287
18288 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18289
18290 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18291
18292 data_buf_pos++;
18293
18294 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;
18295
18296 const uint iter = atoi (NumCyclesPower_pos);
18297 const uint crc = atoi (crc_buf_pos);
18298 const uint p_buf = atoi (p_buf_pos);
18299 const uint salt_len = atoi (salt_len_pos);
18300 const uint iv_len = atoi (iv_len_pos);
18301 const uint unpack_size = atoi (unpack_size_pos);
18302 const uint data_len = atoi (data_len_pos);
18303
18304 /**
18305 * verify some data
18306 */
18307
18308 if (p_buf != 0) return (PARSER_SALT_VALUE);
18309 if (salt_len != 0) return (PARSER_SALT_VALUE);
18310
18311 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18312
18313 if (data_len > 384) return (PARSER_SALT_VALUE);
18314
18315 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18316
18317 /**
18318 * store data
18319 */
18320
18321 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18322 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18323 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18324 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18325
18326 seven_zip->iv_len = iv_len;
18327
18328 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18329
18330 seven_zip->salt_len = 0;
18331
18332 seven_zip->crc = crc;
18333
18334 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18335 {
18336 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18337
18338 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18339 }
18340
18341 seven_zip->data_len = data_len;
18342
18343 seven_zip->unpack_size = unpack_size;
18344
18345 // real salt
18346
18347 salt->salt_buf[0] = seven_zip->data_buf[0];
18348 salt->salt_buf[1] = seven_zip->data_buf[1];
18349 salt->salt_buf[2] = seven_zip->data_buf[2];
18350 salt->salt_buf[3] = seven_zip->data_buf[3];
18351
18352 salt->salt_len = 16;
18353
18354 salt->salt_sign[0] = iter;
18355
18356 salt->salt_iter = 1 << iter;
18357
18358 /**
18359 * digest
18360 */
18361
18362 digest[0] = crc;
18363 digest[1] = 0;
18364 digest[2] = 0;
18365 digest[3] = 0;
18366
18367 return (PARSER_OK);
18368 }
18369
18370 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18371 {
18372 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18373
18374 u32 *digest = (u32 *) hash_buf->digest;
18375
18376 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18377 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18378 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18379 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18380 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18381 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18382 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18383 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18384
18385 digest[0] = byte_swap_32 (digest[0]);
18386 digest[1] = byte_swap_32 (digest[1]);
18387 digest[2] = byte_swap_32 (digest[2]);
18388 digest[3] = byte_swap_32 (digest[3]);
18389 digest[4] = byte_swap_32 (digest[4]);
18390 digest[5] = byte_swap_32 (digest[5]);
18391 digest[6] = byte_swap_32 (digest[6]);
18392 digest[7] = byte_swap_32 (digest[7]);
18393
18394 return (PARSER_OK);
18395 }
18396
18397 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18398 {
18399 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18400
18401 u32 *digest = (u32 *) hash_buf->digest;
18402
18403 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18404 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18405 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18406 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18407 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18408 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18409 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18410 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18411 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18412 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18413 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18414 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18415 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18416 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18417 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18418 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18419
18420 digest[ 0] = byte_swap_32 (digest[ 0]);
18421 digest[ 1] = byte_swap_32 (digest[ 1]);
18422 digest[ 2] = byte_swap_32 (digest[ 2]);
18423 digest[ 3] = byte_swap_32 (digest[ 3]);
18424 digest[ 4] = byte_swap_32 (digest[ 4]);
18425 digest[ 5] = byte_swap_32 (digest[ 5]);
18426 digest[ 6] = byte_swap_32 (digest[ 6]);
18427 digest[ 7] = byte_swap_32 (digest[ 7]);
18428 digest[ 8] = byte_swap_32 (digest[ 8]);
18429 digest[ 9] = byte_swap_32 (digest[ 9]);
18430 digest[10] = byte_swap_32 (digest[10]);
18431 digest[11] = byte_swap_32 (digest[11]);
18432 digest[12] = byte_swap_32 (digest[12]);
18433 digest[13] = byte_swap_32 (digest[13]);
18434 digest[14] = byte_swap_32 (digest[14]);
18435 digest[15] = byte_swap_32 (digest[15]);
18436
18437 return (PARSER_OK);
18438 }
18439
18440 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18441 {
18442 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18443
18444 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18445
18446 u32 *digest = (u32 *) hash_buf->digest;
18447
18448 salt_t *salt = hash_buf->salt;
18449
18450 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18451
18452 /**
18453 * parse line
18454 */
18455
18456 // iterations
18457
18458 char *iter_pos = input_buf + 4;
18459
18460 u32 iter = atoi (iter_pos);
18461
18462 if (iter < 1) return (PARSER_SALT_ITERATION);
18463 if (iter > 999999) return (PARSER_SALT_ITERATION);
18464
18465 // first is *raw* salt
18466
18467 char *salt_pos = strchr (iter_pos, ':');
18468
18469 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18470
18471 salt_pos++;
18472
18473 char *hash_pos = strchr (salt_pos, ':');
18474
18475 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18476
18477 u32 salt_len = hash_pos - salt_pos;
18478
18479 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18480
18481 hash_pos++;
18482
18483 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18484
18485 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18486
18487 // decode salt
18488
18489 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18490
18491 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18492
18493 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18494
18495 salt_buf_ptr[salt_len + 3] = 0x01;
18496 salt_buf_ptr[salt_len + 4] = 0x80;
18497
18498 salt->salt_len = salt_len;
18499 salt->salt_iter = iter - 1;
18500
18501 // decode hash
18502
18503 u8 tmp_buf[100] = { 0 };
18504
18505 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18506
18507 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18508
18509 memcpy (digest, tmp_buf, 16);
18510
18511 // add some stuff to normal salt to make sorted happy
18512
18513 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18514 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18515 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18516 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18517 salt->salt_buf[4] = salt->salt_iter;
18518
18519 return (PARSER_OK);
18520 }
18521
18522 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18523 {
18524 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18525
18526 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18527
18528 u32 *digest = (u32 *) hash_buf->digest;
18529
18530 salt_t *salt = hash_buf->salt;
18531
18532 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18533
18534 /**
18535 * parse line
18536 */
18537
18538 // iterations
18539
18540 char *iter_pos = input_buf + 5;
18541
18542 u32 iter = atoi (iter_pos);
18543
18544 if (iter < 1) return (PARSER_SALT_ITERATION);
18545 if (iter > 999999) return (PARSER_SALT_ITERATION);
18546
18547 // first is *raw* salt
18548
18549 char *salt_pos = strchr (iter_pos, ':');
18550
18551 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18552
18553 salt_pos++;
18554
18555 char *hash_pos = strchr (salt_pos, ':');
18556
18557 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18558
18559 u32 salt_len = hash_pos - salt_pos;
18560
18561 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18562
18563 hash_pos++;
18564
18565 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18566
18567 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18568
18569 // decode salt
18570
18571 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18572
18573 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18574
18575 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18576
18577 salt_buf_ptr[salt_len + 3] = 0x01;
18578 salt_buf_ptr[salt_len + 4] = 0x80;
18579
18580 salt->salt_len = salt_len;
18581 salt->salt_iter = iter - 1;
18582
18583 // decode hash
18584
18585 u8 tmp_buf[100] = { 0 };
18586
18587 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18588
18589 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18590
18591 memcpy (digest, tmp_buf, 16);
18592
18593 digest[0] = byte_swap_32 (digest[0]);
18594 digest[1] = byte_swap_32 (digest[1]);
18595 digest[2] = byte_swap_32 (digest[2]);
18596 digest[3] = byte_swap_32 (digest[3]);
18597
18598 // add some stuff to normal salt to make sorted happy
18599
18600 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18601 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18602 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18603 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18604 salt->salt_buf[4] = salt->salt_iter;
18605
18606 return (PARSER_OK);
18607 }
18608
18609 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18610 {
18611 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18612
18613 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18614
18615 u64 *digest = (u64 *) hash_buf->digest;
18616
18617 salt_t *salt = hash_buf->salt;
18618
18619 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18620
18621 /**
18622 * parse line
18623 */
18624
18625 // iterations
18626
18627 char *iter_pos = input_buf + 7;
18628
18629 u32 iter = atoi (iter_pos);
18630
18631 if (iter < 1) return (PARSER_SALT_ITERATION);
18632 if (iter > 999999) return (PARSER_SALT_ITERATION);
18633
18634 // first is *raw* salt
18635
18636 char *salt_pos = strchr (iter_pos, ':');
18637
18638 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18639
18640 salt_pos++;
18641
18642 char *hash_pos = strchr (salt_pos, ':');
18643
18644 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18645
18646 u32 salt_len = hash_pos - salt_pos;
18647
18648 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18649
18650 hash_pos++;
18651
18652 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18653
18654 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18655
18656 // decode salt
18657
18658 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18659
18660 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18661
18662 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18663
18664 salt_buf_ptr[salt_len + 3] = 0x01;
18665 salt_buf_ptr[salt_len + 4] = 0x80;
18666
18667 salt->salt_len = salt_len;
18668 salt->salt_iter = iter - 1;
18669
18670 // decode hash
18671
18672 u8 tmp_buf[100] = { 0 };
18673
18674 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18675
18676 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18677
18678 memcpy (digest, tmp_buf, 64);
18679
18680 digest[0] = byte_swap_64 (digest[0]);
18681 digest[1] = byte_swap_64 (digest[1]);
18682 digest[2] = byte_swap_64 (digest[2]);
18683 digest[3] = byte_swap_64 (digest[3]);
18684 digest[4] = byte_swap_64 (digest[4]);
18685 digest[5] = byte_swap_64 (digest[5]);
18686 digest[6] = byte_swap_64 (digest[6]);
18687 digest[7] = byte_swap_64 (digest[7]);
18688
18689 // add some stuff to normal salt to make sorted happy
18690
18691 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18692 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18693 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18694 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18695 salt->salt_buf[4] = salt->salt_iter;
18696
18697 return (PARSER_OK);
18698 }
18699
18700 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18701 {
18702 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18703
18704 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18705
18706 uint *digest = (uint *) hash_buf->digest;
18707
18708 salt_t *salt = hash_buf->salt;
18709
18710 /**
18711 * parse line
18712 */
18713
18714 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18715
18716 char *hash_pos = strchr (salt_pos, '$');
18717
18718 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18719
18720 u32 salt_len = hash_pos - salt_pos;
18721
18722 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18723
18724 hash_pos++;
18725
18726 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18727
18728 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18729
18730 // decode hash
18731
18732 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18733 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18734 digest[ 2] = 0;
18735 digest[ 3] = 0;
18736 digest[ 4] = 0;
18737 digest[ 5] = 0;
18738 digest[ 6] = 0;
18739 digest[ 7] = 0;
18740 digest[ 8] = 0;
18741 digest[ 9] = 0;
18742 digest[10] = 0;
18743 digest[11] = 0;
18744 digest[12] = 0;
18745 digest[13] = 0;
18746 digest[14] = 0;
18747 digest[15] = 0;
18748
18749 // decode salt
18750
18751 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18752 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18753
18754 salt->salt_iter = ROUNDS_ECRYPTFS;
18755 salt->salt_len = 8;
18756
18757 return (PARSER_OK);
18758 }
18759
18760 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18761 {
18762 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18763
18764 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18765
18766 unsigned char c19 = itoa64_to_int (input_buf[19]);
18767
18768 if (c19 & 3) return (PARSER_HASH_VALUE);
18769
18770 salt_t *salt = hash_buf->salt;
18771
18772 u32 *digest = (u32 *) hash_buf->digest;
18773
18774 // iteration count
18775
18776 salt->salt_iter = itoa64_to_int (input_buf[1])
18777 | itoa64_to_int (input_buf[2]) << 6
18778 | itoa64_to_int (input_buf[3]) << 12
18779 | itoa64_to_int (input_buf[4]) << 18;
18780
18781 // set salt
18782
18783 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18784 | itoa64_to_int (input_buf[6]) << 6
18785 | itoa64_to_int (input_buf[7]) << 12
18786 | itoa64_to_int (input_buf[8]) << 18;
18787
18788 salt->salt_len = 4;
18789
18790 u8 tmp_buf[100] = { 0 };
18791
18792 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18793
18794 memcpy (digest, tmp_buf, 8);
18795
18796 uint tt;
18797
18798 IP (digest[0], digest[1], tt);
18799
18800 digest[0] = rotr32 (digest[0], 31);
18801 digest[1] = rotr32 (digest[1], 31);
18802 digest[2] = 0;
18803 digest[3] = 0;
18804
18805 return (PARSER_OK);
18806 }
18807
18808 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18809 {
18810 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18811
18812 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18813
18814 u32 *digest = (u32 *) hash_buf->digest;
18815
18816 salt_t *salt = hash_buf->salt;
18817
18818 /**
18819 * parse line
18820 */
18821
18822 char *type_pos = input_buf + 6 + 1;
18823
18824 char *salt_pos = strchr (type_pos, '*');
18825
18826 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18827
18828 u32 type_len = salt_pos - type_pos;
18829
18830 if (type_len != 1) return (PARSER_SALT_LENGTH);
18831
18832 salt_pos++;
18833
18834 char *crypted_pos = strchr (salt_pos, '*');
18835
18836 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18837
18838 u32 salt_len = crypted_pos - salt_pos;
18839
18840 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18841
18842 crypted_pos++;
18843
18844 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18845
18846 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18847
18848 /**
18849 * copy data
18850 */
18851
18852 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18853 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18854
18855 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18856 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18857
18858 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18859 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18860 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18861 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18862
18863 salt->salt_len = 24;
18864 salt->salt_iter = ROUNDS_RAR3;
18865
18866 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18867 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18868
18869 digest[0] = 0xc43d7b00;
18870 digest[1] = 0x40070000;
18871 digest[2] = 0;
18872 digest[3] = 0;
18873
18874 return (PARSER_OK);
18875 }
18876
18877 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18878 {
18879 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18880
18881 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18882
18883 u32 *digest = (u32 *) hash_buf->digest;
18884
18885 salt_t *salt = hash_buf->salt;
18886
18887 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18888
18889 /**
18890 * parse line
18891 */
18892
18893 char *param0_pos = input_buf + 1 + 4 + 1;
18894
18895 char *param1_pos = strchr (param0_pos, '$');
18896
18897 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18898
18899 u32 param0_len = param1_pos - param0_pos;
18900
18901 param1_pos++;
18902
18903 char *param2_pos = strchr (param1_pos, '$');
18904
18905 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18906
18907 u32 param1_len = param2_pos - param1_pos;
18908
18909 param2_pos++;
18910
18911 char *param3_pos = strchr (param2_pos, '$');
18912
18913 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18914
18915 u32 param2_len = param3_pos - param2_pos;
18916
18917 param3_pos++;
18918
18919 char *param4_pos = strchr (param3_pos, '$');
18920
18921 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18922
18923 u32 param3_len = param4_pos - param3_pos;
18924
18925 param4_pos++;
18926
18927 char *param5_pos = strchr (param4_pos, '$');
18928
18929 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18930
18931 u32 param4_len = param5_pos - param4_pos;
18932
18933 param5_pos++;
18934
18935 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18936
18937 char *salt_buf = param1_pos;
18938 char *iv = param3_pos;
18939 char *pswcheck = param5_pos;
18940
18941 const uint salt_len = atoi (param0_pos);
18942 const uint iterations = atoi (param2_pos);
18943 const uint pswcheck_len = atoi (param4_pos);
18944
18945 /**
18946 * verify some data
18947 */
18948
18949 if (param1_len != 32) return (PARSER_SALT_VALUE);
18950 if (param3_len != 32) return (PARSER_SALT_VALUE);
18951 if (param5_len != 16) return (PARSER_SALT_VALUE);
18952
18953 if (salt_len != 16) return (PARSER_SALT_VALUE);
18954 if (iterations == 0) return (PARSER_SALT_VALUE);
18955 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18956
18957 /**
18958 * store data
18959 */
18960
18961 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18962 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18963 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18964 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18965
18966 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18967 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18968 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18969 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18970
18971 salt->salt_len = 16;
18972
18973 salt->salt_sign[0] = iterations;
18974
18975 salt->salt_iter = ((1 << iterations) + 32) - 1;
18976
18977 /**
18978 * digest buf
18979 */
18980
18981 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18982 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18983 digest[2] = 0;
18984 digest[3] = 0;
18985
18986 return (PARSER_OK);
18987 }
18988
18989 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18990 {
18991 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
18992
18993 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18994
18995 u32 *digest = (u32 *) hash_buf->digest;
18996
18997 salt_t *salt = hash_buf->salt;
18998
18999 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
19000
19001 /**
19002 * parse line
19003 */
19004
19005 /* Skip '$' */
19006 char *account_pos = input_buf + 11 + 1;
19007
19008 char *data_pos;
19009
19010 uint data_len;
19011
19012 if (account_pos[0] == '*')
19013 {
19014 account_pos++;
19015
19016 data_pos = strchr (account_pos, '*');
19017
19018 /* Skip '*' */
19019 data_pos++;
19020
19021 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19022
19023 uint account_len = data_pos - account_pos + 1;
19024
19025 if (account_len >= 512) return (PARSER_SALT_LENGTH);
19026
19027 /* Skip '$' */
19028 data_pos++;
19029
19030 data_len = input_len - 11 - 1 - account_len - 2;
19031
19032 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
19033 }
19034 else
19035 {
19036 /* assume $krb5tgs$23$checksum$edata2 */
19037 data_pos = account_pos;
19038
19039 memcpy (krb5tgs->account_info, "**", 3);
19040
19041 data_len = input_len - 11 - 1 - 1;
19042 }
19043
19044 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
19045
19046 char *checksum_ptr = (char *) krb5tgs->checksum;
19047
19048 for (uint i = 0; i < 16 * 2; i += 2)
19049 {
19050 const char p0 = data_pos[i + 0];
19051 const char p1 = data_pos[i + 1];
19052
19053 *checksum_ptr++ = hex_convert (p1) << 0
19054 | hex_convert (p0) << 4;
19055 }
19056
19057 char *edata_ptr = (char *) krb5tgs->edata2;
19058
19059 krb5tgs->edata2_len = (data_len - 32) / 2 ;
19060
19061 /* skip '$' */
19062 for (uint i = 16 * 2 + 1; i < (krb5tgs->edata2_len * 2) + (16 * 2 + 1); i += 2)
19063 {
19064 const char p0 = data_pos[i + 0];
19065 const char p1 = data_pos[i + 1];
19066 *edata_ptr++ = hex_convert (p1) << 0
19067 | hex_convert (p0) << 4;
19068 }
19069
19070 /* this is needed for hmac_md5 */
19071 *edata_ptr++ = 0x80;
19072
19073 salt->salt_buf[0] = krb5tgs->checksum[0];
19074 salt->salt_buf[1] = krb5tgs->checksum[1];
19075 salt->salt_buf[2] = krb5tgs->checksum[2];
19076 salt->salt_buf[3] = krb5tgs->checksum[3];
19077
19078 salt->salt_len = 32;
19079
19080 digest[0] = krb5tgs->checksum[0];
19081 digest[1] = krb5tgs->checksum[1];
19082 digest[2] = krb5tgs->checksum[2];
19083 digest[3] = krb5tgs->checksum[3];
19084
19085 return (PARSER_OK);
19086 }
19087
19088 int axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19089 {
19090 if ((input_len < DISPLAY_LEN_MIN_13200) || (input_len > DISPLAY_LEN_MAX_13200)) return (PARSER_GLOBAL_LENGTH);
19091
19092 if (memcmp (SIGNATURE_AXCRYPT, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19093
19094 u32 *digest = (u32 *) hash_buf->digest;
19095
19096 salt_t *salt = hash_buf->salt;
19097
19098 /**
19099 * parse line
19100 */
19101
19102 /* Skip '*' */
19103 char *wrapping_rounds_pos = input_buf + 11 + 1;
19104
19105 char *salt_pos;
19106
19107 char *wrapped_key_pos;
19108
19109 char *data_pos;
19110
19111 salt->salt_iter = atoi (wrapping_rounds_pos);
19112
19113 salt_pos = strchr (wrapping_rounds_pos, '*');
19114
19115 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19116
19117 uint wrapping_rounds_len = salt_pos - wrapping_rounds_pos;
19118
19119 /* Skip '*' */
19120 salt_pos++;
19121
19122 data_pos = salt_pos;
19123
19124 wrapped_key_pos = strchr (salt_pos, '*');
19125
19126 if (wrapped_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19127
19128 uint salt_len = wrapped_key_pos - salt_pos;
19129
19130 if (salt_len != 32) return (PARSER_SALT_LENGTH);
19131
19132 /* Skip '*' */
19133 wrapped_key_pos++;
19134
19135 uint wrapped_key_len = input_len - 11 - 1 - wrapping_rounds_len - 1 - salt_len - 1;
19136
19137 if (wrapped_key_len != 48) return (PARSER_SALT_LENGTH);
19138
19139 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19140 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19141 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &data_pos[16]);
19142 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &data_pos[24]);
19143
19144 data_pos += 33;
19145
19146 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19147 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19148 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &data_pos[16]);
19149 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &data_pos[24]);
19150 salt->salt_buf[8] = hex_to_u32 ((const u8 *) &data_pos[32]);
19151 salt->salt_buf[9] = hex_to_u32 ((const u8 *) &data_pos[40]);
19152
19153 salt->salt_len = 40;
19154
19155 digest[0] = salt->salt_buf[0];
19156 digest[1] = salt->salt_buf[1];
19157 digest[2] = salt->salt_buf[2];
19158 digest[3] = salt->salt_buf[3];
19159
19160 return (PARSER_OK);
19161 }
19162
19163 int keepass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19164 {
19165 if ((input_len < DISPLAY_LEN_MIN_13400) || (input_len > DISPLAY_LEN_MAX_13400)) return (PARSER_GLOBAL_LENGTH);
19166
19167 if (memcmp (SIGNATURE_KEEPASS, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
19168
19169 u32 *digest = (u32 *) hash_buf->digest;
19170
19171 salt_t *salt = hash_buf->salt;
19172
19173 keepass_t *keepass = (keepass_t *) hash_buf->esalt;
19174
19175 /**
19176 * parse line
19177 */
19178
19179 char *version_pos;
19180
19181 char *rounds_pos;
19182
19183 char *algorithm_pos;
19184
19185 char *final_random_seed_pos;
19186 u32 final_random_seed_len;
19187
19188 char *transf_random_seed_pos;
19189 u32 transf_random_seed_len;
19190
19191 char *enc_iv_pos;
19192 u32 enc_iv_len;
19193
19194 /* default is no keyfile provided */
19195 char *keyfile_len_pos;
19196 u32 keyfile_len = 0;
19197 u32 is_keyfile_present = 0;
19198 char *keyfile_inline_pos;
19199 char *keyfile_pos;
19200
19201 /* specific to version 1 */
19202 char *contents_len_pos;
19203 u32 contents_len;
19204 char *contents_pos;
19205
19206 /* specific to version 2 */
19207 char *expected_bytes_pos;
19208 u32 expected_bytes_len;
19209
19210 char *contents_hash_pos;
19211 u32 contents_hash_len;
19212
19213 version_pos = input_buf + 8 + 1 + 1;
19214
19215 keepass->version = atoi (version_pos);
19216
19217 rounds_pos = strchr (version_pos, '*');
19218
19219 if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19220
19221 rounds_pos++;
19222
19223 salt->salt_iter = (atoi (rounds_pos));
19224
19225 algorithm_pos = strchr (rounds_pos, '*');
19226
19227 if (algorithm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19228
19229 algorithm_pos++;
19230
19231 keepass->algorithm = atoi (algorithm_pos);
19232
19233 final_random_seed_pos = strchr (algorithm_pos, '*');
19234
19235 if (final_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19236
19237 final_random_seed_pos++;
19238
19239 keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]);
19240 keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]);
19241 keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]);
19242 keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]);
19243
19244 if (keepass->version == 2)
19245 {
19246 keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]);
19247 keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]);
19248 keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]);
19249 keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]);
19250 }
19251
19252 transf_random_seed_pos = strchr (final_random_seed_pos, '*');
19253
19254 if (transf_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19255
19256 final_random_seed_len = transf_random_seed_pos - final_random_seed_pos;
19257
19258 if (keepass->version == 1 && final_random_seed_len != 32) return (PARSER_SALT_LENGTH);
19259 if (keepass->version == 2 && final_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19260
19261 transf_random_seed_pos++;
19262
19263 keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]);
19264 keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]);
19265 keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]);
19266 keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]);
19267 keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]);
19268 keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]);
19269 keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]);
19270 keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]);
19271
19272 enc_iv_pos = strchr (transf_random_seed_pos, '*');
19273
19274 if (enc_iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19275
19276 transf_random_seed_len = enc_iv_pos - transf_random_seed_pos;
19277
19278 if (transf_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19279
19280 enc_iv_pos++;
19281
19282 keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]);
19283 keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]);
19284 keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]);
19285 keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]);
19286
19287 if (keepass->version == 1)
19288 {
19289 contents_hash_pos = strchr (enc_iv_pos, '*');
19290
19291 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19292
19293 enc_iv_len = contents_hash_pos - enc_iv_pos;
19294
19295 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19296
19297 contents_hash_pos++;
19298
19299 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19300 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19301 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19302 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19303 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19304 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19305 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19306 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19307
19308 /* get length of contents following */
19309 char *inline_flag_pos = strchr (contents_hash_pos, '*');
19310
19311 if (inline_flag_pos == NULL) return (PARSER_SALT_LENGTH);
19312
19313 contents_hash_len = inline_flag_pos - contents_hash_pos;
19314
19315 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19316
19317 inline_flag_pos++;
19318
19319 u32 inline_flag = atoi (inline_flag_pos);
19320
19321 if (inline_flag != 1) return (PARSER_SALT_LENGTH);
19322
19323 contents_len_pos = strchr (inline_flag_pos, '*');
19324
19325 if (contents_len_pos == NULL) return (PARSER_SALT_LENGTH);
19326
19327 contents_len_pos++;
19328
19329 contents_len = atoi (contents_len_pos);
19330
19331 if (contents_len > 50000) return (PARSER_SALT_LENGTH);
19332
19333 contents_pos = strchr (contents_len_pos, '*');
19334
19335 if (contents_pos == NULL) return (PARSER_SALT_LENGTH);
19336
19337 contents_pos++;
19338
19339 u32 i;
19340
19341 keepass->contents_len = contents_len;
19342
19343 contents_len = contents_len / 4;
19344
19345 keyfile_inline_pos = strchr (contents_pos, '*');
19346
19347 u32 real_contents_len;
19348
19349 if (keyfile_inline_pos == NULL)
19350 real_contents_len = input_len - (contents_pos - input_buf);
19351 else
19352 {
19353 real_contents_len = keyfile_inline_pos - contents_pos;
19354 keyfile_inline_pos++;
19355 is_keyfile_present = 1;
19356 }
19357
19358 if (real_contents_len != keepass->contents_len * 2) return (PARSER_SALT_LENGTH);
19359
19360 for (i = 0; i < contents_len; i++)
19361 keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]);
19362 }
19363 else if (keepass->version == 2)
19364 {
19365 expected_bytes_pos = strchr (enc_iv_pos, '*');
19366
19367 if (expected_bytes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19368
19369 enc_iv_len = expected_bytes_pos - enc_iv_pos;
19370
19371 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19372
19373 expected_bytes_pos++;
19374
19375 keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]);
19376 keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]);
19377 keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]);
19378 keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]);
19379 keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]);
19380 keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]);
19381 keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]);
19382 keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]);
19383
19384 contents_hash_pos = strchr (expected_bytes_pos, '*');
19385
19386 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19387
19388 expected_bytes_len = contents_hash_pos - expected_bytes_pos;
19389
19390 if (expected_bytes_len != 64) return (PARSER_SALT_LENGTH);
19391
19392 contents_hash_pos++;
19393
19394 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19395 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19396 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19397 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19398 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19399 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19400 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19401 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19402
19403 keyfile_inline_pos = strchr (contents_hash_pos, '*');
19404
19405 if (keyfile_inline_pos == NULL)
19406 contents_hash_len = input_len - (int) (contents_hash_pos - input_buf);
19407 else
19408 {
19409 contents_hash_len = keyfile_inline_pos - contents_hash_pos;
19410 keyfile_inline_pos++;
19411 is_keyfile_present = 1;
19412 }
19413 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19414 }
19415
19416 if (is_keyfile_present != 0)
19417 {
19418 keyfile_len_pos = strchr (keyfile_inline_pos, '*');
19419
19420 keyfile_len_pos++;
19421
19422 keyfile_len = atoi (keyfile_len_pos);
19423
19424 keepass->keyfile_len = keyfile_len;
19425
19426 if (keyfile_len != 64) return (PARSER_SALT_LENGTH);
19427
19428 keyfile_pos = strchr (keyfile_len_pos, '*');
19429
19430 if (keyfile_pos == NULL) return (PARSER_SALT_LENGTH);
19431
19432 keyfile_pos++;
19433
19434 u32 real_keyfile_len = input_len - (keyfile_pos - input_buf);
19435
19436 if (real_keyfile_len != 64) return (PARSER_SALT_LENGTH);
19437
19438 keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]);
19439 keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]);
19440 keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]);
19441 keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]);
19442 keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]);
19443 keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]);
19444 keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]);
19445 keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]);
19446 }
19447
19448 digest[0] = keepass->enc_iv[0];
19449 digest[1] = keepass->enc_iv[1];
19450 digest[2] = keepass->enc_iv[2];
19451 digest[3] = keepass->enc_iv[3];
19452
19453 salt->salt_buf[0] = keepass->transf_random_seed[0];
19454 salt->salt_buf[1] = keepass->transf_random_seed[1];
19455 salt->salt_buf[2] = keepass->transf_random_seed[2];
19456 salt->salt_buf[3] = keepass->transf_random_seed[3];
19457 salt->salt_buf[4] = keepass->transf_random_seed[4];
19458 salt->salt_buf[5] = keepass->transf_random_seed[5];
19459 salt->salt_buf[6] = keepass->transf_random_seed[6];
19460 salt->salt_buf[7] = keepass->transf_random_seed[7];
19461
19462 return (PARSER_OK);
19463 }
19464
19465 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19466 {
19467 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
19468
19469 u32 *digest = (u32 *) hash_buf->digest;
19470
19471 salt_t *salt = hash_buf->salt;
19472
19473 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
19474 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
19475 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
19476 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
19477 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
19478 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
19479 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
19480 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
19481
19482 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
19483
19484 uint salt_len = input_len - 64 - 1;
19485
19486 char *salt_buf = input_buf + 64 + 1;
19487
19488 char *salt_buf_ptr = (char *) salt->salt_buf;
19489
19490 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
19491
19492 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19493
19494 salt->salt_len = salt_len;
19495
19496 /**
19497 * we can precompute the first sha256 transform
19498 */
19499
19500 uint w[16] = { 0 };
19501
19502 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
19503 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
19504 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
19505 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
19506 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
19507 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
19508 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
19509 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
19510 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
19511 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
19512 w[10] = byte_swap_32 (salt->salt_buf[10]);
19513 w[11] = byte_swap_32 (salt->salt_buf[11]);
19514 w[12] = byte_swap_32 (salt->salt_buf[12]);
19515 w[13] = byte_swap_32 (salt->salt_buf[13]);
19516 w[14] = byte_swap_32 (salt->salt_buf[14]);
19517 w[15] = byte_swap_32 (salt->salt_buf[15]);
19518
19519 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
19520
19521 sha256_64 (w, pc256);
19522
19523 salt->salt_buf_pc[0] = pc256[0];
19524 salt->salt_buf_pc[1] = pc256[1];
19525 salt->salt_buf_pc[2] = pc256[2];
19526 salt->salt_buf_pc[3] = pc256[3];
19527 salt->salt_buf_pc[4] = pc256[4];
19528 salt->salt_buf_pc[5] = pc256[5];
19529 salt->salt_buf_pc[6] = pc256[6];
19530 salt->salt_buf_pc[7] = pc256[7];
19531
19532 digest[0] -= pc256[0];
19533 digest[1] -= pc256[1];
19534 digest[2] -= pc256[2];
19535 digest[3] -= pc256[3];
19536 digest[4] -= pc256[4];
19537 digest[5] -= pc256[5];
19538 digest[6] -= pc256[6];
19539 digest[7] -= pc256[7];
19540
19541 return (PARSER_OK);
19542 }
19543
19544 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19545 {
19546 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
19547
19548 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
19549
19550 u32 *digest = (u32 *) hash_buf->digest;
19551
19552 salt_t *salt = hash_buf->salt;
19553
19554 /**
19555 * parse line
19556 */
19557
19558 char *data_len_pos = input_buf + 1 + 10 + 1;
19559
19560 char *data_buf_pos = strchr (data_len_pos, '$');
19561
19562 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19563
19564 u32 data_len_len = data_buf_pos - data_len_pos;
19565
19566 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
19567 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
19568
19569 data_buf_pos++;
19570
19571 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
19572
19573 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
19574
19575 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
19576
19577 u32 data_len = atoi (data_len_pos);
19578
19579 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
19580
19581 /**
19582 * salt
19583 */
19584
19585 char *salt_pos = data_buf_pos;
19586
19587 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
19588 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
19589 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
19590 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
19591
19592 // this is actually the CT, which is also the hash later (if matched)
19593
19594 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
19595 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
19596 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
19597 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
19598
19599 salt->salt_len = 32; // note we need to fix this to 16 in kernel
19600
19601 salt->salt_iter = 10 - 1;
19602
19603 /**
19604 * digest buf
19605 */
19606
19607 digest[0] = salt->salt_buf[4];
19608 digest[1] = salt->salt_buf[5];
19609 digest[2] = salt->salt_buf[6];
19610 digest[3] = salt->salt_buf[7];
19611
19612 return (PARSER_OK);
19613 }
19614
19615 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19616 {
19617 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
19618
19619 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19620
19621 u32 *digest = (u32 *) hash_buf->digest;
19622
19623 salt_t *salt = hash_buf->salt;
19624
19625 /**
19626 * parse line
19627 */
19628
19629 char *salt_pos = input_buf + 11 + 1;
19630
19631 char *iter_pos = strchr (salt_pos, ',');
19632
19633 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19634
19635 u32 salt_len = iter_pos - salt_pos;
19636
19637 if (salt_len != 20) return (PARSER_SALT_LENGTH);
19638
19639 iter_pos++;
19640
19641 char *hash_pos = strchr (iter_pos, ',');
19642
19643 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19644
19645 u32 iter_len = hash_pos - iter_pos;
19646
19647 if (iter_len > 5) return (PARSER_SALT_LENGTH);
19648
19649 hash_pos++;
19650
19651 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
19652
19653 if (hash_len != 64) return (PARSER_HASH_LENGTH);
19654
19655 /**
19656 * salt
19657 */
19658
19659 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
19660 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
19661 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
19662 salt->salt_buf[3] = 0x00018000;
19663
19664 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19665 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19666 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
19667 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
19668
19669 salt->salt_len = salt_len / 2;
19670
19671 salt->salt_iter = atoi (iter_pos) - 1;
19672
19673 /**
19674 * digest buf
19675 */
19676
19677 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19678 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19679 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19680 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19681 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19682 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19683 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19684 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19685
19686 return (PARSER_OK);
19687 }
19688
19689 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19690 {
19691 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
19692
19693 u32 *digest = (u32 *) hash_buf->digest;
19694
19695 salt_t *salt = hash_buf->salt;
19696
19697 /**
19698 * parse line
19699 */
19700
19701 char *hash_pos = input_buf + 64;
19702 char *salt1_pos = input_buf + 128;
19703 char *salt2_pos = input_buf;
19704
19705 /**
19706 * salt
19707 */
19708
19709 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
19710 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
19711 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
19712 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
19713
19714 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
19715 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
19716 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
19717 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
19718
19719 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
19720 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
19721 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
19722 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
19723
19724 salt->salt_len = 48;
19725
19726 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
19727
19728 /**
19729 * digest buf
19730 */
19731
19732 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19733 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19734 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19735 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19736 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19737 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19738 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19739 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19740
19741 return (PARSER_OK);
19742 }
19743
19744 /**
19745 * parallel running threads
19746 */
19747
19748 #ifdef WIN
19749
19750 BOOL WINAPI sigHandler_default (DWORD sig)
19751 {
19752 switch (sig)
19753 {
19754 case CTRL_CLOSE_EVENT:
19755
19756 /*
19757 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
19758 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
19759 * function otherwise it is too late (e.g. after returning from this function)
19760 */
19761
19762 myabort ();
19763
19764 SetConsoleCtrlHandler (NULL, TRUE);
19765
19766 hc_sleep (10);
19767
19768 return TRUE;
19769
19770 case CTRL_C_EVENT:
19771 case CTRL_LOGOFF_EVENT:
19772 case CTRL_SHUTDOWN_EVENT:
19773
19774 myabort ();
19775
19776 SetConsoleCtrlHandler (NULL, TRUE);
19777
19778 return TRUE;
19779 }
19780
19781 return FALSE;
19782 }
19783
19784 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19785 {
19786 switch (sig)
19787 {
19788 case CTRL_CLOSE_EVENT:
19789
19790 myabort ();
19791
19792 SetConsoleCtrlHandler (NULL, TRUE);
19793
19794 hc_sleep (10);
19795
19796 return TRUE;
19797
19798 case CTRL_C_EVENT:
19799 case CTRL_LOGOFF_EVENT:
19800 case CTRL_SHUTDOWN_EVENT:
19801
19802 myquit ();
19803
19804 SetConsoleCtrlHandler (NULL, TRUE);
19805
19806 return TRUE;
19807 }
19808
19809 return FALSE;
19810 }
19811
19812 void hc_signal (BOOL WINAPI (callback) (DWORD))
19813 {
19814 if (callback == NULL)
19815 {
19816 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19817 }
19818 else
19819 {
19820 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19821 }
19822 }
19823
19824 #else
19825
19826 void sigHandler_default (int sig)
19827 {
19828 myabort ();
19829
19830 signal (sig, NULL);
19831 }
19832
19833 void sigHandler_benchmark (int sig)
19834 {
19835 myquit ();
19836
19837 signal (sig, NULL);
19838 }
19839
19840 void hc_signal (void (callback) (int))
19841 {
19842 if (callback == NULL) callback = SIG_DFL;
19843
19844 signal (SIGINT, callback);
19845 signal (SIGTERM, callback);
19846 signal (SIGABRT, callback);
19847 }
19848
19849 #endif
19850
19851 void status_display ();
19852
19853 void *thread_keypress (void *p)
19854 {
19855 int benchmark = *((int *) p);
19856
19857 uint quiet = data.quiet;
19858
19859 tty_break();
19860
19861 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19862 {
19863 int ch = tty_getchar();
19864
19865 if (ch == -1) break;
19866
19867 if (ch == 0) continue;
19868
19869 #ifdef _POSIX
19870 if (ch != '\n')
19871 #endif
19872
19873 hc_thread_mutex_lock (mux_display);
19874
19875 log_info ("");
19876
19877 switch (ch)
19878 {
19879 case 's':
19880 case '\n':
19881
19882 log_info ("");
19883
19884 status_display ();
19885
19886 log_info ("");
19887
19888 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19889 if (quiet == 0) fflush (stdout);
19890
19891 break;
19892
19893 case 'b':
19894
19895 log_info ("");
19896
19897 bypass ();
19898
19899 log_info ("");
19900
19901 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19902 if (quiet == 0) fflush (stdout);
19903
19904 break;
19905
19906 case 'p':
19907
19908 log_info ("");
19909
19910 SuspendThreads ();
19911
19912 log_info ("");
19913
19914 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19915 if (quiet == 0) fflush (stdout);
19916
19917 break;
19918
19919 case 'r':
19920
19921 log_info ("");
19922
19923 ResumeThreads ();
19924
19925 log_info ("");
19926
19927 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19928 if (quiet == 0) fflush (stdout);
19929
19930 break;
19931
19932 case 'c':
19933
19934 log_info ("");
19935
19936 if (benchmark == 1) break;
19937
19938 stop_at_checkpoint ();
19939
19940 log_info ("");
19941
19942 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19943 if (quiet == 0) fflush (stdout);
19944
19945 break;
19946
19947 case 'q':
19948
19949 log_info ("");
19950
19951 if (benchmark == 1)
19952 {
19953 myquit ();
19954 }
19955 else
19956 {
19957 myabort ();
19958 }
19959
19960 break;
19961 }
19962
19963 hc_thread_mutex_unlock (mux_display);
19964 }
19965
19966 tty_fix();
19967
19968 return (p);
19969 }
19970
19971 /**
19972 * rules common
19973 */
19974
19975 bool class_num (const u8 c)
19976 {
19977 return ((c >= '0') && (c <= '9'));
19978 }
19979
19980 bool class_lower (const u8 c)
19981 {
19982 return ((c >= 'a') && (c <= 'z'));
19983 }
19984
19985 bool class_upper (const u8 c)
19986 {
19987 return ((c >= 'A') && (c <= 'Z'));
19988 }
19989
19990 bool class_alpha (const u8 c)
19991 {
19992 return (class_lower (c) || class_upper (c));
19993 }
19994
19995 int conv_ctoi (const u8 c)
19996 {
19997 if (class_num (c))
19998 {
19999 return c - '0';
20000 }
20001 else if (class_upper (c))
20002 {
20003 return c - 'A' + 10;
20004 }
20005
20006 return -1;
20007 }
20008
20009 int conv_itoc (const u8 c)
20010 {
20011 if (c < 10)
20012 {
20013 return c + '0';
20014 }
20015 else if (c < 37)
20016 {
20017 return c + 'A' - 10;
20018 }
20019
20020 return -1;
20021 }
20022
20023 /**
20024 * device rules
20025 */
20026
20027 #define INCR_POS if (++rule_pos == rule_len) return (-1)
20028 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
20029 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
20030 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
20031 #define MAX_KERNEL_RULES 255
20032 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
20033 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20034 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20035
20036 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
20037 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
20038 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20039 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20040
20041 int cpu_rule_to_kernel_rule (char *rule_buf, uint rule_len, kernel_rule_t *rule)
20042 {
20043 uint rule_pos;
20044 uint rule_cnt;
20045
20046 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
20047 {
20048 switch (rule_buf[rule_pos])
20049 {
20050 case ' ':
20051 rule_cnt--;
20052 break;
20053
20054 case RULE_OP_MANGLE_NOOP:
20055 SET_NAME (rule, rule_buf[rule_pos]);
20056 break;
20057
20058 case RULE_OP_MANGLE_LREST:
20059 SET_NAME (rule, rule_buf[rule_pos]);
20060 break;
20061
20062 case RULE_OP_MANGLE_UREST:
20063 SET_NAME (rule, rule_buf[rule_pos]);
20064 break;
20065
20066 case RULE_OP_MANGLE_LREST_UFIRST:
20067 SET_NAME (rule, rule_buf[rule_pos]);
20068 break;
20069
20070 case RULE_OP_MANGLE_UREST_LFIRST:
20071 SET_NAME (rule, rule_buf[rule_pos]);
20072 break;
20073
20074 case RULE_OP_MANGLE_TREST:
20075 SET_NAME (rule, rule_buf[rule_pos]);
20076 break;
20077
20078 case RULE_OP_MANGLE_TOGGLE_AT:
20079 SET_NAME (rule, rule_buf[rule_pos]);
20080 SET_P0_CONV (rule, rule_buf[rule_pos]);
20081 break;
20082
20083 case RULE_OP_MANGLE_REVERSE:
20084 SET_NAME (rule, rule_buf[rule_pos]);
20085 break;
20086
20087 case RULE_OP_MANGLE_DUPEWORD:
20088 SET_NAME (rule, rule_buf[rule_pos]);
20089 break;
20090
20091 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20092 SET_NAME (rule, rule_buf[rule_pos]);
20093 SET_P0_CONV (rule, rule_buf[rule_pos]);
20094 break;
20095
20096 case RULE_OP_MANGLE_REFLECT:
20097 SET_NAME (rule, rule_buf[rule_pos]);
20098 break;
20099
20100 case RULE_OP_MANGLE_ROTATE_LEFT:
20101 SET_NAME (rule, rule_buf[rule_pos]);
20102 break;
20103
20104 case RULE_OP_MANGLE_ROTATE_RIGHT:
20105 SET_NAME (rule, rule_buf[rule_pos]);
20106 break;
20107
20108 case RULE_OP_MANGLE_APPEND:
20109 SET_NAME (rule, rule_buf[rule_pos]);
20110 SET_P0 (rule, rule_buf[rule_pos]);
20111 break;
20112
20113 case RULE_OP_MANGLE_PREPEND:
20114 SET_NAME (rule, rule_buf[rule_pos]);
20115 SET_P0 (rule, rule_buf[rule_pos]);
20116 break;
20117
20118 case RULE_OP_MANGLE_DELETE_FIRST:
20119 SET_NAME (rule, rule_buf[rule_pos]);
20120 break;
20121
20122 case RULE_OP_MANGLE_DELETE_LAST:
20123 SET_NAME (rule, rule_buf[rule_pos]);
20124 break;
20125
20126 case RULE_OP_MANGLE_DELETE_AT:
20127 SET_NAME (rule, rule_buf[rule_pos]);
20128 SET_P0_CONV (rule, rule_buf[rule_pos]);
20129 break;
20130
20131 case RULE_OP_MANGLE_EXTRACT:
20132 SET_NAME (rule, rule_buf[rule_pos]);
20133 SET_P0_CONV (rule, rule_buf[rule_pos]);
20134 SET_P1_CONV (rule, rule_buf[rule_pos]);
20135 break;
20136
20137 case RULE_OP_MANGLE_OMIT:
20138 SET_NAME (rule, rule_buf[rule_pos]);
20139 SET_P0_CONV (rule, rule_buf[rule_pos]);
20140 SET_P1_CONV (rule, rule_buf[rule_pos]);
20141 break;
20142
20143 case RULE_OP_MANGLE_INSERT:
20144 SET_NAME (rule, rule_buf[rule_pos]);
20145 SET_P0_CONV (rule, rule_buf[rule_pos]);
20146 SET_P1 (rule, rule_buf[rule_pos]);
20147 break;
20148
20149 case RULE_OP_MANGLE_OVERSTRIKE:
20150 SET_NAME (rule, rule_buf[rule_pos]);
20151 SET_P0_CONV (rule, rule_buf[rule_pos]);
20152 SET_P1 (rule, rule_buf[rule_pos]);
20153 break;
20154
20155 case RULE_OP_MANGLE_TRUNCATE_AT:
20156 SET_NAME (rule, rule_buf[rule_pos]);
20157 SET_P0_CONV (rule, rule_buf[rule_pos]);
20158 break;
20159
20160 case RULE_OP_MANGLE_REPLACE:
20161 SET_NAME (rule, rule_buf[rule_pos]);
20162 SET_P0 (rule, rule_buf[rule_pos]);
20163 SET_P1 (rule, rule_buf[rule_pos]);
20164 break;
20165
20166 case RULE_OP_MANGLE_PURGECHAR:
20167 return (-1);
20168 break;
20169
20170 case RULE_OP_MANGLE_TOGGLECASE_REC:
20171 return (-1);
20172 break;
20173
20174 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20175 SET_NAME (rule, rule_buf[rule_pos]);
20176 SET_P0_CONV (rule, rule_buf[rule_pos]);
20177 break;
20178
20179 case RULE_OP_MANGLE_DUPECHAR_LAST:
20180 SET_NAME (rule, rule_buf[rule_pos]);
20181 SET_P0_CONV (rule, rule_buf[rule_pos]);
20182 break;
20183
20184 case RULE_OP_MANGLE_DUPECHAR_ALL:
20185 SET_NAME (rule, rule_buf[rule_pos]);
20186 break;
20187
20188 case RULE_OP_MANGLE_SWITCH_FIRST:
20189 SET_NAME (rule, rule_buf[rule_pos]);
20190 break;
20191
20192 case RULE_OP_MANGLE_SWITCH_LAST:
20193 SET_NAME (rule, rule_buf[rule_pos]);
20194 break;
20195
20196 case RULE_OP_MANGLE_SWITCH_AT:
20197 SET_NAME (rule, rule_buf[rule_pos]);
20198 SET_P0_CONV (rule, rule_buf[rule_pos]);
20199 SET_P1_CONV (rule, rule_buf[rule_pos]);
20200 break;
20201
20202 case RULE_OP_MANGLE_CHR_SHIFTL:
20203 SET_NAME (rule, rule_buf[rule_pos]);
20204 SET_P0_CONV (rule, rule_buf[rule_pos]);
20205 break;
20206
20207 case RULE_OP_MANGLE_CHR_SHIFTR:
20208 SET_NAME (rule, rule_buf[rule_pos]);
20209 SET_P0_CONV (rule, rule_buf[rule_pos]);
20210 break;
20211
20212 case RULE_OP_MANGLE_CHR_INCR:
20213 SET_NAME (rule, rule_buf[rule_pos]);
20214 SET_P0_CONV (rule, rule_buf[rule_pos]);
20215 break;
20216
20217 case RULE_OP_MANGLE_CHR_DECR:
20218 SET_NAME (rule, rule_buf[rule_pos]);
20219 SET_P0_CONV (rule, rule_buf[rule_pos]);
20220 break;
20221
20222 case RULE_OP_MANGLE_REPLACE_NP1:
20223 SET_NAME (rule, rule_buf[rule_pos]);
20224 SET_P0_CONV (rule, rule_buf[rule_pos]);
20225 break;
20226
20227 case RULE_OP_MANGLE_REPLACE_NM1:
20228 SET_NAME (rule, rule_buf[rule_pos]);
20229 SET_P0_CONV (rule, rule_buf[rule_pos]);
20230 break;
20231
20232 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20233 SET_NAME (rule, rule_buf[rule_pos]);
20234 SET_P0_CONV (rule, rule_buf[rule_pos]);
20235 break;
20236
20237 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20238 SET_NAME (rule, rule_buf[rule_pos]);
20239 SET_P0_CONV (rule, rule_buf[rule_pos]);
20240 break;
20241
20242 case RULE_OP_MANGLE_TITLE:
20243 SET_NAME (rule, rule_buf[rule_pos]);
20244 break;
20245
20246 default:
20247 return (-1);
20248 break;
20249 }
20250 }
20251
20252 if (rule_pos < rule_len) return (-1);
20253
20254 return (0);
20255 }
20256
20257 int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule)
20258 {
20259 uint rule_cnt;
20260 uint rule_pos;
20261 uint rule_len = HCBUFSIZ - 1; // maximum possible len
20262
20263 char rule_cmd;
20264
20265 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
20266 {
20267 GET_NAME (rule);
20268
20269 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
20270
20271 switch (rule_cmd)
20272 {
20273 case RULE_OP_MANGLE_NOOP:
20274 rule_buf[rule_pos] = rule_cmd;
20275 break;
20276
20277 case RULE_OP_MANGLE_LREST:
20278 rule_buf[rule_pos] = rule_cmd;
20279 break;
20280
20281 case RULE_OP_MANGLE_UREST:
20282 rule_buf[rule_pos] = rule_cmd;
20283 break;
20284
20285 case RULE_OP_MANGLE_LREST_UFIRST:
20286 rule_buf[rule_pos] = rule_cmd;
20287 break;
20288
20289 case RULE_OP_MANGLE_UREST_LFIRST:
20290 rule_buf[rule_pos] = rule_cmd;
20291 break;
20292
20293 case RULE_OP_MANGLE_TREST:
20294 rule_buf[rule_pos] = rule_cmd;
20295 break;
20296
20297 case RULE_OP_MANGLE_TOGGLE_AT:
20298 rule_buf[rule_pos] = rule_cmd;
20299 GET_P0_CONV (rule);
20300 break;
20301
20302 case RULE_OP_MANGLE_REVERSE:
20303 rule_buf[rule_pos] = rule_cmd;
20304 break;
20305
20306 case RULE_OP_MANGLE_DUPEWORD:
20307 rule_buf[rule_pos] = rule_cmd;
20308 break;
20309
20310 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20311 rule_buf[rule_pos] = rule_cmd;
20312 GET_P0_CONV (rule);
20313 break;
20314
20315 case RULE_OP_MANGLE_REFLECT:
20316 rule_buf[rule_pos] = rule_cmd;
20317 break;
20318
20319 case RULE_OP_MANGLE_ROTATE_LEFT:
20320 rule_buf[rule_pos] = rule_cmd;
20321 break;
20322
20323 case RULE_OP_MANGLE_ROTATE_RIGHT:
20324 rule_buf[rule_pos] = rule_cmd;
20325 break;
20326
20327 case RULE_OP_MANGLE_APPEND:
20328 rule_buf[rule_pos] = rule_cmd;
20329 GET_P0 (rule);
20330 break;
20331
20332 case RULE_OP_MANGLE_PREPEND:
20333 rule_buf[rule_pos] = rule_cmd;
20334 GET_P0 (rule);
20335 break;
20336
20337 case RULE_OP_MANGLE_DELETE_FIRST:
20338 rule_buf[rule_pos] = rule_cmd;
20339 break;
20340
20341 case RULE_OP_MANGLE_DELETE_LAST:
20342 rule_buf[rule_pos] = rule_cmd;
20343 break;
20344
20345 case RULE_OP_MANGLE_DELETE_AT:
20346 rule_buf[rule_pos] = rule_cmd;
20347 GET_P0_CONV (rule);
20348 break;
20349
20350 case RULE_OP_MANGLE_EXTRACT:
20351 rule_buf[rule_pos] = rule_cmd;
20352 GET_P0_CONV (rule);
20353 GET_P1_CONV (rule);
20354 break;
20355
20356 case RULE_OP_MANGLE_OMIT:
20357 rule_buf[rule_pos] = rule_cmd;
20358 GET_P0_CONV (rule);
20359 GET_P1_CONV (rule);
20360 break;
20361
20362 case RULE_OP_MANGLE_INSERT:
20363 rule_buf[rule_pos] = rule_cmd;
20364 GET_P0_CONV (rule);
20365 GET_P1 (rule);
20366 break;
20367
20368 case RULE_OP_MANGLE_OVERSTRIKE:
20369 rule_buf[rule_pos] = rule_cmd;
20370 GET_P0_CONV (rule);
20371 GET_P1 (rule);
20372 break;
20373
20374 case RULE_OP_MANGLE_TRUNCATE_AT:
20375 rule_buf[rule_pos] = rule_cmd;
20376 GET_P0_CONV (rule);
20377 break;
20378
20379 case RULE_OP_MANGLE_REPLACE:
20380 rule_buf[rule_pos] = rule_cmd;
20381 GET_P0 (rule);
20382 GET_P1 (rule);
20383 break;
20384
20385 case RULE_OP_MANGLE_PURGECHAR:
20386 return (-1);
20387 break;
20388
20389 case RULE_OP_MANGLE_TOGGLECASE_REC:
20390 return (-1);
20391 break;
20392
20393 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20394 rule_buf[rule_pos] = rule_cmd;
20395 GET_P0_CONV (rule);
20396 break;
20397
20398 case RULE_OP_MANGLE_DUPECHAR_LAST:
20399 rule_buf[rule_pos] = rule_cmd;
20400 GET_P0_CONV (rule);
20401 break;
20402
20403 case RULE_OP_MANGLE_DUPECHAR_ALL:
20404 rule_buf[rule_pos] = rule_cmd;
20405 break;
20406
20407 case RULE_OP_MANGLE_SWITCH_FIRST:
20408 rule_buf[rule_pos] = rule_cmd;
20409 break;
20410
20411 case RULE_OP_MANGLE_SWITCH_LAST:
20412 rule_buf[rule_pos] = rule_cmd;
20413 break;
20414
20415 case RULE_OP_MANGLE_SWITCH_AT:
20416 rule_buf[rule_pos] = rule_cmd;
20417 GET_P0_CONV (rule);
20418 GET_P1_CONV (rule);
20419 break;
20420
20421 case RULE_OP_MANGLE_CHR_SHIFTL:
20422 rule_buf[rule_pos] = rule_cmd;
20423 GET_P0_CONV (rule);
20424 break;
20425
20426 case RULE_OP_MANGLE_CHR_SHIFTR:
20427 rule_buf[rule_pos] = rule_cmd;
20428 GET_P0_CONV (rule);
20429 break;
20430
20431 case RULE_OP_MANGLE_CHR_INCR:
20432 rule_buf[rule_pos] = rule_cmd;
20433 GET_P0_CONV (rule);
20434 break;
20435
20436 case RULE_OP_MANGLE_CHR_DECR:
20437 rule_buf[rule_pos] = rule_cmd;
20438 GET_P0_CONV (rule);
20439 break;
20440
20441 case RULE_OP_MANGLE_REPLACE_NP1:
20442 rule_buf[rule_pos] = rule_cmd;
20443 GET_P0_CONV (rule);
20444 break;
20445
20446 case RULE_OP_MANGLE_REPLACE_NM1:
20447 rule_buf[rule_pos] = rule_cmd;
20448 GET_P0_CONV (rule);
20449 break;
20450
20451 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20452 rule_buf[rule_pos] = rule_cmd;
20453 GET_P0_CONV (rule);
20454 break;
20455
20456 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20457 rule_buf[rule_pos] = rule_cmd;
20458 GET_P0_CONV (rule);
20459 break;
20460
20461 case RULE_OP_MANGLE_TITLE:
20462 rule_buf[rule_pos] = rule_cmd;
20463 break;
20464
20465 case 0:
20466 return rule_pos - 1;
20467 break;
20468
20469 default:
20470 return (-1);
20471 break;
20472 }
20473 }
20474
20475 if (rule_cnt > 0)
20476 {
20477 return rule_pos;
20478 }
20479
20480 return (-1);
20481 }
20482
20483 /**
20484 * CPU rules : this is from hashcat sources, cpu based rules
20485 */
20486
20487 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
20488 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
20489
20490 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
20491 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
20492 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
20493
20494 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
20495 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
20496 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
20497
20498 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
20499 {
20500 int pos;
20501
20502 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
20503
20504 return (arr_len);
20505 }
20506
20507 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
20508 {
20509 int pos;
20510
20511 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
20512
20513 return (arr_len);
20514 }
20515
20516 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
20517 {
20518 int pos;
20519
20520 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
20521
20522 return (arr_len);
20523 }
20524
20525 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
20526 {
20527 int l;
20528 int r;
20529
20530 for (l = 0; l < arr_len; l++)
20531 {
20532 r = arr_len - 1 - l;
20533
20534 if (l >= r) break;
20535
20536 MANGLE_SWITCH (arr, l, r);
20537 }
20538
20539 return (arr_len);
20540 }
20541
20542 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
20543 {
20544 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
20545
20546 memcpy (&arr[arr_len], arr, (size_t) arr_len);
20547
20548 return (arr_len * 2);
20549 }
20550
20551 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
20552 {
20553 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
20554
20555 int orig_len = arr_len;
20556
20557 int i;
20558
20559 for (i = 0; i < times; i++)
20560 {
20561 memcpy (&arr[arr_len], arr, orig_len);
20562
20563 arr_len += orig_len;
20564 }
20565
20566 return (arr_len);
20567 }
20568
20569 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
20570 {
20571 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
20572
20573 mangle_double (arr, arr_len);
20574
20575 mangle_reverse (arr + arr_len, arr_len);
20576
20577 return (arr_len * 2);
20578 }
20579
20580 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
20581 {
20582 int l;
20583 int r;
20584
20585 for (l = 0, r = arr_len - 1; r > 0; r--)
20586 {
20587 MANGLE_SWITCH (arr, l, r);
20588 }
20589
20590 return (arr_len);
20591 }
20592
20593 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
20594 {
20595 int l;
20596 int r;
20597
20598 for (l = 0, r = arr_len - 1; l < r; l++)
20599 {
20600 MANGLE_SWITCH (arr, l, r);
20601 }
20602
20603 return (arr_len);
20604 }
20605
20606 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
20607 {
20608 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20609
20610 arr[arr_len] = c;
20611
20612 return (arr_len + 1);
20613 }
20614
20615 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
20616 {
20617 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20618
20619 int arr_pos;
20620
20621 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20622 {
20623 arr[arr_pos + 1] = arr[arr_pos];
20624 }
20625
20626 arr[0] = c;
20627
20628 return (arr_len + 1);
20629 }
20630
20631 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
20632 {
20633 if (upos >= arr_len) return (arr_len);
20634
20635 int arr_pos;
20636
20637 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
20638 {
20639 arr[arr_pos] = arr[arr_pos + 1];
20640 }
20641
20642 return (arr_len - 1);
20643 }
20644
20645 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20646 {
20647 if (upos >= arr_len) return (arr_len);
20648
20649 if ((upos + ulen) > arr_len) return (arr_len);
20650
20651 int arr_pos;
20652
20653 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
20654 {
20655 arr[arr_pos] = arr[upos + arr_pos];
20656 }
20657
20658 return (ulen);
20659 }
20660
20661 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20662 {
20663 if (upos >= arr_len) return (arr_len);
20664
20665 if ((upos + ulen) >= arr_len) return (arr_len);
20666
20667 int arr_pos;
20668
20669 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
20670 {
20671 arr[arr_pos] = arr[arr_pos + ulen];
20672 }
20673
20674 return (arr_len - ulen);
20675 }
20676
20677 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20678 {
20679 if (upos >= arr_len) return (arr_len);
20680
20681 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20682
20683 int arr_pos;
20684
20685 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
20686 {
20687 arr[arr_pos + 1] = arr[arr_pos];
20688 }
20689
20690 arr[upos] = c;
20691
20692 return (arr_len + 1);
20693 }
20694
20695 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)
20696 {
20697 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20698
20699 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
20700
20701 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
20702
20703 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
20704
20705 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
20706
20707 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
20708
20709 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
20710
20711 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
20712
20713 return (arr_len + arr2_cpy);
20714 }
20715
20716 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20717 {
20718 if (upos >= arr_len) return (arr_len);
20719
20720 arr[upos] = c;
20721
20722 return (arr_len);
20723 }
20724
20725 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
20726 {
20727 if (upos >= arr_len) return (arr_len);
20728
20729 memset (arr + upos, 0, arr_len - upos);
20730
20731 return (upos);
20732 }
20733
20734 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
20735 {
20736 int arr_pos;
20737
20738 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
20739 {
20740 if (arr[arr_pos] != oldc) continue;
20741
20742 arr[arr_pos] = newc;
20743 }
20744
20745 return (arr_len);
20746 }
20747
20748 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
20749 {
20750 int arr_pos;
20751
20752 int ret_len;
20753
20754 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
20755 {
20756 if (arr[arr_pos] == c) continue;
20757
20758 arr[ret_len] = arr[arr_pos];
20759
20760 ret_len++;
20761 }
20762
20763 return (ret_len);
20764 }
20765
20766 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
20767 {
20768 if (ulen > arr_len) return (arr_len);
20769
20770 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20771
20772 char cs[100] = { 0 };
20773
20774 memcpy (cs, arr, ulen);
20775
20776 int i;
20777
20778 for (i = 0; i < ulen; i++)
20779 {
20780 char c = cs[i];
20781
20782 arr_len = mangle_insert (arr, arr_len, i, c);
20783 }
20784
20785 return (arr_len);
20786 }
20787
20788 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20789 {
20790 if (ulen > arr_len) return (arr_len);
20791
20792 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20793
20794 int upos = arr_len - ulen;
20795
20796 int i;
20797
20798 for (i = 0; i < ulen; i++)
20799 {
20800 char c = arr[upos + i];
20801
20802 arr_len = mangle_append (arr, arr_len, c);
20803 }
20804
20805 return (arr_len);
20806 }
20807
20808 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20809 {
20810 if ( arr_len == 0) return (arr_len);
20811 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20812
20813 char c = arr[upos];
20814
20815 int i;
20816
20817 for (i = 0; i < ulen; i++)
20818 {
20819 arr_len = mangle_insert (arr, arr_len, upos, c);
20820 }
20821
20822 return (arr_len);
20823 }
20824
20825 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20826 {
20827 if ( arr_len == 0) return (arr_len);
20828 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20829
20830 int arr_pos;
20831
20832 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20833 {
20834 int new_pos = arr_pos * 2;
20835
20836 arr[new_pos] = arr[arr_pos];
20837
20838 arr[new_pos + 1] = arr[arr_pos];
20839 }
20840
20841 return (arr_len * 2);
20842 }
20843
20844 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20845 {
20846 if (upos >= arr_len) return (arr_len);
20847 if (upos2 >= arr_len) return (arr_len);
20848
20849 MANGLE_SWITCH (arr, upos, upos2);
20850
20851 return (arr_len);
20852 }
20853
20854 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20855 {
20856 MANGLE_SWITCH (arr, upos, upos2);
20857
20858 return (arr_len);
20859 }
20860
20861 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20862 {
20863 if (upos >= arr_len) return (arr_len);
20864
20865 arr[upos] <<= 1;
20866
20867 return (arr_len);
20868 }
20869
20870 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20871 {
20872 if (upos >= arr_len) return (arr_len);
20873
20874 arr[upos] >>= 1;
20875
20876 return (arr_len);
20877 }
20878
20879 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20880 {
20881 if (upos >= arr_len) return (arr_len);
20882
20883 arr[upos] += 1;
20884
20885 return (arr_len);
20886 }
20887
20888 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20889 {
20890 if (upos >= arr_len) return (arr_len);
20891
20892 arr[upos] -= 1;
20893
20894 return (arr_len);
20895 }
20896
20897 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20898 {
20899 int upper_next = 1;
20900
20901 int pos;
20902
20903 for (pos = 0; pos < arr_len; pos++)
20904 {
20905 if (arr[pos] == ' ')
20906 {
20907 upper_next = 1;
20908
20909 continue;
20910 }
20911
20912 if (upper_next)
20913 {
20914 upper_next = 0;
20915
20916 MANGLE_UPPER_AT (arr, pos);
20917 }
20918 else
20919 {
20920 MANGLE_LOWER_AT (arr, pos);
20921 }
20922 }
20923
20924 return (arr_len);
20925 }
20926
20927 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20928 {
20929 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20930
20931 u32 j;
20932
20933 u32 rule_pos = 0;
20934
20935 for (j = 0; j < rp_gen_num; j++)
20936 {
20937 u32 r = 0;
20938 u32 p1 = 0;
20939 u32 p2 = 0;
20940 u32 p3 = 0;
20941
20942 switch ((char) get_random_num (0, 9))
20943 {
20944 case 0:
20945 r = get_random_num (0, sizeof (grp_op_nop));
20946 rule_buf[rule_pos++] = grp_op_nop[r];
20947 break;
20948
20949 case 1:
20950 r = get_random_num (0, sizeof (grp_op_pos_p0));
20951 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20952 p1 = get_random_num (0, sizeof (grp_pos));
20953 rule_buf[rule_pos++] = grp_pos[p1];
20954 break;
20955
20956 case 2:
20957 r = get_random_num (0, sizeof (grp_op_pos_p1));
20958 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20959 p1 = get_random_num (1, 6);
20960 rule_buf[rule_pos++] = grp_pos[p1];
20961 break;
20962
20963 case 3:
20964 r = get_random_num (0, sizeof (grp_op_chr));
20965 rule_buf[rule_pos++] = grp_op_chr[r];
20966 p1 = get_random_num (0x20, 0x7e);
20967 rule_buf[rule_pos++] = (char) p1;
20968 break;
20969
20970 case 4:
20971 r = get_random_num (0, sizeof (grp_op_chr_chr));
20972 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20973 p1 = get_random_num (0x20, 0x7e);
20974 rule_buf[rule_pos++] = (char) p1;
20975 p2 = get_random_num (0x20, 0x7e);
20976 while (p1 == p2)
20977 p2 = get_random_num (0x20, 0x7e);
20978 rule_buf[rule_pos++] = (char) p2;
20979 break;
20980
20981 case 5:
20982 r = get_random_num (0, sizeof (grp_op_pos_chr));
20983 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20984 p1 = get_random_num (0, sizeof (grp_pos));
20985 rule_buf[rule_pos++] = grp_pos[p1];
20986 p2 = get_random_num (0x20, 0x7e);
20987 rule_buf[rule_pos++] = (char) p2;
20988 break;
20989
20990 case 6:
20991 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20992 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20993 p1 = get_random_num (0, sizeof (grp_pos));
20994 rule_buf[rule_pos++] = grp_pos[p1];
20995 p2 = get_random_num (0, sizeof (grp_pos));
20996 while (p1 == p2)
20997 p2 = get_random_num (0, sizeof (grp_pos));
20998 rule_buf[rule_pos++] = grp_pos[p2];
20999 break;
21000
21001 case 7:
21002 r = get_random_num (0, sizeof (grp_op_pos_pos1));
21003 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
21004 p1 = get_random_num (0, sizeof (grp_pos));
21005 rule_buf[rule_pos++] = grp_pos[p1];
21006 p2 = get_random_num (1, sizeof (grp_pos));
21007 while (p1 == p2)
21008 p2 = get_random_num (1, sizeof (grp_pos));
21009 rule_buf[rule_pos++] = grp_pos[p2];
21010 break;
21011
21012 case 8:
21013 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
21014 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
21015 p1 = get_random_num (0, sizeof (grp_pos));
21016 rule_buf[rule_pos++] = grp_pos[p1];
21017 p2 = get_random_num (1, sizeof (grp_pos));
21018 rule_buf[rule_pos++] = grp_pos[p1];
21019 p3 = get_random_num (0, sizeof (grp_pos));
21020 rule_buf[rule_pos++] = grp_pos[p3];
21021 break;
21022 }
21023 }
21024
21025 return (rule_pos);
21026 }
21027
21028 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
21029 {
21030 char mem[BLOCK_SIZE] = { 0 };
21031
21032 if (in == NULL) return (RULE_RC_REJECT_ERROR);
21033
21034 if (out == NULL) return (RULE_RC_REJECT_ERROR);
21035
21036 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21037
21038 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
21039
21040 int out_len = in_len;
21041 int mem_len = in_len;
21042
21043 memcpy (out, in, out_len);
21044
21045 int rule_pos;
21046
21047 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
21048 {
21049 int upos, upos2;
21050 int ulen;
21051
21052 switch (rule[rule_pos])
21053 {
21054 case ' ':
21055 break;
21056
21057 case RULE_OP_MANGLE_NOOP:
21058 break;
21059
21060 case RULE_OP_MANGLE_LREST:
21061 out_len = mangle_lrest (out, out_len);
21062 break;
21063
21064 case RULE_OP_MANGLE_UREST:
21065 out_len = mangle_urest (out, out_len);
21066 break;
21067
21068 case RULE_OP_MANGLE_LREST_UFIRST:
21069 out_len = mangle_lrest (out, out_len);
21070 if (out_len) MANGLE_UPPER_AT (out, 0);
21071 break;
21072
21073 case RULE_OP_MANGLE_UREST_LFIRST:
21074 out_len = mangle_urest (out, out_len);
21075 if (out_len) MANGLE_LOWER_AT (out, 0);
21076 break;
21077
21078 case RULE_OP_MANGLE_TREST:
21079 out_len = mangle_trest (out, out_len);
21080 break;
21081
21082 case RULE_OP_MANGLE_TOGGLE_AT:
21083 NEXT_RULEPOS (rule_pos);
21084 NEXT_RPTOI (rule, rule_pos, upos);
21085 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
21086 break;
21087
21088 case RULE_OP_MANGLE_REVERSE:
21089 out_len = mangle_reverse (out, out_len);
21090 break;
21091
21092 case RULE_OP_MANGLE_DUPEWORD:
21093 out_len = mangle_double (out, out_len);
21094 break;
21095
21096 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21097 NEXT_RULEPOS (rule_pos);
21098 NEXT_RPTOI (rule, rule_pos, ulen);
21099 out_len = mangle_double_times (out, out_len, ulen);
21100 break;
21101
21102 case RULE_OP_MANGLE_REFLECT:
21103 out_len = mangle_reflect (out, out_len);
21104 break;
21105
21106 case RULE_OP_MANGLE_ROTATE_LEFT:
21107 mangle_rotate_left (out, out_len);
21108 break;
21109
21110 case RULE_OP_MANGLE_ROTATE_RIGHT:
21111 mangle_rotate_right (out, out_len);
21112 break;
21113
21114 case RULE_OP_MANGLE_APPEND:
21115 NEXT_RULEPOS (rule_pos);
21116 out_len = mangle_append (out, out_len, rule[rule_pos]);
21117 break;
21118
21119 case RULE_OP_MANGLE_PREPEND:
21120 NEXT_RULEPOS (rule_pos);
21121 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
21122 break;
21123
21124 case RULE_OP_MANGLE_DELETE_FIRST:
21125 out_len = mangle_delete_at (out, out_len, 0);
21126 break;
21127
21128 case RULE_OP_MANGLE_DELETE_LAST:
21129 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
21130 break;
21131
21132 case RULE_OP_MANGLE_DELETE_AT:
21133 NEXT_RULEPOS (rule_pos);
21134 NEXT_RPTOI (rule, rule_pos, upos);
21135 out_len = mangle_delete_at (out, out_len, upos);
21136 break;
21137
21138 case RULE_OP_MANGLE_EXTRACT:
21139 NEXT_RULEPOS (rule_pos);
21140 NEXT_RPTOI (rule, rule_pos, upos);
21141 NEXT_RULEPOS (rule_pos);
21142 NEXT_RPTOI (rule, rule_pos, ulen);
21143 out_len = mangle_extract (out, out_len, upos, ulen);
21144 break;
21145
21146 case RULE_OP_MANGLE_OMIT:
21147 NEXT_RULEPOS (rule_pos);
21148 NEXT_RPTOI (rule, rule_pos, upos);
21149 NEXT_RULEPOS (rule_pos);
21150 NEXT_RPTOI (rule, rule_pos, ulen);
21151 out_len = mangle_omit (out, out_len, upos, ulen);
21152 break;
21153
21154 case RULE_OP_MANGLE_INSERT:
21155 NEXT_RULEPOS (rule_pos);
21156 NEXT_RPTOI (rule, rule_pos, upos);
21157 NEXT_RULEPOS (rule_pos);
21158 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
21159 break;
21160
21161 case RULE_OP_MANGLE_OVERSTRIKE:
21162 NEXT_RULEPOS (rule_pos);
21163 NEXT_RPTOI (rule, rule_pos, upos);
21164 NEXT_RULEPOS (rule_pos);
21165 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
21166 break;
21167
21168 case RULE_OP_MANGLE_TRUNCATE_AT:
21169 NEXT_RULEPOS (rule_pos);
21170 NEXT_RPTOI (rule, rule_pos, upos);
21171 out_len = mangle_truncate_at (out, out_len, upos);
21172 break;
21173
21174 case RULE_OP_MANGLE_REPLACE:
21175 NEXT_RULEPOS (rule_pos);
21176 NEXT_RULEPOS (rule_pos);
21177 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
21178 break;
21179
21180 case RULE_OP_MANGLE_PURGECHAR:
21181 NEXT_RULEPOS (rule_pos);
21182 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
21183 break;
21184
21185 case RULE_OP_MANGLE_TOGGLECASE_REC:
21186 /* todo */
21187 break;
21188
21189 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21190 NEXT_RULEPOS (rule_pos);
21191 NEXT_RPTOI (rule, rule_pos, ulen);
21192 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
21193 break;
21194
21195 case RULE_OP_MANGLE_DUPECHAR_LAST:
21196 NEXT_RULEPOS (rule_pos);
21197 NEXT_RPTOI (rule, rule_pos, ulen);
21198 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
21199 break;
21200
21201 case RULE_OP_MANGLE_DUPECHAR_ALL:
21202 out_len = mangle_dupechar (out, out_len);
21203 break;
21204
21205 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21206 NEXT_RULEPOS (rule_pos);
21207 NEXT_RPTOI (rule, rule_pos, ulen);
21208 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
21209 break;
21210
21211 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21212 NEXT_RULEPOS (rule_pos);
21213 NEXT_RPTOI (rule, rule_pos, ulen);
21214 out_len = mangle_dupeblock_append (out, out_len, ulen);
21215 break;
21216
21217 case RULE_OP_MANGLE_SWITCH_FIRST:
21218 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
21219 break;
21220
21221 case RULE_OP_MANGLE_SWITCH_LAST:
21222 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
21223 break;
21224
21225 case RULE_OP_MANGLE_SWITCH_AT:
21226 NEXT_RULEPOS (rule_pos);
21227 NEXT_RPTOI (rule, rule_pos, upos);
21228 NEXT_RULEPOS (rule_pos);
21229 NEXT_RPTOI (rule, rule_pos, upos2);
21230 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
21231 break;
21232
21233 case RULE_OP_MANGLE_CHR_SHIFTL:
21234 NEXT_RULEPOS (rule_pos);
21235 NEXT_RPTOI (rule, rule_pos, upos);
21236 mangle_chr_shiftl (out, out_len, upos);
21237 break;
21238
21239 case RULE_OP_MANGLE_CHR_SHIFTR:
21240 NEXT_RULEPOS (rule_pos);
21241 NEXT_RPTOI (rule, rule_pos, upos);
21242 mangle_chr_shiftr (out, out_len, upos);
21243 break;
21244
21245 case RULE_OP_MANGLE_CHR_INCR:
21246 NEXT_RULEPOS (rule_pos);
21247 NEXT_RPTOI (rule, rule_pos, upos);
21248 mangle_chr_incr (out, out_len, upos);
21249 break;
21250
21251 case RULE_OP_MANGLE_CHR_DECR:
21252 NEXT_RULEPOS (rule_pos);
21253 NEXT_RPTOI (rule, rule_pos, upos);
21254 mangle_chr_decr (out, out_len, upos);
21255 break;
21256
21257 case RULE_OP_MANGLE_REPLACE_NP1:
21258 NEXT_RULEPOS (rule_pos);
21259 NEXT_RPTOI (rule, rule_pos, upos);
21260 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
21261 break;
21262
21263 case RULE_OP_MANGLE_REPLACE_NM1:
21264 NEXT_RULEPOS (rule_pos);
21265 NEXT_RPTOI (rule, rule_pos, upos);
21266 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
21267 break;
21268
21269 case RULE_OP_MANGLE_TITLE:
21270 out_len = mangle_title (out, out_len);
21271 break;
21272
21273 case RULE_OP_MANGLE_EXTRACT_MEMORY:
21274 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
21275 NEXT_RULEPOS (rule_pos);
21276 NEXT_RPTOI (rule, rule_pos, upos);
21277 NEXT_RULEPOS (rule_pos);
21278 NEXT_RPTOI (rule, rule_pos, ulen);
21279 NEXT_RULEPOS (rule_pos);
21280 NEXT_RPTOI (rule, rule_pos, upos2);
21281 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
21282 break;
21283
21284 case RULE_OP_MANGLE_APPEND_MEMORY:
21285 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
21286 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21287 memcpy (out + out_len, mem, mem_len);
21288 out_len += mem_len;
21289 break;
21290
21291 case RULE_OP_MANGLE_PREPEND_MEMORY:
21292 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
21293 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21294 memcpy (mem + mem_len, out, out_len);
21295 out_len += mem_len;
21296 memcpy (out, mem, out_len);
21297 break;
21298
21299 case RULE_OP_MEMORIZE_WORD:
21300 memcpy (mem, out, out_len);
21301 mem_len = out_len;
21302 break;
21303
21304 case RULE_OP_REJECT_LESS:
21305 NEXT_RULEPOS (rule_pos);
21306 NEXT_RPTOI (rule, rule_pos, upos);
21307 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
21308 break;
21309
21310 case RULE_OP_REJECT_GREATER:
21311 NEXT_RULEPOS (rule_pos);
21312 NEXT_RPTOI (rule, rule_pos, upos);
21313 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
21314 break;
21315
21316 case RULE_OP_REJECT_CONTAIN:
21317 NEXT_RULEPOS (rule_pos);
21318 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
21319 break;
21320
21321 case RULE_OP_REJECT_NOT_CONTAIN:
21322 NEXT_RULEPOS (rule_pos);
21323 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
21324 break;
21325
21326 case RULE_OP_REJECT_EQUAL_FIRST:
21327 NEXT_RULEPOS (rule_pos);
21328 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
21329 break;
21330
21331 case RULE_OP_REJECT_EQUAL_LAST:
21332 NEXT_RULEPOS (rule_pos);
21333 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
21334 break;
21335
21336 case RULE_OP_REJECT_EQUAL_AT:
21337 NEXT_RULEPOS (rule_pos);
21338 NEXT_RPTOI (rule, rule_pos, upos);
21339 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
21340 NEXT_RULEPOS (rule_pos);
21341 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
21342 break;
21343
21344 case RULE_OP_REJECT_CONTAINS:
21345 NEXT_RULEPOS (rule_pos);
21346 NEXT_RPTOI (rule, rule_pos, upos);
21347 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
21348 NEXT_RULEPOS (rule_pos);
21349 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
21350 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
21351 break;
21352
21353 case RULE_OP_REJECT_MEMORY:
21354 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
21355 break;
21356
21357 default:
21358 return (RULE_RC_SYNTAX_ERROR);
21359 break;
21360 }
21361 }
21362
21363 memset (out + out_len, 0, BLOCK_SIZE - out_len);
21364
21365 return (out_len);
21366 }